KO ▾
API 키 받기

LangChain에서 무검열 API로 ChatOpenAI 사용

LangChain의 ChatOpenAI 클래스는 모든 OpenAI 호환 무검열 엔드포인트에서 작동하므로 Base URL, 키 및 모델 이름만 변경하면 됩니다. 이 페이지에서는 Python 및 Node에서의 설정 방법을 보여주고, 스트리밍, 도구 및 작은 에이전트 구축으로 확장합니다.

업데이트

서버 큐브로 채팅 버블을 전달하는 연결된 고리의 등각 체인, API에 대한 LangChain 연결을 나타냄

주요 포인트

  1. ChatOpenAI에는 base_url, api_key 및 모델을 uncensored로 설정하는 세 가지 설정이 필요합니다.
  2. 스트리밍, 도구 호출 및 구조화된 출력는 모두 표준 LangChain 인터페이스를 통해 처리됩니다.
  3. 동시성(concurrency)을 8로 제한하고 HTTP 429를 재시도로 처리하여 한도 내에 머무르세요.
  4. 10단계 에이전트 실행 비용은 토큰 100만 개당 $0.15 및 $0.50으로 1센트 미만입니다.

간단한 답변: ChatOpenAI의 세 가지 설정

chat open ai langchain을 검색했다면, 이미 ChatOpenAI를 사용하는 LangChain 프로젝트가 있고 다른 백엔드와 연결하고 싶은 상황일 것입니다. 이는 재작성이 아닌 구성 변경입니다. 이 사이트의 API는 OpenAI 채팅 완료 프로토콜을 지원하므로 LangChain은 이를 다른 OpenAI 스타일 서버와 동일하게 처리합니다.

Base URL, API 키 및 모델 ID uncensored가 필요합니다. 먼저 패키지를 설치하세요:

pip install -U langchain-openai langgraph

그런 다음 모델 객체를 생성합니다:

import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
    temperature=0.8,
)

reply = llm.invoke("Write a two-sentence villain monologue for a heist novel.")
print(reply.content)

이것이 전체 통합입니다. ChatOpenAI 기반의 모든 LangChain 기능은 이제 무검열 모델에서 실행됩니다: 체인, 채팅 모델 호출 리트리버, 출력 파서 및 에이전트입니다. 아직 키가 없다면 API 키 페이지에서 가입 방법과 원클릭 체험 크레딧을 설명합니다.

키를 코드에서 분리하세요

키를 환경 변수에 넣고 시작 시 읽으세요. Linux 또는 macOS에서:

export NOFILTER_API_KEY="paste-your-key-here"

프로젝트를 위해 하나의 공유 클라이언트 모듈(예: llm.py)을 만들어 모델을 한 번만 생성하고 내보내세요. 모든 체인은 동일한 객체를 가져오며, 키, 시간 초과 또는 온도의 변경은 한 곳에서만 발생합니다. 이렇게 하면 도구 단계용 더 차가운 인스턴스와 창의적인 글쓰기용 더 따뜻한 인스턴스를 같은 엔드포인트에 다른 설정으로 유지하기가 쉬워집니다.

많은 사람이 빠지는 함정이 있습니다. ChatOpenAI은 환경에서 OPENAI_API_KEY 및 OPENAI_API_BASE도 읽습니다. 다른 프로젝트에 대해 이러한 변수가 설정되어 있으면, 반쯤 구성된 객체가 요청을 잘못된 서버로 보낼 수 있습니다. 위에서처럼 base_url 및 api_key을 명시적으로 전달하면 모호함이 제거됩니다.

LangChain 없이도 연결을 확인할 수 있습니다. 모델 엔드포인트는 단일 항목을 반환해야 합니다:

curl https://api.nofilteraichat.com/v1/models \
  -H "Authorization: Bearer $NOFILTER_API_KEY"

이것이 작동하지만 LangChain이 실패하면 문제는 키가 아닌 Python 환경에 있습니다. 둘 다 401로 실패하면 키에 여분 공백이나 줄바꿈이 있는지 확인하세요. 빠른 시작에는 비교를 위한 정확한 요청 형식이 나열되어 있습니다.

스트리밍 및 토큰 사용량

토큰이 생성되는 대로 표시될 때 채팅 UI가 더 나아 보입니다. LangChain은 .stream()을 통해 이를 제공하며, 서버는 내부적으로 stream: true이 설정되면 표준 SSE 청크를 보냅니다.

from langchain_openai import ChatOpenAI
import os

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
    stream_usage=True,
)

final = None
for chunk in llm.stream("Describe a rainy harbour town in four sentences."):
    print(chunk.content, end="", flush=True)
    final = chunk if final is None else final + chunk

