多 Agent 协作
多 Agent 协作把一个任务分给多个 Agent 完成,再汇总各自的结果。每个 Agent 可以拥有自己的提示词、上下文和工具范围,专注于分配给它的子任务。
本文介绍协作的组织方式,以及子任务所需的信息怎样传递和共享。选型时重点看任务是否适合独立执行,并结合失败处理、结果汇总和资源冲突评估拆分代价。
1. 面试核心
先记住这几条,再读正文- 任务分工。 在编排者—执行者结构中,各执行者在独立上下文中处理子任务,再向编排者返回结论与证据引用。卡 · 组织方式
- 结果汇总。 编排者通过任务 ID 跟踪子任务状态,汇总时检查完成情况、去除重复结果并处理结论冲突。
- 协调成本。 重复读取背景、传递信息和汇总结果会增加 Token 消耗与协调成本。卡 · 拆分依据与代价
- 并行写入。 多个 Agent 并行写入时,需要明确谁可以修改哪些资源,或约定如何合并各自的修改。卡 · 资源竞争与隔离
- 失败与部分结果。 汇总策略需要规定子任务失败后何时重试,以及缺少哪些子任务时仍可返回部分结果。卡 · 部分失败与汇总策略
2. 组织方式
组织方式决定谁分配工作、谁接收结果,以及谁处理冲突。选择时先看子任务之间的依赖,再决定是否需要中心编排者。
| 方式 | 结构 | 适用情况 |
|---|---|---|
| 编排者—执行者 | 中心节点分配并汇总 | 独立调研、分模块检查 |
| 流水线 | 前一阶段输出进入下一阶段 | 抽取、校验、报告生成 |
| 层级 | 子编排者继续拆分任务 | 需要分层管理的任务 |
| 对等协作 | 多个 Agent 交换消息或共享状态 | 讨论与协商 |
编排者—执行者结构把分配和汇总集中在一个节点,执行者只与编排者通信。流水线则把前一阶段的输出交给下一阶段。这两种结构的结果去向明确,所以更容易追踪任务归属和定位失败。
层级结构让子编排者继续拆分工作,适合需要多级管理的任务。对等协作中,Agent 可以直接交换消息,或把信息写到共同读取的状态区。讨论越自由,越需要明确发言顺序、终止条件和冲突裁决方式,否则会反复争论或转交任务。
3. 通信与状态共享
执行者需要知道具体要做什么,也需要知道哪些信息属于自己的任务范围。信息可以通过两种方式传递:
- 消息传递:编排者发送子任务,执行者返回结果。执行者使用自己的消息历史,因此任务描述要包含所需背景。缺少关键条件时,它会重复探索,或沿错误方向执行。
- 共享状态:多个 Agent 读写同一份任务数据,例如数据库中的任务表、共享文件或框架中的图状态。图状态是执行节点之间传递的数据对象,需要明确每个字段由谁写入。
派发任务时,要写清以下五项要求:
- 目标是什么,完成后要解决什么问题。
- 输入范围是什么,例如哪些文档或代码目录。
- 可以使用哪些工具,以及对应的权限范围。
- 输出使用什么格式,必须包含哪些字段和证据。
- 什么条件下算完成,达到什么上限后停止。
请求和结果还要带任务 ID 与完成状态,方便程序关联。下面是一个接口兼容性检查的结果消息,大产物保存在文件中,消息只返回引用。
{
"task_id": "review-3",
"goal": "检查订单模块的接口兼容性",
"scope": ["src/orders/"],
"status": "done",
"result_ref": "artifacts/review-3.json"
}
结果引用指向完整产物,摘要则帮助编排者快速了解结论。这样能减少汇总时读入的内容,避免主 Agent 的上下文被子任务结果占满。这个结果消息省略了派发阶段的工具权限、输出格式和停止条件,实际任务描述仍需提供它们。
共享状态需要规定字段归属和合并规则。比如两个执行者同时更新检查结论,直接覆盖会丢失其中一份结果。可以用版本检查拒绝过期写入,或用归并函数把新旧结果合成一份。数据库、共享文件与图状态都要落实这些约束。
3.1 结果汇总
汇总要把多个结果变成一份可核验的结论。编排者先检查各子任务是否完成,再去除重复内容,并核对结论对应的证据。
不同 Agent 给出矛盾结论时,要比较证据来源、时间与适用条件。比如一个结果针对旧接口,另一个针对新接口,两者就应分别说明适用版本。证据不足以裁决时,保留争议并说明它对最终结果的影响。
3.2 部分失败与汇总策略
部分子任务超时后,能否继续汇总,取决于它是否影响最终验收。必需子任务失败时,父任务保持未完成;可选子任务失败时,可以返回部分结果,但要列出缺失范围与影响。
重试沿用子任务 ID,同时增加尝试编号。这样,编排者就能区分同一任务的多次执行,只接纳当前有效尝试的结果,避免迟到结果覆盖新结果。重试次数和消耗仍受总预算约束。
父任务取消后,编排者停止派发新工作,并通知仍在运行的执行者停止。已经写入的文件或发出的外部请求仍要核对,取消消息无法撤销此前的副作用。
4. 拆分依据与代价
拆分是否有收益,要看它能否减少等待,或让每个 Agent 更专注于自己的输入。以下三类任务特征值得考虑拆分:
- 子任务之间依赖少,可以同时执行,例如分别检查互不依赖的代码模块。
- 各子任务需要读取大量文档或代码,一个上下文窗口难以容纳全部内容。
- 子任务需要不同工具或权限,例如一个只读检索,另一个修改代码。
如果后一步需要前一步的完整细节,执行者之间就要传递大量上下文。这会增加交接成本,摘要还容易遗漏关键条件。因此,强依赖任务更适合先保留在同一个 Agent 中处理。
拆分后还要计算以下几项代价:
- 重复输入:每个子 Agent 都要读取任务背景,所以总输入 Token 随执行者数量增长。
- 通信失真:子任务描述或结果摘要缺信息,会导致重复劳动或方向偏差。
- 结果冲突:并行修改需要合并,矛盾结论也需要编排者复核。
- 排查成本:一个子任务的错误会影响其他任务,定位时要查看多条执行轨迹。
并行可以缩短独立工作的等待时间,但总耗时还包括排队、最慢子任务和汇总。等待时间下降时,总 Token 消耗仍会增加。所以应以单 Agent 为基线,在同一任务集上比较质量、耗时和总成本,再决定是否拆分。
5. 资源竞争与隔离
独立上下文解决的是信息干扰,文件和外部服务仍可能被多个 Agent 同时访问。并发执行前,需要为这些共享资源规定访问与合并方式。
| 资源 | 风险 | 处理方式 |
|---|---|---|
| 文件 | 同时编辑覆盖结果 | 文件所有权、独立 worktree、合并检查 |
| 共享数据 | 并发更新丢失 | 条件更新、锁或归并规则 |
| API 配额 | 并发触发限流 | 全局并发与速率预算 |
| 模型预算 | 子任务耗尽额度 | 子任务预算与总预算 |
| 上下文 | 无关信息干扰 | 独立消息历史、摘要与产物引用 |
Git worktree 是同一仓库的独立工作目录,可以让执行者分别修改,再集中合并并运行集成测试。共享数据则按约定字段读写,用条件更新或锁防止覆盖其他执行者的结果。
API 配额要在所有子任务之间统一分配。比如,令牌桶按固定速率补充请求额度,每次请求消耗额度,从而限制总请求速率。并发上限控制同时在途的请求数,两者可以配合使用。模型调用还要同时受子任务预算与总预算限制。
消息隔离与工作目录隔离是两项配置。每个 Agent 可以只接收自己的任务文档和代码,但共享目录中的文件仍彼此可见。
实际访问范围需要工具权限与沙箱约束,见工具授权与执行沙箱。
6. 常见问题
6.1 A2A 与 MCP 有什么区别?
A2A 面向 Agent 之间的任务协作,MCP 面向工具与数据接入。前者传递需要完成的任务,后者提供可调用的工具与数据。
MCP Server 提供能力,Host 中的应用结合模型请求发起调用,具体角色与流程见 MCP。
6.2 怎样避免多个 Agent 反复转交任务?
每个子任务要有唯一负责人,由编排者跟踪完成状态。转交时记录原因,并限制转交次数与委派层级,避免同一任务被不断向外分派。
超过上限或截止时间后,由编排者接管未完成部分,或转交人工处理。这样,即使执行者无法继续,也有明确的人或程序负责收尾。
7 · 面试题卡片
本页题目与参考回答
7.1 多 Agent 协作系统如何设计?Agent 之间的通信机制和状态共享如何实现?
考察重点
- 根据子任务依赖选择组织方式,并解释编排者与执行者的分工。
- 说明消息要传哪些信息、共享字段怎样更新,以及结果怎样汇总。
参考回答
多 Agent 可以采用编排者—执行者结构,通过结构化消息分派任务,再由编排者集中汇总。
编排者写清目标、输入范围、可用工具、输出格式与停止条件。执行者在独立上下文中完成任务,返回结果与证据,只与编排者通信。消息带任务 ID 和状态,大结果保存在外部存储,返回摘要与引用。
需要共享状态时,按字段规定写入者与合并规则,避免并发覆盖。汇总时先检查完成情况,再去重,并按来源、时间与适用条件复核冲突。证据不足的争议要保留并标注影响。整个过程受委派深度、时限和总预算约束。
7.2 为什么不默认使用多 Agent?拆分后有哪些风险?
考察重点
- 解释什么任务能从并行与上下文隔离中获益。
- 说明拆分怎样增加通信、成本、冲突与调试难度。
相关内容:拆分依据与代价。
参考回答
多 Agent 的并行与隔离收益需要特定任务条件,因此应从单 Agent 基线出发,再评估拆分。
依赖少、文档或代码量大、工具权限不同的子任务,适合分开处理。强依赖任务需要传递完整细节,交接反而容易遗漏信息。
拆分后的主要风险包括:
- 每个执行者重复读取背景,增加总 Token 消耗。
- 任务描述或摘要缺少条件,导致重复工作或方向错误。
- 并行写入同一资源产生冲突,矛盾结论需要额外裁决。
- 失败影响多个任务时,需要结合多条轨迹排查。
并行能缩短部分等待时间,但总耗时仍受最慢子任务与汇总过程影响。应在同一任务集上比较质量、耗时和总成本,用结果判断拆分是否值得。
7.3 多个 Agent 并发执行时会争抢哪些资源?如何隔离上下文和状态?
考察重点
- 识别文件、共享数据、API 配额、模型预算和上下文之间的竞争。
- 解释怎样划分所有权、隔离工作区,并验证合并后的结果。
相关内容:资源竞争与隔离。
参考回答
多个 Agent 会竞争共享文件与数据、API 配额、模型预算,以及汇总时的上下文空间。
文件可按模块划分所有权,或让执行者使用独立 worktree,最后合并并运行集成测试。共享数据只按约定字段读写,并用锁、版本检查或归并函数防止结果被覆盖。
API 调用设置全局并发上限与令牌桶,模型调用还要分配子任务预算并统计总消耗。各 Agent 保持独立消息历史,只接收所需文档与代码,结果以摘要和引用返回。独立上下文仍需配合工作目录和工具权限隔离,才能限制实际访问范围。
7.4 部分子 Agent 超时后,父任务怎样汇总和重试?
考察重点:根据任务依赖判断能否返回部分结果,并解释怎样识别过期结果与传播取消请求。
相关内容:部分失败与汇总策略。
参考回答
必需子任务超时后,父任务保持未完成;可选子任务超时后,可以返回注明缺失范围的部分结果。
重试沿用任务 ID,再增加尝试编号,编排者据此丢弃过期结果,避免旧尝试覆盖新结果。次数和消耗受总预算限制,超过上限时要说明缺失内容对验收的影响。
父任务取消后,停止派发并通知执行者结束。已经执行的写入或外部请求仍需核对,因为取消只影响后续执行。