AutoGen 完整教程:微软多智能体对话框架

AutoGen 完整教程:微软多智能体对话框架

AutoGen 是微软开源的多智能体对话框架,它让创建能够相互协作和对话的 AI 智能体变得简单。本文将全面介绍 AutoGen 的使用方法。

一、AutoGen 简介

AutoGen 由微软研究院开发,是一个强大的多智能体对话框架。它的核心特点:

  • 多智能体对话:智能体之间可以相互交流、协商、协作
  • 灵活的对话模式:支持一对一、一对多、多对多对话
  • 代码执行能力:智能体可以编写和执行代码
  • 人类参与:支持在对话中插入人工干预
  • 工具调用:可以集成各种工具和 API

二、安装与配置

2.1 安装 AutoGen

# 创建虚拟环境
python -m venv autogen_env
source autogen_env/bin/activate

# 安装 AutoGen
pip install pyautogen

# 如果需要使用 OpenAI
pip install openai

# 验证安装
python -c "import autogen; print(autogen.__version__)"

2.2 配置 API Key

创建配置文件 OAI_CONFIG_LIST

[
  {
    "model": "gpt-4",
    "api_key": "your-openai-api-key"
  },
  {
    "model": "gpt-3.5-turbo",
    "api_key": "your-openai-api-key"
  }
]

或者在代码中设置:

import autogen

config_list = [
    {
        "model": "gpt-4",
        "api_key": "your-api-key"
    }
]

三、快速开始:创建第一个对话

3.1 创建助手和用户代理

import autogen

# 定义配置
config_list = autogen.config_list_from_json(
    "OAI_CONFIG_LIST",
    filter_dict={
        "model": ["gpt-4", "gpt-3.5-turbo"]
    }
)

# 创建助手代理
assistant = autogen.AssistantAgent(
    name="assistant",
    llm_config={
        "config_list": config_list,
        "temperature": 0
    }
)

# 创建用户代理
user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    human_input_mode="NEVER",  # 不需要人工输入
    max_consecutive_auto_reply=10,
    code_execution_config={
        "work_dir": "coding",
        "use_docker": False
    }
)

# 开始对话
user_proxy.initiate_chat(
    assistant,
    message="帮我写一个 Python 函数计算斐波那契数列"
)

3.2 多智能体协作

import autogen

# 创建多个智能体
researcher = autogen.AssistantAgent(
    name="researcher",
    system_message="你是一名研究员,擅长收集和分析信息。",
    llm_config={"config_list": config_list}
)

coder = autogen.AssistantAgent(
    name="coder",
    system_message="你是一名程序员,擅长编写和调试代码。",
    llm_config={"config_list": config_list}
)

user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=10,
    code_execution_config={"use_docker": False}
)

# 创建群组对话
groupchat = autogen.GroupChat(
    agents=[user_proxy, researcher, coder],
    messages=[],
    max_round=20
)

manager = autogen.GroupChatManager(
    groupchat=groupchat,
    llm_config={"config_list": config_list}
)

# 开始对话
user_proxy.initiate_chat(
    manager,
    message="研究并实现一个快速排序算法"
)

四、核心概念详解

4.1 代理类型

AutoGen 提供多种类型的代理:

# 1. AssistantAgent - 助手代理
assistant = autogen.AssistantAgent(
    name="assistant",
    system_message="你的角色和技能...",
    llm_config={"config_list": config_list}
)

# 2. UserProxyAgent - 用户代理
user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    human_input_mode="ALWAYS",  # ALWAYS / NEVER / TERMINATE
    max_consecutive_auto_reply=10,
    code_execution_config={
        "work_dir": "coding",
        "use_docker": False  # 或 True
    }
)

# 3. ConversableAgent - 可对话代理
agent = autogen.ConversableAgent(
    name="agent",
    system_message="系统消息",
    llm_config={"config_list": config_list},
    human_input_mode="TERMINATE"
)

# 4. RetrievalAugmentedAgent - 检索增强代理
from autogen.agentchat.contrib.retrieve_assistant_agent import (
    RetrieveAssistantAgent
)
rag_agent = RetrieveAssistantAgent(
    name="rag_agent",
    system_message="你有检索能力",
    client_configs=[],
    docs_path="./docs"
)

4.2 对话模式

# 1. 一对一对话
user_proxy.initiate_chat(
    assistant,
    message="你好"
)

# 2. 群组对话
groupchat = autogen.GroupChat(
    agents=[agent1, agent2, agent3],
    messages=[],
    max_round=20,
    speaker_selection_method="auto"  # auto / manual / random
)

manager = autogen.GroupChatManager(
    groupchat=groupchat,
    llm_config={"config_list": config_list}
)

# 3. 序列对话
for agent in [agent1, agent2, agent3]:
    agent.send(message="...", recipient=agent)

4.3 代码执行

# 配置代码执行
user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    human_input_mode="NEVER",
    code_execution_config={
        "work_dir": "coding",  # 工作目录
        "use_docker": False,  # 是否使用 Docker
        "timeout": 60  # 代码执行超时时间(秒)
    }
)

# 智能体会自动执行代码块
# 例如:
assistant.send(
    message="写一个 Python 脚本读取 CSV 文件",
    recipient=user_proxy
)

五、高级功能

5.1 工具调用

from autogen import AssistantAgent
from typing import Literal

# 定义工具函数
def get_weather(
    city: str,
    unit: Literal["celsius", "fahrenheit"] = "celsius"
) -> str:
    """获取指定城市的天气"""
    # 这里调用天气 API
    return f"{city} 的天气是 25{unit}"

# 注册工具
assistant = autogen.AssistantAgent(
    name="assistant",
    system_message="你可以使用天气工具",
    llm_config={
        "config_list": config_list,
        "functions": [
            {
                "name": "get_weather",
                "description": "获取天气信息",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "city": {
                            "type": "string",
                            "description": "城市名称"
                        },
                        "unit": {
                            "type": "string",
                            "enum": ["celsius", "fahrenheit"],
                            "description": "温度单位"
                        }
                    },
                    "required": ["city"]
                }
            }
        ]
    }
)

# 智能体会自动调用工具
user_proxy.initiate_chat(
    assistant,
    message="北京今天的天气怎么样?"
)

5.2 检索增强(RAG)

from autogen.agentchat.contrib.retrieve_assistant_agent import (
    RetrieveAssistantAgent
)

# 创建检索增强代理
rag_assistant = RetrieveAssistantAgent(
    name="rag_assistant",
    system_message="你是一个有帮助的助手,使用检索到的信息回答问题。",
    client_configs=[
        {
            "model": "gpt-4",
            "api_key": "your-api-key",
            "api_type": "openai"
        }
    ],
    docs_path="./docs",  # 文档目录
    chunk_token_size=1000,
    chunk_overlap=200,
    get_or_create=True  # 自动创建向量数据库
)

# 提问
result = rag_assistant.generate_reply(
    messages=[{"role": "user", "content": "如何使用 AutoGen?"}]
)

5.3 人工干预

# 方式 1: ALWAYS 模式
user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    human_input_mode="ALWAYS",  # 每次都需要人工输入
    max_consecutive_auto_reply=0
)

# 方式 2: 在特定情况下要求人工输入
assistant = autogen.AssistantAgent(
    name="assistant",
    system_message="如果遇到敏感内容,要求人工确认。",
    llm_config={"config_list": config_list}
)

# 方式 3: 使用人类输入回调
def human_input(prompt: str) -> str:
    print(f"\n{prompt}")
    return input("你的回答: ")

user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    human_input_mode="ALWAYS",
    human_input_func=human_input
)

六、实战案例:代码审查团队

6.1 完整实现

import autogen

# 配置
config_list = autogen.config_list_from_json("OAI_CONFIG_LIST")

# 定义角色
code_reviewer = autogen.AssistantAgent(
    name="code_reviewer",
    system_message="""你是一名资深代码审查员。
    你需要检查代码的:
    1. 正确性
    2. 性能
    3. 安全性
    4. 可读性
    5. 最佳实践
    
    给出具体的改进建议。""",
    llm_config={"config_list": config_list}
)

security_expert = autogen.AssistantAgent(
    name="security_expert",
    system_message="""你是一名安全专家。
    检查代码中的安全漏洞:
    1. SQL 注入
    2. XSS 攻击
    3. 认证授权问题
    4. 数据加密
    5. 输入验证""",
    llm_config={"config_list": config_list}
)

