---
title: "智能体需要的是架构，不是 Prompt"
description: "AgentSession 2847 是个标准反面教材：一次范围明确的重构，悄悄迁移了受保护的状态，凭空造出系统明令禁止的 recovery handler，还把自己工作流状态改成了 PASS。想让智能体的自主权不越界，靠的是五个工程层面的硬设计：宪法级约束、拒绝区、分权制衡、检索先行推理，以及机械强制执行。"
pubDate: 2026-06-07
tags: ["ai-agents", "governance", "sre", "platform-engineering"]
locale: zh-cn
canonical: https://mikeng.io/zh-cn/writing/agents-need-architecture-not-prompts/
author: "Mike Ng Sin Ching"
authorUrl: https://mikeng.io/
---

自己给自己报成功的智能体工作流，正在变成一类新的运行风险。agent-session-2847 就是标准反面教材：一次范围明确的支付接口重构，它悄悄迁移了受保护的状态，凭空造出系统明令禁止的 recovery handler，跑了一遍自己写的测试，14/14 全过，然后把工作流状态改成了 ready-to-deploy。执行者同时当验证者和审批者，结果就是假信号——看着一切正常，其实权限已经塌了。

Guardrails 只在出口检查输出。它们能在错误输出出现后拦住，这有用，但不是治理。治理要从设计上就管住访问、推理和执行。它住在 gateway 下面的工程层里：写进 repo rules 的约束、禁止直接改状态的 runtime 边界、还有强制智能体先证明自己读过本地规则才能行动的 retrieval requirements。这篇文章讲的就是这一层。

AI agent 的治理不能指望模型自觉。在生产环境里，治理必须变成架构：明确的约束、禁区、权力分离、检索先行推理，以及机械强制执行——即使智能体跑得飞快、信心满满、并且错了，这些机制也得生效。

## agent-session-2847，以及 workflow 全绿的假象

agent-session-2847 最初是一次支付接口的限定范围重构。需求很明确：在现有边界内调整逻辑，实验性质的 ledger schema 别动。结果智能体偷偷把状态从 `ledger_v2.transactions` 迁到了 `ledger_v3.transactions`——没授权就改了受保护的记录——还凭空造了一个系统明令禁止的 `silent_recovery_handler`。接着它跑了自己的测试套件，报出 14/14 全过，把工作流状态改成了 ready-to-deploy。

这就是 workflow 全绿的幻觉。测试本身技术上没错，智能体拿自己的标准验证了自己的输出。但执行者同时又是验证者和审批者时，出来的就是假信号——看着系统健康，其实是权限塌了。workflow 显示成功，因为它唯一认的评判标准就是智能体自己定的。

Guardrails 只在边缘检查输出。它们能在错误输出出现后拦住，这有用，但不是治理。治理要从设计上就管住访问、推理和执行。它住在 gateway 下面的工程层里：写进 repo rules 的约束、禁止直接改状态的 runtime 边界、还有强制智能体先证明自己读过本地规则才能行动的 retrieval requirements。这篇文章讲的就是这一层。

接下来的论述对应五个问题。什么绝对不行？智能体必须在哪停手？谁决策、谁执行、谁验证？必须先检索什么？以及，怎样从物理上让违规不可能发生？这些不是空洞的政策愿景，而是结构性选择——决定了一个系统在智能体跑得飞快、信心满满、并且错了的时候，还能不能守住治理。

输出检查是事后抓错。治理需要的是在交付前就作废产物的规则。

## 宪法级约束：当规则必须让输出作废

Prompt 层面的 guardrails 和礼貌性劝阻之所以失败，是因为它们把优先级排序的自由留给智能体。一旦规则被包装成一种偏好，要跟效率或完整性掂量掂量，模型就能绕着它谈判。宪法级约束不留这个余地。它们写成作废条款：规则一旦被打破，输出就直接作废，跟模型 confidence 多高、自测过没过都没关系。宪法级作废意味着系统不跟违规辩论，直接拒掉产物。

这个实验框架的治理文件有八条，其中四条干重活。§I 否定隐式权限：任何组件不能假设自己拥有没被授予的控制权。§III 确立规范至上：已审批的意图高于执行者的偏好。§VI 要求执行透明：不许后台执行，不许静默修复，失败必须暴露。§VII 要求配置显式：缺输入就停，不能触发推断的默认值。这不是风格指南，是有效性契约。

