🍐
Claude Code 源码拆解 harness 设计 - 多Agent协作设计
- 总结:不信任模型的自觉性,能用硬约束的地方,绝不用软约束
- 只读Agent不能写文件的约束不是靠prompt来软约束而是给它的工具中只有只读工具,风险操作权限隔离,而不是靠模型自己判断
- 不要加用户没要求的功能,这种无法靠硬约束完成的约束才退而求其次使用软约束写进prompt
- 用明确的规则代替模型的临场判断
- 硬约束兜底,软约束填缝
- 一个Agent无法承担太多角色,角色之间会相互干扰,探索阶段的好奇心会限制实现阶段的克制,实现阶段的克制会限制验证阶段的怀疑
- 把角色按任务阶段拆开给每个角色明确的权限边界和行为规范,是Claude Code给出的答案
- Claude Code 所有的设计都在假设上层是不可靠的
- agent 可能存在的目标漂移、权限越界等问题,最常见的看法就是模型能力的问题,但是 Anthropic 认为这是架构的问题
- Claude Code 的设计理念是:让一个Agent 同时做 研究、规划、实现、验证 并不可靠,让同一个Agent编码然后review会倾向自己没问题,并且影响模型思考方式,这是角色冲突而不是模型能力的问题
- 为什么模型在改 bug 的时候可能会修改不相关的代码,因为它在改bug的同时也在探索代码,探索的过程中它看到了它觉得可以优化的地方,就动手了
- 让 模型 写功能的时候模型会提前抽象、设计冗余,因为是它在 编码的同时也在规划
- 在Anthropic看来问题的根源是一个Agent承担了太多角色,导致每个角色的行为边界模糊了
- Claude Code 设计了一个 6个角色完全不同的 Agent 各有各的 system prompt、工具集、权限边界,而不是一个 agent 配上不同的 prompt
- General-Purpose Agent(通用任务、执行)
- Explore Agent(纯只读的代码探索、研究)
- 明确禁止创建新文件和修改文件、用重定向写文件改变运行状态的操作等
- Plan Agent(只做规划,不执行任何操作)
- Verification Agent(只做对抗性验证,寻找代码中的问题)
- Guide Agent(产品使用说明书与新手向导)
- 专门负责提供 Claude Code 本身的使用指导
- Statusline Agent(负责终端 UI 状态栏的管理与配置)
- Claude Code 的解法是将角色彻底拆开,而不是只用不用的 prompt 来区分角色,它在三个维度上做了隔离
- 工具集隔离
- Explore Agent 只能用 Glob、Grep和FileRead,命令只允许 ls、git status、git log 这种只读命令和操作
- 如果在探索时不小心改了东西那么后续的阶段都会出问题,把权限彻底隔离,简单且有效
- Prompt 隔离
- 每个Agent有自己system prompt 设定角色,能做什么,不能做什么
- 其中 verification agent 的 prompt 写了 130行,核心方向就一个,想尽一切办法搞破坏
- 它不会温和的检查代码看起来对不对,而是主动构造出错场景,用实际运行来证明
- 权限隔离
- 不同 Agent 有不用的权限模式,只读Agent在Runtime层面就被锁死了权限
- Zod Schema 的边界硬校验
- 定义权限门控
- PreToolUse Hooks 的沙箱阻断
- 而不是靠prompt 一句 你只能读不能写 来约束
- 这三层隔离叠加在一起,才真正实现了角色分离
- 不信任模型的自觉性,能用硬约束的地方,绝不用软约束
- 如何拆分Agent
- 常见做法
- 按功能拆分:前端Agent,后端Agent,测试Agent
- Claude Code 的做法:按阶段分
- Explore Agent、Plan Agent、执行Agent、验证Agent
- 本质区别
- 按功能分 每个Agent 内部还是要同时做研究、规划、实现、验证,没有解决角色冲突
- 按阶段分 每个Agent 只负责一个阶段的职责,角色边界清晰
- 成本优化
- Explore Agent 使用 Haiku 更快更便宜
- Plan Agent 使用 Sonnet 具备一定的推理能力
- 执行和验证 Agent 使用 Opus 强推理模型
- 行为规范
- 不是每次都让模型临场判断而是每次都添加到prompt中去
- prompt 中有一个 get simple doing tasks section 的函数专门列出注意事项,每次调用模型时都加上这些内置的prompt
- 例如:不加用户没要求的功能、不过度抽象、不给没改的代码加注释、不做不必要的错误处理、不设计面向未来的抽象、结果如实汇报 等等