AutoGen v0.4:从对话到事件驱动

AutoGen v0.4 是一次重大架构重写。v0.2 时代的设计核心是"Agent 之间通过对话协作",v0.4 在此基础上引入了事件驱动的 actor 模型

版本核心模型通信方式架构特点
v0.2对话轮转直接消息传递同步阻塞
v0.4Actor 模型事件总线 + 消息异步事件驱动

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按顺序轮流发言固定流程
selectorLLM 选择下一个发言者动态流程,灵活但成本高
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 的核心功能:

  1. 拖拽式 Agent 配置:在 UI 中添加 Agent、设置 system message、绑定工具
  2. 团队编排:选择 GroupChat 策略、设置终止条件
  3. 实时对话观察:查看 Agent 间的对话流、每轮的 token 消耗
  4. 会话管理:保存和加载会话配置,支持版本管理
  5. 代码导出:将 UI 配置导出为 Python 代码

Studio 适合快速原型验证,但生产部署还是建议用代码方式。

与 LangGraph、CrewAI 对比

维度AutoGenLangGraphCrewAI
范式对话式编程图状态机角色扮演
代码执行原生支持,沙箱隔离需自己实现需自己实现
Human-in-loopUserProxyAgent,自然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。

实战建议

  1. 用 Studio 验证,用代码部署:Studio 适合开发阶段,生产用代码更可控
  2. GroupChat 限制在 3-5 个 Agent:太多 Agent 会导致对话发散
  3. 设置 max_turns:防止对话失控
  4. 用 selector 策略替代 round_robin:当流程不是严格线性时
  5. 代码执行务必隔离:Docker 是底线

结论

AutoGen 是代码生成和对话式任务的首选框架。微软背书、v0.4 架构升级、Studio UI 降低使用门槛,使其在企业场景有一定优势。但相比 LangGraph 的精确控制流和 CrewAI 的快速原型能力,AutoGen 在通用工作流编排上不是最优解。

一句话:AutoGen 适合需要代码执行和对话协作的场景,GroupChat + UserProxyAgent 是它的差异化优势。

加入讨论

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

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