news 2026/10/16 8:24:24

多智能体协作系统架构设计与落地:从单体Agent到Agency Agents

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多智能体协作系统架构设计与落地:从单体Agent到Agency Agents

最近差不多两个月的时间,我一直泡在一个内部研发辅助工具的重构项目里,核心动作就是把它从单Agent模式改成多智能体协作系统,内部代号就叫Agency Agents。听着有点绕,但整体思路其实很朴素:与其让一个大模型从头到尾包办开发任务,不如像组建一支真实开发团队那样,把需求拆解、方案设计、编码实现、代码评审、测试验收分别交给不同的Agent去干,让它们各管一摊、互相配合。

这个系统能做的事,往小了说是自动把一个粗需求变成带测试的代码,往大了说是提供一套可以复用的多智能体架构模板。文章里我会把架构设计、角色划分、协作机制、落地实操、踩坑记录一起整理出来,适合正在研究多智能体应用、想在真实业务里把Agent用起来的工程师,也适合刚入门、想搞清楚多智能体系统到底怎么落地的同学。

1. 为什么用多智能体重构开发团队——核心命题与架构思路

1.1 我是在什么场景下决定放弃单体Agent的

先说改造前的状态。我之前那套工具就是典型的单体Agent:把一大段需求描述、历史对话、相关代码片段全部塞进一个提示词里,让大模型一口气输出完整代码。在demo阶段这套方案非常爽,丢进去一句"帮我写一个用户登录模块",它真能给你吐出一堆能跑的文件。

但只要碰真实项目,问题就会接二连三地冒出来。第一个是上下文长度失控。一个正经需求通常涉及多个文件、多种约束、若干轮讨论,把这些全塞进一个上下文窗口之后,模型注意力会被严重稀释。表现为前半段还在认真按需求来,后半段就开始放飞,备忘录里提到的约束忘得一干二净。第二个是角色混乱。让同一个Agent既当架构师又当编码员还要自己审自己,结果就是设计文档写得像代码注释、代码里又混进一堆设计讨论,最后收拾起来极其痛苦。

还有一个更隐蔽的问题:单体Agent一旦输出中间结果,是没有"校验节点"的,错了就一路错到结尾,中途没有任何机制能拦一下。真实开发团队里,需求评审、代码评审、测试关卡都在不断拦截低级错误,但单体Agent把这些环节全压缩了,等于一个人又写代码又做测试,出问题概率自然高。

1.2 为什么拿"开发团队"当架构蓝图

后来我意识到一个事情:早在Agent出现之前,软件开发行业就已经有一套成熟的复杂任务拆解方法论了,也就是现代研发团队的组织方式。一个团队能稳定交付,靠的不是某个人特别强,而是下面这五个要素配合着运转:

  • 分工:产品、开发、测试各管一段,职责边界清晰。
  • 流程:需求到设计、设计到编码、编码到评审,有先后顺序。
  • 评审:代码有审查,测试有验收,错误在流转中被拦截。
  • 记录:需求文档、接口约定、变更历史,让信息可以跨阶段传递。
  • 工具:CI、代码库、测试框架,负责把琐碎的活自动化。

多智能体系统如果把上面五条都落到架构里,就是一套"用Agent模拟的真实研发组织"。这也是Agency Agents项目的核心命题:不是搞一个什么都干的全能Agent,而是造一批各有所长、按照固定协作协议配合的"虚拟员工"。

1.3 架构模式怎么选:三种主流方案的对比

在动手之前,我先梳理了多智能体的主流协作架构,大概可以分为三类。

流水线模式。需求Agent处理后把结果交给设计Agent,再交给编码Agent,像工厂流水线一样按顺序流转。好处是结构简单、可预测性强,适合任务边界清晰的场景。坏处是上游一旦出错,下游会一直错下去,而且没法回头修正。

编排者模式。也叫Orchestrator-Worker,有一个中央调度者负责拆任务、派任务、收结果、做决策,下面挂一堆专门干活的Worker。好处是控制力强,编排者可以判断"这个结果要打回重做"或者"下一步派给谁",坏处是编排者的思维能力会变成瓶颈。

