(多)AutoGen 多智能体框架
概述
AutoGen 是一个由微软研究院开发的多智能体框架,它允许开发者使用不同的 LLM(大型语言模型)构建多智能体系统,这些智能体可以相互对话、协作完成任务。与传统的单智能体系统相比,AutoGen 的多智能体系统能够处理更复杂的任务,提供更多样的观点,并能够自动化任务执行流程。
AutoGen 的核心理念是将不同的 LLM 配置为具有不同角色和能力的智能体,使它们能够相互协作,共同解决问题。这类似于人类团队中不同专家协作的方式,每个智能体都可以贡献自己的专业知识和视角。
核心概念
1. 智能体(Agents)
在 AutoGen 中,智能体是框架的基本单元,每个智能体都可以:
接收和发送消息
理解和执行特定任务
使用特定的 LLM 配置
拥有独特的角色和行为模式
AutoGen 提供了多种预定义智能体类型:
AssistantAgent:默认助手智能体,通常基于 LLM,能够理解和回应用户查询
UserProxyAgent:代表人类用户,可以执行代码、提供反馈等
GroupChatManager:管理多个智能体之间的群组对话
RetrieveAssistantAgent:具备检索功能的助手智能体,可以从外部知识库获取信息
TeachableAgent:可以从交互中学习的智能体,能够记住和应用以前的经验
2. 对话(Conversation)
智能体之间通过对话进行交互。对话是一系列消息的交换,每条消息包含:
发送者
接收者
内容
可能的附加元数据
对话可以是一对一的,也可以是群组式的(多个智能体参与)。
3. 工作流程(Workflow)
AutoGen 支持灵活的工作流程设计,允许开发者定义智能体如何协作完成任务。工作流程可以是:
对话式:智能体之间自由交流,直到达成共识或完成任务
串行:一个接一个地完成任务
并行:同时处理不同任务
混合:结合上述模式
主要组件
1. ConversableAgent
ConversableAgent
是 AutoGen 中智能体的基类,提供了基本的对话功能。所有类型的智能体都继承自这个类,包括:
消息处理
上下文管理
回调处理
LLM 交互
2. AssistantAgent
AssistantAgent
是基于 LLM 的智能体,旨在理解用户需求并提供帮助。它可以:
回答问题
提供建议
生成内容
解决问题
3. UserProxyAgent
UserProxyAgent
代表人类用户,可以:
执行代码
提供人类反馈
作为系统与人类之间的接口
自动化某些用户操作
4. GroupChat
GroupChat
管理多个智能体之间的群组对话,支持:
消息广播
发言权管理
对话历史维护
对话终止条件管理
基本用法示例
1. 简单的助手-用户对话
以下是创建一个基本助手和用户代理并进行对话的示例:
import autogen
from autogen import AssistantAgent, UserProxyAgent
# 配置助手智能体
assistant = AssistantAgent(
name="AI_助手",
llm_config={
"temperature": 0,
"api_key": "your-api-key",
"model": "gpt-4",
},
system_message="你是一位专业且有帮助的AI助手。"
)
# 配置用户代理
user_proxy = UserProxyAgent(
name="用户",
human_input_mode="TERMINATE", # 用户可以随时终止对话
max_consecutive_auto_reply=10, # 最多自动回复10次
code_execution_config={"work_dir": "output"}
)
# 启动对话
user_proxy.initiate_chat(
assistant,
message="帮我用Python写一个简单的计算器程序,支持加减乘除操作。"
)
2. 多智能体群聊
以下示例创建了一个小型工作组,包括项目经理、程序员和测试员,共同解决一个软件开发任务:
import autogen
from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager
# 配置LLM
llm_config = {
"temperature": 0,
"api_key": "your-api-key",
"model": "gpt-4",
}
# 创建团队成员
project_manager = AssistantAgent(
name="项目经理",
llm_config=llm_config,
system_message="你是项目经理,负责需求分析、任务分配和进度跟踪。你需要确保团队理解需求并协调他们的工作。"
)
programmer = AssistantAgent(
name="程序员",
llm_config=llm_config,
system_message="你是一位经验丰富的程序员,擅长Python编程。你的任务是实现项目需求,编写清晰、高效、可维护的代码。"
)
tester = AssistantAgent(
name="测试员",
llm_config=llm_config,
system_message="你是软件测试专家,负责确保软件质量。你需要设计测试用例,识别潜在问题,并验证功能正确性。"
)
user_proxy = UserProxyAgent(
name="用户",
human_input_mode="TERMINATE",
code_execution_config={"work_dir": "output"}
)
# 创建群聊
team_members = [project_manager, programmer, tester, user_proxy]
group_chat = GroupChat(
agents=team_members,
messages=[],
max_round=20
)
# 创建群聊管理器
manager = GroupChatManager(group_chat=group_chat, llm_config=llm_config)
# 启动群聊
user_proxy.initiate_chat(
manager,
message="我们需要开发一个简单的待办事项应用,可以添加、完成和删除任务。请团队协作完成这个项目。"
)
3. 利用代码执行功能
Autogen的一个强大功能是能够执行代码并使用执行结果。以下示例展示了如何设置一个可以执行Python代码的用户代理:
import autogen
from autogen import AssistantAgent, UserProxyAgent
# 配置助手智能体
assistant = AssistantAgent(
name="数据分析师",
llm_config={
"temperature": 0,
"api_key": "your-api-key",
"model": "gpt-4",
},
system_message="你是一位数据分析专家,擅长使用Python进行数据分析和可视化。"
)
# 配置支持代码执行的用户代理
user_proxy = UserProxyAgent(
name="用户",
human_input_mode="TERMINATE",
code_execution_config={
"work_dir": "data_analysis", # 代码执行的工作目录
"use_docker": False, # 是否使用Docker容器执行代码
"timeout": 60, # 代码执行超时时间(秒)
"last_n_messages": 3, # 检查最后几条消息中的代码
}
)
# 启动对话
user_proxy.initiate_chat(
assistant,
message="""使用Python生成一个示例数据集,包含100个样本,有'年龄'、'收入'和'教育程度'三个特征。
然后分析这些特征之间的相关性,并生成一个简单的可视化展示。"""
)
高级用法
1. 定制化智能体
您可以通过继承基类创建自定义智能体,添加特殊功能或行为:
from autogen import ConversableAgent
import requests
class WeatherAgent(ConversableAgent):
def __init__(self, name, api_key):
super().__init__(name=name)
self.api_key = api_key
self.register_reply(
trigger=lambda x: "天气" in x["content"] or "气温" in x["content"],
reply_func=self.weather_reply
)
def weather_reply(self, message, sender):
# 从消息中提取城市名
content = message["content"]
# 简单示例,实际应用中应使用NLP技术提取城市名
if "在" in content and "的天气" in content:
city = content.split("在")[1].split("的天气")[0]
else:
return False, "无法识别城市名,请明确指定城市。"
# 调用天气API获取数据
response = requests.get(
f"https://api.weatherapi.com/v1/current.json?key={self.api_key}&q={city}&aqi=no"
)
if response.status_code == 200:
data = response.json()
weather_info = f"{city}当前天气:{data['current']['condition']['text']},气温:{data['current']['temp_c']}°C,湿度:{data['current']['humidity']}%"
return True, weather_info
else:
return False, "获取天气信息失败,请稍后再试。"
# 使用自定义智能体
weather_agent = WeatherAgent(name="天气助手", api_key="your-weather-api-key")
assistant = AssistantAgent(
name="总助手",
llm_config={"temperature": 0, "api_key": "your-api-key", "model": "gpt-4"}
)
user_proxy = UserProxyAgent(
name="用户",
human_input_mode="TERMINATE",
)
# 创建三方对话
group_chat = GroupChat(
agents=[user_proxy, assistant, weather_agent],
messages=[],
max_round=10
)
manager = GroupChatManager(group_chat=group_chat, llm_config={"temperature": 0, "api_key": "your-api-key", "model": "gpt-4"})
# 启动对话
user_proxy.initiate_chat(
manager,
message="北京的天气怎么样?"
)
2. 使用记忆和状态管理
Autogen支持智能体记忆和状态管理,可以通过以下方式实现:
import autogen
from autogen import AssistantAgent, UserProxyAgent
class StatefulAssistant(AssistantAgent):
def __init__(self, name, llm_config, system_message=""):
super().__init__(name=name, llm_config=llm_config, system_message=system_message)
self.memory = {}
self.register_reply(
trigger=lambda x: True, # 触发所有消息
reply_func=self.stateful_reply
)
def stateful_reply(self, message, sender):
# 提取用户名
if "我是" in message["content"] and ",请记住我" in message["content"]:
user_name = message["content"].split("我是")[1].split(",请记住我")[0]
self.memory["user_name"] = user_name
return True, f"你好,{user_name}!我已经记住你了。"
# 使用记忆的信息
if "你还记得我是谁吗" in message["content"]:
if "user_name" in self.memory:
return True, f"当然记得,你是{self.memory['user_name']}!"
else:
return True, "对不起,我们似乎还没有正式介绍过。请告诉我你的名字。"
# 如果没有特殊处理,让LLM处理
return False, None
# 创建有状态的助手
stateful_assistant = StatefulAssistant(
name="记忆助手",
llm_config={"temperature": 0, "api_key": "your-api-key", "model": "gpt-4"},
system_message="你是一个能够记住用户信息的助手。"
)
user_proxy = UserProxyAgent(
name="用户",
human_input_mode="TERMINATE",
)
# 启动对话
user_proxy.initiate_chat(
stateful_assistant,
message="我是张三,请记住我"
)
3. 智能体与工具集成
将AutoGen与外部工具和API集成,扩展智能体的能力:
import autogen
from autogen import AssistantAgent, UserProxyAgent, Tool
import wikipedia
import yfinance as yf
# 定义工具函数
def search_wikipedia(query):
"""搜索维基百科并返回摘要"""
try:
return wikipedia.summary(query, sentences=3)
except Exception as e:
return f"搜索出错: {str(e)}"
def get_stock_price(ticker):
"""获取股票当前价格"""
try:
stock = yf.Ticker(ticker)
data = stock.history(period="1d")
return f"{ticker}当前价格: {data['Close'].iloc[-1]:.2f}"
except Exception as e:
return f"获取股票价格出错: {str(e)}"
# 创建工具列表
tools = [
Tool(
name="wikipedia_search",
func=search_wikipedia,
description="搜索维基百科获取信息,输入为搜索查询"
),
Tool(
name="stock_price_check",
func=get_stock_price,
description="查询股票价格,输入为股票代码"
)
]
# 配置助手智能体
assistant = AssistantAgent(
name="多功能助手",
llm_config={
"temperature": 0,
"api_key": "your-api-key",
"model": "gpt-4",
"tools": [tool.to_dict() for tool in tools], # 将工具配置添加到LLM配置中
},
system_message="你是一个多功能助手,可以搜索维基百科和查询股票价格。请根据用户需求使用合适的工具。"
)
# 配置用户代理以处理工具调用
user_proxy = UserProxyAgent(
name="用户",
human_input_mode="TERMINATE",
tools=tools # 提供工具给用户代理
)
# 启动对话
user_proxy.initiate_chat(
assistant,
message="阿尔伯特·爱因斯坦是谁?然后告诉我苹果公司(AAPL)的股票价格。"
)
实际应用场景
1. 软件开发团队
Autogen可以模拟软件开发团队,包括产品经理、架构师、开发人员和测试人员,共同完成软件开发过程:
import autogen
from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager
# 配置基本LLM
llm_config = {
"temperature": 0,
"api_key": "your-api-key",
"model": "gpt-4",
}
# 创建开发团队
product_manager = AssistantAgent(
name="产品经理",
llm_config=llm_config,
system_message="你是产品经理,负责定义需求、澄清功能和确定优先级。你应该首先理解项目需求,并在必要时提出问题。"
)
architect = AssistantAgent(
name="架构师",
llm_config=llm_config,
system_message="你是软件架构师,负责设计系统架构、选择技术栈和定义组件交互。等待产品经理明确需求后再提出架构方案。"
)
developer = AssistantAgent(
name="开发人员",
llm_config=llm_config,
system_message="你是一位全栈开发人员,擅长Python和JavaScript。你的任务是实现架构师设计的组件,并编写清晰、模块化的代码。"
)
tester = AssistantAgent(
name="测试人员",
llm_config=llm_config,
system_message="你是QA测试人员,负责设计测试用例、测试计划和确保软件质量。当开发人员提供代码后,你需要审查代码并提供测试反馈。"
)
user_proxy = UserProxyAgent(
name="项目所有者",
human_input_mode="TERMINATE",
code_execution_config={"work_dir": "dev_project"}
)
# 创建开发团队群聊
dev_team = [product_manager, architect, developer, tester, user_proxy]
group_chat = GroupChat(
agents=dev_team,
messages=[],
max_round=30
)
# 创建群聊管理器
manager = GroupChatManager(group_chat=group_chat, llm_config=llm_config)
# 启动开发流程
user_proxy.initiate_chat(
manager,
message="我需要开发一个简单的博客网站,具有文章发布、评论和用户认证功能。请团队协作完成这个项目。"
)
2. 数据分析流水线
Autogen可以创建数据分析流水线,包括数据工程师、数据分析师和可视化专家:
import autogen
from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager
llm_config = {
"temperature": 0,
"api_key": "your-api-key",
"model": "gpt-4",
}
# 创建数据团队
data_engineer = AssistantAgent(
name="数据工程师",
llm_config=llm_config,
system_message="你是数据工程师,专注于数据获取、清洗和准备。你擅长编写高效的数据处理代码,确保数据质量和一致性。"
)
data_analyst = AssistantAgent(
name="数据分析师",
llm_config=llm_config,
system_message="你是数据分析师,专注于探索性数据分析、统计检验和模式识别。你擅长使用Python数据科学库(如pandas、numpy和scipy)进行数据分析。"
)
visualization_expert = AssistantAgent(
name="可视化专家",
llm_config=llm_config,
system_message="你是数据可视化专家,专注于创建有洞察力的可视化和仪表板。你擅长使用matplotlib、seaborn、plotly等工具创建清晰、信息丰富的图表。"
)
user_proxy = UserProxyAgent(
name="项目负责人",
human_input_mode="TERMINATE",
code_execution_config={"work_dir": "data_analysis_project"}
)
# 创建数据团队群聊
data_team = [data_engineer, data_analyst, visualization_expert, user_proxy]
group_chat = GroupChat(
agents=data_team,
messages=[],
max_round=20
)
manager = GroupChatManager(group_chat=group_chat, llm_config=llm_config)
# 启动数据分析流程
user_proxy.initiate_chat(
manager,
message="我有一个CSV文件sales_data.csv,包含过去12个月的销售数据。我需要分析销售趋势,确定影响销售的关键因素,并创建一个综合报告与可视化。请团队协作完成这个分析任务。"
)
最佳实践
1. 设计智能体角色
明确职责:为每个智能体定义清晰的角色和职责
避免重叠:减少智能体之间的职责重叠
匹配专长:根据任务需求选择合适的智能体组合
2. 有效的系统提示
详细说明:为智能体提供详细的系统提示,明确其角色、任务和限制
示例包含:在系统提示中包含良好回应的示例
反馈机制:设计智能体如何处理和请求反馈
示例改进的系统提示:
developer_agent = AssistantAgent(
name="开发者",
llm_config=llm_config,
system_message="""你是一位专业的Python开发者,擅长编写高质量、可维护的代码。
职责:
1. 根据需求编写清晰、高效的Python代码
2. 提供详细的代码注释和文档
3. 考虑代码的可扩展性和边界情况
4. 回应代码审查意见并进行改进
工作方式:
- 首先理解需求,如有不清楚的地方,提出澄清问题
- 提供代码结构概述,然后实现完整代码
- 每个函数都应包含文档字符串,说明参数、返回值和功能
- 代码提交前进行自我审查,确保质量
示例良好回应:
'根据需求,我们需要一个处理用户数据的函数。以下是我的实现:
```python
def process_user_data(data: dict) -> dict:
"""处理用户数据,验证必填字段并格式化输出
Args:
data: 包含用户信息的字典
Returns:
处理后的用户数据字典
Raises:
ValueError: 当必填字段缺失时
"""
# 验证必填字段
required_fields = ["name", "email"]
for field in required_fields:
if field not in data:
raise ValueError(f"缺少必填字段: {field}")
# 格式化数据
result = {
"user_name": data["name"].strip(),
"email": data["email"].lower(),
"joined_at": data.get("joined_at", datetime.now().isoformat())
}
return result
```
这个函数验证了必填字段并格式化了数据。我特别注意了边界情况处理,如缺少字段时抛出异常,以及对输入数据进行了清理。'
"""
)
3. 群聊管理
限制轮次:设置适当的最大对话轮次,避免无休止的讨论
明确终止条件:定义清晰的对话终止条件
定向对话:使用带有方向性的提问引导对话
4. 错误处理
优雅失败:实现错误处理机制,确保单个智能体失败不会导致整个系统崩溃
重试机制:为不稳定操作设计重试逻辑
详细日志:保留详细日志,便于调试和分析
5. 性能优化
并行处理:适当时使用并行处理提高效率
缓存结果:缓存常用查询或计算结果
减少交互:设计高效的对话流,减少不必要的信息交换
常见问题与解决方案
对话发散
问题:智能体之间的对话偏离原始任务
解决方案:设计更明确的系统提示,使用对话总结智能体定期重新聚焦,设置合理的最大轮次
代码执行错误
问题:生成的代码执行失败
解决方案:使用专门的代码审查智能体,实现更健壮的错误处理,逐步测试代码片段
资源消耗
问题:多智能体系统可能导致大量API调用
解决方案:合并简单查询,实施令牌预算,缓存重复请求
团队协调挑战
问题:智能体之间的冲突或缺乏协调
解决方案:添加协调者智能体,设计更明确的协作协议,实施决策机制
与其他框架的比较
总结
Autogen是一个功能强大、灵活的多智能体框架,特别适合构建需要多智能体协作的复杂应用。其主要优势在于:
灵活的智能体设计:可以创建各种类型的智能体,满足不同角色和功能需求
强大的对话管理:支持多种对话模式,适应各种协作场景
代码执行能力:智能体可以编写和执行代码,极大扩展了应用可能性
可扩展性:易于与外部工具和API集成
通过合理的设计和配置,AutoGen可以帮助开发者构建高效、智能的多智能体系统,应对各种复杂任务挑战。
- 感谢你赐予我前进的力量