print()
print(final.usage_metadata)

stream_usage=True를 사용하면 마지막 청크에 입력 및 출력 토큰 개수가 포함됩니다. API는 스트림 종료 시 이를 보냅니다. 이러한 숫자를 유지하세요. 이는 에이전트의 실제 비용을 파악하는 가장 저렴한 방법이며, 아래 비용 섹션에서 이를 사용합니다.

기억해야 할 한 가지: 스트리밍 요청은 스트림이 완료될 때까지 동시성 슬롯을 유지합니다. 스트림을 닫지 않고 중단하면 해당 슬롯이 예상보다 오래 점유됩니다.

Node 및 TypeScript

JavaScript 패키지는 약간 다른 옵션 이름을 사용합니다. Base URL은 configuration 내부에 들어갑니다:

npm install @langchain/openai @langchain/core
import { ChatOpenAI } from "@langchain/openai";

const llm = new ChatOpenAI({
  model: "uncensored",
  apiKey: process.env.NOFILTER_API_KEY,
  configuration: { baseURL: "https://api.nofilteraichat.com/v1" },
  temperature: 0.8,
});

const res = await llm.invoke("Give me three names for a smuggler's ship.");
console.log(res.content);

응답에 대한 TypeScript 타입은 일반적인 LangChain 메시지 클래스이므로 res.content 또는 res.usage_metadata을 읽는 기존 코드는 계속 작동합니다. 서버 라우트 내에서 이를 실행할 때는 요청마다 모델이 아닌 모듈 범위에서 모델을 생성하세요. 이렇게 하면 호출마다 새 HTTP 클라이언트를 생성하지 않고 동시성을 쉽게 관리할 수 있습니다.

.stream(), .bindTools() 및 .withStructuredOutput()를 포함한 나머지 모든 것은 Python에서와 동일하게 작동합니다. temperature, top_p, stop 시퀀스, seed 및 패널티 옵션은 모델로 전달되므로 다른 OpenAI 스타일 백엔드에서와 같이 생성자에 설정할 수 있습니다.

도구 호출 및 작은 에이전트

API는 도구 호출을 지원합니다: tools 및 tool_choice 필드, 스트리밍 tool_calls 및 role: "tool" 메시지로 반환되는 도구 결과. LangGraph의 사전 구축된 에이전트는 정확히 이 루프를 사용합니다. 여기 도구 하나를 가진 에이전트가 있습니다:

import os
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

@tool
def roll_dice(sides: int) -> int:
    """Roll a die with the given number of sides."""
    import random
    return random.randint(1, sides)

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
)

agent = create_react_agent(llm, [roll_dice])
out = agent.invoke(
    {"messages": [("user", "Roll a twenty-sided die twice and tell me the total.")]}
)
print(out["messages"][-1].content)

오픈 웨이트 모델에서의 도구 사용은 호스팅된 플래그십 모델보다 예측 가능성이 낮으므로 테스트 대상으로 간주해야 합니다. 도구 설명을 평이한 단어로 작성하고, 인수 스키마를 작게 유지하며, 유효한 인수를 생성해야 하는 에이전트 단계에는 temperature을 낮게(0.2~0.4) 설정하세요. 호출이 잘못 반환되면 LangChain은 이를 유효하지 않은 도구 호출로 표시하며, 더 명확한 설명으로 재시도하면 대부분 해결됩니다.

에이전트 루프를 제한된 범위 내에 두세요. LangGraph에는 재귀 한도가 있으며, 감당할 수 있는 숫자로 설정해야 합니다. 에이전트가 도구를 무한히 호출할 수 있다면, 나쁜 프롬프트로 인해 키보드에서 떨어진 동안 크레딧이 소모될 수 있습니다. 대부분의 작업에는 10~15단계의 제한이 적절한 기본값이며, 에이전트를 호출할 때 구성에 전달할 수 있습니다.

구조화된 출력

구조화된 출력는 response_format을 통해 사용할 수 있습니다. LangChain에서는 구조화된 출력 메서드를 요청하고 프롬프트의 키 이름을 지정하세요:

from pydantic import BaseModel
from langchain_openai import ChatOpenAI
import os

class Character(BaseModel):
    name: str
    role: str
    secret: str

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
)
structured = llm.with_structured_output(Character, method="json_mode")
print(structured.invoke(
    "Return JSON with keys name, role and secret for a noir detective."
))

속도 제한, 재시도 및 비용

