跳转到主要内容
每条防护栏规则回答三个问题——查找什么(一个类型)、在哪里 查找(一个阶段),以及如何处理它(一个动作)。本页讲的是 第三个选择。规则的动作是它身上影响最大的单一字段:它决定 一个匹配是停止请求、悄悄改写它,还是只留下一个面包屑。 规则构建器总共会出现五种动作——blockmaskflagannotatespotlight。本页涵盖你最先会用到的三个执行 选择:blockmaskflag。每条规则选一个(或者,对于 PII 规则,把不同实体路由到不同动作;参见 §5)。另外两个是塑形提示词的非拦截 动作:annotate 向上游注入一条安全注释(参见 代码安全),spotlight 用分隔符包裹匹配到的不可信输入,让模型将其视为数据而非 指令。完整清单见防护栏概览 更广的引擎——规则类型、阶段、把策略绑定到密钥——从 防护栏概览或完整的 防护栏参考开始。

1. 一句话讲清 block mask flag 的取舍

block

HTTP 400 guardrail_blocked 拒绝调用。模型从不运行 (输入阶段)或其答案从不返回(输出阶段)。

mask

脱敏每个匹配项——例如 jane@acme.com[EMAIL]——并放行 净化后的文本。请求继续。

flag

不改变流量的任何方面。在信息流中记录一条匹配然后 继续。仅观察。
这是三种执行动作。无论你设置哪一个,它在规则运行的每个地方 都会被遵循——控制台规则构建器、Test 沙箱 和真实的 /v1/* 中继路径读取的都是同一个 block / mask / flag 值。

2. 一个具体示例——三条规则,三种动作

这里是一个防护栏,它的三条规则各自选了不同的动作。你在 控制台(/console/guardrails)的会话上编写它——sk-orca-... 中继密钥只用于 /v1/* 调用,绝不用于编辑策略。创建或编辑 防护栏需要 Developer+ 角色。
{
  "rules": [
    { "type": "keyword", "stage": "input",  "action": "block",
      "keywords": ["internal-only", "do-not-share"] },
    { "type": "pii",     "stage": "input",  "action": "mask",
      "entities": ["email", "phone"] },
    { "type": "regex",   "stage": "output", "action": "flag",
      "pattern": "(?i)acme\\s+confidential" }
  ]
}
每条规则对一个请求做什么:
  • block 规则拒绝任何包含那些字面词项之一的提示词——HTTP 400,模型从不运行。
  • mask 规则在模型看到提示词之前,把 email 和电话号码 改写为 [EMAIL] / [PHONE]
  • flag 规则监视模型的输出中是否有机密标记,并在不改变 响应的情况下记录一条匹配——这样你可以在决定执行之前衡量 它出现的频率。
引擎运行每一条适用的规则并将结果汇聚为一个判定。如果 任何规则拦截,请求就被拦截。

3. block——以 HTTP 400 拒绝

block 动作拒绝整个调用。调用方会得到 HTTP 400,错误码为 guardrail_blocked,消息中指明触发的防护栏和规则。
输入阶段拦截在计量之前触发,因此什么都不消耗。 输出阶段拦截会在拒绝答案后退回预先扣除的配额。无论 哪种方式,调用方都不为被拦截的调用付费。
一个 guardrail_blocked 结果是 skip-retry——针对另一个 通道重新运行同一个提示词只会再次拦截,因此网关不会浪费 一次重试。参见 guardrail_blocked 错误
非流式响应上,答案会在返回前被筛查。在流式 响应上,一个扫描器会中途切断流,并在任何被拦截的内容 到达客户端之前发出一条替换消息。参见 流式覆盖
当一个匹配意味着请求绝不能继续时使用 block——提示词中的 密钥、一次越狱尝试、一条硬性合规红线。

4. mask——脱敏并继续

mask 动作脱敏每个匹配项,并带着净化后的文本放行请求。 上游模型永远看不到原始内容。在 PII 规则上,每个匹配项会被 替换为一个从实体派生的带类型的标签——email 变成 [EMAIL], SSN 变成 [SSN],信用卡变成 [CREDIT_CARD],依此类推。(你可以 按自定义实体覆盖替换字符串;参见 脱敏格式。)
输入阶段脱敏在每个流上都已上线。 它在模型运行之前改写 请求,无论是否流式。输出阶段脱敏只适用于非流式响应—— 被脱敏的文本在完整答案被筛查后转发。在流式响应上,网关 计算脱敏但尚未转发被脱敏的文本,因此 mask 规则今天不会 脱敏流式回复;带内的流式输出脱敏在规划路线图上。(输出 block 仍会中途切断流——参见 §3。)先在沙箱中证明你具体的 阶段/流组合。参见 流式覆盖
内容没问题但某个子串不应到达模型时使用 mask——PII 脱敏是典型用例。开箱即用的起点是 PII Shield 预设;参见 PII Shield

5. flag——只记录,不改变任何东西

flag 动作是仅观察:请求与一个完全没有规则的请求字节 相同,只是会在Matches 信息流 中记录一条匹配。什么都不拦截,什么都不脱敏。
flag 是你在执行某条规则之前衡量它的方式。把一个新的 keyword 或 regex 作为 flag 上线,观察 Matches 信息流几天, 看它在真实流量上的真阳/假阳比率,等你信任它之后再把它晋级到 maskblock。开着 flag 调优一个嘈杂的模式,胜过开着 block 在生产中发现误报。参见 调优误报
一条被 flag 的匹配会记录规则类型、动作、阶段和一个详情 字符串——而匹配的子串仅当该防护栏开启了 Log raw content 时才记录(默认关闭,隐私保守的姿态)。参见 日志与隐私

6. 按实体的动作覆盖

单条 PII 规则可以通过 entity_actions 把不同实体路由到 不同动作,而不必堆叠互相重叠的规则。每个覆盖值必须是 block / mask / flag / annotate 之一,并且必须引用该规则 已经声明的实体——校验器会拒绝其他任何内容。
{
  "type": "pii",
  "stage": "input",
  "action": "mask",
  "entities": ["email", "phone", "ip", "credit_card", "ssn"],
  "entity_actions": {
    "credit_card": "block",
    "ssn": "block"
  }
}
这一条规则脱敏 email、电话和 IP,但在遇到卡号或 SSN 时 直接拦截请求。参见 自定义 PII 实体,了解 如何在同一个覆盖模型下叠加你自己的检测器。

7. 选择正确的动作

如果你想…使用效果
完全停止请求blockHTTP 400,无配额,skip-retry
剥离一个子串,保留调用mask转发被脱敏的文本
在不触碰流量的情况下观察flag仅记录匹配
动作与阶段组合。同一个动作在输入与输出上行为略有不同—— 输入拦截在前期节省配额;输出拦截退回配额;输出脱敏只适用于 非流式响应,而输出拦截在流式和非流式响应上都会切断。请将 输入阶段输出阶段与本页一起阅读。

8. 接下来去哪里

guardrail_blocked 错误

一个 400 是什么样子、为什么它不消耗配额,以及 skip-retry 如何工作。

脱敏格式

带类型的标签、自定义替换字符串,以及被脱敏的提示词在 模型看来是什么样子。

流式覆盖

今天究竟哪些 动作 × 阶段 × 流 组合会被执行。

执行模式

block / mask / flag 如何映射到网关更广的执行模型,包括 防火墙的 audit 判定。
防火墙对工具策略有它自己的判定词汇表(allow、audit、deny、 sanitize 等)——与这些内容动作不同。参见 防护栏 vs. 防火墙