协商模式。多个Agent地位平等,通过讨论、投票、辩论达成共识。这种方式在需要多角度观点时表现亮眼,比如让两个Agent扮演正方反方讨论一个技术方案。坏处是收敛慢、token消耗高、不可控。

我做了一次对比选型,最终选择的是以编排者模式为主、局部嵌入流水线执行的混合架构。核心调度由编排者Agent负责,但执行路径是固定的流水线:需求解析到设计到编码到评审到测试,每个阶段完成后编排者根据质量门禁决定放行还是打回。这样既保住了流程稳定性,又保留了分支决策能力。

2. 智能体角色体系设计与开发团队的角色映射

2.1 角色设计原则:"定岗定编"比堆数量重要

多智能体系统设计里最容易犯的错,就是一上来搞十几个Agent,感觉声势浩大,结果系统连一个最小闭环都跑不通。我的经验是,角色数量由任务链决定,而不是由想象决定。先把一条完整任务链画出来,标出必须的转换节点,再给每个节点配一个Agent,多余的统统砍掉。

我给每个Agent定岗时遵守三条硬约束:

  • 职责单一:一个Agent只做一件事。比如审查Agent只做代码评审,绝对不负责改代码,让它"顺带修一下"只会让结果不可控。
  • 上下文最小化:每个Agent看到的上下文只包含它做当前决策所需的信息,不该看到的全局杂讯一律隔离。
  • 工具白名单:每个Agent只挂自己需要的工具,编码Agent有搜索代码和写文件的权限,但测试Agent才有执行测试命令的权限。

2.2 从需求解析到集成验收的角色全景

顺着"把粗需求变成已验收代码"这条主链走下来,我在Agency Agents里一共定义了六个角色。

需求解析Agent。负责把用户模糊的描述转成结构化需求条目,包括业务规则、验收标准、边界条件。它相当于真实团队里的产品经理,输出的是一份可作为契约的需求清单。核心提示词约束是:必须列出"可验证"的验收标准,不能只写形容词。

架构设计Agent。输入需求清单,输出模块划分、数据流、接口定义、技术选型。它相当于架构师,只做方案设计,不写业务代码。关键约束是:设计必须落到文件和函数级别,以便后续编码Agent可以无脑实现。

编码Agent。按照架构设计产出具体代码。它相当于开发工程师,默认只会按设计执行,遇到设计遗漏点时必须停下来向编排者上报,而不能自作主张。这一点是我踩过坑之后加的硬性约束,因为大模型太容易在不确定时"帮你想当然"了。

代码审查Agent。负责从代码规范、逻辑缺陷、遗漏边界三个角度审查编码产出。它相当于评审组里的资深工程师,输出是问题列表,每条问题必须指出所在文件和风险等级。

测试Agent。负责生成并执行测试用例,包含单元测试和关键链路测试。它相当于测试工程师,执行完测试以后输出测试报告,对未通过项给出最少复现步骤。

集成验收Agent。最后把关者,把需求清单、代码、审查报告、测试报告放在一起做综合验收。只有它通过,这轮任务才算结束。

2.3 角色提示词的关键设计:给Agent立"人设"不是写作文

我为每个角色都写了一套固定结构的提示词,这套结构经过多次调整后才稳定下来,核心包含四块内容:

第一块是身份与能力边界,明确你是谁、你能做什么、你绝对不能做什么。第二块是输入输出Schema,严格规定输入字段和输出结构,用JSON格式强制约束。第三块是工作流程提示,描述你拿到输入后应该先看什么、再想什么、最后产出什么。第四块是公共铁律,比如"不得编造不存在的文件路径""遇到歧义必须标记为待确认"。

下面给个简化版示例,是编码Agent的核心提示词骨架:

你是该项目中的编码Agent,职责是按照架构设计文档实现代码。 你可以访问的工具有:代码库检索、文件写入。 你无权执行测试命令,也无权修改架构设计文档。 输入是一个包含需求清单和模块设计的JSON对象。 输出必须是符合Schema定义的代码变更列表。 铁律: - 只实现设计文档中存在的模块,不新增任何未要求的功能。 - 如果设计文档存在遗漏,你必须以issue形式上报,禁止自行决定实现方案。 - 所有代码必须包含异常处理。

