ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

多智能体协作编程:从单模型到大模型开发团队的进阶实践

多智能体协作编程:从单模型到大模型开发团队的进阶实践

最近这一年,我基本把日常编码工作都迁到了“AI辅助”模式下,从自动补全到聊天式重构成了一段自然的流程。但用久了会发现一个特别别扭的问题:单个模型在同一段上下文里一会儿当架构师、一会儿当测试工程师,提示词写得再详细,它还是会不由自主地偏科。真正让我觉得AI编程开始“换玩法”的,是一个多智能体软件开发团队模拟项目——让多个AI角色像一家公司的部门一样协作,有人定需求、有人写方案、有人出代码、有人做评审。这篇文章就围绕这个项目,谈谈多智能体协作编程的完整拆解、落地实操和当前边界,适合已经用过AI辅助编程、正在寻找更高阶用法的开发者阅读。

1. 为什么一个AI从头写到尾不够用了

1.1 长对话里那些让人抓狂的瞬间

我最早用AI写代码,就是一个对话窗口从头写到尾,需求不明确就让模型自己问,写出来有问题就贴回去让它改。起初很爽,项目一复杂就开始露馅。有一次我让AI实现一个带本地存储的待办工具,前面几轮它还在老老实实地设计数据模型,十几轮之后我开始让它调整UI布局,结果它突然把存储层的数据结构也顺手改了,还特别自信地把所有调用点都重构了一遍。我盯着diff看了半天,血都快吐出来了。

这其实是单模型长上下文共有的问题:模型没有真正的“记忆”,它只能在一个上下文窗口里做注意力计算。当对话轮次变多、代码块变长,早期的信息会被新信息稀释。如果你要求它同时扮演“业务分析人员”和“资深后端工程师”,它还会出现角色混淆——前半段还在问用户需求,后半段直接替用户做决定。这不是提示词写得不够好,而是架构上就存在天花板。

1.2 多智能体隐喻:把团队装进代码里

多智能体软件开发团队的核心思想其实特别简单:与其让一个AI什么都干,不如拆成多个各司其职的AI代理,每个代理拥有独立的上下文和角色设定。有的代理只负责把用户需求翻译成功能列表,有的代理只负责函数设计和接口定义,有的代理只负责写具体的函数实现,还有的代理专职挑刺。

这套思路借用的是现实软件公司的分工模型。现实里你不会让同一个程序员又写需求文档又写测试用例又写核心代码,因为角色目标互相冲突,写需求的人想的是“范围可控”,写代码的人想的是“实现优雅”,测试的人想的是“找漏洞”。这些目标让一个人同时承担,最终一定会在某个环节里偏袒了自己最顺手的那一面。多智能体模拟的就是这种“多个角色互相制衡”的环境。

我见过一个很形象的类比:传统单模型像是让一个全能选手跑马拉松,多智能体则更像组织一个接力队,每个人只跑自己最擅长的那一段。只不过这只接力队的每个成员都是大语言模型,靠自然语言消息传递交接棒。

1.3 范式转移到底转移了什么

很多人听到“范式转移”会觉得夸张,但站在实操角度看,这个转移其实非常具体:编程的核心工作正在从“写代码”变成“定义流程和约束”。

以前我们面对AI编程,思考的是“这句提示词怎么写才能让模型理解我的意图”,本质上是人机对话。多智能体出现之后,思考方式变成了“这个软件团队的每个角色应该承担什么职责、按照什么顺序交互、什么情况下需要人介入”。你不再对着一个AI提问,而是在编排一群人。这种转移意味着,开发者的核心能力会从“编码技能”逐渐走向“流程设计和质量把关能力”。

当然这不意味着编码不再重要,而是在AI能把大部分编码执行工作做掉的环境下,真正产生决定性差异的,是你能不能设计出一套让AI角色高效协作的流程。这一点在多智能体项目里体现得淋漓尽致。

2. 多智能体团队的角色设计与协作机制

2.1 角色怎么分才合理

搭建一个能用的多智能体开发团队,第一步不是写代码,而是画组织架构图。我实际用下来,最精简的配置是四个角色,再多就容易被上下文开销拖垮:

产品经理代理负责需求澄清。它接收用户输入,把模糊的想法抽成明确的功能需求列表、用户故事和验收标准。这个角色最重要的能力是“提问”,它应该主动发现需求里的歧义,而不是顺着用户的话直接开干。

