系列 :高级Agent框架(1/6)
难度 :⭐⭐⭐⭐ 中高级
预计阅读时间:18分钟
问题场景
开发Multi-Agent系统时,你是否遇到这些问题?
- LangChain的Agent协作不够灵活
- 需要手动管理对话历史
- 代码执行安全性难以保证
- 缺乏可视化的调试工具
痛点:如何快速构建强大的Multi-Agent系统?
解决方案:使用微软开源的AutoGen框架。
AutoGen简介
什么是AutoGen?
AutoGen是微软研究院开源的Multi-Agent对话框架,旨在简化复杂LLM应用的开发。
核心特点:
- 🤖 多Agent协作:支持多个Agent自主对话
- 💻 代码执行:内置安全的代码执行环境
- 🔧 工具集成:轻松集成外部工具和API
- 🎭 角色定制:灵活的Agent角色定义
- 📊 可观测性:完整的对话日志和监控
GitHub :https://github.com/microsoft/autogen
Star数 :25,000+(持续增长)
最新版本:0.2.x(2026年5月)
为什么选择AutoGen?
| 维度 | AutoGen | LangChain | CrewAI |
|---|---|---|---|
| Multi-Agent原生支持 | ✅ 优秀 | ⚠️ 需额外配置 | ✅ 良好 |
| 代码执行能力 | ✅ 内置 | ❌ 需自定义 | ⚠️ 基础 |
| 对话管理 | ✅ 自动 | ⚠️ 手动 | ✅ 自动 |
| 学习曲线 | ⭐⭐⭐ | ⭐⭐ | ⭐⭐ |
| 灵活性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 社区活跃度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
适用场景:
- ✅ 需要代码生成和执行的任务
- ✅ 复杂的多轮对话协作
- ✅ 需要高度自定义的Agent行为
- ✅ 研究和实验性质的项目
核心概念
1. ConversableAgent(可对话Agent)
AutoGen的核心抽象,所有Agent都继承自ConversableAgent。
from autogen import ConversableAgent
# 创建Assistant Agent
assistant = ConversableAgent(
name="Assistant",
llm_config={
"config_list": [
{
"model": "gpt-4",
"api_key": "your-api-key"
}
]
},
system_message="你是一个专业的Python程序员。",
human_input_mode="NEVER" # 不需要人工输入
)
# 创建User Proxy Agent(用户代理)
user_proxy = ConversableAgent(
name="User_Proxy",
llm_config=False, # 不使用LLM
human_input_mode="TERMINATE", # 允许人工干预
code_execution_config={
"work_dir": "coding",
"use_docker": False # 生产环境建议启用Docker
}
)
关键参数:
llm_config:LLM配置(设为False表示不使用LLM)system_message:系统提示词,定义Agent角色human_input_mode:人工输入模式"ALWAYS":每次都询问人工"TERMINATE":仅在终止时询问"NEVER":完全自动化
2. AssistantAgent vs UserProxyAgent
AutoGen提供了两个预定义的Agent类型:
from autogen import AssistantAgent, UserProxyAgent
# AssistantAgent:负责思考和生成
assistant = AssistantAgent(
name="Assistant",
llm_config={"config_list": [{"model": "gpt-4", "api_key": "..."}]},
system_message="你是一个数据分析师。"
)
# UserProxyAgent:负责执行和反馈
user_proxy = UserProxyAgent(
name="User_Proxy",
human_input_mode="TERMINATE",
code_execution_config={"work_dir": "coding", "use_docker": False},
max_consecutive_auto_reply=10 # 最大自动回复次数
)
职责分工:
- AssistantAgent:接收任务,生成解决方案(代码、文本等)
- UserProxyAgent:执行代码,返回结果,必要时请求人工输入
3. GroupChat(群聊)
多个Agent参与的对话场景。
from autogen import GroupChat, GroupChatManager
# 创建多个Agent
coder = AssistantAgent(name="Coder", llm_config=llm_config)
reviewer = AssistantAgent(name="Reviewer", llm_config=llm_config)
tester = AssistantAgent(name="Tester", llm_config=llm_config)
# 创建群聊
groupchat = GroupChat(
agents=[coder, reviewer, tester],
messages=[],
max_round=10 # 最大对话轮数
)
# 创建群聊管理器
manager = GroupChatManager(
groupchat=groupchat,
llm_config=llm_config
)
# 启动对话
user_proxy.initiate_chat(
manager,
message="请开发一个排序算法并进行测试。"
)
工作流程:
User_Proxy → Coder(生成代码)
↓
Coder → Reviewer(审查代码)
↓
Reviewer → Tester(测试代码)
↓
Tester → User_Proxy(返回结果)
快速入门示例
示例1:代码生成与执行
任务:计算斐波那契数列前20项
import autogen
# 配置LLM
llm_config = {
"config_list": [
{
"model": "qwen-plus",
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"api_key": "your-api-key"
}
],
"temperature": 0.7
}
# 创建Agent
assistant = autogen.AssistantAgent(
name="Assistant",
llm_config=llm_config,
system_message="你是一个Python专家。编写完整可运行的代码。"
)
user_proxy = autogen.UserProxyAgent(
name="User_Proxy",
human_input_mode="NEVER",
code_execution_config={
"work_dir": "coding",
"use_docker": False,
"timeout": 60
}
)
# 发起对话
response = user_proxy.initiate_chat(
assistant,
message="请生成Python代码计算斐波那契数列前20项,并执行它。"
)
# 查看对话历史
for msg in user_proxy.chat_messages[assistant]:
print(f"{msg['role']}: {msg['content'][:100]}...")
输出示例:
User_Proxy: 请生成Python代码计算斐波那契数列前20项,并执行它。
Assistant: 好的,我来编写代码:
```python
def fibonacci(n):
fib = [0, 1]
for i in range(2, n):
fib.append(fib[i-1] + fib[i-2])
return fib
result = fibonacci(20)
print(result)
User_Proxy: 执行结果: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
### 示例2:多轮对话协作
**任务**:数据分析全流程(获取数据→分析→可视化)
```python
import autogen
# 创建三个专业Agent
data_engineer = autogen.AssistantAgent(
name="Data_Engineer",
llm_config=llm_config,
system_message="你是数据工程师,负责数据获取和清洗。"
)
data_analyst = autogen.AssistantAgent(
name="Data_Analyst",
llm_config=llm_config,
system_message="你是数据分析师,负责统计分析和洞察提取。"
)
data_visualizer = autogen.AssistantAgent(
name="Data_Visualizer",
llm_config=llm_config,
system_message="你是数据可视化专家,负责生成图表。"
)
# 创建群聊
groupchat = autogen.GroupChat(
agents=[data_engineer, data_analyst, data_visualizer],
messages=[],
max_round=15
)
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config=llm_config
)
# 用户代理
user_proxy = autogen.UserProxyAgent(
name="User_Proxy",
human_input_mode="TERMINATE",
code_execution_config={"work_dir": "analysis", "use_docker": False}
)
# 发起任务
user_proxy.initiate_chat(
manager,
message="""
请完成以下数据分析任务:
1. 生成模拟的销售数据(1000条记录)
2. 分析销售趋势和关键指标
3. 生成可视化图表
数据字段:日期、产品类别、销售额、数量
"""
)
执行流程:
1. Data_Engineer:生成模拟数据并保存为CSV
2. Data_Analyst:读取数据,计算统计指标
3. Data_Visualizer:生成折线图和柱状图
4. User_Proxy:展示最终结果
示例3:工具调用
任务:查询天气信息
import autogen
import requests
# 定义工具函数
def get_weather(city: str) -> str:
"""查询城市天气"""
api_key = "your_weather_api_key"
url = f"http://api.weatherapi.com/v1/current.json?key={api_key}&q={city}"
response = requests.get(url)
data = response.json()
return f"{city}当前温度:{data['current']['temp_c']}°C,天气:{data['current']['condition']['text']}"
# 注册工具
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
}
}
]
# 创建支持工具调用的Agent
assistant = autogen.AssistantAgent(
name="Assistant",
llm_config={
"config_list": [{"model": "gpt-4", "api_key": "..."}],
"functions": tools # 注册工具
}
)
user_proxy = autogen.UserProxyAgent(
name="User_Proxy",
human_input_mode="NEVER",
function_map={"get_weather": get_weather} # 映射函数
)
# 发起查询
user_proxy.initiate_chat(
assistant,
message="北京今天的天气怎么样?"
)
执行过程:
1. Assistant识别到需要调用get_weather工具
2. 生成函数调用:get_weather(city="北京")
3. User_Proxy执行函数,获取真实天气数据
4. Assistant基于返回结果生成自然语言回答
高级特性
1. 自定义Agent
继承ConversableAgent创建自定义Agent。
import autogen
from autogen import ConversableAgent
class CodeReviewerAgent(ConversableAgent):
"""代码审查Agent"""
def __init__(self, name: str, llm_config: dict):
super().__init__(
name=name,
llm_config=llm_config,
system_message="""
你是一位资深代码审查专家。审查代码时关注:
1. 代码规范性
2. 性能优化
3. 安全漏洞
4. 可维护性
给出具体改进建议。
"""
)
def review_code(self, code: str) -> str:
"""审查代码"""
prompt = f"请审查以下代码:\n\n{code}"
response = self.generate_reply(messages=[{"role": "user", "content": prompt}])
return response
# 使用自定义Agent
reviewer = CodeReviewerAgent(
name="Code_Reviewer",
llm_config=llm_config
)
code_to_review = """
def calculate_sum(numbers):
total = 0
for i in numbers:
total += i
return total
"""
feedback = reviewer.review_code(code_to_review)
print(feedback)
2. 嵌套聊天(Nested Chat)
在一个对话中启动子对话。
import autogen
# 外层Agent
coordinator = autogen.AssistantAgent(
name="Coordinator",
llm_config=llm_config,
system_message="你负责任务分解和结果整合。"
)
# 内层Agent(专门处理数学计算)
math_expert = autogen.AssistantAgent(
name="Math_Expert",
llm_config=llm_config,
system_message="你是数学专家,只回答数学问题。"
)
user_proxy = autogen.UserProxyAgent(
name="User_Proxy",
human_input_mode="NEVER"
)
# 注册嵌套聊天
def solve_math_problem(recipient, messages, sender, config):
"""启动数学问题的子对话"""
problem = messages[-1]["content"]
# 启动子对话
result = user_proxy.initiate_chat(
math_expert,
message=f"请解决这个数学问题:{problem}",
summary_method="last_msg"
)
return True, result.summary
coordinator.register_nested_chats(
chat_queue=[
{
"recipient": math_expert,
"message": solve_math_problem,
"summary_method": "last_msg",
"max_turns": 3
}
],
trigger=lambda sender: sender == user_proxy
)
# 发起复杂任务
user_proxy.initiate_chat(
coordinator,
message="""
请帮我解决以下问题:
1. 计算 (123 * 456) / 789
2. 求解方程 x^2 - 5x + 6 = 0
"""
)
3. 持久化对话历史
保存和恢复对话状态。
import json
import autogen
# 创建Agent
assistant = autogen.AssistantAgent(name="Assistant", llm_config=llm_config)
user_proxy = autogen.UserProxyAgent(name="User_Proxy", human_input_mode="NEVER")
# 进行对话
user_proxy.initiate_chat(
assistant,
message="解释一下什么是递归。"
)
# 保存对话历史
def save_chat_history(agent1, agent2, filename="chat_history.json"):
"""保存对话历史"""
history = {
"agent1": agent1.name,
"agent2": agent2.name,
"messages": agent1.chat_messages[agent2]
}
with open(filename, 'w', encoding='utf-8') as f:
json.dump(history, f, ensure_ascii=False, indent=2)
print(f"对话历史已保存到 {filename}")
save_chat_history(assistant, user_proxy)
# 恢复对话历史
def load_chat_history(agent1, agent2, filename="chat_history.json"):
"""加载对话历史"""
with open(filename, 'r', encoding='utf-8') as f:
history = json.load(f)
# 恢复到Agent
agent1.chat_messages[agent2] = history["messages"]
print(f"已恢复 {len(history['messages'])} 条消息")
load_chat_history(assistant, user_proxy)
实战案例:自动化数据分析Pipeline
项目背景
构建一个自动化的数据分析系统,能够:
- 接收原始数据(CSV/Excel)
- 自动清洗和预处理
- 执行统计分析
- 生成可视化报告
- 输出总结洞察
系统架构
┌─────────────┐
│ User_Proxy │ ← 用户输入任务
└──────┬──────┘
│
▼
┌─────────────┐ ┌──────────────┐
│ Coordinator │←──→│ Data_Loader │ ← 加载数据
└──────┬──────┘ └──────────────┘
│
▼
┌──────────────┐
│ Data_Cleaner │ ← 数据清洗
└──────┬───────┘
│
▼
┌──────────────┐
│ Data_Analyst │ ← 统计分析
└──────┬───────┘
│
▼
┌─────────────────┐
│ Visualizer │ ← 生成图表
└──────┬──────────┘
│
▼
┌──────────────┐
│ Report_Writer│ ← 撰写报告
└──────┬───────┘
│
▼
┌─────────────┐
│ User_Proxy │ ← 返回结果
└─────────────┘
完整代码
import autogen
import pandas as pd
import matplotlib.pyplot as plt
import os
# 配置LLM
llm_config = {
"config_list": [
{
"model": "qwen-plus",
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"api_key": "your-api-key"
}
],
"temperature": 0.7
}
# 1. 数据加载Agent
data_loader = autogen.AssistantAgent(
name="Data_Loader",
llm_config=llm_config,
system_message="""
你是数据加载专家。负责:
1. 读取CSV/Excel文件
2. 显示数据结构(行数、列数、字段类型)
3. 检查缺失值
输出数据的基本信息。
"""
)
# 2. 数据清洗Agent
data_cleaner = autogen.AssistantAgent(
name="Data_Cleaner",
llm_config=llm_config,
system_message="""
你是数据清洗专家。负责:
1. 处理缺失值(填充或删除)
2. 去除重复数据
3. 数据类型转换
4. 异常值检测
生成清洗后的数据文件。
"""
)
# 3. 数据分析Agent
data_analyst = autogen.AssistantAgent(
name="Data_Analyst",
llm_config=llm_config,
system_message="""
你是数据分析专家。负责:
1. 描述性统计(均值、中位数、标准差)
2. 相关性分析
3. 趋势分析
4. 关键洞察提取
输出分析结果和建议。
"""
)
# 4. 可视化Agent
visualizer = autogen.AssistantAgent(
name="Visualizer",
llm_config=llm_config,
system_message="""
你是数据可视化专家。负责:
1. 选择合适的图表类型
2. 生成高质量的图表
3. 添加标题、标签、图例
4. 保存为PNG文件
生成至少3个不同的图表。
"""
)
# 5. 报告撰写Agent
report_writer = autogen.AssistantAgent(
name="Report_Writer",
llm_config=llm_config,
system_message="""
你是报告撰写专家。负责:
1. 整合所有分析结果
2. 撰写结构化报告
3. 突出关键发现
4. 给出 actionable 建议
报告格式:Markdown
"""
)
# 创建群聊
agents = [data_loader, data_cleaner, data_analyst, visualizer, report_writer]
groupchat = autogen.GroupChat(
agents=agents,
messages=[],
max_round=20,
speaker_selection_method="round_robin" # 轮流发言
)
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config=llm_config
)
# 用户代理
user_proxy = autogen.UserProxyAgent(
name="User_Proxy",
human_input_mode="TERMINATE",
code_execution_config={
"work_dir": "data_analysis",
"use_docker": False
}
)
# 准备示例数据
os.makedirs("data_analysis", exist_ok=True)
# 生成模拟销售数据
import random
from datetime import datetime, timedelta
def generate_sample_data():
"""生成模拟销售数据"""
dates = [datetime(2024, 1, 1) + timedelta(days=i) for i in range(100)]
categories = ['电子产品', '服装', '食品', '图书']
data = []
for date in dates:
for _ in range(10): # 每天10条记录
data.append({
'date': date.strftime('%Y-%m-%d'),
'category': random.choice(categories),
'sales_amount': round(random.uniform(50, 500), 2),
'quantity': random.randint(1, 20)
})
df = pd.DataFrame(data)
df.to_csv('data_analysis/sales_data.csv', index=False)
print(f"已生成 {len(df)} 条销售数据")
generate_sample_data()
# 启动分析流程
task_description = """
请对 data_analysis/sales_data.csv 进行完整的数据分析:
步骤:
1. Data_Loader:加载数据并显示基本信息
2. Data_Cleaner:清洗数据,处理异常值
3. Data_Analyst:执行统计分析,提取洞察
4. Visualizer:生成可视化图表(折线图、柱状图、饼图)
5. Report_Writer:撰写分析报告
最后将报告保存为 Markdown 文件。
"""
# 执行
response = user_proxy.initiate_chat(
manager,
message=task_description
)
# 查看最终报告
print("\n=== 分析报告 ===")
for msg in reversed(user_proxy.chat_messages[manager]):
if msg['role'] == 'assistant' and '报告' in msg['content']:
print(msg['content'])
break
运行结果
生成的文件:
data_analysis/
├── sales_data.csv # 原始数据
├── cleaned_data.csv # 清洗后数据
├── sales_trend.png # 销售趋势图
├── category_distribution.png # 类别分布图
├── daily_sales.png # 每日销售图
└── analysis_report.md # 分析报告
报告示例:
# 销售数据分析报告
## 数据概览
- 总记录数:1000条
- 时间范围:2024-01-01 至 2024-04-10
- 产品类别:4个(电子产品、服装、食品、图书)
## 关键发现
### 1. 销售趋势
- 整体呈上升趋势
- 3月份销售额最高(¥15,234)
- 周末销售额比工作日高23%
### 2. 类别分析
- 电子产品贡献最大(42%)
- 食品复购率最高
- 图书销售额稳定增长
### 3. 建议
1. 增加电子产品库存
2. 周末开展促销活动
3. 拓展食品品类
## 可视化图表


