跳转到主要内容
一个通过了自身安全训练的模型,仍然可能发出你不能交付的文本: 客户回复里的脏话、你的品牌助手里出现的竞争对手名字、你的合规 团队绝不会签字认可的一个确定性法律论断。提示词看起来没问题; 出问题的是响应 OrcaRouter 在网关上、在输出阶段筛查模型的响应,于它到达 你的客户端之前。该检查是一条在上游模型作答之后运行的 防护栏规则,并收敛为一个判定——拦截 该响应、对违规片段做 mask,或为审查 flag 它——独立于由哪个 模型来服务该请求。

1. 为何要在输出阶段筛查 unsafe ai output

输入筛查能捕获一个糟糕的提示词。它捕获不了一个糟糕的答案: 一个被诱导偏离策略的模型、一个内置防护更弱的微调模型,或者 一条完全合理的提示词却产生了一个不合理的补全。输出阶段正是 你断言”无论原因如何,这段文本都不会离开网关”的地方。 一条网关规则确定性地触发,并对你密钥背后的每一个模型一视同仁 地应用。而且每一条触发的规则都会落入工作区 Matches 信息流——规则 类型、动作、阶段——于是你就有了一份关于什么被捕获、什么被放行 的审计追踪。
防御存在于网关,而非你的应用。 编辑该防护栏,变更就会在 下一次调用时对每个附加到它的密钥生效——无需重新部署,无需 修改 SDK。你的应用照旧一字不差地调用 /v1/chat/completions

2. 捕获它的两种方式

把一个确定性的拒绝列表与一个语义裁判配对,构成纵深防御。
一条 keyword 规则是不区分大小写的子串匹配;一条 regex 规则是一个 RE2 模式(线性时间,无反向引用)。两者都在热路径上 运行,没有网络调用——非常适合一个已知的禁用词列表、一个 竞争对手拒绝列表,或一个结构性模式(一个泄露的 chat-template 令牌、一个确定性的”you are entitled to damages”措辞)。
一条 llm_judge 规则使用你工作区里的一个模型,依据你编写的 评分准则对响应求值——有毒性、偏离品牌的语气、任何字面列表 都捕获不到的偏离策略建议。它携带一个 judge_timeout_ms默认 fail-open(一次裁判错误会被记录而响应继续),且它的 token 作为一条裁判子项计费。参见 LLM 裁判参考

3. 一个具体示例——block 有毒、mask 偏离品牌

一条单一的输出阶段防护栏,在语义上 block 一个有毒响应,并对 剩下的任何内容里的禁用品牌词做 mask
{
  "name": "safe-output",
  "rules": [
    {
      "type": "llm_judge",
      "stage": "output",
      "action": "block",
      "judge_model": "openai/gpt-4o-mini",
      "judge_format": "yes_no",
      "judge_rubric": "Does this response contain toxic, harassing, hateful, or otherwise unsafe content? Answer yes or no.",
      "judge_fail_open": true
    },
    {
      "type": "keyword",
      "stage": "output",
      "action": "mask",
      "keywords": ["competitor-name", "internal-codename"]
    }
  ]
}
在控制台里编写它——打开 /console/guardrailsNew guardrail,添加这两条规则,并从 Token 编辑器把它附加到一个 密钥(绑定关系作为 guardrail_id 存在于密钥上)。配置运行在 你的控制台会话上,而非你的中继密钥上;只有下面的 /v1/* 调用 才使用 sk-orca-... 密钥。
curl https://api.orcarouter.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-orca-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "messages": [{"role": "user", "content": "Draft a reply to this angry customer"}]
  }'
如果模型返回一个有毒草稿,该响应会被以 HTTP 400 guardrail_blocked 扣下。如果它干净但提到了一个禁用词,那个 片段会渲染为一个带类型的脱敏,其余内容照常流过。
在附加之前先迭代。编辑器内的 Test 标签会在 output 阶段对 一个样本响应运行当前策略——没有上游调用,不消耗配额——而 Eval 标签会对一个语料库运行它,让你在投产前就能证明捕获率 和误报率。参见 评估框架

4. 从一个预设起步

New guardrail 模板库在 SafetyBrandCompliance 类别里附带了现成的起点。一个预设是一颗种子——应用它,然后 自由编辑。
类别可起步的输出阶段预设
SafetySystem-Prompt Leak Detector(output)、Strong System Prompt Leak——对回显系统提示词或 chat-template 令牌的响应 flag/block。
BrandProfanity Filter(mask)——在两个阶段都运行,并对响应中位于拒绝列表的词做 mask。(block 风格的 Profanity / Brand Safety 和 Competitor Mentions 预设是输入阶段的种子;如果你想用它们来筛查答案,把一个副本重新指向 output。)
ComplianceLegal Disclaimer Enforce——对给出确定性法律/财务建议的响应 flag,交团队审查。
Compliance 类别还打包了与框架对齐的策略;对于由某个框架 驱动的受审计上线,安装一个 合规包,并把审计追踪与 审计追踪 配对。

5. 流式:那个要紧的注意事项

一条输出规则是否被实时执行,取决于动作以及你是否流式。
动作非流式流式
block响应被扣下;HTTP 400 guardrail_blocked扫描器中途切断数据流并发出一条替代消息——被拦截的内容永远到不了客户端
mask在返回的文本中脱敏匹配当下仅限非流式;带内的流式改写在路线图上
flag记录一次匹配,不改变任何内容记录一次匹配,不改变任何内容
输出 mask 在流式响应上尚未上线。 如果你流式,并依赖 mask 来脱敏偏离品牌的片段,原始块会原样不经 mask 地通过。要么在 mask 响应时请求非流式,要么对绝不允许离开网关的内容使用一条 block 规则(在流式非流式上都被执行)。同样的注意事项也 适用于 PII Shield 预设,它实时 的 mask 当下是输入阶段的。
一个被拦截的响应不消耗配额——输出阶段的 block 会在响应被 拒绝后退还预先消耗的配额——并被标记为 skip-retry,因为 重新运行同一条提示词只会再次被拦截。

6. 推荐的策略形态

在一条防护栏里叠加三条规则

  1. output 上的 keyword / regex——对已知禁用词和结构性 模式的零延迟捕获。
  2. output 上的 llm_judge——对字面列表所遗漏内容的语义 有毒性 / 偏离品牌 / 偏离策略捕获。
  3. 先以 flag 上线,观察 Matches 信息流,等 误报率可接受后再晋升为 block。参见 执行模式
要同时筛查请求——那些一开始就产生不安全输出的越狱和注入 尝试——请在这条规则旁边运行一条输入阶段的防护栏。参见 越狱提示注入

防护栏参考

规则类型、动作、阶段、LLM 裁判、预设、评估框架和 Matches 信息流的完整参考。

数据外泄

阻止敏感数据在模型响应或工具调用中离开。