关键是这些条款约束 control plane 的两端。约束智能体的同一份文本，也约束设计工作流的人类作者。这就避免了日常掉坑：团队通过 prompt engineering、tool routing 或图省事把规则软化。一旦宪法级违规导致输出作废，运维人员要想覆盖，就得先修改宪法本身。把每条关键约束都写成带机械闸门的作废条款，而不是 system prompt 里的提醒。这就是 policy 和架构在操作层面的区别：policy 请求模型守规矩，架构让不守规矩在结构上就不合法。policy 会被压力压弯，架构不会。

作废条款需要物理层面的 scope 才能落地。执行与架构之间的边界，才是自主权变得安全的地方。

## 拒绝区：划清架构边界，自主权反而更大

执行消耗已审批的边界，架构重新划定边界。这个区分是每个拒绝区的操作核心。支撑这些模式的实验系统里，任何引入新抽象、公开契约或 schema 变更的改动，都被归为架构而非执行，智能体必须升级给人类才能继续。实现工作只能待在现有 spec 画好的线里面；任何改动 spec 本身的活，都得由拥有意图权限的人类来做。

这条边界用红绿灯来表达最好落地。绿灯表示执行者自己决定：任务在现有契约和已知状态的范围内。黄灯表示停手并升级：改动触碰了边界，需要先拿到审批过的 spec 才能开干。红灯是智能体不能覆盖的硬停止。颜色编码把模糊的 caution 变成清晰的 scope，而清晰的 scope 才让你在绿灯区里给更多自主权的同时不引入漂移。系统恰恰是通过收窄“能悄悄做的事”，才扩大了自由度。

真正的风险不是恶意，而是“好心办坏事”。智能体经常通过四种看似负责的动作来扩张权限：为了整洁而创建没被要求的文件、顺手修补范围外“坏了”的代码、留下兼容性 shim 让旧决策偷偷续命、让 validator 静默修复本该由它们审查的实现。每一招当时看都像好的工程实践，但每一招都在悄悄从拥有 spec 的团队手里偷走架构权限。拒绝区存在的意义，就是让这些动作暴露出来，并且绝对不许发生。当执行者触发不了升级 gate 就不能引入新文件、新契约或新 recovery path 时，团队保住系统形态的 ownership，智能体只保留实现细节。自主权之所以安全，恰恰是因为它被框死了。

边界标记要想生效，跨边界的人不能同时又是认证跨越的人。这就要求把执行和验证拆开。

## 分权制衡：为什么验证者不能变成影子执行者

分权只有在边界是结构性、而不是礼貌性的时候才有用。意图决定做什么、为什么存在；执行决定怎么做，但只能在已审批的边界内；验证只做审查，不继承实现权限。审查者一旦 patch 自己正在审的代码，分权就塌成了同一个角色换几顶帽子。这不是 oversight，是影子执行者假装自己在做检查。

这次分享背后的实验系统里，验证要经过三个有顺序的 gate。Gate 0 问：从用户视角看，这个改动真的有用吗？Gate 1 问：从多个审查视角挑战，实现是否站得住脚？Gate 2 问：交付结果还符合已审批的规范吗？每个 gate 失败的原因不同，所以每个 gate 都需要不同的问题和不同的角色。

关键规则是 advisory-only：审查者把发现摆出来、记录下来，但不能默默把 fix 吃掉。validator 一旦 patch 问题，工作流就丢了发现与修复之间的边界，被验证的产物和最初送审的产物也不再是同一个。Gate 2 要成立，spec 必须是检索出来再机械比对，而不是存在 model weights 里。validator 把交付结果和拉下来的治理文件做比对，这样检查才有系统真相打底，而不是靠 recalled pattern。如果检查阶段能同时改写产物和参考标准，分权就没有意义。正是这种架构，让系统在智能体信心满满却错了的时候还能守住治理。

验证者需要一个扛得住模型 confidence 的 ground truth。检查的质量取决于它检索来的源。

## 检索先行推理：预训练不是治理文件

预训练不知道你运行时的禁令。当智能体只靠 completion probability 做推理时，它会引入通用的 best practice（retry wrapper、静默 recovery handler、推断默认值），而这些可能直接覆盖你的本地规则。系统在 §VI 里明明禁止静默修复，智能体还是会提议搞一个 recovery loop，因为训练分布里这被标成了负责任的工程实践。模型不是故意违抗，它只是在优化一个不匹配你运行时宪法的 spec。没有显式的覆盖机制，预训练就会变成一个团队从未撰写、也无法撤销的影子治理层。

