跳转到内容

多 Agent 编排模式

多 Agent 编排模式

学习目标

本章要解决什么问题:AutoGen 如何在 AgentChat 层提供多种预置的多 Agent 协作模式。你将学到:

  • 四种编排模式的工作原理和 API 用法
  • DiGraph 有向图对话流的定义方法
  • Magentic-One 的 Ledger 编排机制
  • 如何根据任务类型选择合适的编排模式

前置知识

本章涉及多 Agent 编排的通用原理,建议先阅读:

下文假设你已理解 Orchestrator 模式的基本概念,直接聚焦 AutoGen 的具体实现。


项目实践

四种编排模式概览

RoundRobinGroupChat:固定顺序

from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import MaxMessageTermination
from 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 Handoff
from 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 到 math
general.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 三要素

  1. Facts:从任务中提取的已知事实
  2. Plan:当前执行计划
  3. Progress:已完成步骤列表

停滞检测:Orchestrator 每轮评估进度,如果连续 max_stalls 轮没有进展,强制终止并返回当前最佳答案。

DiGraph:有向图对话流

from autogen_agentchat.teams import SelectorGroupChat
from 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 DiGraphLangGraph StateGraph
控制流有向边定义路径条件函数定义路径
状态管理GroupChat 内部维护用户自定义状态对象
动态路由Selector + LLM 选择条件函数返回值
学习曲线低(配置式)中(代码式)

AutoGen 更偏向配置式(声明 Agent 和关系),LangGraph 更偏向代码式(定义状态转换函数)。

参考来源