无审查 AI 面向开发者:构建无拒绝
面向开发者的无审查 AI 将内容规则从模型转移到你的应用程序。这赋予你自由,也赋予你制定和执行这些规则的责任。
最后更新于

关键事实
- 在系统提示词中编写产品规则,并在代码中进行检查。
- 添加你自己的输入和输出检查,因为模型不会为你完成所有工作。
- 记录请求 ID、token 计数和哈希用户 ID,除非需要,否则不要记录原始对话。
- 你仍需对你的用户和司法管辖区负责。禁止涉及未成年人的性内容。
当模型不再拒绝时,会发生什么变化
使用主流助手时,供应商决定什么是可接受的,模型会拒绝其余部分。对于无审查模型,针对合法成人用途调整以无内容拒绝方式回答,该层已消失。面向开发者的无审查 AI 对小说工具、陪伴应用、模型行为研究以及主流拒绝阻碍合法工作的任何产品都有用。
取代供应商过滤器的是你自己的设计。你决定谁可以使用应用、模型可以写什么,以及出错时如何处理。本文涵盖该工作的四个部分:系统提示词、审核层、日志记录和你承担的责任。
从声明规则的 system prompt 开始
系统提示词是你最便宜的控制手段。像简短政策一样编写它,使用直白的句子,并在版本之间保持稳定,以便轻松推敲行为。
- 角色与设定。 定义助手是谁以及产品的用途。
- 受众。 声明所有用户和所有角色均为成年人。
- 边界。 列出助手在你的产品中不得撰写的内容,例如涉及未成年人的内容、真实私人个体或伤害他人的指令。
- 格式。 长度、语气、语言,以及当被问及超出范围的问题时该怎么做。
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
审查调用像任何调用一样消耗 token:输入每 1M token $0.15,输出每 1M token $0.50。300 token 的检查加上 20 token 的审查结果,费用为 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 响应头、token 计数和审查结果。仅对标记项存储全文,并设置较短的保留期。
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。请尊重该头信息。如果你为每条消息运行审查调用和回复调用,两者都计入限制,因此将队列大小设置为请求量的两倍。
失败或被拒绝的请求不收费,因此针对失败尝试的重试不产生费用。文档 列出了参数,你可以使用 API 密钥页面 的试用额度尝试一切。有关此领域的选项,请参阅 无审查 AI 选项对比。
发布前审查
在真实用户到来之前,像攻击者一样进行一次脚本会话演练。尝试通过直接提问、角色扮演、跨轮次拆分请求以及粘贴包含指令的文本,让应用生成你的规则禁止的内容。记录哪些内容漏掉了,并在正确的层修复。
- 如果模型忽略系统提示词中的规则,请收紧措辞并在代码中添加检查。
- 如果检查阻止了太多合法内容,请放宽规则或添加允许路径,并在真实提示词样本上测量错误阻止率。
- 如果问题仅出现在长对话中,请使用完整历史记录进行测试,因为随着上下文增长,规则会漂移。100,000 token 的窗口让你有机会将规则保持在顶部,并在末尾重复简短的提醒。
每次更改提示词、过滤器或模型设置时,重复此审查。将测试用例保存在文件中并作为自动化检查运行,以便破坏规则的更改在发布前失败。
更多指南
技术常见问题
获取你的 API 密钥
注册,获取密钥,并更新你的接口 URL。简单。
无审查模型是否意味着我不需要内容审核?
- 不是。它移除了供应商的拒绝,因此规则由你制定。添加符合你产品的系统提示词规则和输入输出检查。
我可以将第二次模型调用用作过滤器吗?
- 可以。使用 JSON 模式配合简短指令和低 temperature,然后解析结果。每次检查消耗少量 token。
我的提示词会用于训练吗?
- 不会。提示词不用于训练。
什么是不允许的?
- 禁止涉及未成年人的性内容。该服务适用于合法的成人用途。
我应该记录完整的对话吗?
- 仅在你有明确理由时。请求 ID 和 token 计数等元数据通常就足够了,全文仅保留标记项。