개발자를 위한 무검열 AI: 거절 없이 빌드
개발자를 위한 무검열 AI는 콘텐츠 규칙을 모델에서 애플리케이션으로 이동시킵니다. 이는 자유를 주지만, 규칙을 작성하고 시행할 책임도 당신에게 줍니다.
마지막 업데이트

핵심 사실
- 시스템 프롬프트에 제품 규칙을 작성하고 코드에서 확인하세요.
- 모델이 모든 것을 처리하지 않으므로 자체 입력 및 출력 검사를 추가하세요.
- 필요하지 않다면 전체 대화 대신 요청 ID, 토큰 수 및 해시된 사용자 ID를 로깅하세요.
- 귀하의 사용자 및 관할권에 대한 책임은 여전히 귀하에게 있습니다. 미성년자가 관련된 성적 콘텐츠는 절대 허용되지 않습니다.
모델이 거절을 멈출 때의 변화
주요 어시스턴트에서는 제공업체가 허용되는 것을 결정하고 모델이 나머지를 거절합니다. 합법적인 성인 용도로 콘텐츠 거절 없이 답변하도록 조정된 무검열 모델에서는 해당 레이어가 제거됩니다. 무검열 AI는 픽션 도구, 컴패니언 앱, 모델 동작 연구 및 주요 거절이 합법적인 작업을 방해하는 모든 제품에 유용합니다.
제공업체의 필터를 대체하는 것은 당신의 자체 설계입니다. 누가 앱을 사용할 수 있는지, 모델이 무엇을 쓸 수 있는지, 문제가 발생했을 때 어떻게 할지 결정합니다. 이 기사에서는 이 작업의 네 가지 부분인 시스템 프롬프트, 모더레이션 레이어, 로깅 및 귀하의 책임에 대해 다룹니다.
규칙을 명시하는 시스템 프롬프트로 시작하세요
시스템 프롬프트는 가장 저렴하고 첫 번째 제어 수단입니다. 짧은 정책처럼 평이한 문장으로 작성하고, 동작을 쉽게 추론할 수 있도록 릴리스 간에 안정적으로 유지하세요.
- 역할과 설정. 어시스턴트의 정체성과 제품의 용도.
- 대상. 모든 사용자 및 모든 캐릭터가 성인임을 명시하세요.
- 경계. 어시스턴트가 제품에서 작성해서는 안 되는 내용을 나열하세요. 예를 들어 미성년자가 관련된 콘텐츠, 실제 사적인 개인, 타인에게 해를 끼치는 지침 등이 있습니다.
- 형식. 길이, 어조, 언어, 범위 밖의 질문을 받았을 때의 행동.
SYSTEM = '''You are the narrator of an interactive fiction app for adult readers.
All characters are adults. Never write sexual content involving minors.
Do not write about real, named private individuals.
If a request is outside the story, say so briefly and return to the scene.
Keep replies under 200 words.'''
시스템 프롬프트는 지침일 뿐 보장은 아닙니다. 모델이 이탈할 수 있고 사용자가 이를 밀어붙일 수 있습니다. 이것이 다음 레이어가 존재하는 이유입니다.
모델 주변에 모더레이션 레이어를 구축하세요
모델에 도달하기 전과 모델이 응답한 후 두 번 텍스트를 확인하세요. 저렴한 규칙으로 명백한 사례를 잡고, 두 번째 모델 호출로 모호한 사례를 판단할 수 있습니다. JSON 모드는 판정을 파싱하기 쉽게 해줍니다.
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.bestuncensored.com/v1", api_key="YOUR_KEY")
BLOCKLIST = ["example banned phrase"] # your own rules
JUDGE = '''Classify the text. Reply with JSON: {"verdict": "allow" or "block", "reason": "short"}.
Block if it sexualizes anyone under 18, or asks for real-world harm.'''
def judge(text):
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "system", "content": JUDGE}, {"role": "user", "content": text}],
response_format={"type": "json_object"},
temperature=0,
)
return json.loads(r.choices[0].message.content)
def safe_reply(user_text, system):
low = user_text.lower()
if any(b in low for b in BLOCKLIST) or judge(user_text)["verdict"] == "block":
return "That request is outside what this app allows."
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "system", "content": system}, {"role": "user", "content": user_text}],
)
out = r.choices[0].message.content
if judge(out)["verdict"] == "block":
return "That reply was withheld by the app's content rules."
return out
Judge 호출은 일반 호출과 동일하게 토큰 비용이 발생합니다: 입력 1M당 $0.15, 출력 1M당 $0.50입니다. 300 토큰 체크와 20 토큰 판정에는 300 x $0.15 / 1,000,000 + 20 x $0.50 / 1,000,000 = $0.000045 + $0.00001 = $0.000055가 듭니다. 메시지당 두 번 체크하면 $0.00011이 추가되지만, 응답 비용에 비하면 작은 금액입니다. 필터는 완벽하지 않으므로 신고 버튼과 신고 항목 검토를 유지하세요.
과잉 저장하지 않는 로깅
디버깅, 오용 신고 처리 및 비용 감시를 위해 로그가 필요합니다. 모든 대화를 평문으로 저장할 필요는 없으며, 저장하면 귀하와 사용자에게 위험이 생깁니다. 이 API로 전송된 프롬프트는 학습에 사용되지 않지만, 자체 로그는 귀하의 책임입니다.
현명한 기본값은 메타데이터를 로깅하는 것입니다: 시간, 해시된 사용자 ID, X-Request-Id 응답 헤더, 토큰 수 및 모더레이션 판정입니다. 전체 텍스트는 짧은 보존 기간 동안 신고된 항목에 대해서만 저장하세요.
import hashlib, logging
log = logging.getLogger("llm")
def logged_call(user_id, messages):
raw = client.chat.completions.with_raw_response.create(
model="uncensored", messages=messages
)
resp = raw.parse()
log.info(
"user=%s req=%s in=%s out=%s balance=%s",
hashlib.sha256(user_id.encode()).hexdigest()[:12],
raw.headers.get("x-request-id"),
resp.usage.prompt_tokens,
resp.usage.completion_tokens,
raw.headers.get("x-balance-usd"),
)
return resp.choices[0].message.content
특정 호출에 대해 지원에 문의할 때 인용하는 요청 ID입니다.
유지할 책임
이것은 일반적인 정보이며 법률 조언이 아닙니다. 귀하의 사례에 대해서는 변호사와 상의하세요. 이러한 요점은 무검열 모델을 기반으로 한 대부분의 제품에 적용됩니다:
- 단호한 원칙. 미성년자가 관련된 성적 콘텐츠는 이 서비스에서 절대 허용되지 않으며, 어떤 시스템 프롬프트도 이를 변경할 수 없습니다. 자체 제품에서도 이 원칙을 따르세요.
- 연령 제한. 제품에 성인용 콘텐츠가 포함된 경우, 운영 지역이 허용하는 방식에 따라 연령을 확인하거나 제한하세요.
- 현지 법률. 성인 콘텐츠, 데이터 보호 및 기록 보관에 관한 규칙은 국가와 주마다 다릅니다. API가 실행되는 곳 어디에서나 당신과 사용자에게 적용됩니다.
- 약관 및 프라이버시 정책. 자체 이용약관과 개인정보 처리방침을 게시하세요. 제공자의 약관과 프라이버시 정책도 확인하세요.
- 키. API 키를 서버에 보관하고 브라우저나 앱 번들에는 넣지 마세요.
귀하의 오용 처리, 신고 처리 및 속도 제한
실제 사용자가 도착하면 일부가 규칙을 넘어서 밀어붙이려 할 것입니다. 첫날부터 이에 대비하세요.
- 사용자별 제한. 계정당 일일 메시지 수와 분당 요청 수를 제한하세요. 이는 예산을 보호하고 자동화된 오용을 늦춥니다. 자체 제한은 API의 제한보다 낮아야 합니다: 전체 키는 모든 사용자에 대해 분당 300개의 요청을 허용합니다.
- 신고 버튼. 사용자가 응답을 신고할 수 있게 하세요. 요청 ID와 신고된 대화의 텍스트를 저장하고, 정기적으로 큐를 검토하세요.
- 단계적 조치. 반복적인 위반 후 발생할 사항을 미리 결정하세요: 경고, 일시 정지, 영구 정지. 이를 이용약관에 명시하세요.
- 키 관리 관행. 계정에 충전이 완료되면 최대 5개의 레이블된 키를 보유할 수 있으므로 환경별로 하나씩 사용하세요. 클라이언트 코드에 키를 포함하지 마세요. 키가 유출되었을 가능성이 있는 경우 키 페이지에서 키를 재생성하세요. 이전 키는 즉시 작동하지 않게 됩니다.
큐는 시스템 프롬프트가 약한 부분도 보여줍니다. 동일한 유형의 플래그가 지정된 출력이 세 번 나타나면 프롬프트나 필터를 변경한 후 테스트 세트를 다시 실행하여 다른 부분이 손상되지 않았는지 확인하세요. 프롬프트를 코드처럼 취급하세요: 버전 관리에 보관하고 각 변경의 목적을 기록하세요.
제한 및 실패에 대비하세요
프로덕션 코드에는 백오프가 필요합니다. 전체 키는 동시 요청 8개와 분당 300개의 요청을 허용합니다. 제한을 초과하면 API는 HTTP 429를 반환하며 코드 rate_limited 또는 concurrency을 표시합니다. 일시적 과부하 시에는 Retry-After: 5와 함께 429를 반환합니다. 해당 헤더를 존중하세요. 메시지당 Judge 호출과 응답 호출을 모두 실행하는 경우 둘 다 제한에 카운트되므로, 큐 크기를 요청 수의 두 배에 맞게 조정하세요.
실패하거나 거부된 요청은 요금이 부과되지 않으므로 실패한 시도에서의 재시도는 비용이 들지 않습니다. 문서에는 매개변수 목록이 있으며, API 키 페이지에서 제공되는 무료 체험 크레딧으로 모든 기능을 테스트할 수 있습니다. 이 분야의 옵션에 대해서는 무검열 AI 옵션 비교를 참조하세요.
출시 전 검토
실제 사용자가 도착하기 전에 공격자처럼 스크립트된 세션을 한 번 통과하세요. 직접 묻거나, 역할극을 하거나, 요청을 여러 턴에 나누거나, 지침이 포함된 텍스트를 붙여넣어 앱이 규칙에서 금지하는 무언가를 생성하도록 해보세요. 새어 나온 것을 기록하고 적절한 레이어에서 수정하세요.
- 모델이 시스템 프롬프트의 규칙을 무시하는 경우, 문구를 강화하고 코드에서 검사를 추가하세요.
- 검사가 너무 많은 합법적인 콘텐츠를 차단하면 규칙을 완화하거나 허용 경로를 추가하고 실제 프롬프트 샘플에서 잘못된 차단률을 측정하세요.
- 문제가 긴 채팅에서만 발생하는 경우, 컨텍스트가 커짐에 따라 규칙이 흐려지므로 전체 기록으로 테스트하세요. 100,000 토큰 컨텍스트 창은 규칙을 상단에 유지하고 끝에 짧은 알림을 반복할 수 있는 여유를 줍니다.
프롬프트, 필터 또는 모델 설정을 변경할 때마다 이 검토를 반복하세요. 테스트 케이스를 파일에 보관하고 자동화된 검사로 실행하여 규칙을 위반하는 변경 사항이 출시 전에 실패하도록 하세요.
더 많은 가이드
기술 FAQ
API 키를 획득하세요
등록하고, 키를 가져온 다음, 엔드포인트 URL을 업데이트하세요. 간단합니다.
무검열 모델이 모더레이션의 필요성을 없애주나요?
- 아닙니다. 벤더의 응답 거부를 제거하므로 규칙이 당신 것이 됩니다. 제품에 맞는 시스템 프롬프트 규칙과 입력/출력 검사를 추가하세요.
두 번째 모델 호출을 필터로 사용할 수 있나요?
- 네. 짧은 지침과 낮은 temperature로 JSON 모드를 사용하고 판정을 파싱하세요. 각 체크에는 소량의 토큰이 필요합니다.
내 프롬프트는 학습에 사용됩니까?
- 아니요. 프롬프트는 학습에 사용되지 않습니다.
절대 허용되지 않는 것은 무엇인가요?
- 미성년자가 관련된 성적 콘텐츠. 본 서비스는 합법적인 성인용으로 제공됩니다.
전체 대화를 로그해야 하나요?
- 명확한 이유가 있을 때만 하세요. 요청 ID 및 토큰 수와 같은 메타데이터가 보통 충분하며, 전체 텍스트는 플래그가 지정된 항목에만 유지됩니다.