전환 전후
Python의 일반적인 OpenAI 클라이언트 예시입니다:
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
r = client.chat.completions.create(
model="your-current-model",
messages=[{"role": "user", "content": "Draft a tense dialogue between two rivals."}],
)
그리고 동일한 클라이언트가 무검열 대안을 가리켰습니다:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.chatgptunfiltered.com/v1",
api_key=os.environ["UNFILTERED_API_KEY"],
)
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Draft a tense dialogue between two rivals."}],
)
생성자에서 두 줄이 변경되고, 호출에서 모델 문자열이 변경됩니다. 메시지 형식, 응답 객체와 r.choices[0].message.content을 읽어내는 방식은 그대로 유지됩니다. 이 대안은 독립적인 제공자에 의해 운영되는 다른 모델입니다. ChatGPT도 아니고 OpenAI나 기타 제공자의 공식 API도 아닙니다.
환경 변수만으로 전환하기
공식 Python 및 Node SDK의 최신 버전에서는 인자 없이 클라이언트를 생성할 때 OPENAI_BASE_URL 및 OPENAI_API_KEY을 읽습니다. 즉, 애플리케이션 코드를 수정할 필요가 없습니다:
export OPENAI_BASE_URL="https://api.chatgptunfiltered.com/v1"
export OPENAI_API_KEY="YOUR_KEY"
python app.py
코드에 model="uncensored"를 전달하는지 반드시 확인해야 합니다. 모델 이름이 여러 곳에 하드코딩되어 있다면 먼저 설정 값 하나로 추출하세요. 이 작은 리팩토링은 향후 어느 방향으로든 전환 비용을 동일하게 낮춥니다.
동일한 아이디어는 Node에서도 적용됩니다:
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.chatgptunfiltered.com/v1",
apiKey: process.env.UNFILTERED_API_KEY,
});
const r = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Give me five villain names." }],
});
console.log(r.choices[0].message.content);프레임워크 및 Responses 형식
OpenAI 클라이언트를 감싸는 라이브러리는 일반적으로 베이스 URL 설정을 노출합니다. LangChain의 OpenAI 채팅 래퍼에서는 다음과 같이 표시됩니다:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.chatgptunfiltered.com/v1",
api_key="YOUR_KEY",
)
print(llm.invoke("Name three moods for a chase scene.").content)
새로운 Responses 형식을 사용한다면, POST /v1/responses는 POST /v1/chat/completions과 함께 지원됩니다. GET /v1/models은 모델을 나열하며, 키와 URL이 올바른지 빠르게 확인할 수 있습니다.
예상되는 차이점
| 영역 | 주의해야 할 사항 |
|---|---|
| 답변 의지 | 법적인 성인 사용에 대해 콘텐츠 거부 없이 응답합니다. 필터링된 모델이 거부할 프롬프트는 보통 응답을 얻습니다. |
| 어휘와 스타일 | 서로 다른 모델, 다른 목소리입니다. 어조, 길이 및 서식 습관은 이전 모델과 일치하지 않습니다. |
| 모델 선택 | ID uncensored인 모델이 하나 있습니다. 선택할 티어가 없습니다. |
| 범위 | 텍스트 전용: 이미지, 오디오 또는 비디오 생성, 임베딩, 파인튜닝 없음. |
| 컨텍스트 | 100,000 토큰, 프롬프트와 생성된 응답의 합계입니다. max_tokens은 선택 사항입니다. |
| 제한 사항 | 전체 키: 동시 요청 8개, 분당 300개. 체험 키: 동시 요청 2개, 분당 60개. 요청 본문 최대 8 MB. |
| 오류 | rate_limited 또는 concurrency 코드와 함께 HTTP 429가 반환되며, 일시적 과부하 시 Retry-After: 5와 함께 429가 반환됩니다. |
스트리밍, 함수 호출 및 JSON 모드가 지원되며, temperature, top_p, stop, seed 및 페널티도 지원됩니다. 응답 헤더에는 X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests 및 X-RateLimit-Limit-Concurrency이 포함됩니다. 문서에 세부 정보가 있습니다.
추가적인 두 가지 차이점을 한 줄로 설명합니다. 첫째, 다른 모델은 토큰을 다르게 세는 경우가 있으므로 동일한 텍스트의 토큰 수는 이전 제공자가 보고한 것과 다를 수 있습니다. 자체 추정치가 아닌 응답의 사용량 숫자를 사용하세요. 둘째, 내장 웹 검색이나 제공자 측 파일 저장소와 같은 벤더 호스팅 도구에 의존하는 기능은 이 서비스에 포함되지 않습니다. 함수 호출은: 함수를 정의하고 코드가 이를 실행합니다.
자체 프롬프트용 패러티 스크립트
출력물을 눈으로 확인하는 대신 프롬프트 집합을 새 엔드포인트에서 루프로 실행하고 검토가 필요한 모든 데이터를 저장하세요.
import csv, json
with open("prompts.json", encoding="utf-8") as f:
prompts = json.load(f) # a list of strings
with open("results.csv", "w", newline="", encoding="utf-8") as out:
w = csv.writer(out)
w.writerow(["prompt", "reply", "in_tokens", "out_tokens"])
for p in prompts:
r = client.chat.completions.create(
model="uncensored",
temperature=0.7,
messages=[{"role": "user", "content": p}],
)
w.writerow([p, r.choices[0].message.content, r.usage.prompt_tokens, r.usage.completion_tokens])
CSV 파일을 열고 열을 하나씩 검토하세요. 토큰 열은 동일한 트래픽에 대한 비용 예측을 제공합니다: 합계를 1M당 $0.15 및 $0.50에 곱하세요. 체험 키는 분당 60개 요청과 동시에 2개까지 허용하므로, 루프를 순차적으로 유지하면 몇백 개의 프롬프트 세트가 몇 분 안에 완료됩니다.
짧은 마이그레이션 체크리스트
- 키를 얻으세요. API 키 페이지에서 Google 또는 이메일로 가입하고 $0.50 체험 크레딧을 청구하세요. 7일 동안 유효하며 카드가 필요하지 않습니다.
- 모델 이름과 URL을 설정 파일로 이동합니다. 한 곳에서 환경 변수에서 읽습니다.
- 테스트 프롬프트를 다시 실행합니다. 이전 모델이 거부한 것을 포함해 20~50개의 실제 예제를 사용하고 결과를 읽어보세요.
- 시스템 프롬프트를 조정합니다. 필터링된 모델을 설득하기 위해 존재했던 텍스트를 제거합니다. 역할, 대상 및 형식을 설명하는 내용만 유지합니다.
- 429 핸들러를 추가합니다. 5초 대기 후 재시도합니다. 키에 맞게 동시 요청 수를 제한하세요.
- 사용량을 확인합니다. 실제 트래픽을 실행하는 동안 응답의
X-Balance-USD을 모니터링하세요.
5단계를 처리하는 재시도 헬퍼:
import time
from openai import RateLimitError
def create_with_retry(**kwargs):
for _ in range(4):
try:
return client.chat.completions.create(**kwargs)
except RateLimitError:
time.sleep(5)
raise RuntimeError("rate limited after 4 tries")
이전 모델의 저장된 출력을 몇 주 동안 보관하세요. 전환 후 사용자가 뭔가 이상하다고 불만이라면, 이전 모델이 어떤 응답을 했을지 비교하여 차이가 프롬프트, 모델 아니면 입력에서 비롯된 것인지 확인하세요.
위험 없이 출시하기
모든 설정을 한 번에 변경하지 마세요. 제공업체 선택을 구성 뒤에 두어 트래픽의 일부를 전환하고 몇 초 내에 롤백할 수 있도록 하세요.
import os, random
from openai import OpenAI
old = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
new = OpenAI(base_url="https://api.chatgptunfiltered.com/v1", api_key=os.environ["UNFILTERED_API_KEY"])
SHARE = float(os.environ.get("NEW_SHARE", "0.05"))
def pick():
if random.random() < SHARE:
return new, "uncensored"
return old, os.environ["OLD_MODEL"]
5%로 시작하여 며칠 동안 오류율, 429 횟수 및 사용자 피드백을 관찰한 후 증가시키십시오. 롤백하려면 NEW_SHARE을 0으로 설정하십시오. 대화에서 모델을 변경하면 음성이 변하므로, 요청별 선택보다 사용자별 또는 기능별 선택이 더 좋습니다.
비용 및 유지가 적합한 경우
가격은 선불 크레딧 기준 입력 토큰 100만 토큰당 $0.15, 출력 토큰 100만 토큰당 $0.50입니다. 입력 1,500 토큰, 출력 400 토큰 요청의 비용은 1,500 x $0.15 / 1M = $0.000225, 그리고 400 x $0.50 / 1M = $0.0002이므로 총 $0.000425이며, 이는 1,000회 요청당 $0.425에 해당합니다. 다른 벤더의 경우 현재 가격 페이지를 확인하십시오; 요금은 변경되며 기억에 의존한 비교는 빠르게 낡습니다. 충전은 $20에서 $500까지의 전체 금액으로 암호화폐로 결제하며, $50 이상의 보너스가 제공됩니다. 가격 페이지에서 자세히 확인하십시오.
이미지나 임베딩이 필요하거나, 사용자에게 엄격한 검열이 필요하거나, 벤더별 모델이 필수 요구사항인 경우 현재 제공업체를 유지하는 것이 올바른 선택입니다. 이 모델 클래스의 배경에 대해 알아보세요 무검열 ChatGPT 모델 이해하기. 하드 리미트는 절대 변하지 않습니다: 미성년자가 관련된 성적 콘텐츠는 금지됩니다.
두 제공자를 함께 실행해도 좋습니다. 많은 팀은 일반 요청은 한 모델로, 거부 응답이 계속 발생하는 요청은 다른 모델로 라우팅합니다. 둘 다 동일한 형식을 지원하므로, 이 라우팅은 몇 줄의 코드와 어떤 경우에 어떤 모델을 사용할지 결정하는 규칙만으로 가능합니다.
