作者分享在实际项目中应用多个 agent 协同工作的架构设计和最佳实践。
我继续探索 AI 在软件工程领域的应用。很幸运,团队支持我尝试不同的方法,改善我们的日常工作。本周,我设计了一支由自主 Agent 组成的团队,负责从设计到实现的完整功能开发流程。
很久以前,当 IDE 开始提供自动补全功能时,我们欣喜不已。而在过去两年里,情况发生了变化。翻天覆地的变化。
Coding assistant 已经成为我们编写代码时的主要交互界面。我们仍然会使用 IDE,至少我还在用。不过,两周前我的 IDE 许可证出了问题,但即使没有 IDE,我依然继续写代码。assistant 会在每次修改后自动执行编译和测试。虽然这次经历并非出于我的主动选择,但我认为它可以成为一项对资深程序员很有价值的测试:你能否用 coding assistant 取代 IDE,还是说二者其实是互补关系?
话虽如此,与 assistant 聊天只是 AI 成熟度阶梯中的一个阶段。在《Agentic Engineering 的 8 个层级》中,作者提到了以下阶段:
Claude Code 的实验性 Agent Teams 功能是这一理念的早期实现:多个实例在同一个共享代码库中并行工作,每位队友都在自己的 context window 中运行,并且可以彼此直接沟通。Anthropic 曾使用 16 个并行 Agent 从零构建了一个能够编译 Linux 的 C 编译器。Cursor 则让数百个 Agent 并发运行数周,从零构建了一个 Web 浏览器,并将自己的代码库从 Solid 迁移到了 React。
显然,我既没有足够的资源,也不具备完成如此庞大工程所需的专业能力。不过,我希望设计一支能够处理较小任务的团队。
我最近写过一篇关于 subagent 的文章。
Claude Code 的文档列出了 subagent 的几项优势:
Claude Code 提供了几个内置 subagent:explore、plan、general purpose、status line,以及 Claude Code guidelines。你可以在文档中进一步了解它们。
不过,真正有意思的地方在于:你可以在 .claude/agents 文件夹中,通过一个带有特定 front matter 的专用 Markdown 文件来定义专业化的 subagent。front matter 定义了名称、描述、模型以及可用工具列表;正文则描述 subagent 的职责,也就是它所遵循的指令。下面是一个示例:
---
name: code-reviewer
description: Reviews code for quality and best practices
tools: Read, Glob, Grep
model: sonnet
---
You are a code reviewer. When invoked, analyze the code and provide
specific, actionable feedback on quality, security, and best practices.
我让 Claude Code 帮我设计这支团队。它给出了一套方案,其中包含五个 subagent:planner、challenger、coder、tester 和 documenter。它们的名称基本已经说明了各自的职责,不过稍后我还会回到这个话题。与此同时,我了解到一支团队的最佳 Agent 数量通常在三到五个之间,于是移除了 documenter。
“常规”subagent 会自主完成自己的任务,但完成后仍会回到主 Agent。团队中的 subagent 则可以彼此直接沟通。
定义好 Agent 之后,还需要明确 subagent 应该如何相互沟通,共同完成任务。你可以在一个 skill 中描述这些交互方式,而 Claude 也替我创建了这个 skill。下面是一个经过大幅简化的模型。
各个状态代表对应 Agent 文件中定义的 Agent 职责,而状态之间的交互则代表 skill 中定义的 Agent 间通信。需要注意的是,我还在 Agent 的描述中添加了额外的通信约束。平时我仍像往常一样使用 Claude Code,唯一的区别出现在需要开始实现的时候:我不再直接告诉它继续,而是从命令行调用 /implement skill。
下面是它目前在控制台中的样子:
4 tasks (0 done, 4 open)
◻ Approve plan › blocked by #3
◻ Implement merged CSV hierarchy changes › blocked by #1
◻ Plan: materialize merged CSVs with new hierarchy across both repos
◻ Write tests for merged CSV changes › blocked by #2
Agent 团队非常强大,但也存在一些问题。
最大的问题,是自主性与安全性之间的矛盾。在常规的 Claude Code 会话中,当它请求执行某条命令时,授予权限很容易。但使用常规 subagent 时,我发现这个过程会变得有些繁琐:权限请求的频率高得多。而到了 Agent 团队,这个问题更是达到了顶峰。
为了解决这个问题,你可以在 settings.json 中添加权限配置,然后寄希望于这些配置能够覆盖 Claude Code 在当前会话中执行的命令。或者,你可以使用这个名字非常贴切的 --dangerously-skip-permissions flag,也可以等待相对更安全的 auto mode。无论采用哪种方式,你都必须在自主性与安全性之间做出权衡。安全限制太多会拖慢工作速度,而自主权限太大又会带来风险。
此外,Agent Teams 目前仍处于实验阶段。将来它可能会变得更好,也可能变得与现在大不相同,甚至可能彻底消失。要在当前版本中启用它,需要在 settings.json 中将 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS 设置为 1。
好的一面是,在 Agent 上投入时间是值得的。无论 Agent 是否位于团队中,你都可以在命令行中显式调用它们。
自主 Agent 团队位于 agentic engineering 阶梯的最顶端。要走到这一步,需要预先设计好 Agent 之间的交互方式,并解决自主性与安全性之间的权衡问题。
这项功能仍处于实验阶段,我们也应该以看待实验性功能的方式来对待它,但发展方向已经非常明确。我们直接编写代码的时间正在减少,管理 Agent 的时间则越来越多。Agent 团队正是顺理成章的下一步。