这套设计看起来简单,但对稳定性提升是质变级的。角色边界一旦清晰,Agent之间互相"越权打架"的情况就大幅减少了。

3. 协作机制与通信协议——多智能体协同的核心关节

3.1 任务怎么拆、怎么派:编排者的任务分解策略

编排者Agent承担了两项核心工作,一是任务分解,二是调度决策。任务分解上我采用的是"渐进细化"策略:不在一开始就把所有子任务拆完,而是沿着主流程逐级往下拆。拿到用户需求后,编排者先生成一个宏观执行计划,也就是"先需求解析、再架构设计、再编码、再审查、再测试、最后验收"这个顺序;然后每进入一个环节,再根据当前实际状态决定下一步怎么派活。

这样做的好处是可以根据中间产物动态调整。比如审查Agent返回高危问题,编排者可以选择打回给编码Agent,而不是傻乎乎继续往测试阶段走。在代码层面,我用的是一套简单的状态机,每个Agent的执行状态有pending、running、passed、rejected四种,编排者根据这些状态做路由。

任务分发时,每条消息都遵循统一结构,包含任务ID、任务类型、输入数据、期望输出格式、最大轮次限制。这个结构的核心思路是让每个Agent把"收到的任务"和"产出的结果"都变成结构化消息,而不是自由的对话文本,结构化消息在传递和校验时都更可靠。

3.2 共享记忆与状态管理:短期会话与长期记忆的配合

多智能体系统最容易翻车的地方在记忆设计。初期我天真的做法是让每个Agent把上一轮所有输出全文带进下一轮,结果很快就发现上下文窗口撑不住,而且大量无关信息会干扰Agent判断。

后来我把记忆拆成了三层:全局黑板、阶段产物、长期知识库。

全局黑板只存放当前任务的高层状态,包括用户需求摘要、当前所处阶段、各阶段结果的消息引用,由编排者维护。阶段产物是每个Agent的输出,也就是需求清单、设计文档、代码diff这些具体文件。长期知识库里存的是历史项目的决策记录和踩坑教训,按需检索出来后注入相应的Agent上下文。

这套三层结构的核心收益是隔离。编码Agent不需要看架构设计Agent审查自己时的长篇自我辩论记录,它只需要拿最终的、通过校验的设计文档。隔离让每个Agent上下文保持精简,也让上下文窗口溢出概率大幅下降。

3.3 工具调用与安全边界:给Agent装上带权限的"手脚"

智能体不能只会说,必须会动手。Agency Agents里的Agent都挂了一组工具,但每个工具的使用权限是被编排者统一下发的。工具本身做得比较薄,核心是三类:

代码类工具包括代码检索、文件读取、文件写入、git状态查看;执行类工具包括运行测试、运行静态检查、执行构建脚本;知识类工具包括长期记忆检索、需求文档查询。每一类工具都被包了一层沙箱,Agent在沙箱里跑命令,无法访问系统关键路径,这样即使某个Agent被提示词注入攻击,也无法对系统造成实质破坏。

在实际运行中,工具调用最常见的坑是Agent拿到一个错误输出之后反复重试同样的命令,白白消耗token。所以我在工具层加了一个规则:同一个命令连续失败两次后,Agent必须如实上报失败原因,而不是继续盲试。

4. 落地实操:从设计到实现的一次完整走读

4.1 最小闭环目标:只选了一条最有价值的链路

在把六七个Agent全部接入之前,我先框定了一个最小闭环:用户输入一条模糊需求,系统最终输出一份通过测试的代码变更,并附带测试报告和审查报告。这条链路覆盖了需求解析、架构设计、编码、审查、测试、验收六个环节,足够验证架构,又不会一开始就被大而全的野心拖死。

我给最小闭环定的验收标准非常直白:代码能编译、测试能通过、需求清单里的验收标准有一一对应的代码实现。在这个标准面前,任何花里胡哨的中间产物都没有意义。

4.2 技术栈与关键组件选型

