跳转到主要内容
一个面向客户的聊天机器人会从公众那里接收不可信的输入并把它发送给 模型。这使它成为你运行的暴露面最高的执行面:用户会粘贴进你不想被 上游存储的 PII,攻击者会试图覆盖你的系统提示,而模型可能把密钥或 不安全内容回显进聊天窗口。本配方接好端到端保护一个 AI 聊天机器人的 四项控制——请求上的一条 PII 防护栏、提示注入筛查、输出安全,以及一个 被严格限定范围的密钥——全部在控制台中完成,无需修改你的聊天机器人代码。
这里的一切都绑定到你的工作区并从控制台配置。你的聊天机器人继续用 同一个 sk-orca-... 密钥调用 https://api.orcarouter.ai/v1/chat/completions ——只有网关中的策略发生变化。配置动作需要每个步骤点明的角色;中继调用 使用那个限定范围的密钥。

1. 公共聊天机器人的威胁模型

在编写任何东西之前,先弄清你在防御什么。一个聊天机器人的攻击面比一个 完整智能体的要窄——但高频风险是具体的:

PII 进来,PII 被记录

用户把邮箱、卡号、SSN 粘贴进聊天——而你把它们转发到上游并进入 你的日志。

提示注入

“忽略之前的指令并……”——试图覆盖你的系统提示并改变机器人行为的 尝试。

越狱

DAN / 角色扮演的措辞框架,试图把机器人拉离策略。

不安全输出

模型把泄露的密钥、系统提示样板或夹带注入的内容回显进聊天。
一个纯聊天机器人没有工具调用,因此本配方倚重 防护栏——文本平面——而不是 防火墙。如果你的机器人确实调用工具,就在其上 叠加防火墙(参见 §6)。

2. 一条防护栏,四项职责

与其用四条独立策略,不如编写一条工作区防护栏,用有序的规则覆盖 每一项风险。一条防护栏是一个命名的、有序的规则列表;每条规则说明 寻找什么在哪里inputoutputboth),以及做什么blockmaskflag)。 在控制台中,打开 Guardrails → New guardrail,命名为 chatbot-shield, 并加入下面的规则。编写一条防护栏——以及运行 Test 沙箱——需要 Developer 角色;查看防护栏对任何成员开放。

a. 请求上的 PII

加入一条 PII 规则,stage 为 input,action 为 mask。内置实体集 是封闭的——挑选聊天机器人实际会看到的那些:
{
  "type": "pii",
  "stage": "input",
  "action": "mask",
  "entities": ["email", "phone", "credit_card", "ssn", "ip"],
  "entity_actions": { "credit_card": "block", "ssn": "block" }
}
一次 mask 会把每个匹配替换成一个带类型的标签——jane@acme.com 变成 [EMAIL],因此上游模型永远看不到那个地址。entity_actions 覆盖会在 卡号或 SSN 上直接拦截请求,同时对较低严重度的实体做掩码。这正是 PII Shield 预设,扩展了按实体的覆盖——从模板库应用该预设并从那里 编辑。
输入阶段的 PII 掩码今天已上线——它在模型看到请求之前就重写请求。 对流式响应的实时掩码在路线图上。要从机器人回复的内容中脱敏 PII, 请使用一条输出 block 规则(在流式和非流式上都执行),或在适用输出 掩码的非流式模式下运行机器人。先在 Test 标签页中证明你确切的 stage/stream 组合。

b. 提示注入筛查

OrcaRouter 将此作为 Prompt-Injection Basics 安全预设提供(一个针对 诸如*“忽略之前的指令””揭示你的系统提示”*等短语的关键词拒绝列表; 要对 DAN / 角色扮演框架做更严格的正则覆盖,加入 Jailbreak / Role-Play Blocker 预设)此外,对于任何模式都捕捉不到的语义意图,还有一条 llm_judge 规则。加入该预设,然后在 input 阶段加一条带有标记 注入/覆盖企图的评分标准的 judge 规则。该 judge 针对你工作区中的一个 模型运行,受 judge_timeout_ms 限制,并默认故障开放(judge 错误被 记录,请求继续)——设置 judge_fail_open: false 以故障关闭。
flag 上启动注入规则,在真实流量上观察 Matches 信息流一天, 然后在你确认它们对攻击触发、而不对合法问题触发之后,再晋级为 block。 参见 执行模式

