前言
传统的AI应用通常围绕着一个单一的、全能的LLM Agent展开。然而,现实世界中的复杂问题往往需要不同角色的专家协同工作才能解决。为了模拟这种协作模式,多代理(Multi-Agent)系统应运而生,它通过让多个具有不同专长和角色的AI Agent进行对话和协作,来完成复杂的任务。
AutoGen
是微软开源的一个强大的框架,它极大地简化了构建和协调多代理系统的工作。本文将带你入门AutoGen,了解其核心理念,并亲手构建一个由“代码手”和“产品经理”组成的小型AI团队。
什么是AutoGen?
AutoGen的核心思想是可对话的(Conversable)Agent。在AutoGen中,任何东西都可以被封装成一个Agent,只要它能发送和接收消息。这些Agent可以基于LLM,也可以是纯粹的Python代码(工具),甚至是人类用户。
AutoGen框架为你提供了:
- 可定制的Agent: 你可以轻松定义Agent的角色、能力(LLM配置、工具使用)和行为模式。
- 灵活的对话模式: 支持多种预设的对话模式(如两两对话、群聊),也允许你自定义复杂的交互逻辑。
- 无缝的人类参与: 人类用户可以随时作为“監督者”或“参与者”加入对话,提供反馈或进行决策。
- 强大的代码执行能力: Agent可以编写代码,并由代码执行Agent(或人类)在真实环境中运行和验证。
通过这些能力,你可以构建出能够自我规划、自我反思、并利用工具解决问题的复杂自动化工作流。
准备工作
1. 安装必要的库
pip install pyautogen
2. 配置LLM Provider
AutoGen支持多种LLM,包括OpenAI、Azure OpenAI等。你需要一个配置文件 OAI_CONFIG_LIST
来告诉AutoGen可以使用哪些模型。
在你的项目根目录下创建一个名为 OAI_CONFIG_LIST
的JSON文件(注意,没有 .json
后缀):
[
{
"model": "gpt-4",
"api_key": "sk-..."
},
{
"model": "gpt-3.5-turbo",
"api_key": "sk-..."
}
]
重要: 请将
sk-...
替换为你自己的真实OpenAI API密钥。AutoGen会自动从这个列表中选择合适的模型。
构建你的第一个多代理系统
我们的目标是构建一个简单的团队来完成一个编程任务:“编写一个Python函数,计算斐波那契数列的第n项,并将结果保存到文件中。”
这个团队包含三个角色:
Admin
(UserProxyAgent): 代表人类用户,负责发起任务和最终确认。Engineer
(AssistantAgent): AI工程师,负责编写Python代码。PM
(AssistantAgent): AI产品经理,负责审查代码、提出修改意见并验证最终结果。
1. 导入并配置
import autogen
# 加载LLM配置
config_list = autogen.config_list_from_json(
"OAI_CONFIG_LIST",
file_location=".", # 配置文件所在目录
)
# 通用的LLM配置,将用于我们的Agent
llm_config = {
"config_list": config_list,
"temperature": 0.1,
}
2. 定义Agents
现在,我们来定义我们的三个Agent。
# 人类管理员/代理
# UserProxyAgent可以执行代码和与人类交互
admin = autogen.UserProxyAgent(
name="Admin",
system_message="一个人类管理员,负责发起任务并最终批准。",
code_execution_config={
"last_n_messages": 2, # 执行最后两条消息中的代码
"work_dir": "coding", # 代码执行的工作目录
},
human_input_mode="TERMINATE" # 当任务完成时,会请求人类输入'TERMINATE'来结束对话
)
# AI工程师
engineer = autogen.AssistantAgent(
name="Engineer",
llm_config=llm_config,
system_message="你是一名资深Python工程师。你只负责根据需求编写高质量、符合规范的Python代码。不要添加任何解释性文字。"
)
# AI产品经理
pm = autogen.AssistantAgent(
name="PM",
llm_config=llm_config,
system_message="你是一名产品经理。你的职责是:1. 将需求清晰地传达给工程师。2. 审查工程师的代码,确保其符合需求。3. 确认最终结果并向Admin汇报。"
)
UserProxyAgent
是一个特殊的Agent,它不仅能与LLM对话,还能执行代码块,并且可以征求人类的输入。AssistantAgent
是标准的基于LLM的对话Agent。我们通过system_message
来赋予它们不同的角色和行为准则。
3. 创建群聊并开始任务
定义好Agent后,我们需要一个“会议室”——GroupChat
,让它们在里面交流。GroupChatManager
则扮演了会议主持人的角色。
# 创建一个群聊,包含所有Agent
groupchat = autogen.GroupChat(
agents=[admin, engineer, pm],
messages=[],
max_round=12 # 对话最多进行12轮
)
# 创建一个群聊管理器
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config=llm_config
)
# 由Admin发起对话
admin.initiate_chat(
manager,
message="请编写一个Python函数,计算斐波那契数列的第n项,并将第10项的结果保存到文件'fibonacci.txt'中。"
)
4. 观察对话流
当你运行这段代码后,神奇的事情发生了。你会看到一场自动进行的对话:
- Admin (你) 发起了初始任务。
- Manager (会议主持) 决定接下来由谁发言,很可能是PM。
- PM 接收到任务,可能会对需求进行澄清,然后清晰地向Engineer提出开发请求。
- Engineer 接收到指令,编写Python代码块。
# filename: fibonacci_calculator.py def fibonacci(n): if n <= 0: return 0 elif n == 1: return 1 else: a, b = 0, 1 for _ in range(2, n + 1): a, b = b, a + b return b result = fibonacci(10) with open("fibonacci.txt", "w") as f: f.write(str(result))
- 代码块由Admin (因为它有
code_execution_config
) 自动执行。 - 执行结果(或错误)被返回到群聊中。
- PM 看到代码和执行结果,进行审查。如果发现问题(比如没有处理边界情况),它会提出修改意见。如果没有问题,它会向Admin汇报任务完成。
- 对话持续进行,直到任务被标记为完成。此时,由于
human_input_mode
被设置为TERMINATE
,程序会暂停并等待你输入TERMINATE
来确认并结束整个流程。
总结
通过AutoGen,我们仅仅用了几十行代码,就创建了一个能够自主协作、执行代码并解决问题的多代理系统。这展示了超越单一Agent的巨大潜力。
这只是AutoGen能力的初探。你可以继续探索更复杂的场景,比如:
- 为Agent添加自定义工具(如API调用、数据库查询)。
- 设计更复杂的对话流程和Agent角色。
- 让Agent进行长期规划和自我反思。
AutoGen为我们打开了一扇通往“AI协作智能”的大门。未来,开发应用可能不再是编写死板的代码,而是设计和管理一个高效、智能的AI团队。现在就开始,构建你的第一个AI Agent团队吧!
...