核心摘要
三种多智能体编排模式各有适用场景:Supervisor(集中协调者)适合中等复杂度的确定性流水线;Swarm(对等 Handoff)适合动态灵活的对话式场景;Hierarchical(多级管理树)适合大规模复杂系统。本文通过 LangGraph、OpenAI Swarm 和 CrewAI 的完整可运行代码,深入对比三者在架构、延迟、容错和可扩展性上的实际表现。
目录
- 核心要点
- 什么是多智能体编排模式
- 模式一:Supervisor 集中协调者
- 模式二:Swarm 对等 Handoff
- 模式三:Hierarchical 多级管理
- 决策矩阵:如何选择编排模式
- 生产环境注意事项
- 最佳实践
- 常见问题
- 总结与相关资源
核心要点
- Supervisor 模式:单一中心节点路由分派,最适合 3-8 个 Agent 的确定性任务流
- Swarm 模式:去中心化 handoff,无单点故障,适合客服、多轮对话等灵活场景
- Hierarchical 模式:树状管理结构,适合 15+ Agent 的企业级复杂系统
- 选择依据:Agent 数量 × 任务动态性 × 容错需求共同决定最佳模式
- 生产关键:无论哪种模式,超时控制、可观测性和优雅降级是必备基础设施
本文是 多智能体系统入门指南 的进阶实战篇。建议先了解多Agent基础概念后再阅读。
什么是多智能体编排模式
多智能体编排模式(Multi-Agent Orchestration Pattern)定义了多个 AI Agent 之间如何协调任务分配、控制权流转和结果聚合的架构规范。不同于简单的 Agent 链式调用,编排模式关注的是拓扑结构——谁决定下一步该做什么、谁执行、结果如何汇总。
为什么编排模式如此重要
| 场景痛点 | 无编排的后果 | 正确编排的收益 |
|---|---|---|
| 任务路由 | 消息在 Agent 间无序流转 | 明确的控制流,可预测 |
| 错误处理 | 一个 Agent 失败导致全链崩溃 | 局部重试 + 优雅降级 |
| 可观测性 | 无法追踪决策路径 | 完整 Trace 链路 |
| 扩展性 | 新增 Agent 需重写逻辑 | 插件式注册即可扩展 |
三种核心模式概览
模式一:Supervisor 集中协调者
架构设计
Supervisor 模式由一个中央协调者 Agent 负责接收用户请求、分解任务、调度子 Agent 执行、收集结果并汇总输出。所有通信都经过 Supervisor 中转,子 Agent 之间不直接通信。
LangGraph 实现
from typing import Annotated, TypedDict, Literal
from langgraph.graph import StateGraph, START, END
from langgraph.types import Command
from langchain_openai import ChatOpenAI
# 定义共享状态
class AgentState(TypedDict):
messages: list
next_agent: str
research_output: str
draft_output: str
final_output: str
# 初始化模型
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# Supervisor 节点:决定下一步路由
def supervisor_node(state: AgentState) -> Command:
system_prompt = """你是一个 Supervisor,负责协调以下 Agent:
- researcher:负责信息搜索和数据收集
- writer:负责撰写内容
- critic:负责审查和改进
根据当前进度决定下一步应该交给哪个 Agent,
或者返回 FINISH 表示任务完成。"""
response = llm.invoke([
{"role": "system", "content": system_prompt},
*state["messages"]
])
# 解析路由决策
next_agent = parse_routing_decision(response.content)
if next_agent == "FINISH":
return Command(goto=END, update={"final_output": state["draft_output"]})
return Command(goto=next_agent, update={"next_agent": next_agent})
# Researcher Agent 节点
def researcher_node(state: AgentState) -> Command:
response = llm.invoke([
{"role": "system", "content": "你是一个研究专家,负责搜集和整理信息。"},
{"role": "user", "content": state["messages"][-1]["content"]}
])
return Command(
goto="supervisor",
update={"research_output": response.content,
"messages": state["messages"] + [{"role": "assistant", "content": response.content}]}
)
# Writer Agent 节点
def writer_node(state: AgentState) -> Command:
response = llm.invoke([
{"role": "system", "content": "你是一个写作专家,根据研究资料撰写高质量内容。"},
{"role": "user", "content": f"基于以下研究撰写文章:\n{state['research_output']}"}
])
return Command(
goto="supervisor",
update={"draft_output": response.content,
"messages": state["messages"] + [{"role": "assistant", "content": response.content}]}
)
# 构建 Graph
workflow = StateGraph(AgentState)
workflow.add_node("supervisor", supervisor_node)
workflow.add_node("researcher", researcher_node)
workflow.add_node("writer", writer_node)
workflow.add_node("critic", critic_node)
workflow.add_edge(START, "supervisor")
app = workflow.compile()
# 执行
result = app.invoke({
"messages": [{"role": "user", "content": "写一篇关于 AI Agent 编排模式的技术分析"}],
"next_agent": "",
"research_output": "",
"draft_output": "",
"final_output": ""
})
TypeScript 版本(LangGraph.js)
import { StateGraph, START, END } from "@langchain/langgraph";
import { ChatOpenAI } from "@langchain/openai";
import { BaseMessage, HumanMessage } from "@langchain/core/messages";
// 定义状态类型
interface AgentState {
messages: BaseMessage[];
nextAgent: string;
researchOutput: string;
draftOutput: string;
}
const llm = new ChatOpenAI({ model: "gpt-4o", temperature: 0 });
// Supervisor 节点
async function supervisorNode(state: AgentState) {
const response = await llm.invoke([
{ role: "system", content: "Route to: researcher | writer | critic | FINISH" },
...state.messages,
]);
const nextAgent = parseRoute(response.content as string);
return { nextAgent };
}
// 条件路由
function routeFromSupervisor(state: AgentState): string {
if (state.nextAgent === "FINISH") return END;
return state.nextAgent;
}
// 构建 Graph
const workflow = new StateGraph<AgentState>({
channels: {
messages: { default: () => [] },
nextAgent: { default: () => "" },
researchOutput: { default: () => "" },
draftOutput: { default: () => "" },
},
});
workflow.addNode("supervisor", supervisorNode);
workflow.addNode("researcher", researcherNode);
workflow.addNode("writer", writerNode);
workflow.addEdge(START, "supervisor");
workflow.addConditionalEdges("supervisor", routeFromSupervisor);
const app = workflow.compile();
优缺点分析
| 维度 | 优势 | 劣势 |
|---|---|---|
| 控制力 | 完全集中控制,流程可预测 | Supervisor 成为瓶颈 |
| 可观测性 | 所有消息经过中心节点,天然可追踪 | — |
| 容错性 | 单一故障点(Supervisor 挂则全挂) | 需额外实现 Supervisor 高可用 |
| 延迟 | 每步需经过 Supervisor 中转 | 多跳开销大 |
| 适用规模 | 3-8 个 Agent | 超过 10 个时路由逻辑变复杂 |
模式二:Swarm 对等 Handoff
架构设计
Swarm 模式取消了中心协调者,每个 Agent 可以自主判断何时将控制权移交(handoff)给另一个 Agent。OpenAI Swarm 框架是这种模式的典型实现——Agent 通过函数调用机制返回目标 Agent 对象来完成 handoff。
OpenAI Swarm 实现
from swarm import Swarm, Agent
client = Swarm()
# 定义 handoff 函数
def transfer_to_tech_support():
"""将用户转接给技术支持 Agent"""
return tech_agent
def transfer_to_order_agent():
"""将用户转接给订单处理 Agent"""
return order_agent
def escalate_to_human():
"""升级到人工客服"""
return "ESCALATE: 已转接人工客服,工单号 #" + generate_ticket_id()
# Triage Agent - 入口分流
triage_agent = Agent(
name="Triage Agent",
instructions="""你是客服入口分流员。根据用户问题类型:
- 技术问题(安装、配置、Bug)-> 转接技术支持
- 订单问题(退款、物流、支付)-> 转接订单处理
- 无法分类 -> 升级人工""",
functions=[transfer_to_tech_support, transfer_to_order_agent, escalate_to_human],
)
# Tech Support Agent
tech_agent = Agent(
name="Tech Support",
instructions="""你是技术支持专家。解决用户的技术问题。
如果涉及退款或订单操作,调用 transfer_to_order_agent。
如果问题超出能力范围,调用 escalate_to_human。""",
functions=[transfer_to_order_agent, escalate_to_human],
model="gpt-4o",
)
# Order Agent
order_agent = Agent(
name="Order Agent",
instructions="""你是订单处理专员。处理退款、物流查询、支付问题。
如果涉及技术排查,调用 transfer_to_tech_support。""",
functions=[transfer_to_tech_support, escalate_to_human,
process_refund, check_order_status],
)
# 执行对话
response = client.run(
agent=triage_agent,
messages=[{"role": "user", "content": "我的订单显示已发货但三天没收到,而且 App 一直闪退"}],
)
print(response.messages[-1]["content"])
# Agent 会自动在 triage -> order -> tech 之间流转
TypeScript 自定义实现
interface SwarmAgent {
name: string;
instructions: string;
functions: AgentFunction[];
model?: string;
}
interface AgentFunction {
name: string;
description: string;
handler: (args: any) => SwarmAgent | string;
}
class SwarmOrchestrator {
private currentAgent: SwarmAgent;
private conversationHistory: Message[] = [];
private maxHandoffs = 10; // 防止无限循环
constructor(entryAgent: SwarmAgent) {
this.currentAgent = entryAgent;
}
async run(userMessage: string): Promise<string> {
this.conversationHistory.push({ role: "user", content: userMessage });
let handoffCount = 0;
while (handoffCount < this.maxHandoffs) {
const response = await this.callLLM(this.currentAgent);
// 检查是否有 handoff
if (response.functionCall) {
const fn = this.currentAgent.functions.find(
f => f.name === response.functionCall!.name
);
const result = fn!.handler(response.functionCall!.arguments);
if (typeof result === "object" && "name" in result) {
// handoff 到新 Agent
console.log(`[Handoff] ${this.currentAgent.name} -> ${result.name}`);
this.currentAgent = result;
handoffCount++;
continue;
}
// 普通函数调用结果
this.conversationHistory.push({ role: "function", content: result });
continue;
}
// 无 handoff,返回最终回答
return response.content;
}
throw new Error("Exceeded maximum handoff limit");
}
}
优缺点分析
| 维度 | 优势 | 劣势 |
|---|---|---|
| 灵活性 | Agent 自主决策 handoff,适应动态场景 | 流转路径难以预测 |
| 容错性 | 无单点故障,局部 Agent 失败不影响其他 | 需设置 handoff 上限防循环 |
| 延迟 | 直接 Agent 到 Agent,无中间人开销 | 复杂场景可能多次 handoff |
| 可观测性 | 需额外实现 Trace 注入 | 去中心化使追踪更难 |
| 适用场景 | 客服、多轮对话、动态决策 | 不适合严格顺序的流水线 |
模式三:Hierarchical 多级管理
架构设计
Hierarchical 模式在 Supervisor 基础上引入多级管理层级。顶层 Manager 做战略分解,中层 Team Lead 做战术分配,底层 Worker 执行具体任务。这种模式借鉴了企业管理结构,特别适合 15+ Agent 的大规模系统。
CrewAI 实现
from crewai import Agent, Task, Crew, Process
# 顶层 Manager(自动由 CrewAI hierarchical 模式管理)
manager_llm = "gpt-4o"
# 中层 Team Lead Agents
research_lead = Agent(
role="Research Team Lead",
goal="协调研究团队,收集并验证所有相关数据",
backstory="你是一位资深研究负责人,擅长分配搜索任务和交叉验证信息。",
llm="gpt-4o",
allow_delegation=True, # 可以向下委派
)
engineering_lead = Agent(
role="Engineering Team Lead",
goal="协调工程团队,确保代码质量和架构合理性",
backstory="你是一位技术总监,负责协调前后端开发和运维部署。",
llm="gpt-4o",
allow_delegation=True,
)
# 底层 Worker Agents
web_researcher = Agent(
role="Web Researcher",
goal="搜索并提取网络上的最新技术文献",
backstory="你擅长网络信息检索,能快速定位高质量信息源。",
llm="gpt-4o-mini", # Worker 用小模型降低成本
allow_delegation=False,
)
data_analyst = Agent(
role="Data Analyst",
goal="分析数据并生成可视化洞察",
backstory="你是数据分析专家,擅长统计分析和趋势识别。",
llm="gpt-4o-mini",
allow_delegation=False,
)
backend_dev = Agent(
role="Backend Developer",
goal="实现后端 API 和业务逻辑",
backstory="你是资深后端工程师,精通 Python 和分布式系统。",
llm="gpt-4o-mini",
allow_delegation=False,
)
# 定义任务
research_task = Task(
description="调研当前多智能体编排模式的最新进展,包括论文、开源项目和企业实践",
expected_output="结构化的调研报告,包含至少 10 个关键发现",
agent=research_lead,
)
implementation_task = Task(
description="基于调研结果,设计并实现一个多模式编排引擎的原型",
expected_output="可运行的原型代码和架构文档",
agent=engineering_lead,
context=[research_task], # 依赖研究任务的输出
)
# 构建层级 Crew
crew = Crew(
agents=[research_lead, engineering_lead, web_researcher,
data_analyst, backend_dev],
tasks=[research_task, implementation_task],
process=Process.hierarchical, # 关键:启用层级模式
manager_llm=manager_llm,
verbose=True,
)
# 执行
result = crew.kickoff()
print(result)
TypeScript 版本(AutoGen 风格)
import { AutoGenGroupChat, Agent, UserProxy } from "autogen";
// 定义层级结构
const projectManager = new Agent({
name: "ProjectManager",
systemMessage: `你是项目经理。将复杂任务分解为子任务,
分配给对应的 Team Lead。监控进度并处理跨团队依赖。`,
model: "gpt-4o",
});
const researchLead = new Agent({
name: "ResearchLead",
systemMessage: `你是研究负责人。接收 PM 的研究任务,
将其拆解为具体检索任务分配给 Worker,汇总结果后向上汇报。`,
model: "gpt-4o",
});
const webResearcher = new Agent({
name: "WebResearcher",
systemMessage: "你是网络调研员。执行具体的搜索和信息提取任务。",
model: "gpt-4o-mini",
});
// 多级 GroupChat 配置
const researchTeam = new AutoGenGroupChat({
agents: [researchLead, webResearcher],
maxRound: 5,
speakerSelectionMethod: "round_robin",
});
const topLevelChat = new AutoGenGroupChat({
agents: [projectManager, researchLead],
maxRound: 10,
speakerSelectionMethod: "auto",
nestedChats: {
ResearchLead: researchTeam, // 嵌套子团队
},
});
await topLevelChat.initiate(
"设计一个支持三种编排模式热切换的 Agent 框架"
);
优缺点分析
| 维度 | 优势 | 劣势 |
|---|---|---|
| 可扩展性 | 支持 15+ Agent,层级隔离 | 架构复杂度高 |
| 控制力 | 分层管理,职责清晰 | 层级过深影响效率 |
| 成本 | 中间层可用小模型,Worker 成本低 | 管理层本身消耗 Token |
| 延迟 | 多级中转,延迟累加 | 不适合实时场景 |
| 适用场景 | 复杂项目、大团队模拟 | 简单任务杀鸡用牛刀 |
决策矩阵:如何选择编排模式
综合对比表
| 维度 | Supervisor | Swarm | Hierarchical |
|---|---|---|---|
| 复杂度 | 中等 | 低 | 高 |
| Agent 规模 | 3-8 | 2-15 | 10-50+ |
| 延迟 | 中(2跳/步) | 低(1跳/步) | 高(3+跳/步) |
| 容错性 | 低(单点) | 高(分布式) | 中(需冗余设计) |
| 可预测性 | 高 | 低 | 高 |
| 动态适应 | 低 | 高 | 中 |
| 实现难度 | ★★☆ | ★★★ | ★★★★ |
| 调试难度 | ★☆☆ | ★★★ | ★★☆ |
| 典型框架 | LangGraph | OpenAI Swarm | CrewAI |
| 典型场景 | 数据管道、报告生成 | 客服、对话助手 | 软件开发团队模拟 |
决策流程图
生产环境注意事项
超时与重试
无论哪种编排模式,Agent 调用都可能因 LLM 限流、网络波动或模型幻觉而超时。
import asyncio
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(min=1, max=10))
async def call_agent_with_timeout(agent_fn, state, timeout=30):
"""带超时和重试的 Agent 调用"""
try:
result = await asyncio.wait_for(agent_fn(state), timeout=timeout)
return result
except asyncio.TimeoutError:
# 记录超时日志并尝试降级
logger.warning(f"Agent {agent_fn.__name__} timed out after {timeout}s")
raise
except Exception as e:
logger.error(f"Agent {agent_fn.__name__} failed: {e}")
raise
可观测性集成
from opentelemetry import trace
from opentelemetry.trace import StatusCode
tracer = trace.get_tracer("multi-agent-orchestrator")
def traced_agent_call(agent_name: str):
"""为每次 Agent 调用创建 Span"""
def decorator(fn):
async def wrapper(state):
with tracer.start_as_current_span(f"agent.{agent_name}") as span:
span.set_attribute("agent.name", agent_name)
span.set_attribute("agent.input_tokens", count_tokens(state))
try:
result = await fn(state)
span.set_attribute("agent.output_tokens", count_tokens(result))
span.set_status(StatusCode.OK)
return result
except Exception as e:
span.set_status(StatusCode.ERROR, str(e))
span.record_exception(e)
raise
return wrapper
return decorator
优雅降级策略
| 故障类型 | Supervisor 策略 | Swarm 策略 | Hierarchical 策略 |
|---|---|---|---|
| Agent 超时 | 跳过该步 + 用默认值 | Handoff 回上一个 Agent | Team Lead 接管 Worker 任务 |
| LLM 限流 | 全局排队等待 | 局部 Agent 暂停 | 按层级优先级排队 |
| 结果异常 | Supervisor 判断重做 | 下游 Agent 自行校验 | Manager 触发审查流程 |
最佳实践
- 从 Supervisor 开始,按需演进:大多数项目初期 3-5 个 Agent 即可覆盖需求,Supervisor 模式最易实现和调试
- 限制 handoff 深度:Swarm 模式务必设置
max_handoffs(建议 ≤ 10),防止 Agent 之间无限循环 - 中间层用小模型:Hierarchical 模式的 Team Lead 主要做路由决策,使用 GPT-4o-mini 可节省 80% 成本
- 实现 Dead Letter Queue:无法处理的消息进入死信队列,而非直接丢弃
- 状态持久化:长时间运行的编排流程需要 checkpoint 机制,LangGraph 原生支持
- 端到端测试:使用 JSON 格式化工具 验证 Agent 间消息的结构正确性
工具推荐:使用 AI Agent 工具导航 快速找到适合你编排需求的 Agent 框架。
常见问题
Supervisor、Swarm、Hierarchical 三种模式可以混合使用吗?
可以,也推荐在大型系统中混合使用。例如顶层用 Hierarchical 管理多个团队,每个团队内部用 Supervisor 协调,而客服入口使用 Swarm 做动态分流。LangGraph 的 SubGraph 机制天然支持这种嵌套组合。
Swarm 模式中如何防止 Agent 之间无限 handoff?
三重保护措施:(1) 设置全局 max_handoffs 计数器;(2) 在 handoff 函数中加入 visited_agents 集合,禁止回退到已经处理过的 Agent;(3) 添加兜底的 escalate_to_human 函数作为逃逸阀。
性能对比:三种模式的实际延迟差异有多大?
以一个 4-Agent 的任务为例(单次 LLM 调用约 1.5 秒):
- Supervisor: 4 × 1.5s (Agent) + 5 × 1.5s (Supervisor 路由) = ~13.5s
- Swarm: 4 × 1.5s (Agent) = ~6s(Agent 间直接 handoff)
- Hierarchical (2层): 4 × 1.5s (Worker) + 2 × 1.5s (Lead) + 1 × 1.5s (PM) = ~10.5s
哪种模式最适合构建企业内部的 AI 自动化平台?
对于企业级平台,建议 Hierarchical 模式为主干架构。原因:(1) 企业通常有明确的组织架构映射需求;(2) 权限控制可以按层级隔离;(3) 支持渐进式扩展——先部署一个团队,再逐步增加。关于 Agent 生产化的更多挑战,参见 Agent 从验证到上线的十大陷阱。
编排模式与 MCP 协议的关系是什么?
MCP 协议 解决的是 Agent 与外部工具之间的通信标准化问题,而编排模式解决的是 Agent 与 Agent 之间的协作拓扑问题。两者是正交的——无论使用哪种编排模式,Agent 都可以通过 MCP 调用外部工具。详细了解 MCP 请阅读我们的 MCP 协议深入解析。
总结与相关资源
三种编排模式没有绝对优劣,选择取决于具体场景。Supervisor 适合快速交付中等复杂度项目,Swarm 适合需要高灵活性和容错性的动态场景,Hierarchical 适合大规模企业级系统。生产环境下,超时控制、可观测性和优雅降级是三种模式都必须具备的基础能力。
内部资源
- 多智能体系统入门指南 — 多 Agent 基础概念
- LangGraph vs AutoGen 框架对比 — 框架选型参考
- Agent 从验证到上线的十大陷阱 — 生产化避坑
- AI Agent 工具导航 — Agent 框架与工具发现
- JSON 格式化工具 — Agent 消息调试