AutoGen 概述

AutoGen 是微软推出的多智能体(Multi-Agent)框架,目标是让开发者能快速搭建多个 AI Agent 协作完成复杂任务。2025 年发布的 v0.4 是完全重写版本(也叫 AG2),架构设计全面升级。

v0.4 核心变化

维度v0.3 (旧)v0.4 (新)
架构扁平、耦合分层、事件驱动
异步✅ 原生 asyncio
消息传递直接调用事件总线
Agent 通信硬编码可扩展通信协议
可观测性基本日志OpenTelemetry 集成
跨语言Python onlyPython + .NET
扩展性高(插件架构)

架构解析

事件驱动模型

┌─────────────────────────────────────────┐
│              Runtime                     │
│  ┌──────────────────────────────────┐   │
│  │         Event Bus                 │   │
│  │  (消息路由、订阅/发布)              │   │
│  └──────┬─────┬─────┬─────┬─────────┘   │
│         │     │     │     │              │
│    ┌────┴──┐ ┌┴────┐ ┌┴────┐ ┌┴──────┐   │
│    │Agent A│ │Agent B│ │Agent C│ │Tool   │   │
│    │(Writer)│ │(Reviewer)│ │(Coder)│ │Agent  │   │
│    └───────┘ └──────┘ └──────┘ └───────┘   │
│                                           │
│  ┌──────────────────────────────────┐   │
│  │    Model Client Layer             │   │
│  │  (OpenAI / Azure / Ollama / ...)  │   │
│  └──────────────────────────────────┘   │
└─────────────────────────────────────────┘

所有 Agent 间通信通过事件总线,Agent 之间完全解耦。这意味着可以灵活替换、增删 Agent 而不影响其他部分。

核心 Agent 类型

AssistantAgent

最基础的 Agent,负责与 LLM 交互:

from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletionClient

model_client = OpenAIChatCompletionClient(
    model="deepseek-chat",
    base_url="https://api.deepseek.com/v1",
    api_key="sk-xxx",
    model_info={"vision": False, "function_calling": True, "json_output": True}
)

writer = AssistantAgent(
    name="Writer",
    model_client=model_client,
    system_message="""你是一位技术写作专家,擅长将复杂技术概念用清晰的语言解释。
    你负责撰写文章初稿,不需要完美,但要覆盖所有要点。"""
)

# 单 Agent 对话
response = await writer.on_messages(
    [TextMessage(content="写一篇关于 RAG 的入门文章", source="user")],
    cancellation_token=CancellationToken()
)
print(response.chat_message.content)

CodeExecutorAgent

负责执行代码并返回结果:

from autogen_agentchat.agents import CodeExecutorAgent
from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor

executor = LocalCommandLineCodeExecutor(
    timeout=30,
    work_dir="code_workspace"
)

coder = CodeExecutorAgent(
    name="CodeExecutor",
    code_executor=executor
)

安全提示:LocalCommandLineCodeExecutor 在本地执行任意代码,仅用于开发环境。生产环境用 Docker 容器执行:

from autogen_ext.code_executors.docker import DockerCommandLineCodeExecutor

docker_executor = DockerCommandLineCodeExecutor(
    image="python:3.12-slim",
    timeout=60,
    work_dir="/workspace"
)

多 Agent 协作模式

1. 双 Agent 协作(Writer + Reviewer)

from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMentionTermination

writer = AssistantAgent(
    name="Writer",
    model_client=model_client,
    system_message="你是技术写作者。写完文章后说'初稿完成'。"
)

reviewer = AssistantAgent(
    name="Reviewer",
    model_client=model_client,
    system_message="""你是严格的技术审稿人。检查:
    1. 技术准确性 2. 逻辑完整性 3. 代码正确性
    如果需要修改,指出具体问题。如果满意,说'审稿通过'。"""
)

# 轮询对话,直到 Reviewer 说"审稿通过"
termination = TextMentionTermination("审稿通过")
team = RoundRobinGroupChat([writer, reviewer], termination_condition=termination)

result = await team.run(
    task="写一篇 500 字的 Embedding 模型选型指南"
)
print(result)

2. GroupChat 多角色协作

from autogen_agentchat.teams import SelectorGroupChat

