ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

多智能体协同工程化实战:角色拆分、通信契约与上下文管理

多智能体协同工程化实战:角色拆分、通信契约与上下文管理 1. 从一个模型打天下到一支队伍打硬仗多智能体协同到底在解决什么如果你最近半年在关注 AI 研发的工程化落地大概率会反复撞见一个词——多智能体协同。但真正让我决定动手写这篇总结的不是概念本身有多热而是我在实际项目里踩过的一个坑早期我们用一个单体 Agent 去做代码生成、需求拆解、测试用例编写这一整条链路结果就是它在写代码时表现不错一到评审自己的代码就开始自说自话改了三轮反而把原本能跑的模块改崩了。后来我们把这条链路拆成四个角色——需求分析、架构设计、编码实现、质量校验——每个角色一个独立的 Agent各自有独立的上下文和工具权限整体成功率直接从 40% 出头拉到了 80% 以上。这件事让我彻底想明白一个道理多智能体协同不是把一个大模型拆成几个小模型那么简单它本质上是把一个人的独角戏变成一支有分工、有流程、有交接规范的工程团队。关键词里的工程级三个字才是重点它意味着这套东西不能停留在 Demo 阶段而要能扛住真实项目的复杂度、可复现性和稳定性要求。这篇内容适合三类人看一是正在做 AI 应用但被单体 Agent 的稳定性折磨的开发者二是想把 AI 研发流程真正嵌入团队协作的技术负责人三是对组织范式这个词好奇、想知道它和普通 Prompt 工程差在哪里的从业者。我会从角色拆分的底层逻辑讲起一路讲到通信协议、上下文管理、失败回滚这些真正决定成败的工程细节中间穿插我自己踩过的坑和实测有效的配置方案。先说结论性的判断多智能体协同的价值不在于更聪明而在于可控。单体 Agent 像一个全能但情绪不稳定的天才你很难预测它下一步会干什么多智能体像一个流程规范的团队每个环节的输入输出都是可定义、可校验、可回滚的。工程级研发要的从来不是天才而是可预期的产出。2. 角色怎么拆不是越多越好而是边界要清晰2.1 拆分的核心依据是上下文隔离而非功能分类很多人第一次设计多智能体系统时会本能地按功能拆一个写代码的、一个写文档的、一个做测试的。这个思路方向对但不够本质。我后来总结出来的拆分依据是上下文隔离需求——也就是哪些工作放在同一个上下文里会互相污染就必须拆开。举个具体的例子。代码生成 Agent 需要大量的代码库上下文、API 文档、历史提交记录而需求分析 Agent 需要的是产品文档、用户反馈、业务规则。这两类上下文如果塞进同一个 Agent会出现两个问题一是上下文窗口被快速占满二是模型在生成代码时会被业务描述干扰写出业务上正确但技术上跑不通的东西。反过来如果让需求 Agent 去看代码细节它又会陷入实现层面丢失对业务目标的把握。所以我的拆分原则是凡是需要不同知识域、不同工具集、不同输出格式的工作就拆成独立 Agent。按这个原则一个典型的工程级 AI 研发流程通常拆成这么几个角色角色核心职责关键上下文输出物需求分析 Agent把模糊需求转成结构化任务产品文档、业务规则任务清单、验收标准架构设计 Agent确定技术方案与模块边界现有代码结构、技术栈约束架构说明、接口定义编码实现 Agent按接口写具体实现代码库、编码规范可运行代码质量校验 Agent独立验证产出验收标准、测试框架测试报告、缺陷清单协调调度 Agent管理流程与交接全局状态、任务队列调度决策、异常处理注意最后那个协调调度 Agent它是很多人会忽略但极其关键的一环。没有它各个 Agent 就是各自为战的散兵交接全靠硬编码一旦某个环节失败整个流程就卡死。2.2 为什么质量校验必须独立于编码实现这是我在项目里用血换来的教训。最初为了省成本我让编码 Agent 自己写完代码后顺便自查一遍。结果发现它的自查基本等于走过场——它会倾向于认为自己写的是对的即使有 bug 也会找理由解释成这是设计选择。后来我把校验独立出来给它一套完全不同的提示词和工具权限编码 Agent 只能读代码库和写文件校验 Agent 只能读代码和跑测试不能修改任何代码。这个权限隔离一加上缺陷检出率立刻上了一个台阶。原因很简单当校验者没有维护自己作品的心理负担时它才敢真正挑刺。这其实对应了软件工程里一个老原则——开发和测试分离。多智能体系统把这个原则用 Agent 的形式重新实现了一遍而且因为 Agent 之间没有人类的人情世故这种分离反而执行得更彻底。2.3 角色数量的甜点区在 4 到 7 个之间拆得太少上下文污染问题解决不了拆得太多通信开销和协调复杂度会指数级上升。我实测下来4 到 7 个角色是比较舒服的区间。低于 4 个往往有一两个 Agent 要承担互相冲突的职责高于 7 个光是维护它们之间的消息格式和状态同步就够你喝一壶的。如果你刚开始做我建议从最小的三角色起步规划者、执行者、校验者。跑通之后再根据实际瓶颈增加角色。不要一上来就设计一个十几个 Agent 的宏大架构那基本等于给自己挖坑。3. 通信与交接决定系统能不能跑起来的关键3.1 消息格式必须结构化禁止自然语言裸传多智能体系统最容易翻车的地方就是 Agent 之间的通信。我见过太多项目Agent A 用一段自然语言把任务描述给 Agent BAgent B 再自己理解一遍。这种做法的失败率高得惊人因为自然语言里充满了歧义而每个 Agent 的理解又各不相同。正确做法是强制结构化消息。我通常用 JSON Schema 定义每种交接的数据格式比如任务交接消息长这样{ task_id: task-20260115-001, from_agent: requirement_analyzer, to_agent: architect, task_type: design_request, payload: { feature_name: 用户登录模块, acceptance_criteria: [ 支持手机号验证码登录, 登录失败3次锁定5分钟 ], constraints: [不得引入新的第三方依赖], priority: high }, context_refs: [doc://prd/login-v2, code://src/auth/], deadline: 2026-01-15T18:00:00Z }关键在于context_refs这个字段——它不直接塞上下文内容而是给引用。接收方 Agent 按需去拉取避免消息体膨胀。这个设计灵感来自微服务里的引用传递实测能显著降低 token 消耗。3.2 交接契约要显式定义不能靠默契Agent 之间不像人类同事可以靠默契配合它们之间的一切都必须显式写清楚。我建议为每一对相邻 Agent 定义一份交接契约明确三件事输入必须包含哪些字段、输出必须满足什么格式、失败时如何回传错误。举个契约示例契约architect - coder 输入要求 - payload.feature_name (string, 必填) - payload.acceptance_criteria (array, 至少1项) - payload.interface_spec (object, 必填) 输出要求 - payload.files_changed (array of {path, diff}) - payload.test_entry (string, 测试入口) 失败回传 - error.code (枚举: MISSING_CONTEXT / CONFLICT / UNSUPPORTED) - error.detail (string) - error.suggested_action (string)有了这份契约任何一个 Agent 的输出都能被程序化校验不合格直接打回重做而不是让错误一路传递到下游。3.3 用共享黑板还是点对点消息取决于流程复杂度通信拓扑有两种主流选择共享黑板Blackboard和点对点消息Message Passing。前者是所有 Agent 读写同一块共享状态区后者是 Agent 之间直接发消息。我的经验是流程线性、角色少的时候用点对点简单直接流程有分支、有循环、角色多的时候用共享黑板因为点对点的消息路径会爆炸式增长。共享黑板的一个典型实现是维护一个全局的project_state对象每个 Agent 完成后更新自己负责的字段下一个 Agent 从里面读自己需要的部分。但共享黑板有个坑并发写入冲突。两个 Agent 同时改同一个字段后写的会覆盖先写的。解决办法是给每个字段加版本号写入时做乐观锁校验冲突了就重试。这个机制听起来麻烦但比事后排查数据错乱要省事得多。4. 上下文管理多智能体系统里最烧钱也最容易失控的部分4.1 每个 Agent 只给它该看的不是越多越好新手最容易犯的错误是上下文给得越多越好觉得信息全了 Agent 就聪明了。实际上恰恰相反——无关上下文是 Agent 表现下降的头号杀手。我给编码 Agent 做过对比测试只给相关模块的代码任务成功率 78%把整个代码库都塞进去成功率掉到 51%。原因是大上下文里充满了干扰信息模型会抓错重点。所以我的原则是按需注入每个 Agent 启动时只加载它当前任务必需的上下文用完即弃。具体做法是给每个 Agent 配一个上下文加载器根据任务类型动态决定拉哪些文件、哪些文档。4.2 长流程要用上下文摘要关键引用而非全量传递一个完整的研发流程可能涉及几十轮 Agent 交互如果把每一轮的完整对话都往下传token 消耗会失控。我的做法是滚动摘要每完成一个阶段由协调 Agent 生成一份该阶段的摘要控制在 500 token 以内加上关键产物的引用作为下一阶段的上下文起点。摘要的生成也有讲究不能随便让模型总结。我用的模板是固定的三段式本阶段完成了什么、产出了哪些关键决策、遗留了哪些待办。这样下游 Agent 能快速抓住重点又不会丢失关键信息。4.3 上下文窗口的预算分配要有硬约束我给自己定的规矩是任何单个 Agent 的单次调用上下文占用不超过模型窗口的 60%。留 40% 给输出和推理。这个比例是实测出来的——超过 60% 后模型的输出质量会明显下降而且容易截断。具体分配大概是系统提示词 10%、任务描述 15%、相关上下文 30%、历史摘要 5%。这个配比不是死的但每一项都要有上限超了就触发压缩或裁剪。提示上下文预算一定要在代码里做成硬约束靠人自觉控制迟早会失控。我见过太多项目因为某次临时多塞了点上下文导致整个流程崩掉。5. 失败处理与回滚工程级和玩具级的分水岭5.1 每个 Agent 都要有明确的失败信号玩具级的多智能体系统假设一切顺利工程级的系统假设一切都会出错。所以每个 Agent 都必须能明确地报告失败而不是硬着头皮输出一个看起来像那么回事但实际错误的结果。我给每个 Agent 定义了三种状态成功、可重试失败、不可恢复失败。可重试失败比如上下文不足协调 Agent 补充信息后重试不可恢复失败比如需求本身矛盾直接上报人工介入。这个分类让整个系统的异常处理逻辑清晰了很多。5.2 检查点机制让流程可以从中断处恢复长流程最怕的就是跑到一半崩了前面全白干。解决办法是检查点Checkpoint每完成一个关键阶段把当前状态序列化存下来。崩了之后从最近的检查点恢复而不是从头再来。检查点要存的东西包括当前阶段、已完成产物的引用、待办任务队列、各 Agent 的状态快照。存储用什么都行文件、数据库、对象存储都可以关键是可序列化和可恢复。5.3 回滚不是简单撤销要处理副作用如果编码 Agent 已经改了代码库回滚就不能只是把状态改回去还得把代码改动也撤销。我的做法是所有写操作都走事务Agent 要改文件先写到临时区整个阶段成功后才提交到主代码库。失败就丢弃临时区主库不受影响。这个机制实现起来有点工作量但它把失败的代价从可能污染主库降到了丢弃临时改动对于工程级系统来说是必须的。6. 实测中的几个反直觉发现6.1 更强的模型不一定带来更好的协同效果我做过一组对比把流程里所有 Agent 都换成当时最强的模型结果整体成功率反而比强模型做关键角色中等模型做辅助角色的混合配置低了几个百分点。原因我分析是强模型更倾向于自作主张在需要严格按契约交接的环节反而容易越界。中等模型更听话在格式化的交接任务上表现更稳定。所以选型原则是需要创造力的角色架构设计用强模型需要严格遵循格式的角色校验、调度用中等模型即可。这样既保证质量又控制成本。6.2 提示词里的角色扮演比任务描述更重要一开始我给每个 Agent 写的提示词都是任务导向的你的任务是分析需求并输出任务清单。效果一般。后来我改成角色导向你是一位有十年经验的需求分析师你的职业习惯是把模糊需求拆成可验证的条目你从不接受大概差不多这类描述。效果明显提升。原因是角色设定给了模型一套稳定的行为准则而任务描述只给了它一个目标。在多轮交互中稳定的行为准则比单次目标更能保证一致性。6.3 日志和可观测性不是可选项多智能体系统一旦跑起来出问题是必然的。没有完善的日志你根本不知道是哪个 Agent 在哪一步出了什么错。我建议从第一天就把日志做扎实每个 Agent 的输入、输出、耗时、token 消耗、状态变化全部记录并且带上统一的 trace_id 方便串联。我用的日志结构大概是{ trace_id: trace-20260115-abc123, agent: coder, step: 3, input_tokens: 4200, output_tokens: 1800, duration_ms: 12400, status: success, artifacts: [file://src/auth/login.py] }有了这些数据排查问题从猜变成了查效率完全不是一个量级。7. 从能跑到好用几个让系统稳定的工程习惯7.1 给每个 Agent 设超时和重试上限Agent 调用可能因为各种原因卡住没有超时机制的话整个流程会挂死。我给每个 Agent 设了硬超时一般 60 到 120 秒看任务复杂度超时就算失败进入重试逻辑。重试上限设 3 次超过就上报。重试也不是无脑重试要区分错误类型网络类错误可以立即重试逻辑类错误要补充上下文后再重试格式类错误要调整提示词后重试。这个分类逻辑写在协调 Agent 里。7.2 用金丝雀任务验证流程改动每次调整流程、提示词或模型配置后不要直接上生产任务先用一批金丝雀任务——也就是已知正确答案的测试任务——跑一遍。对比改动前后的成功率确认没有退化再放量。这个习惯帮我避免了好几次改了一个提示词结果整体崩盘的事故。7.3 人工介入点要设计得自然工程级系统不是要完全无人化而是要把人的介入放在最有价值的地方。我的设计是只在不可恢复失败和高风险决策两个点让人介入。前者是系统确实处理不了的后者比如涉及数据迁移、权限变更这类操作让 Agent 给出方案人来拍板。这样人既不会被琐事淹没又能在关键节点把关。实测下来一个成熟的多智能体研发流程人工介入的频率能控制在总交互次数的 5% 以内。8. 关于组织范式这个词我的理解回到标题里的组织范式。我一开始觉得这个词有点大但做下来发现它其实很准确。多智能体协同真正改变的不是某个技术点而是我们组织 AI 研发工作的方式。以前我们想的是怎么让一个模型更强现在我们想的是怎么让一组模型协作得更顺。这个转变类似于从招一个全栈大神到组建一支分工明确的团队——后者在工程上更可控、更可扩展、也更容易持续优化。我个人的体会是多智能体协同最难的部分从来不是技术而是设计一套让各个角色既能各司其职又能顺畅交接的规则。这套规则设计好了用中等模型也能跑出不错的效果设计不好堆再多强模型也是一盘散沙。如果你正准备上手我的建议是从一个真实的小项目开始先跑通三角色的最小闭环把通信契约、上下文管理、失败处理这三件事做扎实再逐步扩展。别一上来就追求全自动研发那是个陷阱。先把半自动但稳定做出来价值就已经很大了。最后分享一个我一直在用的小技巧每次流程跑完让协调 Agent 生成一份本次流程复盘记录哪些环节顺利、哪些环节卡壳、哪些交接出了问题。攒够几十份之后你会发现系统的瓶颈往往集中在固定的几个地方针对性优化这几个点整体效率能再上一个台阶。这比盲目调提示词有效得多。
RELATED READING

延伸阅读

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