跳转到主要内容
你需要捕获的有些东西不是一个字面词,也不是一个带类型的 PII 实体——它是一个形态。一个 SKU 格式、一个订单号布局、一个内部 URL 模式、一个优惠码、一个合同引用。一条 regex 规则让你在 每一次调用上匹配那个形态,然后在提示词到达模型之前、在响应到达 你的用户之前,blockmaskflag 它。 这是结构化模式用例的专注落地页。完整的防护栏引擎——每种规则 类型、字段和路由——请见防护栏参考
这里的每一步都是托管网关(api.orcarouter.ai)上的控制台 操作。你在自己的会话下编写防护栏;只有最后的 /v1/* 调用使用 sk-orca-... 中继密钥。创建和编辑防护栏需要工作区中的 Developer+

1. 你何时需要一个正则 LLM 防护栏控制

当你想捕获的东西具有字面拒绝列表无法表达的结构但又不是 pii 检测器已经覆盖的标准 身份时,regex 规则是正确的工具。

结构化代码

SKU、优惠码、合同引用、内部工单 ID——一个固定前缀加上一个 数字或字母数字串。

格式形态的词项

任何按形态而非有限词列表匹配的东西——一个订单号布局、一个 序列号格式、一个内部 URL 模式。

输出泄露模式

一个不应暴露内部主机名、文件路径或记录 ID 格式的响应——扫描 模型的输出中的该形态。

廉价、确定性的检查

纯模式匹配,无模型调用,无网络——可以安全地在任一方向的 每一个请求上运行。
选择最轻的合适工具。一份有限的字面词项列表 → 关键词拒绝列表。一个你想要 带类型脱敏标签([EMAIL][SSN])或 Luhn 校验的命名身份形态 → 一个 PII / 自定义实体。 一个没有按实体类型的结构性模式 → 一条 regex 规则,本页所讲。

2. RE2——线性时间,无反向引用

regex 规则的 pattern 是一个 Go RE2 正则。RE2 是让 regex 规则可以安全地在每一个请求上运行的引擎:
无论模式如何,RE2 都保证匹配时间与输入长度成线性关系。一个 回溯引擎可能在一个对抗性输入上指数级爆炸(一次”ReDoS”);RE2 不会。这就是为什么你的模式可以安全地在热路径上对每一次调用 求值。
RE2 不支持反向引用(\1)、前瞻或后顾。如果你正在移植一个 依赖这些的 PCRE 模式,请把它重写为不用它们。字符类、锚点、 量词、交替和非捕获组都如预期工作。
没有单独的”忽略大小写”开关——内联设置标志。用 (?i) 前缀表示 不区分大小写,(?m) 表示多行。示例:(?i)\bproject-orca\b
规则构建器在你保存防护栏时编译你的模式。无法编译的模式会被 拒绝,错误中带有规则索引,因此一个糟糕的检测器永远不会到达 中继路径。
RE2 模式不是 PCRE。最常见的移植意外是一个反向引用或一个前瞻—— 两者都不支持。改为把匹配写成一个字符类 / 交替模式,并在绑定 密钥之前在 Test 标签页中验证它。

3. 正则规则的剖析

regex 规则是继 keyword 之后引擎中最小的规则:一个模式、一个 阶段和一个动作。
字段它做什么
pattern一个 Go RE2 正则(线性时间,无反向引用)。必须能编译。
stageinput(请求)、output(响应)或 both
actionblockmaskflag
mask 动作下,每个匹配项会被就地替换为一个单一的字面 [REDACTED] 标签——regex 规则不带类型,因此它不渲染像 [EMAIL] 这样的按实体标签。如果你想要一个带类型的标签或一个自定义替换 词项,改为把该形态建模为一个 自定义 PII 实体

4. 一个具体示例

假设你的内部订单号看起来像 ORD- 后跟八位数字,而你绝不想让 一个被回显在模型的响应中。在 output 阶段添加单条 regex 规则:
{
  "type": "regex",
  "stage": "output",
  "action": "mask",
  "pattern": "ORD-\\d{8}"
}
在控制台中编写它:
1

创建防护栏

打开 Guardrails,点击 New guardrail,给它命名(≤ 64 字符),例如 order-id-filter
2

添加一条正则规则

添加一条规则——Type: Regular expression,Stage: Output, Action: Mask——并粘贴模式 ORD-\d{8}。保存。
3

在沙箱中测试它

打开 Test 标签页,粘贴一个样本,选择 output 阶段,并在 本地运行当前策略——没有上游调用,没有配额:
Your order ORD-48291507 has shipped.
Your order [REDACTED] has shipped.
4

绑定一个密钥

编辑一个 API 密钥,从 Guardrail 下拉菜单选择 order-id-filter(在密钥上设置 guardrail_id),或将该防护栏 标记为工作区默认值。参见 绑定到密钥账户默认值
然后像以前一样调用 OrcaRouter——无需新的请求头,无需修改 SDK:
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": "What is the status of my order?"}
    ]
  }'
订单号会在响应到达你的用户之前被脱敏。

5. 阶段与流式覆盖

你选择的动作会与响应是否流式相互作用:
动作非流式流式
block(输出)执行执行——扫描器切断流
mask(输出)执行执行——扫描器改写缓冲区
输入阶段规则在上游调用之前运行,因此它们不受流式影响—— 在模型看到请求之前脱敏请求已上线。输出 mask 和输出 block 在流式和非流式响应上都会执行。参见 流式覆盖

6. 选择一个动作

regex 规则为每条规则选择一个动作:
任何匹配都会以 HTTP 400 guardrail_blocked 拒绝请求。 被拦截的请求不消耗配额——输入阶段拦截在计量之前触发; 输出阶段拦截会退回预先扣除的配额——并被标记为 skip-retry。 参见 guardrail_blocked 错误
每个匹配项会被就地替换为 [REDACTED],请求带着净化后的文本 继续——上游模型(输入阶段)或你的用户(输出阶段)永远看不到 原始内容。参见动作
记录一条匹配并且不改变流量的任何方面。一个新模式的正确起点: 把它作为 flag 上线,观察 Matches 信息流,信任它后再晋级到 mask/block
记录一条匹配并附加一条注释(例如一个要在分诊中呈现的发现), 而不改变流量。参见动作
一种输入阶段防御:每个匹配项被包裹在分隔符(例如 ⟦UNTRUSTED⟧…⟦/UNTRUSTED⟧)中,告诉模型把文本视为数据, 而不是指令——一种提示注入缓解。参见 动作

7. 查看触发了什么——并调优精度

每条触发的规则都会在工作区 Matches 信息流中记录一条匹配—— 规则类型、动作、阶段和一个详情字符串。
匹配的子串在开启 Log raw content 时才记录,而它 默认关闭——隐私保守的姿态。关闭它时你仍然能看到一条正则 规则触发了以及多频繁,只是看不到它捕获的字面文本。当你需要 子串进行分诊时按防护栏开启它;该设置不可追溯。参见 Matches 信息流日志与隐私
一个过宽的模式是经典的正则陷阱——\d{8} 匹配每一个八位数字串, 而不仅仅是你的订单号。给它加锚点(一个像 ORD- 的固定前缀、 词边界 \b),观察 Matches 信息流,并标记误报以随着进展收紧。 要针对一个语料库做 A/B 对照——证明一个模式捕获它该捕获的而不 flag 良性流量——Eval 工具就在 隔壁那个标签页。参见 调优误报

8. 接下来去哪里

自定义 PII 实体

当形态是一个你想要带类型脱敏标签或 Luhn 校验和——而不是一个 裸 [REDACTED]——的身份时。

敏感词

一份有限的字面词项列表——当你不需要结构时比一个模式更简单。

动作

block、mask 和 flag 有何不同以及何时使用每一个。

防护栏参考

完整引擎——每种规则类型、字段和路由。
regex 规则治理内容。要治理智能体的工具调用——拒绝破坏性 动作、脱敏工具调用参数、要求审批——请使用 防火墙及其 规则匹配器。对于任何模式都无法表达的 模糊策略(毒性、跑题、注入意图),一条 llm_judge 规则会针对 一个工作区模型运行语义检查。要了解正则在整体设计中的定位,请 阅读防护栏 vs 防火墙