先说基础模型。我选的是当前主流商用大模型的API,出于成本和稳定性考虑,需求解析和架构设计这种偏理解的任务用较高智能档位的模型,简单执行类任务可以用速度更快、成本更低的档位。模型分层这件事,我强烈建议所有做多智能体的人都认真对待,它带来的成本收益差距是数量级的。

编排框架我没有自己从头造轮子,而是基于一个支持图状态编排的开源Agent框架来搭。选择它的原因有两点:一是它天然支持节点和边的图结构,跟我的流水线加分支思路一致;二是它内置了状态持久化功能,节点之间传消息不会丢。

另外需要一个向量库来做长期知识库检索。这里我选了轻量级的本地向量方案,因为项目规模不大,没必要为了demo上重服务。

4.3 核心编排逻辑:用伪代码拆给你看

编排者是整个系统的心脏,它的核心逻辑其实不复杂。我把核心调度流程用伪代码还原出来,这是经过实际裁剪的版本,但保留了主干:

class AgencyOrchestrator: def __init__(self): self.agents = { "requirement": RequirementAgent(), "architect": ArchitectAgent(), "coder": CoderAgent(), "reviewer": ReviewerAgent(), "tester": TesterAgent(), "integrator": IntegrationAgent(), } self.state = GlobalState() self.max_retry = 2 def run(self, raw_request): # Step 1: 需求解析 req_result = self.run_with_retry("requirement", raw_request) if not req_result.passed: return failed("需求解析失败") self.state.requirement = req_result.output # Step 2: 架构设计 design_result = self.run_with_retry("architect", self.state.requirement) if not design_result.passed: return failed("架构设计失败") self.state.design = design_result.output # Step 3: 编码 code_result = self.run_with_retry("coder", { "requirement": self.state.requirement, "design": self.state.design, }) if not code_result.passed: return failed("编码失败") self.state.code = code_result.output # Step 4: 审查与迭代 for attempt in range(self.max_retry): review_result = self.run_agent("reviewer", self.state.code) if review_result.has_high_risk: self.state.code = self.run_agent("coder", self.state.code + review_result.output) else: break # Step 5: 测试 test_result = self.run_agent("tester", self.state.code) if not test_result.all_passed: return failed("测试未通过,原因: " + test_result.failed_reasons) # Step 6: 集成验收 accept_result = self.run_agent("integrator", { "requirement": self.state.requirement, "code": self.state.code, "review": review_result.output, "test": test_result.output, }) return success(accept_result.output)

这段代码里有几个细节值得展开。

run_with_retry是我封装的一个重试机制:如果Agent输出不符合Schema、或者返回明确错误,就带上错误信息重试一次。重试后的结果如果还不行就直接失败。这比无脑循环要安全得多,因为大模型在同一个问题上连续失败两次,第二次往往只是换一批措辞接着错,意义不大。

审查与迭代那一轮循环是我反复调整过的设计。最初的版本是审查Agent发现问题后直接返回文本,让编排者人工判断;后来发现文本形式的信息不好做路由,于是改成让审查Agent输出结构化问题列表,每条带风险等级,编排者只检查是否存在high级别问题来决定是否打回。

4.4 一次实际运行记录与关键数据复盘

为了验证这套系统,我找了一个内部模拟项目X的需求做测试。需求原文是"做一个带过期时间的缓存模块,支持LRU淘汰策略,并提供并发安全的读写接口"。这个需求看似清楚,但隐藏了不少边界问题,比如过期时间精度、LRU的并发实现、缓存容量超过限制时的行为。

整条流水线跑下来,耗时大约6分钟,token消耗约12万。需求解析Agent产出了14条验收标准,其中有一条我一开始以为它过度解读了,仔细看才发现确实有道理,它把"并发安全的读写接口"扩展成了"读操作不能阻塞写操作太长时间",这其实是缓存模块常见的隐藏需求。