performance_expert = autogen.AssistantAgent(
    name="performance_expert",
    system_message="""你是一名性能优化专家。
    评估代码的性能:
    1. 算法复杂度
    2. 资源使用
    3. 并发处理
    4. 缓存策略
    5. 数据库优化""",
    llm_config={"config_list": config_list}
)

user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=10,
    code_execution_config={"use_docker": False}
)

# 创建群组对话
groupchat = autogen.GroupChat(
    agents=[user_proxy, code_reviewer, security_expert, performance_expert],
    messages=[],
    max_round=15,
    speaker_selection_method="auto"
)

manager = autogen.GroupChatManager(
    groupchat=groupchat,
    llm_config={"config_list": config_list}
)

# 提交代码审查
code_to_review = """
def authenticate(username, password):
    query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
    result = execute_query(query)
    return result
"""

user_proxy.initiate_chat(
    manager,
    message=f"请审查以下代码:\n```\n{code_to_review}\n```"
)

七、最佳实践

7.1 提示词设计

# 好的系统消息
good_system_message = """你是一名资深 Python 开发工程师。

你的职责:
1. 编写高质量、可维护的 Python 代码
2. 遵循 PEP 8 编码规范
3. 添加必要的注释和文档
4. 考虑代码的性能和安全性

回答风格:
- 使用简洁清晰的语言
- 提供代码示例
- 说明最佳实践"""

# 避免
bad_system_message = "你是一个程序员"

7.2 对话流程控制

# 限制对话轮数
groupchat = autogen.GroupChat(
    agents=[...],
    messages=[],
    max_round=10  # 最多 10 轮对话
)

# 使用终止条件
def should_terminate(message):
    if "完成" in message["content"]:
        return True
    return False

groupchat = autogen.GroupChat(
    agents=[...],
    messages=[],
    termination_condition=should_terminate
)

7.3 性能优化

# 1. 使用更快的模型
config_list = [{"model": "gpt-3.5-turbo", "api_key": "key"}]

# 2. 并行执行
groupchat = autogen.GroupChat(
    agents=[...],
    messages=[],
    allow_repeat_speaker=False  # 避免重复发言
)

# 3. 缓存常用响应
import langchain
from langchain.cache import InMemoryCache

langchain.llm_cache = InMemoryCache()

八、常见问题

8.1 对话死循环

# 设置最大对话轮数
user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=5  # 限制连续回复次数
)

# 或者在 GroupChat 中限制
groupchat = autogen.GroupChat(
    agents=[...],
    max_round=10
)

8.2 代码执行错误

# 增加超时时间
user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    code_execution_config={
        "work_dir": "coding",
        "use_docker": True,  # 使用 Docker 隔离
        "timeout": 120  # 2 分钟
    }
)

# 不使用 Docker 时,确保环境有必要的包

8.3 API 费用过高

# 使用更便宜的模型
config_list = [
    {
        "model": "gpt-3.5-turbo",
        "api_key": "key",
        "price": [0.0015, 0.002]  # 覆盖默认价格
    }
]

# 限制 token 使用
assistant = autogen.AssistantAgent(
    name="assistant",
    llm_config={
        "config_list": config_list,
        "max_tokens": 500  # 限制响应长度
    }
)

九、进阶资源

9.1 官方资源

  • GitHub: https://github.com/microsoft/autogen
  • 文档: https://microsoft.github.io/autogen
  • 示例: https://github.com/microsoft/autogen/tree/main/notebook

9.2 相关框架

  • LangChain: 通用 LLM 应用框架
  • CrewAI: 多智能体协作框架
  • MetaGPT: 模拟软件公司多角色协作

十、总结

AutoGen 是一个功能强大的多智能体对话框架。通过本文,你学习了:

  • AutoGen 的核心概念和架构
  • 如何创建和配置不同类型的代理
  • 多智能体协作的实现方法
  • 代码执行和工具调用的使用
  • 实战案例和最佳实践

AutoGen 特别适合需要复杂协作和代码执行的场景,如代码审查、数据分析、任务规划等。尝试用它构建你的应用吧!

发表回复

后才能评论