AutoGen v0.4:从对话到事件驱动
AutoGen v0.4 是一次重大架构重写。v0.2 时代的设计核心是"Agent 之间通过对话协作",v0.4 在此基础上引入了事件驱动的 actor 模型:
| 版本 | 核心模型 | 通信方式 | 架构特点 |
|---|---|---|---|
| v0.2 | 对话轮转 | 直接消息传递 | 同步阻塞 |
| v0.4 | Actor 模型 | 事件总线 + 消息 | 异步事件驱动 |
v0.4 的改进解决了 v0.2 的几个硬伤:单进程瓶颈、对话死锁、扩展性差。
核心 Agent 类型
AssistantAgent:AI 助手
from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletionClient
model_client = OpenAIChatCompletionClient(
model="gpt-4o",
model_info={"vision": True, "function_calling": True, "json_output": True}
)
assistant = AssistantAgent(
name="coder",
model_client=model_client,
system_message="你是一个Python专家,写简洁高效的代码。先分析需求,再写代码,最后写测试。",
tools=[search_tool, code_executor_tool],
reflect_on_tool_use=True, # 工具调用后反思结果
model_client_stream=True # 流式输出
)
reflect_on_tool_use 是一个值得关注的参数——开启后,AssistantAgent 会在工具返回结果后生成一段反思性文字,提高后续决策质量,但会增加 token 消耗。
UserProxyAgent:人类代理
from autogen_agentchat.agents import UserProxyAgent
user_proxy = UserProxyAgent(
name="user",
description="一个需要帮助的用户",
input_func=input, # 使用终端输入,也可替换为自定义函数
)
# 自定义输入源(如Web界面)
async def web_input(prompt: str) -> str:
# 从WebSocket或HTTP获取用户输入
return await websocket.recv()
user_proxy = UserProxyAgent(
name="user",
input_func=web_input
)
UserProxyAgent 是 AutoGen 的独特设计——它代表人类参与 Agent 对话。在需要 Human-in-the-loop 的场景下,这比 LangGraph 的 interrupt() 更自然。
CodeExecutorAgent:代码执行沙箱
from autogen_agentchat.agents import CodeExecutorAgent
from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor
executor = LocalCommandLineCodeExecutor(
timeout=30,
work_dir="workspace",
cancellation_policy="at_end"
)
code_agent = CodeExecutorAgent(
name="executor",
code_executor=executor
)
AutoGen 的代码执行能力是它的杀手锏。Agent 不仅能写代码,还能执行代码、查看结果、修正错误。支持本地执行和 Docker 容器执行两种模式。
GroupChat:多 Agent 协作
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMentionTermination
researcher = AssistantAgent(
name="researcher",
model_client=model_client,
system_message="你是研究员,负责搜集信息。完成后说 'PASS TO ANALYST'"
)
analyst = AssistantAgent(
name="analyst",
model_client=model_client,
system_message="你是分析师,负责分析数据。完成后说 'PASS TO WRITER'"
)
writer = AssistantAgent(
name="writer",
model_client=model_client,
system_message="你是撰稿人,负责写报告。完成后说 'TERMINATE'"
)
termination = TextMentionTermination("TERMINATE")
team = RoundRobinGroupChat(
[researcher, analyst, writer],
termination_condition=termination
)
result = await team.run(task="分析2024年AI Agent市场的投资趋势")
GroupChat 的选择策略
| 策略 | 说明 | 适用场景 |
|---|---|---|
round_robin | 按顺序轮流发言 | 固定流程 |
selector | LLM 选择下一个发言者 | 动态流程,灵活但成本高 |
random | 随机选择 | 头脑风暴 |
manual | 手动指定 | 完全控制 |
from autogen_agentchat.teams import SelectorGroupChat
team = SelectorGroupChat(
[researcher, analyst, writer, reviewer],
model_client=model_client, # 用于选择发言者的LLM
termination_condition=termination,
selector_prompt="根据当前对话,选择最适合的下一个发言者: {roles}",
allow_repeated_speaker=False, # 不允许连续发言
max_turns=20
)
AutoGen Studio:可视化编排
AutoGen Studio 提供了 Web UI 来构建和调试多 Agent 系统:
# 启动 Studio
autogenstudio ui --port 8081
Studio 的核心功能:
- 拖拽式 Agent 配置:在 UI 中添加 Agent、设置 system message、绑定工具
- 团队编排:选择 GroupChat 策略、设置终止条件
- 实时对话观察:查看 Agent 间的对话流、每轮的 token 消耗
- 会话管理:保存和加载会话配置,支持版本管理
- 代码导出:将 UI 配置导出为 Python 代码
Studio 适合快速原型验证,但生产部署还是建议用代码方式。
与 LangGraph、CrewAI 对比
| 维度 | AutoGen | LangGraph | CrewAI |
|---|---|---|---|
| 范式 | 对话式编程 | 图状态机 | 角色扮演 |
| 代码执行 | 原生支持,沙箱隔离 | 需自己实现 | 需自己实现 |
| Human-in-loop | UserProxyAgent,自然 | interrupt(),精确 | 基础支持 |
| 多 Agent 编排 | GroupChat | 图节点 | Crew 流程 |
| 可视化 | Studio UI | 图可视化 | 无 |
| 异步支持 | v0.4 原生异步 | 支持 | 有限 |
| 适合场景 | 代码生成、对话任务 | 复杂工作流 | 内容生产 |
生产可用性评估
代码执行的安全考量
# 生产环境使用 Docker 执行
from autogen_ext.code_executors.docker import DockerCommandLineCodeExecutor
docker_executor = DockerCommandLineCodeExecutor(
image="python:3.12-slim",
container_name="agent-sandbox",
timeout=60,
work_dir="/workspace",
auto_remove=True # 执行后自动清理
)
务必使用 Docker 隔离。本地执行 = Agent 可以访问你的文件系统和网络,这在生产环境是不可接受的风险。
异步架构的注意点
v0.4 全面异步化,但需要注意:
# AutoGen v0.4 的 API 都是 async
import asyncio
async def main():
result = await team.run(task="...")
print(result.messages[-1].content)
asyncio.run(main())
如果你的应用是同步架构,需要用 asyncio.run() 包装。在已有异步框架(如 FastAPI)中可以直接 await。
终止条件设计
from autogen_agentchat.conditions import (
TextMentionTermination,
MaxMessageTermination,
TimeoutTermination,
SourceMatchTermination
)
# 组合终止条件
termination = (
TextMentionTermination("TERMINATE") | # 文本标记
MaxMessageTermination(30) | # 最大消息数
TimeoutTermination(300) | # 超时5分钟
SourceMatchTermination("user") # 用户发言后终止
)
一定要设置多重终止条件。没有终止条件的 GroupChat 可能无限循环,烧光 token。
实战建议
- 用 Studio 验证,用代码部署:Studio 适合开发阶段,生产用代码更可控
- GroupChat 限制在 3-5 个 Agent:太多 Agent 会导致对话发散
- 设置
max_turns:防止对话失控 - 用 selector 策略替代 round_robin:当流程不是严格线性时
- 代码执行务必隔离:Docker 是底线
结论
AutoGen 是代码生成和对话式任务的首选框架。微软背书、v0.4 架构升级、Studio UI 降低使用门槛,使其在企业场景有一定优势。但相比 LangGraph 的精确控制流和 CrewAI 的快速原型能力,AutoGen 在通用工作流编排上不是最优解。
一句话:AutoGen 适合需要代码执行和对话协作的场景,GroupChat + UserProxyAgent 是它的差异化优势。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
