跳到主要内容
约 9 分钟4 张卡

多 Agent 协作

多 Agent 协作把一个任务分给多个 Agent 完成,再汇总各自的结果。每个 Agent 可以拥有自己的提示词、上下文和工具范围,专注于分配给它的子任务。

本文介绍协作的组织方式,以及子任务所需的信息怎样传递和共享。选型时重点看任务是否适合独立执行,并结合失败处理、结果汇总和资源冲突评估拆分代价。

1. 面试核心​

先记住这几条,再读正文
  • 任务分工。 在编排者—执行者结构中,各执行者在独立上下文中处理子任务,再向编排者返回结论与证据引用。卡 · 组织方式
  • 结果汇总。 编排者通过任务 ID 跟踪子任务状态,汇总时检查完成情况、去除重复结果并处理结论冲突。
  • 协调成本。 重复读取背景、传递信息和汇总结果会增加 Token 消耗与协调成本。卡 · 拆分依据与代价
  • 并行写入。 多个 Agent 并行写入时,需要明确谁可以修改哪些资源,或约定如何合并各自的修改。卡 · 资源竞争与隔离
  • 失败与部分结果。 汇总策略需要规定子任务失败后何时重试,以及缺少哪些子任务时仍可返回部分结果。卡 · 部分失败与汇总策略

2. 组织方式​

组织方式决定谁分配工作、谁接收结果,以及谁处理冲突。选择时先看子任务之间的依赖,再决定是否需要中心编排者。

方式结构适用情况
编排者—执行者中心节点分配并汇总独立调研、分模块检查
流水线前一阶段输出进入下一阶段抽取、校验、报告生成
层级子编排者继续拆分任务需要分层管理的任务
对等协作多个 Agent 交换消息或共享状态讨论与协商

编排者—执行者结构把分配和汇总集中在一个节点,执行者只与编排者通信。流水线则把前一阶段的输出交给下一阶段。这两种结构的结果去向明确,所以更容易追踪任务归属和定位失败。

层级结构让子编排者继续拆分工作,适合需要多级管理的任务。对等协作中,Agent 可以直接交换消息,或把信息写到共同读取的状态区。讨论越自由,越需要明确发言顺序、终止条件和冲突裁决方式,否则会反复争论或转交任务。

3. 通信与状态共享​

执行者需要知道具体要做什么,也需要知道哪些信息属于自己的任务范围。信息可以通过两种方式传递:

  • 消息传递:编排者发送子任务,执行者返回结果。执行者使用自己的消息历史,因此任务描述要包含所需背景。缺少关键条件时,它会重复探索,或沿错误方向执行。
  • 共享状态:多个 Agent 读写同一份任务数据,例如数据库中的任务表、共享文件或框架中的图状态。图状态是执行节点之间传递的数据对象,需要明确每个字段由谁写入。

派发任务时,要写清以下五项要求:

  1. 目标是什么,完成后要解决什么问题。
  2. 输入范围是什么,例如哪些文档或代码目录。
  3. 可以使用哪些工具,以及对应的权限范围。
  4. 输出使用什么格式,必须包含哪些字段和证据。
  5. 什么条件下算完成,达到什么上限后停止。

请求和结果还要带任务 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,再增加尝试编号,编排者据此丢弃过期结果,避免旧尝试覆盖新结果。次数和消耗受总预算限制,超过上限时要说明缺失内容对验收的影响。

父任务取消后,停止派发并通知执行者结束。已经执行的写入或外部请求仍需核对,因为取消只影响后续执行。

8. 参考资料​