架构设计Agent选择了二级缓存结构,L1用哈希表加LRU链表,L2用时间轮处理过期任务。这个方案算得上中规中矩,但第一次编码实现的时候,编码Agent把时间轮的实现写复杂了,还引入了一个不存在的泛型类型。代码审查Agent准确抓到了这个问题,标为高危并打回。重做之后,测试Agent生成的12个测试用例里有11个通过,最后挂掉的那个是并发写入的极限压力测试,原因是锁粒度太粗。测试报告反馈之后,编码Agent做了一次针对性优化,把锁拆细,全部测试通过。

这个案例给我的最大启示是:多智能体的价值不只是并行干活,更重要的是让错误在更早的节点被拦截。如果还是单体Agent,那个不存在的泛型类型很可能就带着走到最后一版代码里了。

4.5 参数配置心得:temperature、最大轮次与输出约束

大模型的生成参数对多智能体系统稳定性影响很大。我给不同角色设置不同的采样参数,整体原则是理解类任务宽松、执行类任务严格。

需求解析和架构设计这类创造性任务的temperature放到0.4左右,让模型有一定发散度,能生成多角度方案。编码和审查这类精确任务的temperature压到0.1甚至0,尽可能减少幻觉。测试Agent的temperature也压得很低,因为测试用例需要严谨。

还有一个参数值得提,输出token上限。如果不给Agent设置合理的max_tokens,经常会出现输出被截断到一半、生成的JSON无法解析的情况。我在每个节点的调用里都显式传了max_tokens,核心节点要求输出必须完整,宁可多花一点成本也不允许截断。实践下来,因为截断导致的重试次数大幅下降。

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

5.1 上下文污染:Agent"精神分裂"了怎么办

我在早期版本碰到过很诡异的场景:编码Agent在第3轮迭代时,突然在代码里写入了跟需求毫无关系的注释,而且语气像在跟另一个Agent对话。排查后发现,原因是我把前几轮审查Agent的原始输出直接拼到了编码Agent的上下文里,里面包含了一些"建议你重新考虑设计"这类对话性内容,结果编码Agent真的被带偏了。

这个问题的解法是引入消息摘要替换全文拼接。具体来说,进入编码阶段之前,编排者先让一个轻量Agent把之前的长对话压缩成三条信息:确认通过的设计要点、待处理的审查问题、本轮必须完成的变更目标。编码Agent只读这三条,不再接触原始讨论。这个改造上线后,上下文污染类问题基本绝迹。

5.2 死循环与状态机失控:如何打断不收敛的重复劳动

有一轮测试让我印象很深,系统卡在"审查打回—编码重改—审查再打回"的循环里出不来。每次编码Agent改完,审查Agent都能找到新问题,而且这些问题难度逐次下降,但始终归不了零。

后来我在编排层加了三道保险。第一是最大迭代轮次限制,单个审查-编码循环最多两轮,超过后强制进入降级路径;第二是问题相似度检测,如果两轮审查输出里有一模一样的问题描述,就判定当前Agent组合无法解决,直接上报;第三是阶段超时熔断,整个任务设置总时间上限,超时自动结束并导出当前中间产物。这三级保险上线之后,不收敛的情况就再也没有拖垮过系统。

5.3 Token消耗爆炸:多智能体系统烧钱太快怎么办

多智能体系统的token消耗远超单Agent,这是很多人在落地时第一个喊疼的地方。我在一次全量测试里统计过,系统跑一轮完整流程的平均token成本是单体Agent方案的三到五倍。如果不加控制,成本会直接劝退。

成本控制上我有几个实际有效的招。第一个是阶段性摘要,这个前面提过,不再赘述;第二个是按角色分配模型档位,需求解析用旗舰模型,编码用中端模型,测试用轻量模型,整体成本能降到全旗舰方案的一半左右;第三个是精简Agent上下文,我专门写了一个字段过滤器,每个Agent只能拿到它需要的字段,其余全不传递。算下来,这三招叠加把单任务成本压到了可接受的范围,而质量几乎没有明显下降。

5.4 协作产出质量如何度量:没有评测就是盲人摸象

多智能体系统是不是真的比单Agent强,不能靠感觉,必须量化。我给系统建了一套三层评测指标。

