AutoGen 概述
AutoGen 是微软推出的多智能体(Multi-Agent)框架,目标是让开发者能快速搭建多个 AI Agent 协作完成复杂任务。2025 年发布的 v0.4 是完全重写版本(也叫 AG2),架构设计全面升级。
v0.4 核心变化
| 维度 | v0.3 (旧) | v0.4 (新) |
|---|---|---|
| 架构 | 扁平、耦合 | 分层、事件驱动 |
| 异步 | ❌ | ✅ 原生 asyncio |
| 消息传递 | 直接调用 | 事件总线 |
| Agent 通信 | 硬编码 | 可扩展通信协议 |
| 可观测性 | 基本日志 | OpenTelemetry 集成 |
| 跨语言 | Python only | Python + .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.4 | LangGraph |
|---|---|---|
| 核心范式 | 多 Agent 对话 | 状态图(State Graph) |
| 编排方式 | 事件驱动 | 图节点/边 |
| 状态管理 | 隐式(消息历史) | 显式(State 对象) |
| 流控 | 终止条件 | 条件边、循环 |
| 适合场景 | 对话式协作 | 工作流式编排 |
| 学习曲线 | 中 | 中高 |
| 代码量 | 较少 | 较多 |
| 可调试性 | 中 | 高(图可视化) |
| 并发 | ✅ asyncio | ✅ asyncio |
什么时候选 AutoGen
- 任务适合"多人讨论"的方式解决
- Agent 之间的交互模式不确定,需要动态决定
- 角色分工明确(Writer、Reviewer、Coder、Tester)
什么时候选 LangGraph
- 任务有明确的步骤和流程
- 需要精确控制状态流转
- 需要可视化工作流
- 需要持久化和恢复执行状态
与 CrewAI 对比
| 维度 | AutoGen v0.4 | CrewAI |
|---|---|---|
| 设计哲学 | 对话驱动 | 角色任务驱动 |
| 任务分配 | 自主协商 | 显式分配 |
| 流程控制 | 灵活但松散 | 结构化 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论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
