第28章 多 Agent 协作¶
多 Agent 的价值,不是让多个模型“开会”,而是把天然不同的职责、权限和交付物拆到不同执行角色中,同时仍由同一个 Runtime 管理任务状态和审计链。
例如一份经营分析报告可能需要 Question Agent 澄清口径、Data Agent 查数、Report Agent 组织材料、Reviewer 检查风险。若全部塞给一个 Agent,它会同时拥有 SQL、报告生成、审批和外发权限,Prompt 和责任边界都会变得过宽;若简单拆成四个独立聊天机器人,又会丢失统一 run_id、检查点和证据链。
多 Agent 的工程目标,是“职责分离而任务不分裂”:角色可以多个,但用户面对的仍是一条可追踪、可暂停、可恢复的 Run。
28.1 什么时候值得拆成多个 Agent¶
多 Agent 不是默认升级路线。单 Agent 加清晰工具链能完成的任务,拆分只会增加路由、Handoff、状态同步、成本和调试复杂度。
表28-1:单 Agent 与多 Agent 的选择信号。来源:本书整理。
| 判断维度 | 单 Agent 更合适 | 多 Agent 更合适 |
|---|---|---|
| 工具权限 | 同一鉴权域 | SQL、报告、外部发送等权限明显不同 |
| Prompt/专长 | 一个角色能覆盖 | 澄清、分析、复核需要不同上下文和标准 |
| 责任 | 最终 Tool Call 足以说明 | 不同团队需对中间产物分别负责 |
| 并行 | 步骤天然串行 | 多数据源/区域可并行 |
| 交付 | 一个回答 | 报告、附件、审批意见、外部 artifact 多种产物 |
图28-1:单/多 Agent 决策树。来源:本书自绘。Alt text:决策树从单 Agent 是否过载、是否需要专长分工、是否需要并行等问题分支,引向保持单 Agent 或拆分多 Agent 的结论。
真正值得拆分的信号通常是:不同角色需要不同权限、不同责任人或不同输入输出契约。仅仅为了“看起来更智能”增加角色,没有生产价值。
还要区分多 Agent 与 Agentic Workflow。Reflexion、Self-Refine、ToT 可以发生在同一个 Agent 内;多 Agent 意味着出现多个独立 agent_id、权限和责任边界。
28.2 角色设计:Router 选 Agent,Planner 选工具¶
一个可治理的角色至少要声明:
agent_id
version
capabilities
input_schema
output_schema
tool_allowlist
tenant_scope
risk_level
owner
SLO
表28-2:典型角色。来源:本书整理。
| 角色 | 主要职责 | 典型输出 | 工具边界 |
|---|---|---|---|
| Workflow / Router | 接收任务、选择下一角色 | Handoff 决策 | Agent Catalog、路由规则 |
| Question / Clarifier | 补齐口径和槽位 | query_spec |
低风险知识读取 |
| Data / Executor | 查数、计算、事实生成 | 指标 JSON、EvidenceRef | 语义层、SQL、Python |
| Report / Synthesizer | 生成报告或摘要 | Markdown/Artifact | 模板、渲染 |
| Reviewer / Policy | 风险、质量和合规复核 | pass / reject / HITL | 规则、评测、审批 |
Router 和 Planner 不应混淆:Router 决定“谁处理”,Planner 决定“当前 Agent 下一步用什么工具”。若让一个全局 Planner 同时理解所有 Agent 和所有 ToolSpec,候选空间会快速膨胀,也不利于权限隔离。
角色之间也不应自动继承权限。Data Agent 有客户明细读取权、Report Agent 有外发权,并不意味着组合之后可以“读取客户明细再外发”。Handoff 时必须重新计算接收方可见上下文和允许动作。
多 Agent 的权限不是各 Agent 权限的并集,而应按当前任务重新做最小授权。
28.3 Handoff:结构化转移控制权,而不是转发一段聊天¶
Handoff 应被视为同一个 Run 中的一次结构化控制权转移,并写入 Runtime/Trace。一个最小契约可以包括:
{
"handoff_id": "ho-001",
"from_agent_id": "question-agent",
"to_agent_id": "data-agent",
"reason": "query_spec 已完整",
"payload": {
"goal": "解释 Q1 华东毛利下降",
"query_spec_ref": "mem://run-1/query-spec-v2",
"evidence_refs": []
},
"return_policy": "workflow",
"idempotency_key": "run-1:ho-001"
}
图28-2:Handoff 时序。来源:本书自绘。Alt text:时序图展示主 Agent 完成部分任务后,把任务上下文与状态打包交接给专长 Agent,后者处理完再交回,箭头标出交接点与上下文传递。
Handoff 不应复制大型结果。Data Agent 输出十万行数据时,Report Agent 只需要 result_ref、schema、关键指标、样例和 hash,原始对象仍保留在受控存储。
接收方必须可以拒绝 Handoff,例如:payload 不完整、权限不足、任务不属于自身能力、证据已过期。拒绝不是系统错误,而是阻止错误继续传播的一种治理动作。
Handoff 还要幂等。Runtime 重试一次交接,不能让目标 Agent 重复创建报告、工单或外部任务。
交接的核心不是“下一个 Agent 能看懂”,而是任务目标、证据、权限和责任在跨角色后仍然没有丢。
28.4 共享状态:事实、推断和草稿必须分级¶
多 Agent 最容易失控的是所有角色共同读写一块“共享黑板”。一个 Agent 把临时推断写进去,另一个 Agent 可能把它当成事实继续执行。
共享状态至少应分三类:
- 事实状态:已执行查询、已确认用户输入、已通过审批的结果;带 EvidenceRef,可继续使用。
- 推断状态:意图判断、根因假设、候选计划;下游关键动作前需要再次校验。
- 草稿状态:报告段落、图表建议、未提交工具参数;允许修改,不能作为正式事实。
每次写入都应记录 Agent、版本、时间、来源和作用域。原始用户目标不应被任何子 Agent 静默覆盖;如果目标发生变化,应生成新版本并记录变更理由。
共享 Memory 也要克制。当前 Run 中的必要状态可以共享,长期用户记忆和敏感数据不能默认对所有 Agent 可见。
共享越多并不代表协作越好。多 Agent 的稳健性往往来自“只传下一角色完成职责真正需要的最小状态”。
28.5 路由、Agent Catalog 与低置信度处理¶
Router 不应靠模型临场猜测所有 Agent。生产通常采用:规则 + 分类模型 + Agent Catalog + 权限过滤的混合路由。
Agent Catalog 至少保存能力、输入输出 schema、工具白名单、租户范围、版本、SLO、owner 和健康状态。Router 先过滤不可用/无权限候选,再做语义选择。
表28-3:常见路由策略。来源:本书整理。
| 策略 | 优势 | 风险 |
|---|---|---|
| 规则路由 | 可预测、便宜 | 覆盖有限 |
| 分类模型 | 适应自然语言 | 需要置信阈值和回归集 |
| Catalog/能力匹配 | 适合 Agent 数量增多 | 元数据漂移 |
| 混合路由 | 兼顾稳定和灵活 | 运维复杂度更高 |
低置信度时,clarify/reject 应是一等结果。没有合适 Agent、任务缺关键字段或跨租户时,强行选择“最像的一个”会比停下来更危险。
路由结果也要进 Trace:候选、过滤原因、Catalog 版本、最终 Agent 和置信度。否则多 Agent 出错后会把所有问题归因成“下游 Agent 不稳定”。
28.6 冲突与并行:不要让末端 LLM 把矛盾“综合一下”¶
多个 Agent 并行后会出现事实、口径、叙事和资源冲突。
表28-4:冲突类型与处理。来源:本书整理。
| 冲突 | 示例 | 处理 |
|---|---|---|
| 事实冲突 | 同一指标返回不同值 | 回到权威数据源和版本 |
| 口径冲突 | 时间、过滤、metric_id 不同 | 退回重新对齐 query_spec |
| 叙事冲突 | Report 与 Reviewer 结论相反 | 保留批注并修订,不静默覆盖 |
| 写冲突 | 多 Agent 同时改同一 Artifact | 单写者/版本/乐观锁 |
| Handoff 环 | A→B→A 反复转移 | 栈深、payload hash、max_steps |
当两个 Data Agent 给出不同数字时,Report Agent 不能用“平均一下”解决;Reviewer 指出合规风险时,也不能让 Workflow 根据文本流畅度继续发布。
多 Agent 系统必须允许输出“不一致,无法自动完成”。不能自动裁决的冲突,本身就是需要升级到规则或人工的事实。
并行执行还需要明确合并条件。只有 metric version、时间范围、租户、EvidenceRef 等前提一致时,结果才可以合并。
28.7 Runtime、失败恢复与 mini-platform¶
多 Agent 仍然使用同一套 Run 六态。检查点只需增加必要协作状态,例如:
{
"run_id": "run-001",
"active_agent_id": "report-agent",
"handoff_stack": ["workflow-agent", "report-agent"],
"shared_state_refs": ["mem://run-001/query-spec-v2"],
"agent_versions": {
"workflow-agent": "v3",
"data-agent": "v4",
"report-agent": "v2"
}
}
Handoff 失败要分原因恢复:上下文缺失 → 回上游补齐;权限不足 → HITL/拒绝;能力不匹配 → Router 重选;目标 Agent 暂不可用 → 有界重试/备用;循环达到阈值 → 转人工或失败。
projects/multi-agent-workflow/ 的最小链路应验证:
cd mini-platform
python3 projects/multi-agent-workflow/run.py start
python3 projects/multi-agent-workflow/run.py approve
验收至少包括:同一 run_id 贯穿全部 Agent;Handoff 后重启可恢复 active_agent_id;目标 Agent 缺失/拒绝时返回结构化错误;循环不会无限发生;每个 Agent 的工具白名单和输入输出都可追溯。
还要比较单 Agent 与多 Agent 的真实收益:路由准确率、Handoff 拒绝率、冲突率、任务完成率、成本、延迟、人工接管和错误定位时间。如果拆分后没有改善责任隔离或任务质量,就应允许合并回简单架构。
多 Agent 架构要能扩张,也要能收缩。角色数量不是成熟度指标。
本章小结¶
多 Agent 适合职责、权限或组织责任天然不同的复杂任务,不应作为默认架构。Router 决定 Agent,Planner 决定工具;Handoff 在同一个 Run 中结构化转移控制权,不能靠自然语言转发替代契约。
共享状态需要区分事实、推断和草稿;跨 Agent 权限按任务重新计算;并行结果有冲突时优先回到权威源或人工仲裁,而不是让模型把矛盾润色掉。
多 Agent 的成熟度不看系统里有多少“角色”,而看每一次交接后还能否准确回答:谁负责、看到了什么证据、拥有什么权限,以及任务失败后应该由谁接回来。
参考文献¶
Li, G., et al. (2024). CAMEL: Communicative agents for “mind” exploration of large language model society. NeurIPS.
Qian, C., et al. (2024). ChatDev: Communicative Agents for Software Development.
Google. (2025). Agent2Agent (A2A) Protocol.
Microsoft. (n.d.). AutoGen.
Wu, Q., et al. (2024). AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation.
OpenAI. (2024). Swarm.
Hong, S., et al. (2024). MetaGPT: Meta Programming for a Multi-Agent Collaborative Framework.
Wang, L., et al. (2024). A Survey on Large Language Model based Autonomous Agents.
Model Context Protocol. (2024). Specification.
Yao, S., et al. (2023). ReAct: Synergizing Reasoning and Acting in Language Models.