第一层是任务成功率,看整条流水线最终产出能否通过验收。第二层是单节点通过率,分别统计需求解析、架构设计、编码、审查、测试各阶段的独立通过率,这层指标能快速定位瓶颈到底在哪个Agent。第三层是缺陷拦截率,统计审查和测试阶段实际拦截到的高危问题数量,多智能体的核心价值就体现在这里。

跑了几轮基线评测之后,我发现单节点的瓶颈往往不在输出质量,而在输入质量。比如编码Agent输出不稳定,很多时候是因为架构设计Agent给的输入不够具体。这让我开始重视每个阶段的产物校验,而不是一味责怪某个Agent能力不行。

6. 一点个人体会与扩展方向

回到标题里"重构开发团队"这个说法,我的体会是,多智能体系统真正改变的并不是"一个Agent变成一个团队"这种表面形式,而是让系统拥有了开发团队里那种相互校验的张力。单Agent再强,也不会自己质疑自己;而多Agent如果设计得当,审查Agent会把编码Agent的问题拦下来,测试Agent又会把审查Agent没发现的漏洞捞出来,这种互相纠错的机制,才是多智能体架构最有价值的部分。

如果让我给想尝试的人一条最重要的建议,我会说:先手动跑通流程,再谈自动化。我第一次搭这套系统时,先用人工把六个环节完整走了一遍,记录下每个环节输入输出长什么样,然后再让Agent去复现这些接口。很多架构问题是走完这一步才暴露出来的,比如消息结构里缺少任务ID、阶段产物没有版本概念,这些问题如果不手动跑一遍,根本反应不过来。

最后再分享一个小技巧。在多智能体系统里,我后来给每个Agent的输入都加了一个固定前置字段"你正处在整个任务流程的第X步,前序步骤已完成,你仅需聚焦你负责的环节"。这个看似多余的提示,对减少Agent越界行为有奇效。别小看这种话,在长链条任务里,一次小小的越界就可能导致整条链路的输出变得不可控。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 8:23:35

STM32 FreeModbus-RTU主机模式数据接收函数传递全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 8:22:06

鲁棒性迁移:不重训不微调,让AI模型稳扛真实扰动

1. 项目概述:当模型“水土不服”时,我们真正需要的不是重训,而是鲁棒性迁移“鲁棒性迁移”这个词最近在几个技术社群里突然密集出现,不是作为论文里的冷僻术语,而是被一线算法工程师、边缘设备部署人员、甚至某高校AI课…

作者头像 李华
网站建设 2026/10/16 8:22:02

微信小程序健身助手:SSM后端与MySQL实战避坑指南

简介:这是一份面向高校计算机相关专业学生的毕业论文与毕业设计参考资料,主题为基于微信平台的健身小助手小程序,采用Java语言与MySQL数据库,运行于微信开发者工具,适合正在准备毕业设计或课程设计、需要完整项目文档与…

作者头像 李华
网站建设 2026/10/16 8:21:59

REA逆向工程实战:观测驱动下的行为分析与结构还原

逆向工程这个话题,在技术圈里一直是个既让人兴奋又容易踩线的领域。最近一个叫 REA 的逆向工程开源项目在技术社区里讨论度很高,不少做安全研究、协议分析、老旧系统维护的同行都在转发。我花了几个晚上把它的核心思路和代码结构过了一遍,也动…

作者头像 李华
网站建设 2026/10/16 8:21:50

标准化综合试点改革DID数据:准自然实验与工具变量实战解析

开篇直接告诉你这份数据是干嘛的:国家标准化综合试点改革DID数据(2010-2025年),是近些年实证研究里很受欢迎的一类“政策冲击”素材。它的核心逻辑很简单——国家在多个地区分批次开展标准化综合试点,每个地区正式启动…

作者头像 李华
网站建设 2026/10/16 8:21:42

二次优化问题(QP):工程落地中最稳的凸优化建模范式

1. 这不是数学课,是解决现实问题的工具箱“凸优化第四章凸优化问题 4.4 二次优化问题”——看到这个标题,很多人第一反应是教材目录、期末复习重点,或是某门研究生课程的PPT页码。但如果你正在调试一个无人机的姿态控制器,发现它在…

作者头像 李华