多 Agent 编排模式
多 Agent 编排模式
学习目标
本章要解决什么问题:AutoGen 如何在 AgentChat 层提供多种预置的多 Agent 协作模式。你将学到:
- 四种编排模式的工作原理和 API 用法
DiGraph有向图对话流的定义方法- Magentic-One 的 Ledger 编排机制
- 如何根据任务类型选择合适的编排模式
前置知识
本章涉及多 Agent 编排的通用原理,建议先阅读:
下文假设你已理解 Orchestrator 模式的基本概念,直接聚焦 AutoGen 的具体实现。
项目实践
四种编排模式概览
RoundRobinGroupChat:固定顺序
from autogen_agentchat.agents import AssistantAgentfrom autogen_agentchat.teams import RoundRobinGroupChatfrom autogen_agentchat.conditions import MaxMessageTerminationfrom autogen_ext.models.openai import OpenAIChatCompletionClient
client = OpenAIChatCompletionClient(model="gpt-4.1")
agent_a = AssistantAgent("reviewer_a", model_client=client, system_message="You review code for bugs.")agent_b = AssistantAgent("reviewer_b", model_client=client, system_message="You review code for style.")
termination = MaxMessageTermination(6) # 每人 3 轮team = RoundRobinGroupChat([agent_a, agent_b], termination_condition=termination)result = await team.run(task="Review this code: ...")工作原理:内部将参与者注册到同一个 Group Topic,按注册顺序依次发送消息,每轮每个 Agent 发言一次。
SelectorGroupChat:LLM 动态选择
from autogen_agentchat.teams import SelectorGroupChat
team = SelectorGroupChat( [coder, reviewer, tester], model_client=client, termination_condition=termination,)关键设计:每个 Agent 的 description 字段是 LLM 选择的依据。描述越精确,选择越准确。
coder = AssistantAgent("coder", model_client=client, description="Writes Python code to solve programming tasks.")reviewer = AssistantAgent("reviewer", model_client=client, description="Reviews code for correctness and best practices.")内部机制:每次需要选择下一个发言者时,向 LLM 发送包含当前对话历史和所有 Agent 描述的消息,让 LLM 输出下一个发言者的名称。
Swarm:Handoff 驱动
from autogen_agentchat.base import Handofffrom autogen_agentchat.teams import Swarm
general = AssistantAgent("general", model_client=client)math = AssistantAgent("math", model_client=client, system_message="You are a math expert.")
# 当 general 需要数学计算时,handoff 到 mathgeneral.handoffs.append(Handoff(target=math.name, description="Use when the task requires mathematical computation."))
team = Swarm([general, math], termination_condition=termination)工作原理:Agent 在回复中可以包含 HandoffMessage,编排器收到后将控制权转移到目标 Agent。
MagenticOneGroupChat:Ledger 编排
from autogen_agentchat.teams import MagenticOneGroupChat
team = MagenticOneGroupChat( [coder, reviewer], model_client=client, max_stalls=3, # 最大停滞次数 termination_condition=termination,)Ledger 三要素:
- Facts:从任务中提取的已知事实
- Plan:当前执行计划
- Progress:已完成步骤列表
停滞检测:Orchestrator 每轮评估进度,如果连续 max_stalls 轮没有进展,强制终止并返回当前最佳答案。
DiGraph:有向图对话流
from autogen_agentchat.teams import SelectorGroupChatfrom autogen_agentchat.teams import DiGraphBuilder
builder = DiGraphBuilder()builder.add_edge("triage", "simple_task")builder.add_edge("triage", "complex_task")builder.add_edge("simple_task", "review")builder.add_edge("complex_task", "design")builder.add_edge("design", "implement")builder.add_edge("implement", "review")
graph_flow = builder.build()适用场景:对话流程有明确的先后顺序,某些步骤的产出决定后续路径。
问题与规避
Selector 的 LLM 选择不稳定
陷阱:LLM 可能在不同轮次中对同一情境做出不同的选择,导致死循环(反复选择同一个 Agent)或跳过关键 Agent。
规避:
- 每个 Agent 的
description必须明确、互不重叠 - 设置
max_turns防止无限循环 - 监控选择日志,如果发现偏向某个 Agent,调整描述增加区分度
Swarm 的 Handoff 循环
陷阱:Agent A handoff 到 B,B 又 handoff 回 A,形成无限循环。
规避:
- Handoff 描述中明确触发条件(“Use when…”)
- 设置
max_turns限制总轮次 - 在 Agent 系统提示中规定 “如果你无法处理,返回最终结果而非 handoff”
Magentic-One 的 Token 消耗
陷阱:Orchestrator 每轮都需要 LLM 调用做评估和规划,Token 消耗随轮次线性增长。
规避:
- 设置合理的
max_turns - 使用更便宜的模型作为 Orchestrator
- 简单任务不使用 Magentic-One,改用 RoundRobin 或 Selector
设计取舍
为什么提供四种模式而非一种通用模式?
原因:不同任务对编排的需求差异巨大:
- 代码审查:每个审查者必须参与 → RoundRobin
- 客服路由:根据问题类型选择专家 → Selector
- 自主探索:Agent 知道何时求助 → Swarm
- 研究任务:需要规划和反思 → Magentic-One
通用模式的代价:要么功能过于简单无法应对复杂场景,要么功能臃肿学习成本过高。
与 LangGraph 状态图的对比
| 维度 | AutoGen DiGraph | LangGraph StateGraph |
|---|---|---|
| 控制流 | 有向边定义路径 | 条件函数定义路径 |
| 状态管理 | GroupChat 内部维护 | 用户自定义状态对象 |
| 动态路由 | Selector + LLM 选择 | 条件函数返回值 |
| 学习曲线 | 低(配置式) | 中(代码式) |
AutoGen 更偏向配置式(声明 Agent 和关系),LangGraph 更偏向代码式(定义状态转换函数)。
参考来源
- AutoGen AgentChat Tutorial — 官方教程
- 源码验证:
autogen-agentchat/teams/_group_chat/(四种模式实现)