無検閲AI:拒否なしで開発
開発者向け無検閲AIは、コンテンツルールをモデルからアプリケーションへ移します。これにより自由が得られますが、そのルールを記述し適用する役割もあなたにあります。
最終更新日

主要な事実
- システムプロンプトにプロダクトのルールを記述し、コードでチェックします。
- モデルがすべてを行わないため、独自の入出力チェックを追加してください。
- 必要な場合を除き、生会話ではなくリクエストID、トークン数、ハッシュ化されたユーザーIDをログに記録します。
- ユーザーと管轄区域について責任を負います。未成年者を含む性的コンテンツは常に禁止されています。
モデルが拒否しなくなったときの変化
メインストリームのアシスタントではベンダーが許容範囲を決定し、モデルはそれ以外を拒否します。合法的な成人向け利用でコンテンツ拒否なしに回答するよう調整された無検閲モデルでは、そのレイヤーがなくなります。無検閲AIはフィクションツール、コンパニオンアプリ、モデル挙動の研究、およびメインストリームの拒否が合法的な作業の妨げになるプロダクトに役立ちます。
ベンダーのフィルターに代わるのはあなた独自の設計です。誰がアプリを使用できるか、モデルが何を記述できるか、何かが間違えた場合にどうするかを決定します。この記事では、その役割の4つの部分について説明します:システムプロンプト、モデレーションレイヤー、ログ記録、およびあなたの責任です。
ルールを明記するシステムプロンプトから始める
システムプロンプトは最も安価な制御手段です。簡潔なポリシーのように平易な文で記述し、リリース間で安定させて挙動を推論しやすくします。
- 役割と設定。 アシスタントが誰であり、製品が何のためのものか。
- 対象ユーザー。 すべてのユーザーとすべてのキャラクターが大人であることを明記する。
- 境界線。製品でアシスタントが書いてはならない内容をリスト化します。例えば、未成年者が関わるコンテンツ、実在の私人、または他者を傷つけるための指示などです。
- フォーマット。 長さ、トーン、言語、範囲外の質問への対応方法。
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.'''
システムプロンプトはガイダンスであり保証ではありません。モデルは逸脱する可能性があり、ユーザーがそれを試すこともあります。これが次のレイヤーの存在理由です。
モデルの周りにモデレーションレイヤーを構築する
テキストを2回チェックします:モデルに到達する前とモデルの返信後。簡単なルールで明らかなケースを捕捉し、2回目のモデル呼び出しでグレーゾーンを判断します。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 で、20 トークンの判定を含む 300 トークンのチェックには 300 x $0.15 / 1,000,000 + 20 x $0.50 / 1,000,000 = $0.000045 + $0.00001 = $0.000055 かかります。メッセージごとに 2 回のチェックを追加すると $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キーをサーバーに保持し、ブラウザやアプリバンドルには入れないでください。
独自の不正使用、レポート、レート制限
実際のユーザーが到着すると、ルールを超えようとする者が現れます。これを最初の日に計画してください。
- ユーザーごとの制限。アカウントあたりの1日あたりのメッセージ数と1分あたりのリクエスト数を制限します。これにより予算が保護され、自動化された不正使用が抑制されます。独自の制限は API の制限より低く設定すべきです:フルキーは全ユーザー合計で 1 分あたり 300 リクエストを許可します。
- レポートボタン。 ユーザーが返信をフラグ付けできるようにする。リクエストIDとフラグ付きの会話のテキストを保存し、定期的にキューを確認する。
- エスカレーション。 繰り返し違反後に何が起こるかを事前に決定する:警告、一時的なブロック、BAN。それをあなたの利用規約に書き込む。
- キーの衛生管理。アカウントがチャージされると、最大 5 個のラベル付きキーを保持できます。環境ごとに 1 つを使用してください。クライアントコードにキーを出力しないでください。キーが漏洩した可能性がある場合は、キーページで再生成してください。古いキーはすぐに使用できなくなります。
キューはシステムプロンプトの弱点も示します。同じ種類のフラグ付き出力が3回出現した場合、プロンプトまたはフィルタを変更し、テストセットを再実行して他の変更が壊れていないことを確認します。プロンプトをコードのように扱い、バージョン管理に保持し、各変更の目的を記録してください。
制限と障害への計画
本番環境のコードにはバックオフ処理が必要です。フルキーは 8 件の同時リクエストと 1 分あたり 300 件のリクエストを許可します。制限を超えると、API はコード rate_limited または concurrency を伴う HTTP 429 を返し、一時的な過負荷時には Retry-After: 5 を伴う 429 を返します。そのヘッダーを尊重してください。メッセージごとに 判定の呼び出しと返信の呼び出し の両方を実行する場合、両方が制限の対象となるため、キューのサイズをリクエスト数の 2 倍分に設定してください。
失敗または拒否されたリクエストは課金されないため、失敗した試行の再試行にはコストがかかりません。docsにはパラメータがリストされており、API キーページから試用クレジットですべてを試すことができます。この分野のオプションについては、無検閲 AI オプションの比較をご覧ください。
リリース前のレビュー
実際のユーザーが到着する前に、攻撃者としてスクリプト化されたセッションを1回実行します。直接質問、ロールプレイ、リクエストをターンに分割、指示を含むテキストの貼り付けにより、ルールで禁止されたコンテンツを生成させます。漏れたものを記録し、適切なレイヤーで修正します。
- モデルがシステムプロンプトのルールを無視する場合、文言を強化し、コードにチェックを追加します。
- チェックが合法なコンテンツを過度にブロックする場合、ルールを緩和するか許可パスを追加し、実際のプロンプトのサンプルで誤ブロック率を測定してください。
- 問題が長いチャットでのみ発生する場合、コンテキストが長くなるにつれてルールが変化するため、完全な履歴でテストしてください。100,000 トークンのコンテキストウィンドウがあれば、ルールを上部に保持し、末尾近くに短いリマインダーを繰り返す余裕があります。
プロンプト、フィルタ、またはモデル設定を変更するたびにこのレビューを繰り返します。テストケースをファイルに保持し、自動化されたチェックとして実行して、ルールを壊す変更がリリース前に失敗するようにします。
その他のガイド
技術的なFAQ
API キーを取得する
登録してキーを取得し、エンドポイントURLを更新します。簡単です。
無検閲モデルはモデレーションの必要性をなくしますか?
- いいえ。ベンダーの拒否を除外するため、ルールはあなた次第になります。プロダクトに合ったシステムプロンプトルールや入出力チェックを追加してください。
2回目のモデル呼び出しをフィルターとして使えますか?
- はい。短い指示と低い温度でJSONモードを使用し、判定を解析します。各チェックには少量のトークンが必要です。
私のプロンプトはトレーニングに使用されますか?
- いいえ。プロンプトはトレーニングに使用されません。
絶対に許可されないものは何ですか?
- 未成年者を含む性的コンテンツ。本サービスは合法的な成人向け利用向けです。
会話全文をログに記録すべきですか?
- 明確な理由がある場合のみ。リクエストIDやトークン数などのメタデータで十分な場合が多く、全文はフラグ付きアイテムのみ保持します。