优缺点分析
优势
✅ Multi-Agent原生支持
- 无需额外配置即可实现多Agent协作
- 群聊机制简单易用
✅ 代码执行能力强
- 内置安全的代码执行环境
- 支持Docker隔离(生产环境推荐)
✅ 灵活性高
- 可自定义Agent行为
- 支持嵌套聊天、工具调用等高级特性
✅ 微软背书
- 持续更新和维护
- 活跃的社区支持
劣势
❌ 学习曲线较陡
- 概念较多(ConversableAgent、GroupChat等)
- 需要理解异步对话机制
❌ 资源消耗大
- 多Agent对话产生大量LLM调用
- 成本较高
❌ 调试复杂
- 多轮对话难以追踪
- 错误定位困难
❌ 文档不完善
- 部分高级功能文档缺失
- 示例代码较少
适用场景
推荐使用
✅ 代码生成与执行
- 自动化编程任务
- 数据处理Pipeline
- 测试用例生成
✅ 复杂决策流程
- 多专家协作决策
- 分步骤问题解决
- 需要反复迭代的任务
✅ 研究与实验
- 探索Multi-Agent交互模式
- 测试新的Agent架构
- 学术论文原型系统
不推荐使用
❌ 简单问答场景
- 单轮对话即可解决
- 使用LangChain更简单
❌ 成本敏感项目
- LLM调用次数多
- 预算有限
❌ 生产环境关键系统
- 稳定性要求极高
- 需要成熟的监控和告警
最佳实践
1. 合理设置max_round
# ❌ 避免无限循环
groupchat = GroupChat(agents=agents, messages=[], max_round=100)
# ✅ 设置合理的上限
groupchat = GroupChat(agents=agents, messages=[], max_round=10)
2. 启用Docker沙箱
# ❌ 不安全
user_proxy = UserProxyAgent(
code_execution_config={"use_docker": False}
)
# ✅ 安全
user_proxy = UserProxyAgent(
code_execution_config={
"use_docker": True,
"image": "python:3.10-slim"
}
)
3. 限制Token使用
llm_config = {
"config_list": [...],
"max_tokens": 1000, # 限制单次响应长度
"temperature": 0.7
}
4. 保存对话历史
# 定期保存,便于调试和恢复
import json
def save_progress(agent1, agent2, step_name):
history = agent1.chat_messages[agent2]
with open(f"history_{step_name}.json", 'w') as f:
json.dump(history, f)
总结
AutoGen核心价值
🎯 简化Multi-Agent开发
- 开箱即用的多Agent协作
- 内置代码执行和安全机制
🚀 快速原型验证
- 几行代码即可启动复杂对话
- 适合研究和实验
💡 高度可扩展
- 自定义Agent行为
- 灵活的工具集成
下一步学习
- 实践:用AutoGen重构现有的单Agent应用
- 深入:阅读源码,理解核心机制
- 对比:尝试CrewAI和LangGraph,找到最适合的框架
相关资源:
- AutoGen官方文档:https://microsoft.github.io/autogen/
- GitHub仓库:https://github.com/microsoft/autogen
💡 觉得有用?点赞+收藏+关注,不错过下一篇文章!
下一篇预告:《CrewAI实战:构建高效的Agent团队》