模式矩阵 /模式白皮书/A5
A5 · Guardrail Sandwich · 守卫三明治
| 字段 | 值 |
|---|---|
| 双轴坐标 | 行动 Action × 层级 Hierarchy(分) |
| 成本档 | ☷(跨切关注点,开销随风险分级浮动) |
| 课程对应 | 05-05 |
| 目录归属 | 全集 33 模式之一 · 行动模块 5 模式之一 |
| 一句话 | 在 agent 每个有副作用或高风险的动作前后套上 pre-check 和 post-check 夹层,把它从"自由行动"约束到"被监督的行动"。 |
它解决什么问题
前面四个模式都在教 agent "怎么干对",但生产级 agent 还要回答另一个问题:干错时怎么挡住。某银行的对公转账 agent 上线第三周,把客户邮件里的账号"...XX23"解析成了"...XX32",一笔 320 万元转到错误账户,12 小时后才被对账系统抓到,对方已提现一部分。整个过程 agent 自信地完成,没有任何检查环节——调用前没人核账号、核金额、核客户意图,调用后没人复核到账和合规。
问题不是 agent 笨,是没有夹层防护。OWASP 2026 年正式发布的 Agentic Top 10 里,A1(Agent Goal Hijack)和 A2(Tool Misuse)说的就是这件事;调研显示 88% 的组织至少出过一次 AI agent 安全事故。这不是会不会出事的问题,是哪天出事的问题。Guardrail Sandwich 给每个 destructive 动作套上结构化的事前事后审查,让事故在执行前被拦下、或在执行后被回滚。
为什么坐标是「行动 × 层级」
- 纵轴 · 行动:它包装的是 agent 的动作执行——在工具调用的前、中、后插入守卫,属于行动端的执行控制。
- 横轴 · 层级:pre-guard → tool call → post-guard 是一个层级包装结构,与 Web 框架的 middleware 完全同源——一层夹一层,外层先于内层执行、后于内层收尾。它和规划-执行(A2)虽同涉分层,但方向不同:A2 是"战略-战术"分层(先想后干),A5 是"安全-执行"分层(先审后干)。
核心机制
最优工程实现是 hook——一个 hook 能 wrap 任何工具,配置一次、全 agent 受益,不用每个工具改一遍代码。Claude Code 的 hooks 系统铺了 12 个生命周期事件,最核心的是一对:
- PreToolUse:工具调用前触发,是整个系统里唯一能 block 的 hook(退出码 2 直接阻断)。能拦截、改参数、加 context。典型用例是路径白名单、命令黑名单、quota 检查、approval gate。
- PostToolUse:工具调用后触发,不能 undo 已发生的动作,只能验证 output、提示下一步、触发审计或 saga 回滚。典型用例是 output schema 校验、敏感数据扫描、副作用确认。
落地有三条关键纪律:
- 按 risk_level 分级:读操作可以裸跑,不该套夹层;普通写挂 2 到 3 层;destructive 全套;金融、医疗这类 CRITICAL 动作全套加 Approval Gate。hook 配置文件本身就是 agent 的风险地图。
- hook 顺序按"便宜先、贵的后":RBAC 检查(一次 dict 查询)排前面快速失败,AML 扫描(要查反洗钱库)排后面,省算力。
- 三阶段部署:周 1-2 monitor mode(只 log 不 block,收集误报样本)、周 3-4 soft enforcement(拦明显违规、flag 边缘 case)、月 2 起 full enforcement。直接上 full enforcement 会让 agent 卡死、业务方立刻翻脸——guardrail 调参和机器学习调参一样,必须在线收集数据再调。
适合的生产场景
- 有副作用且错调代价高的动作:转账、删数据、发消息、调外部 API。读操作(read file、search、fetch 只读)不必套——每一刀都是真金白银的延迟。
- 强合规的垂直领域:金融、医疗、法律、政府。这类场景的硬约束(金额阈值、处方剂量、制裁名单)可以 1:1 编码进 pre-check。
- 与 Approval Gate 配合的混合把守:低风险动作走 sandwich 自动放行,高风险动作 sandwich 加人工审批双重把守。
容易出错的地方
- Composition Bypass(组合绕过):单个动作每个都被允许(读文件、base64 编码、写 URL),串起来就是数据外泄。单点检查全过,因为它不分析序列。研究显示一个被攻陷的 agent 4 小时内能污染 87% 的下游决策,大半因此。应对是除了单点 hook,还要加 session 级的 scope analyzer,分析过去几分钟动作组合是否构成已知攻击模式——这是 LLM 时代的 SIEM。
- Sandwich Overhead Tax(夹层税):所有工具一律套全套夹层,整体延迟涨 5 到 10 倍,业务方翻脸。读文件套 RBAC 加 AML 加审计是巨大浪费。应对是严格按 risk_level 分级,LOW 直接放行。
- Schema Drift(schema 漂移):pre-check 校验的 schema 和下游工具实际期望的不一致,导致 pre 通过、tool 跑挂。应对是用 OpenAPI / JSON Schema 做 single source of truth,两边从同一份 schema 生成校验逻辑。
三种失败共同的根因是:Guardrail Sandwich 不是 plug-and-play,是工程治理——装上 hook 不等于做对治理,必须持续维护 hook 顺序、风险地图、schema 同源,就像数据库索引加了能跑快、不维护就成累赘。
关键指标
- block 率(monitor 阶段观察,full enforcement 后健康区 <5%):直接上 full enforcement 时第一周 block 率常超 30%,那是阈值没调好的信号。
- 误转账 / 错调率(健康区随业务定,金融场景 <0.01%):银行案例从 0.3% 降到 0.001%。
- 夹层延迟开销(健康区与 risk_level 匹配):金融全套 6 hook 约增加 800ms,是合理代价;读操作若也涨这么多就是夹层税。
- 审计留档完整率(健康区 100%):trace_id 串联全程,金融场景留档 7 年。审计是 sandwich 的副产品,不是额外功夫。
最小骨架
wrap(tool, ctx):
for hook in pre_hooks: # 顺序: 便宜先,贵的后
verdict = hook(ctx)
若 verdict.block → 短路返回 blocked + trace
若 verdict.改参数 → 更新 ctx.args
result = tool(**ctx.args) # 在隔离 sandbox 内执行
for hook in post_hooks:
verdict = hook(ctx, result)
若 verdict.rollback → 触发 saga inverse,返回 rolled_back
若 verdict.改结果 → 更新 result
返回 ok + result + 完整 trace(每个 hook 的 passed/reason/延迟)
工程落地要点:所有 destructive 工具都用它包一层;hook 要 idempotent(重试安全,网络抖动不能让钱转两次);trace_id 落库做审计串联键。
企业落地一例
银行对公转账 agent 给所有 destructive 工具套上 sandwich,落地为六个决策点。pre 层:RBAC 权限校验、金额阈值三档分诊(10 万以下自动 / 10 到 100 万短信确认 / 100 万以上人审)、收款账号白名单匹配、制裁名单事前扫描。post 层:反洗钱事后扫描(高度可疑自动 saga 回滚、中度可疑 flag 给风控)、审计日志 7 年留档。hook 顺序极其关键——金额分诊在白名单之前,但都必须在制裁扫描之前,因为制裁是法律红线。装上之后误转账率从 0.3% 降到 0.001%,每笔交易延迟从 2 秒涨到 4 到 5 秒,金融场景这点延迟换准确率绝对值得。回到开场,account_whitelist 这一刀会先抓住"...XX32 不在客户白名单内"并要求短信二次确认——一个 hook 配置一次,挡掉一类事故。同一套结构换到医疗就是角色权限、处方剂量阈值、病史白名单、FDA 黑名单、药物相互作用扫描、HIPAA 审计——业务约束变了,模式不变。
与其他模式的关系
- 工具调度(A1):嵌套互补。A1 的 quota、state refresh 是 dispatch 内置的轻量守卫,A5 是套在 dispatch 前后的通用夹层——A1 选对工具,A5 保证选错时也兜得住。
- 规划-执行(A2):A2 plan 里的审批节点和合规校验,落地时常由 A5 的 pre-check 实现。
- Approval Gate(治理模块):同源但分工不同。Approval Gate 是 human-in-loop(等人按批准),A5 是 deterministic check(机器直接做规则匹配)。两者常配合——低风险走 sandwich,高风险 sandwich 加 Approval Gate。
- 失败日记(感知模块):组合绕过、记忆中毒这类失败 sandwich 单层挡不住,要配合记忆模块的 audit 一起防。
一句话记住它
Guardrail Sandwich 把人类几千年的程序正义智慧编码进了 agent 行动层——pre-check 是事前听证、execution 是判决执行、post-check 是事后救济。agent 工程的成熟标志不是 demo 跑得多酷,而是事故发生时它没出事。
本页属于 ADPS 33 模式白皮书。返回 模式矩阵与白皮书目录, 或查看配套 可运行代码目录。