전체 키는 동시 요청 8개와 분당 300개의 요청을 허용합니다. 체험 키는 2개와 60개를 허용합니다. 어느 한도를 초과하면 API는 HTTP 429와 오류 코드를 반환합니다: 분당 요청은 rate_limited, 동시 요청 과다는 concurrency. 일시적인 과부하도 429를 반환하며 Retry-After: 5 헤더가 포함됩니다.

LangChain은 이를 위한 두 가지 조절 장치를 제공합니다. 모델의 max_retries는 백오프와 함께 실패한 호출을 재시도하고, 실행 구성의 max_concurrency은 병렬 배치 작업을 제한합니다:

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
    max_retries=4,
    timeout=120,
)

answers = llm.batch(
    ["Prompt one", "Prompt two", "Prompt three", "Prompt four"],
    config={"max_concurrency": 6},
)

전체 키에서 max_concurrency를 6으로 설정하면 두 번째 프로세스를 위한 여유 공간을 확보합니다. 에이전트 단계는 별도의 요청이며, 스트리밍 단계는 스트림이 끝날 때까지 슬롯을 점유한다는 것을 기억하세요.

에이전트 실행 비용

가격은 입력 토큰 100만 개당 $0.15, 출력 토큰 100만 개당 $0.50입니다. 에이전트 단계가 3,000개의 토큰(히스토리, 도구, 지시사항)을 보내고 모델이 500개의 토큰을 생성한다고 가정해 봅시다. 입력 비용은 3,000 × $0.15 / 1,000,000 = $0.00045입니다. 출력 비용은 500 × $0.50 / 1,000,000 = $0.00025입니다. 한 단계당 비용은 $0.0007입니다. 10단계 실행은 $0.007이며, 1,000번의 실행은 $7.00이 듭니다.

에이전트는 매 단계마다 증가하는 히스토리를 다시 보내므로 입력 토큰이 주를 이룹니다. 오래된 도구 출력을 다듬는 것이 가장 저렴한 최적화 방법입니다. 실패하거나 거부된 요청에는 요금이 부과되지 않습니다. 충전 및 보너스 세부 사항은 가격 페이지에 있습니다.

자주 발생하는 문제

  • 모든 호출에서 404. Base URL은 /v1로 끝나야 하며 /chat/completions을 포함해서는 안 됩니다. LangChain은 경로를 자체적으로 추가합니다.
  • 모델을 찾을 수 없음. 유일한 모델 ID는 uncensored입니다. gpt-4o와 같은 이름은 작동하지 않습니다.
  • 컨텍스트 오류 프롬프트와 응답을 합친 컨텍스트 창은 100,000 토큰입니다. 긴 검색 체인은 이를 초과할 수 있습니다. 전송 전에 요약하거나 줄이세요.
  • 요청이 너무 큼. 본문 한도는 8 MB이며, 프롬프트에 전체 문서를 넣는 경우 중요합니다.
  • 임베딩 실패 이 API는 텍스트 채팅 전용입니다. 임베딩 모델은 다른 제공업체에 유지하고 엔드포인트는 생성용으로 사용하세요.

동일한 패턴은 다른 프레임워크 및 채팅 프런트엔드에도 적용됩니다. 통합 가이드에는 더 많은 클라이언트가 다루어져 있습니다. 특별한 사항이 있다면 지원 페이지에서 시작하세요.

질문과 답변

커스텀 base URL로 ChatOpenAI를 사용할 수 있나요?

네. base_url(Node에서는 configuration 내부의 baseURL), API 키 및 모델 uncensored를 전달하세요. OpenAI 채팅 프로토콜을 따르는 한 LangChain은 어떤 서버가 응답하든 상관하지 않습니다.

LangChain 스트리밍이 이 API에서 작동하나요?

네. API는 SSE를 통해 스트리밍하고 종료 시 사용량을 보내므로 .stream()과 astream()이 작동하며, stream_usage=True를 사용하면 토큰 개수를 얻을 수 있습니다.

LangChain 임베딩이나 벡터 스토어를 사용할 수 있나요?

임베딩에는 사용할 수 없습니다. API에 임베딩 엔드포인트가 없기 때문입니다. 검색을 위해 다른 임베딩 소스를 사용하고, 검색된 텍스트를 생성을 위해 이 엔드포인트로 보내세요.

속도 제한에 도달하면 어떻게 되나요?

HTTP 429 응답을 받으며 코드에는 rate_limited 또는 concurrency가 포함됩니다. ChatOpenAI에서 max_retries를 설정하고 전체 키의 경우 max_concurrency를 8 이하로 제한하세요.

키를 받기 위해 양식 하나만 작성하면 됩니다

계정을 생성하고 키를 복사한 후 기본 URL을 변경하세요. 설정은 이것으로 끝입니다.

API 키 받기