团队里来了五个“虚拟工程师”,代码照样出问题,但你再也找不到人来背锅——因为锅被拆成了五份,每一份都来自同一个大模型。这就是我最近在推进的多智能体协作系统(Agency Agents)落地的真实体感。
先说清楚这篇东西写给谁看:你已经用过大模型写代码、写文档,觉得单人单Agent的体验已经到瓶颈了;或者你正在规划把AI Agent引入研发流程,但不确定多Agent到底解决什么问题、架构怎么定、落地哪些坑;又或者你纯粹好奇“AI开发团队”是怎么运作的。
这篇不会复述官方文档,只讲我们在做“重构开发团队”时,从架构设计到真实落地踩过的坑、用过的方案、定下来的配置,以及一个很重要的认知:多Agent不是把多个AI凑在一起,而是要把“软件开发”这件事拆成一套可编排的流程。
1. 为什么“开发团队版”的多智能体系统会成为一个选项
1.1 单Agent的瓶颈:不是能力不够,是目标太模糊
用GPT-4级别的模型写代码,单个Agent最大的问题并不是“写不出来”,而是“没人管它写出来的东西符不符合上下文要求”。
举个例子,让一个Agent开发某个订单系统的结算模块。它会很乖地生成一个结算类的代码文件,但大概率会漏掉前一个模块里已经定义好的金额精度约定、数据库表字段命名规则,更不会主动去看测试目录里已有的测试风格。为什么?因为单Agent的上下文窗口再大,也装不下“整个项目全部上下文”,而且它没有内在动力去主动拉取那些约束信息。
我一开始的解法是穷举提示词,把命名规范、模块依赖、测试风格全部写在一个system prompt里。效果是:提示词长到几千字,模型输出质量反而下降;加上新需求后,提示词越来越难维护;换一个项目之后几乎不能复用。这不是提示词工程能解决的问题,这是架构问题——你需要把上下文拆解开,让不同角色各自关注不同切片,再通过协作动作合并最终结果。
1.2 多Agent协作到底解决什么问题
多Agent协作系统本质上是在做“软件开发流程的编码化”。它把传统研发中PM(产品经理)、后端工程师、前端工程师、测试工程师、代码评审员各司其职的方式,映射到多个各带独立提示词和工具权限的Agent实例上。
这样做得到的几个直接收益:
- 上下文聚焦。每个Agent只关注自己职责范围内信息,上下文窗口压力大减,输出质量显著提升。
- 责任可追溯。哪个模块出了问题,可以定位到是哪个Agent在哪个环节产出的错误。
- 流程可编排。从需求解析到编码再到测试验证,整个流程变成了一套可定义、可重复执行的流水线。
但这背后也隐藏着一个关键代价:编排复杂度。多个Agent之间如何通信、如何共享上下文、如何避免冲突、如何收敛结论,这些单Agent时代完全不存在的问题,会全部爆发出来。
1.3 落地前必须想清楚的三个问题
在动手搭建之前,先想清楚三个关键问题,否则后面大概率翻车。
第一,团队重构的目标到底是“效率”还是“质量”?如果是效率,那多Agent不一定比单Agent更快,因为编排层会带来额外的token消耗和系统开销,主要提升的是并行处理能力。如果是质量,比如减少低级错误、提升代码规范一致性,那么多Agent的效果会非常明显。
第二,你是否已经跑通单Agent的最小闭环?我见过不少团队直接上多Agent,结果分不清问题出在模型能力还是编排逻辑。理性的路径是:先用单Agent把某个任务做到“能用”,再拆成多Agent来优化“质效”。
第三,你的任务是否是可分解的?多Agent适合的是能清晰拆分成多个独立关注点的任务——写一本书、开发一个模块、分析一份财报。如果任务本身几十行代码搞定,强行拆成多个Agent纯属浪费token。
注意:多Agent不是银弹,它是把“流程复杂度”和“模型能力不确定性”做了一次解耦。流程乱了可以改编排,模型抽风了可以换模型,但如果你的任务本身不可拆分,这整套架构就是负担。
2. 核心架构拆解:五个角色与三层编排
2.1 角色设计:模仿的不是组织结构,是信息流
先看我们最后定下来的角色结构,一共五个:
| 角色 | 核心职责 | 需要的关键信息 | 是否接工具 |
|---|---|---|---|
| 需求分析师 | 解析输入需求,产出用户故事 | 用户原始输入 | 否 |
| 架构师 | 确定技术方案、模块划分、接口设计 | 用户故事 + 代码库结构 | 是(读取项目树) |
| 编码工程师 | 按架构设计生成代码实现 | 用户故事 + 接口定义 + 模块规范 | 是(写入文件、执行命令) |
| 测试工程师 | 编写测试用例并验证 | 实现代码 + 用户故事 + 测试规范 | 是(执行测试脚本) |
| 评审员 | 审查代码质量与需求覆盖 | 全部产出物 + 质量规则 | 是(读取产出物) |
这里要说明关键决策:我们没有照搬一个真实的软件公司组织架构,而是按“信息流”来设计。需求分析师产出的用户故事是给架构师看的;架构师产出的接口定义是给编码工程师看的;编码工程师的代码是给测试工程师和评审员看的。每相邻角色之间存在清晰的“契约接口”,这样每个Agent的输入输出都是结构化的。
如果你照搬真实组织架构,加一个“项目经理”角色去催进度,加一个“文档工程师”角色去写说明——你会发现Agent之间通信的token开销远远大于它带来的信息增益。真实公司里加角色是为了管理人和利益,Agent系统里加角色是为了切分上下文,场景完全不同。
2.2 三种编排模式的取舍
多Agent协作系统的核心是编排层(Orchestrator)。我们实践中对比过三种编排模式,各有适用场景。
第一种是“顺序流水线”。Agent A的输出直接作为Agent B的输入,依次执行。优点是流程简单,逻辑清晰,调试方便;缺点是任何一步失败整个任务终止,且无法并行。适用于流程稳定、上下游依赖强的任务。
第二种是“星型协调”。一个主控Agent负责任务调度,把不同子任务分发给多个专门Agent并行执行,最后汇总结果。这种模式在提升并行度上非常有效,但要防止主控Agent成为瓶颈,同时对模型能力要求极高——主控输出的调度指令质量直接决定全局结果。
第三种是“图状编排”。任务被建模为有向图,节点是Agent动作,边是数据依赖。它能够支持条件分支、循环、并行分支汇合等复杂流程,灵活性最高,但调试成本也最高。
我们最终采用了一种混合方案:宏观上用图状编排定义主流程,微观上在单个节点内部采用顺序流水线。举个实际例子,需求解析节点内部,先让需求分析师拆解用户故事,再由架构师产出技术方案,这两个动作严格串行;而跨模块的编码节点中,不同模块的编码Agent会被并行调度。
2.3 通信机制与共享记忆:最容易翻车的部分
这是整个架构里最核心也最容易踩坑的环节。
Agent之间的通信有两种方式,一种是“完全共享上下文”(把前面所有Agent的输出全部拼接给下个Agent),另一种是“结构化传递”(只传递约定的输出字段)。
共享上下文的问题是:token消耗呈线性增长,且大量不相关信息会干扰模型判断。特别是评审Agent,当我们把需求文档、代码实现、测试报告全部塞进去后,它的审查质量反而急剧下降——因为它的注意力被无关信息稀释了。
结构化传递则要求设计好“中间产物协议”。我们参考了函数式编程的思路——每个Agent的输出函数签名是固定的:
评审Agent输入:{原始需求, 用户故事, 代码diff, 测试结果} 评审Agent输出:{是否通过, 问题列表[], 修改建议[]}这样每个Agent都像一个定义良好的函数,可单独测试、可Mock、可替换。代价是需要多花一点时间定义中间格式,但长期看收益巨大。
关于共享记忆,我们踩过坑后发现:每个Agent需要完全隔离的记忆,只有经过“发布动作”的信息才能传给下游Agent。就像真实团队里,后端工程师不会直接看用户原始吐槽记录,他拿到的应该是产品经理整理后的需求文档。这是我们最终保留的共享上下文信息流:
用户需求 → 需求解析(结构化) → 架构设计(接口文档) → 编码(代码diff) → 测试(测试报告) → 评审(结论)3. 从零搭建这套系统:核心环节的实操记录
3.1 搭建Agent工厂:一切皆配置
不写死Agent逻辑,而是把Agent定义建模成一份JSON配置,由工厂函数加载生成。这个设计让我后续调试节省了大量时间。
配置文件的核心结构不复杂,但有几个字段特别值得设计:
model:不同角色用不同模型。需求分析师和架构师我们用推理能力最强的模型,编码工程师用代码能力最好的模型,评审员用综合能力最强的模型。全用同一个模型不仅浪费,在某些环节效果还更差。system_prompt:这是区分角色最核心的地方。需求分析师的prompt强调不做过度设计、只提取关键业务诉求;编码工程师的prompt强调接口文档先行、不擅自修改契约;评审员的prompt强调只评不修、但须给出具体修改建议。tools:按角色精确控制工具权限。测试工程师有执行python脚本的权限,编码工程师有写文件的权限,需求分析师则完全没有工具权限。memory:每个Agent独立维护自己的对话历史。经验数值:测试工程师的上下文保留最近10轮对话就够了,评审员需要完整保留从需求到代码的全链路,所以它用的是持久化存储而不是上下文传递。
3.2 中间产物协议:任务拆解是核心引擎
系统设计中最耗时的不是写Agent提示词,而是定义中间产物的数据结构。
我们最后采用了“四层产物”方案:
第一层是“用户故事”列表,需求分析师输出。每个用户故事格式固定为“作为XX角色,我希望XX能力,以便获得XX收益”。这个格式看起来老套,但它非常有效——架构师读起来信息提取效率极高。
第二层是“架构方案”,架构师输出。必须包含模块划分、核心数据结构、接口签名草案。关键约束是:架构方案必须能覆盖所有用户故事,如果有用户故事没有对应技术实现方案,属于不通过。
第三层是“接口与契约文档”,架构师输出。这是编码Agents的唯一技术依据。我们遇到最大问题是:编码Agent经常会“自由发挥”,比如擅自修改数据库表字段名称、补一个自以为更好的函数参数。解决办法很简单——契约文档一旦发布,编码Agent的prompt中明确标注“只能按契约实现,不得修改已有接口定义”。
第四层是“测试报告”与“评审结论”,分别由测试Agent和评审Agent输出。测试报告包含通过率、失败用例清单;评审结论包含是否通过、问题列表和修改建议。
3.3 循环终止:防止Agent陷入“修改-再评审”死循环
多Agent系统中最让人崩溃的问题是死循环。编码Agent提交代码后,评审Agent发现一堆问题,编码Agent改完再提交,评审Agent又发现新问题……
我们一开始直接限制最大循环次数为3轮,效果很差——要么在质量问题还没解决时就强行退出,要么在已经解决时白白多跑一轮。
改进后的方案是“信号灯机制”。评审Agent的输出不仅包含问题列表,还包含问题严重度标记:P0阻断级、P1重要级、P2轻微级。循环终止的条件修改为:没有P0/P1级问题,或已达到最大循环次数。
更细的调整是:编码Agent在生成修改方案前,先输出“问题理解摘要”,把我们计划通过回合校验收敛:
- 第1轮评审:找出P0/P1问题,要求解除评审Agent的“只评不修”限制,直接给出建议修复的代码片段。
- 第2轮:确认修复后新增问题是否为零,并且P2级问题的“风险提示”是否有必要处理。
- 第3轮以后:只做P0阻断级问题的跟踪。
对Agent的prompt里明确写了“你将收到多轮评审意见,请优先处理P0和P1问题,对P2问题如无明确修改理由可标注为暂缓”。
3.4 外部工具集成:沙箱带来的收益和代价
编码Agent直接写本地文件风险极大,我们必须让它在一个隔离的沙箱环境中执行工具调用。操作系统用的是轻量级容器,每个Agent执行一个独立实例。
实践中有两个细节值得记录:
第一个是代码执行权限控制。测试Agent执行测试脚本时,给它配置了“只能运行tests/目录下的文件”的白名单规则,并且在沙箱内设置网络禁用。这直接阻止了几次测试脚本尝试联网下载依赖的情况。
第二个是文件写入路径隔离。每个Agent有独立工作目录,Agent之间不能直接读取对方目录,必须通过共享产物协议传递数据。这样每个Agent的工作内容都是显式的输入输出map映射,方便审计也方便回溯。
代价是沙箱环境与本地开发环境的依赖不完全一致,可能出现“沙箱里跑通了本地跑不通”的情况。我们的缓解方案是:同步项目依赖锁定文件到沙箱,每次沙箱初始化时先执行一次依赖安装。
4. 常见问题与排查实录
4.1 上下文污染:最隐蔽的质量杀手
这是全套系统中出现频率最高的问题。
症状表现:评审Agent明显偏心,对编码Agent产出总是给出“通过”。排查后发现是因为评审Agent与编码Agent共享了部分对话历史,评审看到了编码Agent的思考过程,在做客观判断时被影响了。
彻底解决方案:所有Agent之间的通信只能通过结构化产物协议,禁止任何Agent直接访问其他Agent的对话历史。共享信息只有“发布”到内存总线上的结构体,其他Agent读取到的是序列化后的JSON字段,而不是原始的推理过程文本。
4.2 Agent“自说自话”导致流程空转
出现过一次印象深刻的故障:编码Agent输出了大量代码文件,但测试Agent迟迟不执行测试,而是重复输出“我已经检查了代码逻辑完整性”。原因是测试Agent的prompt中同时包含了“检查代码”和“执行测试”两个职责,模型决策策略混乱选择了风险更低的行为。
修复方式是把“检查”和“执行”拆成两个独立Agent,或者用工具调用强制绑定。最终我们选择了强制绑定——测试Agent的prompt中明确写“只有执行工具调用返回结果后,你才能输出测试报告”。
4.3 token成本失控:一天烧掉三倍预期
这个问题非常现实。多Agent协作模式下,同一份需求会被多个Agent重复处理,token消耗成倍放大。我们统计过一个中等复杂度功能模块,需求解析消耗约5k token,架构设计约12k token,编码实现约25k token,测试评审约20k token,整体下来一个模块要消耗6-8万token。
成本优化做了三件事:
- 模型分级:把token单价最低的模型分配给需求分析师,最贵的模型只用于关键评审环节。
- 摘要压缩:Agent之间的传递数据不保留完整对话记录,向下游Agent传递的是“结构化摘要”而不是“完整记录”。例如编码Agent的上下文只保留契约摘要,而不是架构师的完整推理过程。
- 输出格式强约束:要求Agent必须输出固定格式的JSON结构,避免输出无关的“思考过程”。在prompt里加了一句话:“不要输出任何解释,只输出JSON字段”,token消耗直接降了约20%。
4.4 并发冲突:多个Agent写同一个文件的“竞态问题”
当两个编码Agent被并行调度时,可能出现同时写入同一个文件、互相覆盖的问题。
初期的粗放做法是加全局锁——同一时间只允许一个Agent写文件。但这样并行度就没了,多个Agent的优势被削弱。
后来的方案是“文件级锁 + 写前合并”。每个Agent在写入文件前,先检查目标文件是否有其他Agent正在修改;如果有,先pull最新版本到本地工作区,再基于最新版本做修改。这就模拟了真实团队中常用代码管理工具的操作习惯——先同步主干,再改分支。
文件锁的粒度需要按实际情况调。如果锁粒度太大(整个仓库一个锁),相当于回到串行;锁粒度太小(单行锁),实现复杂度飙升且死锁概率增大。我们最终定的是“目录级锁”:至少同一目录下只有一个Agent在执行写操作。
5. 工程化落地经验:多Agent系统投入研发流程的取舍
5.1 团队工作流消化:不是替换人,是替换“局部重复劳动”
把多Agent系统接入实际研发流程之后,我最深刻的一个体会是:它不会直接取代任何一名开发工程师,它取代的是工程师身上“局部重复劳动”的部分。
举个例子,在我们内部某个业务模块的需求流转中,过去需要人工整理用户反馈、编写规格说明、拆分模块依赖、检查代码风格。这套系统接进去之后,需求分析师和架构师两个Agent基本承担了“从用户反馈到技术需求卡片”的整理工作,相当于把一个技能熟练但重复度高的初级分析师角色自动化了。开发工程师拿到的是一份结构化的输入,而不是原始的用户反馈,认知负担直接降低。
但要注意,这套系统并不擅长“大需求”。需求模糊度高、涉及跨多个模块重构、团队内部政治因素强(需要调和不同组利益)的任务,我建议还是人工主导。Agent适合的是“需求边界比较清晰、产出物可以客观验证”的任务。
5.2 评估指标体系:不能只看“生成了多少代码”
用线性的“生成代码行数”来衡量多Agent系统价值是极其危险的。我们初期踩过这个坑——编码Agent在无测试约束的情况下生成了大量冗余代码,看起来“产出很丰富”,实际有一大半不可能通过评审。
后来我定了一套评估口径:
- 需求覆盖率:用户故事列表中的每个子项是否都有对应的代码实现。
- 测试通过率:新代码能否通过已有的自动化测试。
- 评审返修率:第一次评审就通过的模块占总任务的比率。
- 人均产出效率:对比引入系统前后,同规模团队处理类似需求的天数变化。
有意思的是,“测试通过率”是最灵敏的指标——只要把这一个指标卡住,代码质量就有保障。因为编码Agent为了让自己提交的代码通过测试,会主动约束自己的输出质量,不再无脑生成“看起来对但跑不通”的代码。
5.3 边界意识:什么坚决不能交给Agent
在投入这套系统半年之后,我整理了一份“坚决不交给Agent”的清单,供你评估时参考:
- 涉及用户隐私数据读取、鉴权逻辑变更的任务。Agent在沙箱中能操作的只是脱敏数据,但真实的鉴权变更涉及安全评审,不适合自动化。
- 对外承诺变更。比如改API返回值、变更数据模型的字段含义,这类决策可能影响其他团队下游系统,人工评审不可跳过。
- 生产环境的直接变更。Agent执行的所有步骤限定在测试副本环境,生产环境发布仍坚持人工确认加审批。
- 价值判断型决策。比如“这个功能是否值得做”这类业务价值判断,模型并不能理解战略背景,做了也只是“基于概率的预测”。
这套系统真正能帮到人的是缩短从“需求到手”到“初步产出物可评审”这个阶段的时间,而不是替你做决策。
6. 结语:当前认知与下一步实验方向
6.1 我对多Agent系统的重新理解
经历了从单Agent到多Agent的架构升级后,一个重要的认知转变是:多Agent系统本质上是一套“上下文管理协议”,而不是“模型能力叠加协议”。
让我解释一下:单个模型的推理能力在任务难度上是有明确上限的,即使你叠加10个Agent,每个Agent调用的还是同一个模型家族,单个Agent的推理能力并不会变强。多Agent真正改变的是信息如何流动——把大量信息切碎后按需分发,有效缓解了单次推理的上下文过载,让每一次推理都更聚焦。
所以,如果你发现单Agent回答质量不行,别急着上多Agent,先检查是不是任务描述不清晰、上下文太冗长。如果单Agent质量已经可接受,只是想处理更大规模的信息、更长的任务链、更复杂的过程控制,那么多Agent是值得投入的方向。
6.2 几个可以深入扩展的方向
最后分享一下后续我打算继续推进的几个方向:
第一,跨Agent的长期经验沉淀。目前每个任务完成后,经验只保存在评审Agent的结论中,没有被系统性地沉淀到Prompt库。我在尝试做一个“经验回写”动作——每个任务结束后,自动抽取“哪些规则值得固化”,更新到后续任务的Prompt模板中。这就相当于不断积累团队规范,而不是每次从零开始让Agent摸索。
第二,自适应编排。现在的图状编排是人工定义的,哪一步失败就重试,哪一步成功就继续。下一步我计划引入一个“调度Agent”来自动决策编排路径——它能根据当前任务的上下文执行情况,动态决定是不是需要额外拆解、是不是要增加一轮评审。
第三,多模态Agent的引入。目前的系统完全是文本和代码。但对于一些涉及UI界面还原、图像内容理解的任务,测试Agent和评审Agent往往表现得不好,因为它们看不到实际界面长什么样。下一步计划引入视觉能力,直接让评审Agent“看”渲染后的UI效果和交互结果,这会大幅提升前端相关任务的完成度。
这套系统的架构与落地经验,本质上是把软件开发团队中“信息流转、角色分工、质量校验”这套行之有效的组织方法论,做了一次工程化迁移。它是有边界的,也是快速迭代的。在做这类系统的迭代时,保持对“失败归因”的耐心,比追求一次性完美更重要。