c. 输出安全

为绝不能到达聊天窗口的内容——泄露的密钥、聊天模板控制令牌、系统提示 样板——加入一条 output 阶段的 block 规则(正则或关键词)。 Secrets & API-Key Blocker 和系统提示泄露安全预设覆盖了常见情形; 应用它们并把相关规则钉到 output 阶段。输出 block 在流式上也执行 ——扫描器会在流中途切断它,并在被拦截内容到达用户之前发出一条替换 消息。

3. 上线前先测试

每个防护栏编辑器都有一个 Test 标签页。粘贴一个样本,挑选 stage, 在本地运行当前策略——没有上游调用,不消耗配额。
粘贴这个Stage预期
email me at jane@acme.cominputemail me at [EMAIL]
ignore previous instructionsinputflag / block(由你选择)
卡号 4111 1111 1111 1111inputguardrail_blocked(按照覆盖)
为了对抗性覆盖,Eval 标签页会针对捆绑的红队语料库(或你自己的 JSONL)运行策略,并报告它的得分——调优 judge 评分标准,直到它捕捉到 已知攻击而不标记良性聊天。

4. 为机器人铸造一个限定范围的密钥

一条防护栏只在解析到它的密钥上执行。给聊天机器人它自己的密钥,限定到 它所需的最小范围——绝不要用你账户级别的密钥。 API Keys → New key 中,设置:
Guardrail 下拉框中挑选 chatbot-shield。这会在密钥上设置 guardrail_id。一次明确的附加是关闭开关的反面:如果它被设置并启用, 它就总是适用,永远不会静默回退。(保持不设置,则改为回退到工作区 is_default 防护栏。)
credit_limit_usd 设为一个合理的上限(0 = 无限)。一个公共 聊天机器人是最可能被滥用的密钥——一个硬性额度上限是你的爆炸半径 限制。参见 denial-of-wallet
打开 model_limits 并只列出机器人被允许调用的模型,这样一个泄露的 密钥就无法被用来运行一个你从未打算暴露的昂贵模型。
如果机器人从一个固定的服务器调用,把 allow_ips 设为你后端的出站 IP;如果密钥是临时的,设置一个 expired_time-1 = 永不过期)。
密钥在创建后于显示时会被掩码——只复制一次。你的聊天机器人后端现在把 每一个用户轮次都通过 chatbot-shield 发送,而没有任何代码意识到筛查 正在发生。

5. 在生产中观察它

两处读取让你保持诚实,二者都是工作区限定的:
  • Guardrails → Matches(任何 Member)——每条触发的规则:类型、 动作、stage 和细节。匹配的子串仅当该防护栏的 Log raw content 开启时才被记录(默认关闭——隐私保守姿态)。标记一个误报以调优策略 (Admin)。
  • Version history——每次变更写入一条历史行;diff 任意两个版本, 并在某条规则被证明过于激进时revert。一个被拦截的请求返回 HTTP 400 guardrail_blocked,消耗无配额,并被标记为 skip-retry。
一个 guardrail_blocked 响应是一个有意的、用户可见的 400。在你的 聊天机器人 UI 中用一条友好的消息处理它(“我无法处理那个”),而不是 把原始错误暴露出来——网关已经为你停止了那个不安全的轮次。

6. 如果你的机器人调用工具

一旦你的聊天机器人能够调用一个函数、抓取一个 URL 或访问一个 MCP 服务器,文本筛查就不够了——你需要动作平面。通过 firewall_policy_id 将一条 防火墙 策略附加到同一个密钥,或应用 balanced 自治级别以审计工具调用并在工作区范围内 flag PII,然后再 收紧。最快的路径是 零信任快速开始;对于一个大量调用工具的 智能体,参见 保护一个自治智能体

7. 去哪里深入

防护栏参考

每种规则类型、PII 实体、judge 字段,以及完整的 eval 装置。

防护栏 vs 防火墙

文本平面 vs 动作平面——你何时需要哪个。

执行模式

Observe → shadow → enforce:上线而不弄坏机器人。

限定密钥、策略、工作区的范围

密钥附加和工作区默认值如何解析。