架构师代理拿到需求后做技术方案设计。它负责拆模块、定义接口、选择存储方案、安排数据流。这个角色产生的产出通常是接口文档和模块结构,而不是具体代码。它存在的意义,是把“要做什么”翻译成“系统怎么组织”。

开发工程师代理负责把设计变成可运行的代码。它需要严格按照架构师的接口定义完成实现,不允许私自变更模块边界。这个角色最容易出错的地方,就是“自由发挥”。

测试工程师代理负责找茬。它拿到需求和实现后,编写测试用例、执行代码检查、识别边界条件和异常路径。它输出的不是“代码写得不错”,而是“这里没处理空指针”“这个函数没有幂等性”。

这四个角色之间,产品经理和架构师是上游,开发和测试是下游。我的个人经验是不要把代码评审单独拆出来,因为开发工程师完成实现后,由测试工程师做一轮针对性的代码走查,效果反而比单独加一个“评审人代理”更直接。角色越少,上下文越干净,输出质量反而越稳定。

2.2 系统提示词:每个代理的“岗位说明书”

让AI代理稳定扮演角色,关键不在于长篇大论,而在于系统提示词的结构化。我整理了一套模板,核心包含三部分:身份职责、工作边界、输出格式。

身份职责要非常明确,比如“你是一个软件项目的测试工程师,你的目标是发现实现中的缺陷,而不是修复它”。这里我在“不是修复它”上加了下划线级别的强调,因为模型天然倾向“帮忙把代码改好”,一旦它开始改代码,测试角色就失效了。

工作边界是约束代理“不能做什么”。产品经理不能写技术方案,架构师不能直接改代码,开发工程师不能跳过设计文档直接出实现。这些负向限制比正向指令更能防止角色串味。

输出格式决定了协作能不能自动化。我给每个代理定义了严格的结构化输出,例如产品经理输出JSON格式的需求列表,架构师输出Markdown格式的接口定义,测试工程师输出带有问题级别和复现路径的缺陷报告。为什么必须这么做?因为下一步的代理要解析这些输出,如果格式不统一,整个流程就是空中楼阁。

实际踩坑让我明白一件事:系统提示词不是一次写好的,需要根据输出质量迭代。最初我写的角色提示词都很“大而全”,动辄五六百字,但效果反而差,因为模型把注意力分散到了“成为一个优秀员工”这种虚泛描述上。后来我砍掉了所有道德层面的措辞,只保留职责、边界、格式,质量立刻上来了。

2.3 协作拓扑:流程驱动比自由对话更稳

多智能体团队的消息交互方式,主流有两种设计:一种是让所有代理在一个开放聊天室里自由发言,谁想到什么就说什么;另一种是严格按照预设流程依次执行,像工厂流水线一样。我在实操里试过这两种方案,最终稳定选择了后一种。

自由对话看起来更灵活,但它有两个致命问题:一是上下文爆炸极快,每个代理都要看到所有历史消息,模型token消耗直接翻倍;二是话题漂移严重,角色A和角色B围绕着某个细节来回拉扯,最后产出了一个完全偏离原始需求的方案。

流程驱动的做法是,预先定义好消息流转路径。例如用户需求先给产品经理,产品经理输出需求文档后,把需求文档发给架构师;架构师输出设计文档,再把设计和需求一起发给开发工程师;开发工程师产出代码,再连同需求和设计一起发给测试工程师。每两个角色之间是接力棒式传递,不是共享所有历史。

这种设计的优势在于“每只智能体只关心自己该关心的那一段”,上下文长度可以被严格限制。但同时它要求每个环节的输出足够完整,下游才能在不看全部历史的情况下开展工作。这恰好又对应了我在2.2里提到的结构化输出,两者是强绑定关系。

3. 从零搭建一套可复用的多智能体开发流水线

3.1 技术选型:框架还是自己组装

搭建多智能体团队有两种路径:使用现成的多智能体开源框架,或者基于大语言模型接口自己编排。对于大多数场景,我建议从框架开始,理由很实际:你可以把精力集中在角色设计、流程优化上,而不是花大量时间处理消息路由、任务调度、上下文管理等底层细节。

