跳到主要内容

编程智能体自主曲线:阅读是免费的,合并是事故级的

· 阅读需 13 分钟
Tian Pan
Software Engineer

关于编程智能体(coding agents)的讨论总是陷入二元对立:自主还是受监督,YOLO 模式还是手握方向盘,--dangerously-skip-permissions 还是“批准每一次按键”。这种构想框架本身就是一个范畴错误。编程智能体执行的并非“一个动作”,而是一系列动作,其成本跨越了至少七个数量级 —— 从读取文件(免费、可撤销、无副作用)到合并至主分支(不通过 revert PR 则不可逆),再到向集群发布二进制文件(六位数成本级别的事故)。用一个自主性开关来处理如此广泛的范围,就像是为停车场和高速公路设置统一的限速一样。

如果团队在发布“无所不能的智能体”时,没有将每个动作映射到其爆炸半径(blast radius),那么只需一个带有提示词注入风险的 GitHub 评论,就足以引发一场事后复盘 —— 事实上,我们已经有了这种失败模式的公开案例。Anthropic 的 Claude Code 安全审查、Google 的 Gemini CLI Action 以及 GitHub Copilot Agent 在 2026 年都被证实可以通过精心设计的 PR 标题和 issue 正文被劫持,研究人员将这种攻击模式命名为“评论并控制”(Comment and Control)。这些智能体并非在抽象意义上损坏了,而是因为自主性层级悄无声息地将低信任输入抹平为“一视同仁”,从而基于这些输入执行了高阶动作(如推送代码、开启 PR)。

接下来需要建立的规范是:针对每个动作的曲线、随层级扩展的闸门、与爆炸等级匹配的回滚速度,以及一个测试工具组合升级而非单一动作失败的评估程序。

没人画出来的动作阶梯

首先,列出编程智能体可以调用的每个工具,并为其标注爆炸半径等级。这个阶梯大致分为七个层级:

  • 第 0 层 —— 读取。 文件读取、grep、AST 查询、gh pr view、日志获取。无副作用,除了推理之外没有令牌(token)成本,无限可撤销。80% 的智能体流量应该留在这里。
  • 第 1 层 —— 沙盒计算。 在容器内运行测试,在临时虚拟机中执行一次性脚本,运行 linter。副作用存在但被隔离。成本:几分钟的 CI 时间。
  • 第 2 层 —— 本地分支写入。 在功能分支中编辑文件、创建提交(commit)、推送分支。受分支限制 —— 在人类采取行动推动其进展之前,影响是受限的。
  • 第 3 层 —— 可审查的提案。 开启 PR、留下评审评论、建议更改。触达人类,但由人类把控下一步。
  • 第 4 层 —— 主分支写入。 合并至主分支(main)、关闭 issue、修改 GitHub Actions、编辑 CODEOWNERS。涉及共享状态。只能通过 revert PR 撤销,且受 CI 的实际耗时(wall-clock latency)限制。
  • 第 5 层 —— 生产部署。 发布产物、运行数据库迁移、在生产环境中切换功能开关。客户可见。只能通过经过测试的回滚来撤销。
  • 第 6 层 —— 集群级。 向 N 个生产主机分发二进制文件、广播缓存失效、大规模 DNS 或路由更改,以及任何“一次性触达全球”的操作。恢复工作是以事故响应来衡量的,而非提交代码。

写下这些层级的目的不是为了记住这七个分类,而是为了强制提出一个问题:每个工具属于哪个层级,以及该层级对应的合适闸门是什么? 一个只提供全局“询问用户”开关的编程智能体平台,实际上已经用单一数值隐含地回答了这个问题,这意味着除了偶然情况外,它在矩阵的每个单元格上都答错了。

随层级扩展的审批闸门

单一的全局确认提示只是一种“审批演戏”。在对第 0 层文件读取进行了 50 次快速的“批准 / 批准 / 批准”点击后,当智能体到达第 4 层动作时,人类已经产生了反射性点击 —— 在关于“人在回路”(human-in-the-loop)系统的用户研究中,这种审批疲劳是主要的失败模式,而不是恶意绕过。解决方案是建立一个具备层级意识的闸门矩阵:

  • 第 0-1 层: 默认允许,无需提示。智能体以全速读取文件并运行测试,因为询问的成本高于出错的成本。
  • 第 2 层: 轻量级闸门 —— 在聊天界面显示简要 diff,除非人类在短时间内反对,否则智能体继续操作。智能体保持在工作流中。
  • 第 3 层: 显式批准,但审查的对象是 PR 本身,这已经是开发者熟悉的评审界面。复用现有工具,而不是发明新的弹窗。
  • 第 4 层: 硬闸门。人类必须主动点击,且智能体必须展示结构化的计划,包括受影响的文件、回滚命令以及推断的风险等级。这也是平台应该要求提供理由字符串(justification string)的地方,用以说明该动作正在履行哪个用户请求 —— 这对审计和捕捉由提示词注入引起的偏离都很有用。
  • 第 5-6 层: 带外(Out-of-band)审批。智能体不负责按下按钮。它暂存动作,在现有的变更管理系统中开启变更请求,并等待由人类发起的触发。智能体在执行瞬间绝不持有生产环境的凭据。

请注意,这并不是“到处都要更多审批”。第 0 层的流量应该加速,而不是减慢。闸门预算是一种有限的人类注意力资源,唯有将其花在出错成本巨大的地方,才是对这种资源的明智利用。Claude Code 在内置的安全工具白名单(文件读取、搜索、代码导航)与针对 Shell 命令和外部工具调用的转录分类器闸门之间所做的区分,就是这一理念的一个生产实践案例 —— 尽管对于一个正在进行实际合并操作的智能体来说,即使是这种双层划分也显得过于粗糙了。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates