AutoGen框架详解:微软Multi-Agent开发利器

系列 :高级Agent框架(1/6)
难度 :⭐⭐⭐⭐ 中高级
预计阅读时间:18分钟


问题场景

开发Multi-Agent系统时,你是否遇到这些问题?

  • LangChain的Agent协作不够灵活
  • 需要手动管理对话历史
  • 代码执行安全性难以保证
  • 缺乏可视化的调试工具

痛点:如何快速构建强大的Multi-Agent系统?

解决方案:使用微软开源的AutoGen框架。


AutoGen简介

什么是AutoGen?

AutoGen是微软研究院开源的Multi-Agent对话框架,旨在简化复杂LLM应用的开发。

核心特点

  • 🤖 多Agent协作:支持多个Agent自主对话
  • 💻 代码执行:内置安全的代码执行环境
  • 🔧 工具集成:轻松集成外部工具和API
  • 🎭 角色定制:灵活的Agent角色定义
  • 📊 可观测性:完整的对话日志和监控

GitHubhttps://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

项目背景

构建一个自动化的数据分析系统,能够:

  1. 接收原始数据(CSV/Excel)
  2. 自动清洗和预处理
  3. 执行统计分析
  4. 生成可视化报告
  5. 输出总结洞察

系统架构

复制代码
┌─────────────┐
│ 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. 拓展食品品类

## 可视化图表
![销售趋势](sales_trend.png)
![类别分布](category_distribution.png)

优缺点分析

优势

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行为
  • 灵活的工具集成

下一步学习

  1. 实践:用AutoGen重构现有的单Agent应用
  2. 深入:阅读源码,理解核心机制
  3. 对比:尝试CrewAI和LangGraph,找到最适合的框架

相关资源


💡 觉得有用?点赞+收藏+关注,不错过下一篇文章!

下一篇预告:《CrewAI实战:构建高效的Agent团队》

相关推荐
阳明山水5 小时前
LightGBM调优降MAPE至19%关键策略
人工智能·机器学习·微信·微信公众平台·微信开放平台
云朵观自在5 小时前
企业媒体宣发为何选择JHMS?——一家策略导向的媒体传讯服务商
大数据·人工智能·经验分享·媒体·jhms
Lee川5 小时前
MCP(Model Context Protocol)深度解析:从面试概念到代码实现
人工智能·面试
Maddie_Mo7 小时前
Unity 联动 Trae AI 项目开发基础教学
人工智能·unity·游戏引擎
光锥智能7 小时前
Google 与百度同步布局智能体:AI 竞争进入全栈能力比拼阶段
人工智能·百度
一点一木12 小时前
深度体验TRAE SOLO移动端7天:作为独立开发者,我把工作流揣进了兜里
前端·人工智能·trae
Lee川13 小时前
mini-cursor 揭秘:从 Tool 定义到 Agent 循环的完整实现
前端·人工智能·后端
weelinking14 小时前
【产品】00_产品经理用Claude实现产品系列介绍
数据库·人工智能·sql·数据挖掘·github·产品经理
Agent产品评测局14 小时前
制造业模具管理AI系统,主流产品能力对比详解:2026年智能制造选型深度洞察
人工智能·ai·chatgpt·制造