# 定义多个专业角色
researcher = AssistantAgent(
    name="Researcher",
    model_client=model_client,
    system_message="你负责调研技术方案,给出可行性分析。"
)

architect = AssistantAgent(
    name="Architect",
    model_client=model_client,
    system_message="你负责系统架构设计,给出技术选型和架构图描述。"
)

coder = AssistantAgent(
    name="Coder",
    model_client=model_client,
    system_message="你负责编写核心代码实现。"
)

tester = AssistantAgent(
    name="Tester",
    model_client=model_client,
    system_message="你负责编写测试用例和验收标准。"
)

# Selector 模式:由 LLM 决定下一个发言者
team = SelectorGroupChat(
    participants=[researcher, architect, coder, tester],
    model_client=model_client,  # 用于选择发言者的模型
    termination_condition=TextMentionTermination("任务完成"),
    selector_prompt="""你是一个团队协调者。根据当前对话状态,选择下一个应该发言的成员。
    可选成员:{participants}
    对话历史:{history}
    下一个发言者:"""
)

result = await team.run(
    task="设计并实现一个基于 RAG 的技术问答系统"
)

3. 嵌套对话(Nested Chat)

from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat

# 内部团队:代码审查
code_review_team = RoundRobinGroupChat(
    [coder, tester],
    termination_condition=TextMentionTermination("代码通过")
)

# 外部 Agent 可以调用内部团队
architect = AssistantAgent(
    name="Architect",
    model_client=model_client,
    system_message="你设计架构后,让代码团队实现。",
    nested_chats=[{
        "trigger": lambda msg: "需要实现" in msg.content,
        "team": code_review_team
    }]
)

与 LangGraph 对比

维度AutoGen v0.4LangGraph
核心范式多 Agent 对话状态图(State Graph)
编排方式事件驱动图节点/边
状态管理隐式(消息历史)显式(State 对象)
流控终止条件条件边、循环
适合场景对话式协作工作流式编排
学习曲线中高
代码量较少较多
可调试性高(图可视化)
并发✅ asyncio✅ asyncio

什么时候选 AutoGen

  • 任务适合"多人讨论"的方式解决
  • Agent 之间的交互模式不确定,需要动态决定
  • 角色分工明确(Writer、Reviewer、Coder、Tester)

什么时候选 LangGraph

  • 任务有明确的步骤和流程
  • 需要精确控制状态流转
  • 需要可视化工作流
  • 需要持久化和恢复执行状态

与 CrewAI 对比

维度AutoGen v0.4CrewAI
设计哲学对话驱动角色任务驱动
任务分配自主协商显式分配
流程控制灵活但松散结构化 Process
易用性
生产就绪
企业支持微软背书社区

CrewAI 更适合"明确分工、按流程执行"的场景,AutoGen 更适合"讨论式协作"场景。

实战踩坑

1. Token 消耗爆炸

多 Agent 对话中 token 消耗指数增长——每轮对话每个 Agent 都能看到完整历史。

# 限制每个 Agent 的上下文窗口
writer = AssistantAgent(
    name="Writer",
    model_client=model_client,
    system_message="...",
    model_client_stream=True,
    max_consecutive_auto_reply=3  # 限制自动回复次数
)

2. 死循环

两个 Agent 互相推诿导致无限对话。务必设置终止条件:

from autogen_agentchat.conditions import MaxMessageTermination

# 最多 20 条消息
termination = MaxMessageTermination(20) | TextMentionTermination("完成")

3. 模型选择

多 Agent 场景建议用不同模型:

  • 协调者/Selector:用便宜模型(gpt-4o-mini / deepseek-chat)
  • 执行者:用强模型(gpt-4o / claude-sonnet)
  • 这样可以兼顾质量和成本

小结

AutoGen v0.4 是多 Agent 协作领域最完善的框架之一。事件驱动架构和灵活的通信模式让它适合对话密集型场景。但多 Agent 系统复杂度高、token 消耗大、调试困难,不建议所有任务都用多 Agent。简单的 RAG + 单 Agent 能解决 80% 的问题,多 Agent 留给真正需要角色协作的复杂任务。LangGraph 更适合流程化工作流,CrewAI 更适合结构化任务分配。选框架前先想清楚你的任务到底需不需要多个 Agent。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。