Appearance
多智能体协作专题
版本:
v1.1最后更新:
2026-07-07
很多团队一聊到 Agent,就会很快进入“要不要做多智能体”。
但多智能体不是“越多越高级”,而是一种成本更高、边界更难、调试更复杂的工程方案。真正值得做多智能体,通常不是因为“看起来更像人类团队”,而是因为单 Agent 已经无法同时兼顾以下几件事:
- 职责边界足够清晰
- 上下文规模仍然可控
- 工具权限不会失控
- 系统可观测性还能维持
- 失败后可以明确定位责任点
这篇专题不讨论“概念上有几个 Agent”,而讨论“工程上为什么拆、怎么拆、拆完怎么不失控”。
1. 什么是多智能体协作
从工程角度看,多智能体系统至少包含三层含义:
- 系统内部存在多个职责不同的 Agent
- Agent 之间会交换控制权、状态或产物
- 这些交接关系需要被明确建模,而不是靠 prompt 临场发挥
按 OpenAI Orchestration and handoffs 与 LangChain Multi-agent 官方文档在 2026-07-07 可访问的设计口径,多智能体最常见的两类基本协作方式是:
- handoff:当前 Agent 判断自己不再适合继续处理,把控制权移交给另一个 Agent
- agent as tool:某个专长 Agent 不接管主会话,而是作为另一个 Agent 的受控能力被调用
这两个模式差别很大:
- handoff 更像“主责切换”
- agent as tool 更像“能力委托”
如果把这两件事混在一起,系统很容易出现“谁在负责最终答案”不清楚的问题。
2. 什么时候值得上多智能体
真正适合多智能体的情况,通常有几个明显信号。
2.1 单 Agent 职责已经明显过载
例如一个 Agent 既要负责:
- 意图识别
- 知识检索
- SQL 查询
- 外部系统写操作
- 最终答复
- 风险审查
这时候不是 prompt 再写长一点就能解决,而是职责已经混在一起,导致:
- 推理链条过长
- 工具选择变差
- 上下文污染严重
- 评测无法定位到底是哪一层错了
2.2 不同步骤天然需要不同角色视角
典型例子:
- Planner 负责拆任务
- Executor 负责执行
- Reviewer 负责检查
- Approver 负责人机审批
这些角色的目标函数不一样,硬塞给一个 Agent,往往会让模型在“快做完”和“严格找错”之间摇摆。
2.3 不同步骤需要不同权限边界
例如:
- 路由 Agent 只看用户输入,不允许写库
- 检索 Agent 可以读知识库,但不能发起交易
- 执行 Agent 可以调用内部工具
- 审批 Agent 只能生成建议,不允许直接执行
当权限模型本身就不同,多智能体会比“一个超级 Agent 拿全权限”更容易治理。
2.4 单 Agent 的上下文成本已经不划算
当所有历史、所有工具结果、所有中间草稿都堆进一个上下文时,通常会出现:
- 时延拉长
- 成本升高
- 相关信息占比下降
- 模型更容易被噪音干扰
拆分后由不同 Agent 只拿自己需要的上下文,往往更稳定。
3. 什么情况不适合多智能体
很多团队上多智能体,并不是因为真的需要,而是因为还没把单 Agent 做扎实。
以下情况通常不建议直接上多智能体:
- 单轮问答或单步工具调用就能解决的问题
- 业务规则还没稳定,连单 Agent 的成功标准都不清楚
- 工具链本身不稳定,失败原因主要来自工具而不是调度
- 还没有 tracing、日志和评测体系
- 团队还无法回答“拆成两个 Agent 后到底更好在哪”
这类情况下,多智能体经常只会带来四种坏处:
- 成本更高
- 调试更难
- 错误链路更长
- 责任归因更模糊
一个实用顺序通常是:
- 先把单 Agent 跑稳。
- 找出真正瓶颈。
- 只把瓶颈位置拆出去。
4. 常见多智能体协作模式
4.1 Router 模式
入口 Agent 负责分类,再把任务交给不同专长 Agent。
适合:
- 客服分诊
- 多域知识问答
- 多能力助手入口
关键点不是“分发出去”,而是“分发依据必须可解释”。一个好的 Router 通常会显式绑定:
- 分类标签
- 置信度阈值
- 无法判断时的兜底路径
- 错误路由的纠偏机制
4.2 Planner + Executor 模式
Planner 负责把复杂任务拆成更小的执行单元,Executor 负责具体操作。
适合:
- 长任务自动化
- 编码或运维流程
- 复杂业务流程编排
这个模式最容易犯的错是:Planner 只是“写了很多话”,但没有输出可执行的结构。更好的做法是让 Planner 明确产出:
- 步骤编号
- 每步输入
- 每步期望输出
- 依赖关系
- 失败重试策略
4.3 Reviewer / Judge 模式
一个 Agent 负责生成结果,另一个 Agent 负责审查。
适合:
- 高风险内容输出
- 政策合规审查
- 代码/SQL/配置改动校验
- 结构化结果一致性检查
这一类协作要特别小心“同源偏差”:如果 Reviewer 和 Generator 完全同 prompt、同上下文、同标准,审查价值会很有限。更有效的做法通常是:
- 换审查目标
- 换审查视角
- 缩小审查输入
- 引入规则校验或程序校验
4.4 Specialist 模式
不同 Agent 对应不同知识域或工具域,例如:
- 检索 Agent
- 数据分析 Agent
- 合同审阅 Agent
- 运维变更 Agent
这个模式的核心不是“专业名字”,而是每个 Specialist 是否有明确的:
- 能力边界
- 输入输出格式
- 可调用工具范围
- 升级/回退规则
4.5 Supervisor 图模式
LangGraph 一类框架会把多智能体看作图结构或状态机,而不是线性接力。此时一个 Supervisor 节点可以:
- 决定下一步走哪条边
- 维护共享状态
- 执行并行分支合流
- 在超时或失败时切换补偿路径
适合:
- 分支条件很多
- 任务可并行
- 需要显式状态恢复
如果系统已经进入“图编排”复杂度,就不要再只靠 prompt 文本描述流程,应该把状态转移规则显式写进工作流层。
5. handoff 和 agent-as-tool 到底怎么选
这是多智能体设计里最容易糊掉的一步。
5.1 更适合 handoff 的情况
- 主责真的发生变化
- 后续对话应由新角色持续接管
- 新角色需要独立的系统指令和长期上下文
- 需要把责任边界切得很清楚
例如:
- 客服分诊转人工审批 Agent
- 通用助理转法务 Agent
- 规划 Agent 把复杂代码任务交给实现 Agent
5.2 更适合 agent-as-tool 的情况
- 主会话不该切换所有权
- 只是临时需要某个专长能力
- 输出应该作为中间结果返回
- 调用应该被统一审计和限权
例如:
- 主 Agent 调用一个“文档检索 Agent”
- 主 Agent 调用一个“SQL 生成 Agent”
- 主 Agent 调用一个“代码审查 Agent”产出建议
一个很实用的判断标准是:
- 如果用户能感知到“现在是另一个角色继续负责”,更像 handoff
- 如果用户只感知到“系统内部查了个子能力”,更像 agent-as-tool
6. 多智能体最难的不是调度,而是上下文交接
handoff 不是简单把消息原样转发一下。真正难的是“交什么”和“不交什么”。
交接包通常至少要包含:
- 当前任务目标
- 已完成步骤
- 未完成步骤
- 可复用的中间结论
- 风险标记
- 用户约束
- 允许使用的工具范围
但不应该无差别塞进去的东西包括:
- 全量历史草稿
- 冗长推理过程
- 与当前子任务无关的工具返回
- 上一个 Agent 的所有临时假设
更推荐的交接方式是“结构化状态包”,而不是“把整个对话继续喂下去”。一个最小交接包常见字段可以是:
json
{
"task_id": "task-20260707-001",
"current_goal": "为用户生成部署变更建议",
"completed_steps": ["读取配置", "识别风险项"],
"pending_steps": ["生成变更单", "等待审批"],
"constraints": ["不能直接执行生产变更"],
"approved_tools": ["read_config", "create_change_request"],
"risk_flags": ["production", "network-change"],
"artifacts": ["risk_summary_v2"]
}这样做的收益通常比“共享全量聊天历史”更大:
- token 更省
- 污染更少
- 责任更清楚
- 更容易回放和重试
7. 状态管理是多智能体系统的地基
多智能体比单 Agent 更依赖显式状态,不然一旦跨节点失败,系统几乎无法恢复。
至少建议把状态分成几类:
- 会话状态:用户目标、身份、会话元信息
- 工作流状态:当前节点、待办步骤、依赖关系
- 业务状态:订单号、工单号、审批单号等外部对象
- 工具状态:某次工具调用结果、重试次数、幂等键
- 风险状态:审批要求、敏感操作标记、降级状态
如果这些状态全混在对话文本里,会直接导致:
- 恢复困难
- 回放困难
- 合规审计困难
- 幂等性保障困难
这也是为什么多智能体经常要和 工作流状态机专题、长任务恢复策略专题、会话记忆治理专题 一起看。
8. 权限设计不能沿用“一个 Agent 全拿”的思路
单 Agent 阶段常见偷懒方式是:给一个 Agent 挂很多工具,然后指望 prompt 自觉克制。
到了多智能体阶段,这种做法风险更大,因为:
- Agent 数量增多,权限传播更难追踪
- handoff 可能把高风险上下文带给错误角色
- 某个 Specialist 被误调用也可能造成真实副作用
更稳的做法通常是:
- 每个 Agent 只拿完成本职工作所需的最小工具集
- 高风险工具只暴露给专门执行角色
- 把审批和执行拆开,不让审查角色顺手执行
- 在工作流层再次做工具白名单校验
多智能体系统里,权限边界应该至少经过三层:
- Agent 角色级权限
- 工具 schema 与参数级校验
- 工作流/平台侧运行时拦截
相关专题可以继续看:
9. 多智能体失败时,最容易坏在哪
9.1 错误路由
入口把任务交给了错误 Specialist,后续全部建立在错误前提上。
9.2 责任漂移
每个 Agent 都认为“最终答案是别人的事”,导致无人对最后输出负责。
9.3 上下文污染
交接包混入大量无关历史,让后续 Agent 把旧噪音当成现状。
9.4 过度串行
理论上可以并行的步骤被全部串行化,时延暴涨但收益不明显。
9.5 假审查
Reviewer 只是换个壳重复生成,没有真正增加校验价值。
9.6 故障无法恢复
某个中间节点失败后,系统既不知道从哪恢复,也不知道是否已经对外产生副作用。
10. 评测不能只看“最终答得对不对”
多智能体系统如果只评最终答案,会隐藏大量结构性问题。更好的做法是分层评测。
10.1 单节点评测
- Router 路由正确率
- Planner 拆解质量
- Reviewer 拦截命中率
- Specialist 工具选择正确率
10.2 handoff 评测
- 交接后任务目标保持率
- 上下文缺失率
- 无关上下文污染率
- 交接后重复劳动比例
10.3 系统级评测
- 端到端任务完成率
- 平均调用轮次
- 平均 token 成本
- 平均时延
- 审批触发率
- 故障恢复成功率
10.4 风险评测
- 越权工具调用率
- 高风险任务漏审批率
- 低价值循环率
- 错误写操作触发率
如果没有这些中间指标,团队很容易只看到“最终结果偶尔不对”,但不知道问题出在:
- 路由
- 计划
- 工具
- 交接
- 审核
- 执行
11. 可观测性和 tracing 要从第一天就接入
多智能体没有 trace,几乎等于黑盒套黑盒。
最少建议记录:
- 当前是哪个 Agent 在处理
- 为什么从 A 切到 B
- 交接包摘要是什么
- 本轮用了哪些工具
- 哪一步进入审批
- 哪一步失败、重试、回滚
如果 tracing 系统里不能还原以下问题,说明可观测性还不够:
- 这次错误是哪个 Agent 先做错的
- 为什么发生 handoff
- handoff 时带了哪些关键状态
- 哪个工具返回导致后续链路偏掉
这部分建议和 可观测性与tracing专题、Agent计划回放专题、工具观测事件模型专题 一起看。
12. 共享状态、私有状态和无状态子 Agent 要分清
多智能体系统最容易失控的一个点,是把“所有子 Agent 都像一个独立小人”想得太自然,结果每个节点都在各自记一份不完整的世界状态。
更稳的做法是先区分三类状态:
| 状态类型 | 适合放什么 | 谁维护 |
|---|---|---|
| 共享状态 | 当前目标、任务 ID、审批单号、关键约束、关键产物引用 | 主工作流或主 Agent |
| 私有状态 | 某个 Specialist 的临时草稿、中间判断、局部工具结果 | 当前子 Agent |
| 无状态调用 | 一次性摘要、改写、分类、检索建议 | 被当作 tool 的子 Agent |
根据 LangChain Subagents 文档在 2026-07-07 可访问的说明,subagents 更偏“受主 Agent 协调的无状态能力”,对话记忆通常由主 Agent 维护,而不是让每个子 Agent 各自保存完整历史。
这对工程实现的启示很直接:
- 能无状态的子 Agent,就不要默认给长期记忆。
- 真正需要跨轮次保留的状态,应回收到主状态层。
- handoff 后是否继承历史,要显式决定,而不是默认继承全部。
如果共享状态和私有状态不分清,最常见的问题就是:
- 一个 Agent 改了约束,另一个 Agent 根本不知道
- 一个 Agent 记住了旧事实,主系统却已经更新
- 恢复时不知道该以谁的状态为准
13. 并行分支和合流策略要先约定
很多团队做多智能体,会很自然地想到:
- 既然有多个 Agent,那就并行跑
但真正难的不是“并行出去”,而是“怎么合回来”。
至少要先回答:
- 并行分支共享哪些状态键
- 相同字段被多个分支同时更新时怎么合并
- 哪些分支必须全成功,哪些允许部分成功
- 某个分支超时后,是整体降级、局部补偿还是继续向前
根据 LangGraph 的并行图与状态更新文档在 2026-07-07 可访问的说明,并行节点更新共享状态时需要提前定义 reducer 或合流规则,否则很容易出现冲突或不确定更新。
更实用的合流策略通常包括:
all_success:所有分支成功才进入下一步best_effort:允许部分分支失败,保留成功结果quorum:达到一定票数或证据数就继续rank_then_merge:先排序,再只合并前 N 个高价值结果
如果不先定义合流策略,并行往往只会带来:
- token 更多
- trace 更乱
- 调试更难
- 最终答案责任更模糊
14. 一个更稳妥的落地顺序
很多团队一开始就想设计“完美的多智能体工厂”,最后往往败在复杂度过高。
更稳妥的落地顺序通常是:
- 先做单 Agent + 明确工具边界。
- 先接 tracing 和基础评测。
- 把最容易出错的角色单独拆出去。
- 只引入一种协作方式,例如先做 Router 或先做 Reviewer。
- 稳定后再考虑 handoff、并行分支和图编排。
这比一开始就做“总控 Agent + 十个 Specialist”更容易走到生产。
15. 常见反模式
- 为了显得高级而上多智能体
- 一个 Router 既分类又执行又审批
- handoff 时共享全量对话,导致上下文失控
- 每个 Agent 都挂全量工具
- 把子 Agent 当工具用,却没有统一的输入输出契约
- 想做并行,但没有去重、幂等和合流策略
- 没有状态机,只靠 prompt 描述流程
- 没有 trace,出了问题只能人工猜测
16. 一个实用判断清单
如果你准备引入多智能体,至少先回答下面这些问题:
- 单 Agent 当前的真实瓶颈是什么?
- 这个瓶颈是职责过载、权限过大,还是上下文过重?
- 拆出来的新 Agent 是否有清晰输入输出?
- 它是 handoff 角色,还是 agent-as-tool?
- 交接状态包长什么样?
- 每个 Agent 的工具白名单是什么?
- 失败后从哪里恢复,是否需要补偿?
- 如何评估这次拆分到底比单 Agent 更好?
如果这些问题还回答不出来,多智能体大概率还没到该做的时候。
17. 推荐搭配阅读
18. 重点官方资源
以下资源已按 2026-07-07 的官方入口重新核对:
- OpenAI Orchestration and handoffs:https://developers.openai.com/api/docs/guides/agents/orchestration
- OpenAI Agents guide:https://developers.openai.com/api/docs/guides/agents
- OpenAI Orchestrating Agents cookbook:https://developers.openai.com/cookbook/examples/orchestrating_agents
- OpenAI Using tool required for customer service:https://developers.openai.com/cookbook/examples/using_tool_required_for_customer_service
- LangChain Multi-agent:https://docs.langchain.com/oss/python/langchain/multi-agent
- LangChain Subagents:https://docs.langchain.com/oss/python/langchain/multi-agent/subagents
- LangChain Handoffs:https://docs.langchain.com/oss/python/langchain/multi-agent/handoffs
- LangGraph Overview:https://docs.langchain.com/oss/python/langgraph/overview
- LangGraph Workflows and agents:https://docs.langchain.com/oss/python/langgraph/workflows-agents
- LangGraph Persistence:https://docs.langchain.com/oss/python/langgraph/persistence
19. 落地检查清单
- 是否能明确说出当前拆分是 handoff 还是 agent-as-tool,而不是两者混用
- 是否区分了共享状态、私有状态和无状态子 Agent
- 是否为并行分支定义了合流规则,而不是默认“最后一个写入覆盖前一个”
- 是否为每个 Agent 约束了最小工具集和运行时白名单
- 是否能对路由、交接、工具、恢复分别做中间评测
- 是否能通过 trace 还原一次 handoff 为什么发生、带了什么状态、在哪一步偏掉