前言

传统的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项,并将结果保存到文件中。”

这个团队包含三个角色:

  1. Admin (UserProxyAgent): 代表人类用户,负责发起任务和最终确认。
  2. Engineer (AssistantAgent): AI工程师,负责编写Python代码。
  3. 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. 观察对话流

当你运行这段代码后,神奇的事情发生了。你会看到一场自动进行的对话:

  1. Admin (你) 发起了初始任务。
  2. Manager (会议主持) 决定接下来由谁发言,很可能是PM
  3. PM 接收到任务,可能会对需求进行澄清,然后清晰地向Engineer提出开发请求。
  4. 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))
    
  5. 代码块由Admin (因为它有 code_execution_config) 自动执行。
  6. 执行结果(或错误)被返回到群聊中。
  7. PM 看到代码和执行结果,进行审查。如果发现问题(比如没有处理边界情况),它会提出修改意见。如果没有问题,它会向Admin汇报任务完成。
  8. 对话持续进行,直到任务被标记为完成。此时,由于 human_input_mode被设置为 TERMINATE,程序会暂停并等待你输入 TERMINATE来确认并结束整个流程。

总结

通过AutoGen,我们仅仅用了几十行代码,就创建了一个能够自主协作、执行代码并解决问题的多代理系统。这展示了超越单一Agent的巨大潜力。

这只是AutoGen能力的初探。你可以继续探索更复杂的场景,比如:

  • 为Agent添加自定义工具(如API调用、数据库查询)。
  • 设计更复杂的对话流程和Agent角色。
  • 让Agent进行长期规划和自我反思。

AutoGen为我们打开了一扇通往“AI协作智能”的大门。未来,开发应用可能不再是编写死板的代码,而是设计和管理一个高效、智能的AI团队。现在就开始,构建你的第一个AI Agent团队吧!