框架调研 · 13
AutoGen:微软的多 Agent 对话框架
AutoGen 是微软研究院开源的多 Agent 框架,核心理念是:让 Agent 之间通过自然语言对话来协作完成任务。它的代码执行能力和 Human-in-the-loop 支持是显著特色。
GitHub:microsoft/autogen
AutoGen 从 v0.2 到 v0.4 有重大架构变化。本文以 AutoGen v0.4+(新版 AgentChat API)为准。
安装
pip install "autogen-agentchat" "autogen-ext[openai]"
核心概念
| 概念 | 说明 |
|---|---|
AssistantAgent |
调用 LLM 生成回复的 Agent |
UserProxyAgent |
代理用户,可执行代码、获取人类输入 |
RoundRobinGroupChat |
多 Agent 轮流发言的群聊 |
SelectorGroupChat |
由 LLM 决定下一个发言的 Agent |
Team |
一组协作的 Agent |
最小示例:两 Agent 对话
import asyncio
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
async def main():
model_client = OpenAIChatCompletionClient(model="gpt-4o-mini")
# 助手 Agent
assistant = AssistantAgent(
name="Assistant",
model_client=model_client,
system_message="你是一个有帮助的助手,用中文回答。",
)
# 批评者 Agent
critic = AssistantAgent(
name="Critic",
model_client=model_client,
system_message="你是一个批评者,检查助手的回答是否准确和完整,指出改进点。",
)
# 组成团队,轮流发言
team = RoundRobinGroupChat(
participants=[assistant, critic],
termination_condition=MaxMessageTermination(max_messages=4),
)
# 运行
result = await team.run(task="解释什么是 RAG(检索增强生成)")
for message in result.messages:
print(f"\n[{message.source}]")
print(message.content)
asyncio.run(main())
带代码执行的 Agent
AutoGen 的代码执行是原生能力:
import asyncio
from autogen_agentchat.agents import AssistantAgent, CodeExecutorAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMentionTermination
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor
async def main():
model_client = OpenAIChatCompletionClient(model="gpt-4o")
# 代码编写者
coder = AssistantAgent(
name="Coder",
model_client=model_client,
system_message="""你是一个 Python 程序员。
编写代码时用 ```python 代码块包裹,只写代码,不加解释。
代码解决问题后回复 TERMINATE。""",
)
# 代码执行者(在本地沙箱执行)
executor = CodeExecutorAgent(
name="Executor",
code_executor=LocalCommandLineCodeExecutor(work_dir="./tmp"),
)
team = RoundRobinGroupChat(
participants=[coder, executor],
termination_condition=TextMentionTermination("TERMINATE"),
)
result = await team.run(
task="计算前 20 个斐波那契数,并用 matplotlib 画出折线图,保存为 fib.png"
)
for msg in result.messages:
print(f"\n[{msg.source}]: {msg.content[:200]}")
asyncio.run(main())
工具调用
from autogen_agentchat.agents import AssistantAgent
from autogen_core.tools import FunctionTool
from autogen_ext.models.openai import OpenAIChatCompletionClient
def get_weather(city: str) -> str:
"""获取城市天气"""
data = {"北京": "晴天 25°C", "上海": "多云 22°C"}
return data.get(city, "暂无数据")
def search_web(query: str) -> str:
"""搜索网络"""
return f"关于 '{query}' 的搜索结果(模拟)"
# 包装成 FunctionTool
tools = [
FunctionTool(get_weather, description="获取城市天气"),
FunctionTool(search_web, description="搜索网络信息"),
]
agent = AssistantAgent(
name="ToolAgent",
model_client=OpenAIChatCompletionClient(model="gpt-4o-mini"),
tools=tools,
system_message="你可以查天气和搜索信息来回答用户问题。",
)
import asyncio
async def main():
result = await agent.run(task="北京天气怎样?同时搜索一下 AutoGen 是什么")
print(result.messages[-1].content)
asyncio.run(main())
SelectorGroupChat:LLM 决定发言顺序
from autogen_agentchat.teams import SelectorGroupChat
from autogen_agentchat.conditions import MaxMessageTermination
# 多个专家 Agent
planner = AssistantAgent(
name="Planner",
model_client=model_client,
system_message="你是规划专家,负责把任务拆分成子任务。",
)
researcher = AssistantAgent(
name="Researcher",
model_client=model_client,
system_message="你是研究专家,负责收集信息。",
)
writer = AssistantAgent(
name="Writer",
model_client=model_client,
system_message="你是写作专家,负责整合信息生成报告。",
)
# SelectorGroupChat 让 LLM 决定下一步该谁说话
team = SelectorGroupChat(
participants=[planner, researcher, writer],
model_client=model_client, # 用这个模型决定发言顺序
termination_condition=MaxMessageTermination(max_messages=10),
)
async def main():
result = await team.run(task="写一份关于 LangGraph 的技术分析报告")
print(result.messages[-1].content)
asyncio.run(main())
Human-in-the-loop
from autogen_agentchat.agents import UserProxyAgent
# UserProxyAgent 在关键步骤请求人类确认
human = UserProxyAgent(
name="Human",
input_func=input, # 从终端读取输入
)
assistant = AssistantAgent(
name="Assistant",
model_client=model_client,
system_message="你是助手,需要人类审批后才能执行操作。",
)
team = RoundRobinGroupChat(
participants=[assistant, human],
termination_condition=TextMentionTermination("APPROVED"),
)
# Agent 会生成方案,等待人类输入 "APPROVED" 确认
流式输出
async def stream_example():
async for message in team.run_stream(task="写一首诗"):
if hasattr(message, "content"):
print(f"[{message.source}]: ", end="")
print(message.content)
AutoGen v0.2 vs v0.4
很多网上教程还是旧版 v0.2,两者 API 差异大:
| v0.2(旧) | v0.4(新) | |
|---|---|---|
| 包名 | autogen |
autogen-agentchat |
| 初始化 | AssistantAgent(llm_config=...) |
AssistantAgent(model_client=...) |
| 运行 | agent.initiate_chat(...) |
team.run(task=...) |
| 异步 | 部分支持 | 完全异步 |
建议直接用 v0.4,不要被旧教程误导。
优缺点
优点:
- 代码执行是原生能力,代码 Agent 场景强
- Human-in-the-loop 支持完善
- 多 Agent 对话模式自然,适合需要”讨论”的任务
- 微软官方维护,Semantic Kernel 可集成
缺点:
- 多 Agent 对话难以预测,调试困难
- v0.2 到 v0.4 迁移成本高,历史教程混乱
- 不适合需要精确控制执行流程的场景
- 代码执行有安全风险(需要沙箱)
适合什么场景
- 代码生成和自动执行(Coder + Executor 模式)
- 需要多专家”讨论”得出结论的分析任务
- 有 Human-in-the-loop 审批需求的工作流
- 教育和研究:探索多 Agent 协作行为