我用过一个SOP式流程驱动的开源框架,它内置了“软件公司”的多角色配置,可以开箱即用地模拟需求分析、架构设计、编码实现、测试反馈的完整流程。你不需要自己实现智能体调度,只需要调整系统提示词和流程顺序。这种方案的优点是上手快、稳定;缺点是不够灵活,想要深度定制交互流程,还得自己改框架源码。

对话式框架是另一个选择。你可以用多个独立的“多代理对话组”,手动定义每个代理的接收条件、回复触发和结束条件。这种方式自由度高,可以做出类似“开发者和测试者背对背讨论方案”的复杂交互,但代价是工程复杂度直线上升,消息解析、循环控制、终止条件都要自己写。

如果让我给一个选择建议,我会说:优先用一个文档完善、社区活跃的现成框架跑通流程,攒够经验之后,再根据实际痛点自研二次封装。不要一开始就自己造轮子,这类项目的复杂度不在“调用模型”,而在“流程编排”。

3.2 最小可用原型:让四角色跑通一个真实需求

我拿一个非常小的需求来演示:“实现一个命令行待办事项管理工具,支持新增、查看、标记完成,数据持久化到本地JSON文件。”这个需求我实际跑了一遍完整流程,下面是每个角色的产出摘要。

产品经理代理的第一步是拆解需求,它提出了三个关键问题:“用户如何区分不同待办事项?”“标记完成后是否保留记录?”“JSON文件损坏时怎么处理?”这三个问题比我最初的需求描述细致得多。很多开发者自己写需求时往往默认了答案,但AI代理会主动把隐含假设翻出来,这一点在需求沟通里非常值钱。

最终产品经理输出的需求文档包含功能列表:新增待办项、展示待办事项列表、按ID标记完成、程序启动时自动加载本地JSON、数据文件不存在时自动创建。验收标准也清楚:“完成标记操作后待办项状态应持久化,重启程序后仍保持。”

架构师代理拿到需求后,产出的是模块划分和接口定义。它设计了三个模块:数据存储模块负责JSON文件的读写与异常兜底,命令解析模块负责解析用户输入的子命令和参数,业务逻辑模块负责调用存储模块完成各项操作。它还明确了接口签名和数据结构,要求每个待办项包含id、content、status、createdAt四个字段。

开发工程师代理按照设计文档完成了代码实现,核心代码我不完全贴了,只说一个关键点:它在实现“标记完成”功能时,读取了数据源后原地更新,而不是先复制一份再合并。测试工程师代理随后发现了两个问题:“当JSON文件内容是空数组时,读取逻辑正常;但当文件内容是空字符串时,会抛解析异常。另外,待办项内容包含特殊字符时,没有做转义处理。”这两个问题提得非常准确。

这个原型实验最有价值的结论是:四个角色各自产出的结论,单独拿出来都不比一个聪明的单模型强多少,但组合起来之后,开发工程师不会跳过设计直接动手,测试工程师也不会因为代码逻辑看起来正确就放行。这就是流程约束带来的正反馈。

3.3 配置代理时的关键参数与上下文管理

多智能体流水线跑起来之后,最需要盯紧的就是上下文窗口。每个代理在收到上游消息时,通常只会拿到精简后的“任务包”,而不是所有历史。我在配置时给每个角色设置了最大上下文长度限制,例如产品经理只需要保存需求相关的原始输入,架构师只保留产品经理的输出和自身的初步设计,开发和测试则持有一份完整的“任务上下文包”。

这份“任务上下文包”是保证长链路不失控的关键设计。它的内容包含需求文档、设计文档、当前代码、测试报告,但每一份内容都会在传递前做一次格式压缩。比如把Markdown表格形式的接口定义精简成单行接口签名列表,把测试报告压缩成“问题级别+模块+问题描述+期望行为”。上下文管理不是简单地截断,而是要做重写与摘要,这一步必须由程序控制,不能交给模型自己处理。

模型参数的设置同样重要。我在流水线里统一关闭了随机采样和创造性发散相关的参数调整,保持确定性输出。为什么这样做?因为多智能体协作的容忍度比单模型对话低很多。单模型聊天里,模型说一句不太贴切的话,你不会觉得天塌了;但在多智能体流程里,如果产品经理输出的需求条目格式偶尔变一下,下游架构师就可能解析失败,整个流水线直接中断。

