青蛙小白

Agent Guardrails(Agent 护栏)

Agent Guardrails(Agent 护栏) 是围绕 AI Agent(智能体)运行过程设置的一组安全、质量与权限控制机制。它们不等同于一句"不要做坏事"的 prompt,而是把输入过滤、工具风险分级、输出校验、人工审批和确定性规则组合成分层防线。

OpenAI 的《A practical guide to building agents》把 guardrails 放在生产 Agent 的核心设计里:Agent 会跨工具执行多步任务,因此风险不只来自模型输出,还来自输入注入、工具误用、隐私泄露、高风险动作和品牌/合规偏离。单一护栏通常不够,可靠系统需要多种护栏叠加。

护栏覆盖的边界

Agent 护栏通常覆盖四个位置:

位置作用例子
输入前判断用户请求是否在任务范围内、是否包含攻击或违规内容相关性分类器、安全分类器、Moderation、正则和黑名单
行动前判断工具调用是否被允许、风险是否过高工具风险分级、权限检查、沙箱策略、高风险动作暂停
输出前判断回复是否符合品牌、隐私和结构要求PII 过滤、结构化输出校验、内容安全检查
失败时决定是否重试、停止或升级给人类连续失败阈值、人工介入、审计记录

这四个位置分别对应 Harness Engineering(驾驭工程)中的输入护栏、动作护栏、信息流控制和人工审批。护栏不是 Agent 外面的装饰,而是 harness 控制平面的一部分。

GPT-5.6的安全栈提供了一个产品级例子:模型级安全训练与拒答之外,所有模型的会话先经过快速主题分类、再由安全推理器做上下文复核;Sol 和 Terra 还会用 activation classifier 在生成中观察内部激活,命中疑似高风险模式时暂停流式输出、等待复核。OpenAI 也使用跨对话账户级风险信号、差异化访问、监控和执法。其关键启示是:单轮内容看起来像双用途安全研究时,判断有时需要结合持续行为模式;同时,这类扩大观察范围的控制必须与数据保留、隐私告知和误报申诉机制共同设计。

分层安全流程

OpenAI guide 中的安全流程可以概括为:先把用户输入送入多层检查,得到 is_safe 之类的判定;不安全则拒绝或要求重试,安全才继续进入函数调用、handoff 或下游业务 Agent。

flowchart LR
    U["用户输入\n可能含恶意指令"] --> SDK["Agent SDK / Harness"]
    SDK --> L1["LLM 相关性 / 幻觉检查"]
    SDK --> L2["安全分类器\nsafe / unsafe"]
    SDK --> M["Moderation API"]
    SDK --> R["规则保护\n长度限制 / 黑名单 / Regex"]
    L1 --> D{"is_safe?"}
    L2 --> D
    M --> D
    R --> D
    D -- "否" --> B["拒绝处理 / 要求重试"]
    D -- "是" --> F["继续工具调用"]
    F --> H["handoff 到业务 Agent"]
    H --> A["执行受控动作"]

这个图强调一点:护栏可以由 LLM、分类模型、Moderation、规则引擎和权限系统共同实现。它们不必都放在同一个模型调用里;工程上常见做法是并行运行轻量检查,把结果作为闸门。

三组件防御

Anthropic 在 Claude 产品的 containment 经验中把 Agent 防御拆成三个组件:

组件作用边界
环境用 sandbox、VM、文件系统边界和 egress control 限制 Agent 能触达什么提供硬上限,是 blast radius 控制的核心
模型用系统提示、分类器、probe 和训练修改影响 Agent 倾向概率性防线,永远不能保证 100% 有效
外部内容对工具、文件、网页、MCP server 和 connector 的输入/输出做审计、扫描和权限裁剪可信工具也可能返回不可信数据

这补充了“护栏覆盖的边界”表:输入扫描和动作前分类器只是其中一层。真正的部署风险近似由 P(harm)blast radius 共同决定;模型层降低前者,环境层限制后者。随着 Agent 能力和访问范围扩大,单靠模型层“更不容易出错”不够,必须给环境设置确定性上限。

Anthropic 报告的模型层指标也体现这个限制:Claude Opus 4.7 在 Gray Swan Agent Red Teaming benchmark 的单次 prompt injection 攻击成功率约 0.1%,100 次自适应尝试后仍约 5–6%;Claude Code Auto Mode 可在执行前拦住约 83% 的 overeager behaviors。这样的结果很强,但不是零风险,所以只能作为 defense-in-depth 的一层。

常见护栏类型

相关性分类器:判断请求是否属于 Agent 的业务范围。客服 Agent 不应回答任意百科问题,代码 Agent 不应越权处理生产账单。

安全分类器:检测 jailbreak、prompt injection、系统提示泄露请求和明显恶意输入。它面向的是 Agent 作为系统组件的攻击面,而不只是普通内容安全。

PII 过滤:在输出或日志写入前识别不必要的个人信息,避免把敏感数据带出边界。

Moderation:处理仇恨、骚扰、暴力等通用内容安全风险。

工具防护(Tool Safeguards):按只读/写入、可逆/不可逆、权限范围、财务影响等维度给工具调用分级。低风险动作可自动执行;高风险动作应触发额外检查或人工审批。

Function Calling(函数调用)提供的是结构化调用请求,不是业务授权。即使模型输出通过 strict schema 校验,应用仍必须在执行前做权限检查、参数校验、风险分级和人工审批路由;schema 正确只说明“形状对”,不说明“该执行”。

