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 特别适合需要复杂协作和代码执行的场景,如代码审查、数据分析、任务规划等。尝试用它构建你的应用吧!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。