温度参数之外,我还会强制设置输出轮次上限。每个代理最多执行一次“思考产出”,如果输出不符合结构要求,就再做一次修正性输出,达到上限仍不合格就直接终止,把原始输出返回给人判断。这个“人工熔断”机制非常有用,它避免了两只智能体在错误信息上来回打转,空转浪费token。

3.4 实测性能数据与效果对比

我拿“命令行待办工具”跑了三组对比:组一是单模型直接一次性生成;组二是我用单模型多轮对话迭代;组三是多智能体团队。三组的时间成本因为接口调用次数明显不同,单模型一次生成最快,多智能体最慢,完整跑完大约要十来分钟的模型响应时间,消耗的token数量大概是单模型直接生成的八到十倍。

但这个成本不是白付的。组一和组二生成的代码,我人工评审各花了接近二十分钟,因为存在隐藏边界问题、接口设计不合理、函数职责混杂;组三生成的代码,我人工只花了五分钟做最终检查。如果把“人工检查时间+模型调用成本”加在一起计算,多智能体在五轮以上迭代的长周期任务里反而更划算。

有个现象特别值得注意:组二在单模型多轮对话里出现的“后期角色漂移”,在多智能体流程里基本消失了。因为每一轮的角色都由独立的系统提示词固定,开发工程师不会突然变成测试工程师,测试工程师也不会在发现问题后自作主张去改代码,每个角色都在自己的上下文里保持职责一致。这种稳定性是“流程约束”带来的,比任何提示词技巧都可靠。

4. 常见问题与排查技巧实录

4.1 角色漂移和串味问题怎么防

多智能体跑久了,最常遇到的问题是角色串味。最经典的是开发工程师代理在实现某个函数时,顺手开始优化产品经理的功能需求,它会在代码注释里写“根据实际实现,需求中的离线搜索功能应改为实时搜索”。这种越权行为看起来有道理,但会打破流程的职责边界。

我的排查方法是:给每一段代理交互都记录完整日志,包括系统提示词、收到的输入、原始输出和解析结果。当发现串味迹象时,优先检查系统提示词里的“工作边界”是否写清楚,关键是“负向约束”。比如给开发工程师的提示词里明确写:你是开发工程师,职责是完成代码实现,不得修改需求,不得调整接口设计,如果发现上游设计有缺陷,请将问题记录在交付说明中。

另一个实用技巧是在代理输出后加一个规则校验层。比如开发工程师的输出不能包含“需求变更”“建议修改”等词汇,如果校验失败,就把输出退回,要求它按要求重新生成。这种程序化校验比让模型自己检查可靠得多。

4.2 上下文爆炸与信息孤岛

上下文爆炸是多智能体项目最常见的技术风险。原因在于每个代理都想获得“全部信息”以便做出更聪明的判断,但全量信息共享会让token消耗指数级上升,最终把模型的有效注意力稀释到几乎为零。

我的对策前面提到过:任务包制。每个代理只接收“执行任务所必需的最小信息集”。如果某个代理报告说信息不足,不应该给它堆历史记录,而应该检查上游输出是否遗漏了关键内容,或者自己的提示词是否没有让上游理解该输出什么字段。信息孤岛问题往往是反面表现:代理之间的信息垂直传递,但横向不共享,导致架构师不知道测试工程师发现了什么。解决方法是允许“测试报告回流给开发工程师”,由开发工程师进行修复,而不是让测试报告直接回到架构师那里,这样能让信息在需要的地方流动起来。

4.3 测试代理“空转”,查不出有效问题

这是我踩过最深的坑。最初跑流水线时,测试工程师代理的输出总是“检查通过,暂无发现问题”,然后我人工一测,隐藏缺陷一堆。造成这种现象的根本原因,是测试代理在“看完代码后”自动与代码产生了“共情”——它可以理解开发者的设计意图,因此对实现里的问题容忍度极高。

解决办法不是让它更努力地检查,而是调整它的输入和评价标准。我给测试代理提供了需求文档和设计文档作为对照,让它把“实现是否符合需求”和“实现是否符合设计”分别校验,而不仅仅是在代码里找语法错误。再一个办法是取消“没问题”这个输出选项,强制测试代理必须以问题列表的形式交付,即使确实没问题,也要写明“基于哪些用例验证、覆盖了哪些边界条件”。这个约束会迫使它输出扎实的测试记录,而不是敷衍了事。