OpenAI 在发布 Computer-Using Agent和 Computer use 工具时特别强调这一点:模型能生成鼠标和键盘动作后,风险边界从“输出一句话”扩展到“对真实界面执行动作”。因此 Computer use 类工具通常需要沙箱、敏感任务确认、prompt injection 检测和策略违规检测共同工作。

规则型保护:用输入长度限制、关键词黑名单、正则、SQL 注入检查等确定性机制拦截已知风险。它们不聪明,但可解释、便宜、稳定。

输出校验:检查结构化输出是否符合 schema、回复是否违反品牌或合规规则、是否泄露不该出现的内容。

Skill 供应链审查Agent Skills和 OpenAI API 中的 Skills 都会把额外指令、脚本、参考材料和资产带进 Agent 运行环境。第三方 Skill 不能只看 description 就安装;应审查 SKILL.md、脚本依赖、网络访问、支持文件中的隐藏指令,以及是否请求过宽的工具权限。它和 MCP server 一样属于“能力来源”,需要进入依赖审计和权限分级。

OpenAI 对 API Skills 的安全建议更接近依赖治理:把 Skill 视为有特权的代码和指令,先由开发者审查并绑定到具体产品工作流,再暴露给终端用户;避免让用户从开放 Skill 目录中任意挑选;对写入、高影响动作和联网访问加显式审批、策略检查和数据驻留评估。

工具风险分级

工具防护的关键不是"工具能不能调用",而是"在当前上下文里调用这类工具的失败代价是什么"。

风险特征控制方式
只读、可重复、无敏感数据自动执行,记录 trace
写入可回滚、影响局部状态额外校验参数,必要时限流或抽样审计
不可逆、涉及资金/隐私/生产权限暂停并要求人工审批,或交给受限业务流程

这个分级和 Agent Sandbox(Agent 沙箱)互补:沙箱控制执行边界,工具分级控制业务风险。即使代码运行在沙箱内,“发起退款"“删除客户记录"这类业务动作仍然需要更高层的治理。

动作前分类器案例:Claude Code Auto Mode

Claude Code 的 Auto Mode 是动作前护栏的一个具体产品化案例。它不把所有工具调用都交给人工审批,而是先用 allowlist 和项目内编辑规则过滤低风险动作,再把 Shell、Web fetch、外部工具、项目外文件操作和 subagent 启动等高风险动作交给 transcript classifier。

这个分类器的判断原则值得泛化到其他 Agent harness:

  • 评估真实影响,而不是只看命令表面文本;如果 Agent 写脚本再运行,分类器应评估脚本会做什么。
  • 读取用户授权时要保守;“清理 PR”不自动授权 force-push,“修一下”也不自动授权改共享基础设施。
  • 把环境信任边界显式配置出来;默认只信任当前 git repo,外部域名、bucket、source-control org 和内部服务需要逐项声明。
  • 对危险动作给出拒绝原因并允许 Agent 换路,而不是每次误报都终止任务。

Auto Mode 也说明 guardrail 的覆盖面必须被清楚记录:项目内文件编辑直接允许,所以它保护的是特定权限层的 tool call,而不是所有可能改变状态的路径。高风险系统不能只看“有分类器”,还要问哪些动作会经过分类器、哪些动作会绕过它。

另一个边界是“用户本身也可能成为注入向量”。Anthropic 的内部红队演练中,攻击者通过普通协作邮件诱导员工把恶意 prompt 复制进 Claude Code,请求读取 ~/.aws/credentials、编码并 POST 到外部 endpoint。因为指令来自用户本人,基于用户意图的分类器没有异常可抓;真正有效的是环境层的文件边界和 egress control。

人工介入不是失败

生产 Agent 不应把"永不打扰人类"当成目标。OpenAI guide 建议在两类情况触发人工介入:连续失败超过阈值,或即将执行敏感、不可逆、高价值动作。对 coding agent 来说,这可能表现为把控制权交还给用户;对客服 Agent 来说,可能是转人工工单。

这与 Evals(评估)的原则一致:Agent 不能只靠自己宣布成功。护栏给出停止、拒绝、升级或继续的控制动作,才真正进入闭环。

与相关概念的区别

概念关注点
Prompt Engineering(提示工程)如何写输入,让模型更可能做对
Agent Guardrails模型做错或被攻击时,系统如何限制损害并选择下一步
Agent Sandbox(Agent 沙箱)代码/工具执行环境的隔离与权限边界
Evals(评估)判断产出是否满足目标,驱动继续、回滚或停止
Harness Engineering(驾驭工程)把护栏、沙箱、工具、上下文、评估和编排统一成可运行系统

相关概念

参考来源
  1. 1. https://openai.com/business/guides-and-resources/a-practical-guide-to-building-ai-agents/
  2. 2. https://arxiv.org/abs/2310.10501
  3. 3. https://openai.com/index/new-tools-for-building-agents/
  4. 4. https://developers.openai.com/api/docs/guides/function-calling
  5. 5. https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills
  6. 6. https://developers.openai.com/api/docs/guides/tools-skills
  7. 7. https://developers.openai.com/cookbook/examples/skills_in_api
  8. 8. https://www.anthropic.com/engineering/claude-code-auto-mode
  9. 9. https://www.anthropic.com/engineering/how-we-contain-claude
  10. 10. https://openai.com/index/previewing-gpt-5-6-sol/
  11. 11. https://deploymentsafety.openai.com/gpt-5-6
评论