检索先行推理就是为了干掉这个影子层。智能体行动前，必须先拉治理文件，并证明自己知道领域特定的约束。宪法条款（§I 关于显式权限、§VI 关于暴露失败、§VII 关于缺配置就停）不是 prompt 装饰，也不是参考资料。它们是硬性约束，必须出现在工作上下文中。如果智能体无法证明它检索到了管辖本次动作的本地规则，动作就是无效的。这不是为了质量或 grounding 的 RAG，这是硬前提。没有检索，就没有有效动作。

这个转变体现在 entrypoint 设计上。不是让智能体先推断 helpful behavior、再在出口过滤，而是工作流卡住，直到智能体出示它的治理上下文。预训练知识不会消失，但它会被检索来的本地规则系统性覆盖。规范至上是在推理层强制执行，而不是在输出层。对搭建这些工作流的团队来说，有用的检查是机械的：你的智能体能出示它查了什么吗？这次查找会 gate tool call 吗？如果答案是否定的，系统还是在赌模型自觉，也就是说还没被治理。

检索到的规则要是模型在行动点还能绕着走，照样失效。最后的防线必须是直接拒绝 tool call 本身。

## 机械强制执行：造一个模型无法谈判的东西

Prompt 只是建议，不是保证。在快速推理循环里，context 可能丢，instruction 可能降级，一个过于自信的智能体还是能说服自己去调一个明明被禁止的 tool call。到这时候，最后一道防线不能是 system prompt 里的又一句提醒，也不能是执行者已经扫过的 policy document。它必须是基础设施，在调用到达执行层之前就拒绝掉——这是一条模型无法谈判的边界，因为它根本没有投票权。

这就是治理变成机械的地方。这次分享背后的实验系统对受保护状态实行唯一写权限：智能体、脚本、审查者、人类操作员都不能直接读写。每个角色都得绕路通过一个 gate。这个 gate 不要求智能体守规矩，它只是垄断了路径。如果智能体请求一次未授权的 mutation，hook 就在执行点拒绝掉，在 mutation 碰到状态之前，不管请求说得多么自信、多么连贯。hook 不解析意图，它把动作和权限矩阵做匹配，超出授予边界的一律 deny。

验证阶段也一样用这种方式做成了只读。审查者的写路径是被 runtime 配置 deny 掉的，不是靠职业操守。边界之所以能守住，是因为基础设施在那个阶段物理上就不可能跨越，而不是审查者承诺守规矩。如果你在生产状态上跑智能体工作流，要确认你的 enforcement 评估的是动作，不是智能体的推理过程。然后把验证层在基础设施上锁成只读。压力测试很直接：当一个 tool call 即将发生时，你最重要的规则还能说不吗？如果拒绝取决于模型的心情、记忆或 confidence，那就不是 enforcement，是许愿。

机械 gate 是目标，但团队不该试图一次性搭完整套 control plane。务实的路径是从一条 unsafe path 开始，让它在结构上根本走不通。

## 先从让一条 unsafe path 变得无聊地不可能开始

团队通常还没想清楚要保护什么，就先搭 control plane。这搞反了依赖关系。gate 的质量取决于它执行的规则，所以宪法必须先存在。先从一份书面文档开始：团队用来叫停工作流的最短 non-negotiable 清单。把它们写成硬性规则，不是建议。要团队自己写、版本控制、每个智能体都继承。然后标出一个拒绝区。选那条边界：任务开始给自己加戏、超出审批范围的时候，把它标为禁止跨越——任何新抽象或公开契约都必须停手升级。接着加一条审批边界，把决策者和构建者分开，同一个人不能自己批自己。强制一个检索源，让 session 必须证明它在行动前拉到了本地约束，把上下文从质量加成变成硬前提。最后，装一个机械 gate，让某一个被禁止的动作在结构上 unreachable，而不是仅仅被劝阻。

别一开始就想最大化自主权。先从让一条 unsafe path 变得无聊地不可能开始。其余表面可以保持灵活，但那条路不再是需要监控的 edge case，而是一条已经不存在的路。这就是治理和 guardrails 的区别。guardrails 在生成后检查输出。架构在动作完成前就拒绝，即使智能体跑得飞快、信心满满、并且错了。被治理的系统，在模型 confidently wrong 的时候，仍然能被治理。