顺序也很重要。先让测试代理基于需求写测试用例,再由开发工程师实现这些用例对应的代码,最后再让测试代理运行验证。这种“测试先行”的流程像极了测试驱动开发(TDD),在多智能体场景下能天然消除共情偏见,因为测试用例和实现代码来自不同角色的不同上下文。

4.4 token成本失控与响应过慢

多智能体项目的成本问题往往让新手措手不及。现在主流大语言模型按token计费,一个完整流水线跑下来的消耗经常是单模型对话的十倍。如果每个代理都携带大段历史记录,成本还会继续增高。

我的建议是给每个代理设置严格的“输出预算”,比如产品经理一次输出的需求文档不超过八百个token,开发工程师一次输出的代码块以“新增代码”为主,不要重贴未修改的文件。另外,可以在流水线中间插入“小结代理”,它只负责对前几步输出做信息压缩,生成一份供下一阶段使用的精简上下文。这个代理虽然额外消耗了模型调用,但因为它能显著降低后续各步的上下文体积,总体成本反而下降。

延迟上最大的瓶颈是串行执行。整个流程必须等产品经理完成才能轮询架构师,每一步都要等待模型响应。这个速度在当前阶段确实不适合交互式开发场景,更适合“提交需求后等结果”的批处理模式。针对这点,我目前的做法是把多智能体流水线放在后台异步执行,与本地开发并行,不让调用阻塞在编辑器里。

5. 边界与真正的范式转移:我们该调整什么

5.1 多智能体编程适合什么、不适合什么

经历了多轮实战后,我对多智能体编程的适用边界有了清晰判断。它非常适合需求相对明确、模块边界清楚、交付物可以验证的中小型项目。比如内部工具、命令行程序、代码生成脚本、数据处理管道,这些项目里智能体之间的接力能明显降低人工审查成本。

它不适合需求极度开放、需要大量人类偏好判断的项目。比如“帮我想一个产品创意并实现它”,产品经理代理会把问题一步步拆细,但最终答案还是要人来定;再比如涉及核心算法调优的项目,开发工程师代理写出了一版算法,但性能是否达标往往需要真实数据集验证,这超出了纯文本协作的范畴。还有一个现实情况是,如果项目代码库非常大,当前阶段的多智能体很难高效地读完全部代码,它们更适合处理“从零到一”的新建功能,而不是深入改造大型遗留系统。

5.2 对开发者角色的真正改变

这个项目让我反复想一个问题:当多个AI智能体模拟了一个开发团队的协作链路,人类开发者的位置在哪里?

我的答案是“流程运营者和决策者”。你需要设计角色配置、定义交互顺序、设置质量标准、判断异常情况,以及在关键节点做最终裁决。比如当产品经理代理与测试工程师代理对某个需求的理解产生分歧时,你需要充当唯一的拍板人。这种工作性质和传统“软件项目经理”非常像,只不过管理对象不是人,而是智能体。

换句话说,多智能体软件开发团队并没有让“人”变得无关紧要,反而把人的作用提到了更高维度。那些只依赖编码技能、不具备流程思维的人可能会感觉到压力,而对于那些原本就擅长分解任务、设计接口、把控质量的工程师来说,多智能体是他们能力的放大器。

我个人的体会是,不要把这个项目当成一个自动化工具来用,而要把自己当成这个团队的“技术负责人”。你依然要理解代码、理解架构、理解测试策略,否则连智能体的产出好坏都判断不了,更谈不上去优化它们。

5.3 后续扩展的几个方向

这个项目的可扩展性很强。我目前正在尝试的方向包括:让“代码评审智能体”加入流水线,专门审查安全性、性能、可维护性;把测试智能体接入本地测试框架,让它真正执行代码而不是只做静态检查;以及用向量数据库存储历史项目的设计决策,让新品需求启动时能参考历史经验。

我踩过几次坑之后也意识到,多智能体编程的瓶颈不一定在模型能力上,而在流程设计上。模型的能力每年都在提升,但如果我们还是用“人肉写提示词”的方式去组织它们,永远只会在单模型基础上做小幅优化。真正的杠杆来自于像组织团队一样去设计协作链路,用结构保证质量,而不是靠运气。

这个领域目前还没有绝对正确的答案,每一位实践者都在参与定义“AI如何参与软件开发”的标准姿势。如果让我给一条建议,那就是从一个小项目开始,亲手跑通一整套多智能体流程,你会在过程中获得远超这篇文字的真实体感。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进