🧠 图解记忆: AutoGen 用对话协商换灵活性,必须用发言选择、终止条件和预算防止失控。
💡 答案要点
AutoGen = 微软开源的对话式多Agent框架
AutoGen核心理念
通过Agent间对话完成复杂任务,而非预定义工作流
传统工作流:
Agent A → Agent B → Agent C (固定顺序)
AutoGen对话式:
Agent A ←→ Agent B
↓ ↓
Agent C ←→ Agent D
(动态协商,类似人类团队讨论)AutoGen核心组件
| 组件 | 类型 | 作用 |
|---|---|---|
| UserProxyAgent | 代理用户 | 执行代码/收集反馈/与用户交互 |
| AssistantAgent | AI助手 | 推理/生成方案/调用工具 |
| GroupChat | 多Agent管理 | 管理多Agent对话流程 |
| GroupChatManager | 调度器 | 决定下一个发言的Agent |
AutoGen实战: 数据分析任务
场景: 分析销售数据并生成报告
展开 Python 代码示例(83 行)
python
import autogen
# 1. 配置LLM
llm_config = {
"model": "qwen3.5-plus",
"api_key": "sk-xxx",
"temperature": 0.7
}
# 2. 创建UserProxyAgent (执行代码)
user_proxy = autogen.UserProxyAgent(
name="UserProxy",
human_input_mode="NEVER", # 自动执行,不需人工干预
code_execution_config={
"work_dir": "coding",
"use_docker": False # 本地执行Python代码
}
)
# 3. 创建AssistantAgent (数据分析师)
data_analyst = autogen.AssistantAgent(
name="DataAnalyst",
llm_config=llm_config,
system_message="""
你是数据分析专家。
任务: 分析销售数据,发现趋势,生成Python代码。
要求: 使用pandas和matplotlib。
"""
)
# 4. 创建AssistantAgent (报告撰写者)
report_writer = autogen.AssistantAgent(
name="ReportWriter",
llm_config=llm_config,
system_message="""
你是商业报告撰写专家。
任务: 将数据分析结果写成专业报告。
要求: 包含关键发现、洞察和建议。
"""
)
# 5. 创建GroupChat
groupchat = autogen.GroupChat(
agents=[user_proxy, data_analyst, report_writer],
messages=[],
max_round=10 # 最多10轮对话
)
# 6. 创建Manager
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config=llm_config
)
# 7. 启动任务
user_proxy.initiate_chat(
manager,
message="""
分析 sales_data.csv,生成月度销售报告。
要求:
1. 计算环比增长率
2. 找出销售额最高的5个产品
3. 生成趋势图
4. 撰写200字分析报告
"""
)
# 8. 对话流程(自动进行)
"""
UserProxy: "分析sales_data.csv..." (发起任务)
↓
DataAnalyst: "我将用pandas读取数据..." (制定计划)
↓
UserProxy: 执行代码: pd.read_csv("sales_data.csv")
↓
DataAnalyst: "数据已读取,发现XX趋势,生成可视化代码..."
↓
UserProxy: 执行代码: plt.plot(...); plt.savefig("trend.png")
↓
ReportWriter: "根据分析结果,我撰写报告如下:..."
↓
UserProxy: "任务完成,报告已生成"
"""AutoGen高级特性
特性1: 人类在环(Human-in-the-Loop)
python
# 关键决策需人工确认
user_proxy = autogen.UserProxyAgent(
name="UserProxy",
human_input_mode="ALWAYS", # 每步都需确认
# 或: "TERMINATE" - 只在终止前确认
)
# 对话流程:
"""
DataAnalyst: "我将删除销售额<100的数据"
UserProxy: [等待人工确认] → 输入 "y" 确认
DataAnalyst: "已删除,继续分析..."
"""特性2: 自定义发言顺序
python
def custom_speaker_selection(last_speaker, groupchat):
"""自定义下一个发言者"""
# 规则1: DataAnalyst说完,让UserProxy执行代码
if last_speaker.name == "DataAnalyst":
return groupchat.agent_by_name("UserProxy")
# 规则2: UserProxy执行完,检查是否需要报告
if last_speaker.name == "UserProxy":
if "数据分析完成" in groupchat.messages[-1]["content"]:
return groupchat.agent_by_name("ReportWriter")
else:
return groupchat.agent_by_name("DataAnalyst")
# 规则3: ReportWriter写完,终止
if last_speaker.name == "ReportWriter":
return None # 终止对话
return None
# 应用自定义策略
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config=llm_config,
speaker_selection_method=custom_speaker_selection
)特性3: 工具调用集成
python
# 定义工具函数
def query_database(sql: str) -> str:
"""查询数据库"""
conn = sqlite3.connect("sales.db")
df = pd.read_sql(sql, conn)
return df.to_string()
def send_email(to: str, subject: str, body: str) -> str:
"""发送邮件"""
# 实际发送逻辑...
return f"邮件已发送给{to}"
# 注册工具到AssistantAgent
data_analyst.register_function(
function_map={
"query_database": query_database,
"send_email": send_email
}
)
# Agent会自动选择工具
"""
DataAnalyst: "我需要查询数据库"
→ 自动调用 query_database("SELECT * FROM sales")
→ 获取结果后继续分析
"""AutoGen vs CrewAI vs MetaGPT
| 框架 | 核心理念 | 优势 | 适用场景 |
|---|---|---|---|
| AutoGen | 对话式协作 | 灵活,迭代细化 | 需要讨论的任务(代码debug/数据分析) |
| CrewAI | 角色驱动 | 结构清晰 | 类团队协作(研究→撰写→审核) |
| MetaGPT | 软件开发 | 专注代码生成 | 自动化软件开发 |
AutoGen实战案例: 自动化代码Review
展开 Python 代码示例(44 行)
python
# 场景: 自动审查Pull Request
# 1. CodeReviewer Agent
reviewer = autogen.AssistantAgent(
name="CodeReviewer",
system_message="""
你是高级代码审查专家。
任务: 审查代码质量、安全性、性能问题。
标准: PEP8规范、无SQL注入风险、时间复杂度合理。
"""
)
# 2. CodeRefactorer Agent
refactorer = autogen.AssistantAgent(
name="CodeRefactorer",
system_message="""
你是代码重构专家。
任务: 根据CodeReviewer的建议优化代码。
要求: 保持功能不变,提升可读性和性能。
"""
)
# 3. Tester Agent
tester = autogen.AssistantAgent(
name="Tester",
system_message="""
你是测试工程师。
任务: 为重构后的代码生成单元测试。
要求: 覆盖率>80%,包含边界情况。
"""
)
# 4. GroupChat
groupchat = autogen.GroupChat(
agents=[user_proxy, reviewer, refactorer, tester],
messages=[],
max_round=15
)
# 5. 启动Review
user_proxy.initiate_chat(
manager,
message="""
审查以下代码:
```python6. 对话流程
""" UserProxy: "审查以下代码..." (提交代码) ↓ CodeReviewer: "发现问题:
- SQL注入风险 - 直接拼接用户输入
- 缺少异常处理
- 变量名不规范" ↓ CodeRefactorer: "我将重构代码:
python
def process_user_input(user_data: str) -> List[Dict]:
try:
query = \"SELECT * FROM users WHERE name = ?\"
return db.execute(query, (user_data,))
except DatabaseError as e:
logger.error(f\"Query failed: {e}\")
raise
```"
↓
UserProxy: 执行代码(保存重构版本)
↓
Tester:
"我将生成测试:
```python
def test_process_user_input():
# 正常情况
assert process_user_input(\"John\") == [...]
# SQL注入测试
assert process_user_input(\"'; DROP TABLE users--\") 不会执行危险操作
# 异常处理
with pytest.raises(DatabaseError):
process_user_input(invalid_data)
```"
↓
UserProxy: "Review完成,代码已优化并附带测试"
"""AutoGen调试技巧
python
# 1. 打印对话历史
for msg in groupchat.messages:
print(f"{msg['name']}: {msg['content'][:100]}...")
# 2. 限制单Agent发言次数
autogen.ConversableAgent(
max_consecutive_auto_reply=3 # 最多连续说3次
)
# 3. 设置超时
user_proxy.initiate_chat(
manager,
message="...",
clear_history=True, # 清除历史
silent=False, # 打印对话
timeout=300 # 5分钟超时
)面试话术:
"AutoGen的核心是对话式协作,不同于固定工作流。我用AutoGen做过代码Review:3个Agent(Reviewer审查/Refactorer重构/Tester测试)通过对话迭代优化代码。关键是定义好每个Agent的system_message,让它们有明确分工。AutoGen优势是灵活,Agent可以讨论来回,类似真实团队;缺点是可控性不如固定工作流。实战中我用自定义speaker_selection控制发言顺序,避免无限循环。"
