1 安装

1
pip install pyautogen

2 源码

1
git clone https://github.com/microsoft/autogen
  • 下载了 2.2G,其中 2.1G 在.git 文件夹下,其余约 60M。只需关注主分支即可。
  • 核心代码位于 autogen/agentchat 目录,核心组件包括:conversable_agent 和 groupchat。
  • conversable_agent:用于管理每个角色的行为。
    • agent -> ConversableAgent:会话的基类,一般不直接使用,而是作为其他类的父类。它能保持对话状态、历史记录,并调用其他工具。
      • Agent 可以指定自己在什么情况下被调用,比 Tool 或 function 更强大。
      • 参数 system_message 指定其用途。
      • 参数 description 告知其他代理什么时候该调用它(如提示:... DO NOT call this Agent in any other scenarios.)
      • 核心函数 generate_reply() 它会依次尝试各种 reply,含终止,用户输入,调函数,执行代码,llm 回答…… 这些 reply 在 __init__ 时被注册到 _reply_func_list
    • ConversableAgent -> UserProxyAgent:用户角色,用于模拟用户输入和执行代码等。user_proxy 充当的角色之一是老板,而其他 agent 是员工。无论其他 agent 做什么,至少需要一个 user_proxy 提出目标问题。
    • ConversableAgent -> AssistantAgent:AI 角色,用于执行任务处理、调用 API 和逻辑推理等相关代码。
  • groupchat:用于管理多个 Agent 的协作。
    • GroupChat:管理多个代理之间的对话,相当于管理一个群聊房间。可通过字典图限定各个 Agent 可与谁交互。
      • 通过多个 agent 以一定规则结合实现一个大功能,具体规则可以由聊天组来定义。
      • 所有代理都参与到一个对话线程中并共享相同的上下文。这对于需要多个代理之间协作的任务非常重要。
      • 如果有两个以上代理,就不确定的下一句话该传给谁,就需要使用 ChatGroup 管理,并利用 transitions 设置代理之间的衔接。
    • GroupChatManager:管理多个 GroupChat,相当于多个群聊房间的管理者,负责统筹多个对话组的协调和资源分配。

3 程序及分析

以下程序用于绘制 NVDA 和 TESLA 的股票走势图,并允许用户参与对话,共同推进任务的完成。在运行过程中,遇到找不到 yfinance 库的问题时,程序会将问题反馈给大模型,由大模型自动完成安装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os
from dotenv import load_dotenv
from autogen import AssistantAgent, UserProxyAgent

load_dotenv()
llm_config = {
"model": "gpt-4o",
"api_key": os.environ.get("OPENAI_API_KEY"),
"base_url": os.environ.get("OPENAI_API_BASE"),
"temperature": 0.9,
}

assistant = AssistantAgent("assistant", llm_config=llm_config)
user_proxy = UserProxyAgent(
"user_proxy", code_execution_config={"work_dir": "coding", "use_docker": False}
)
user_proxy.initiate_chat(assistant, message="Plot a chart of NVDA and TESLA stock price change YTD.")
  • 对话至少包含一个 AssistantAgent 和一个 UserProxyAgent。
  • AssistantAgent:用于与 LLM 交互。
    • 参数:llm_config=llm_config,设置 LLM 参数,需要访问大模型。
  • UserProxyAgent:用于与程序员交互及运行代码。
    • 参数:code_execution_config,设置是否运行代码和相关配置。
    • 参数:human_input_mode="NEVER",设置是否需要与人交互,默认情况下最后一步与人交互。
  • initiate_chat:开始对话。
    • 参数:max_turns=2,限制讨论回合数。
  • 分析:对话开始后,在两个代理之间展开。A.send() -> B.recv(), B.send() -> A.recv()... 如此往复直到结束(找到答案、超过对话轮数或满足退出条件)。每次 AssistantAgent 调用 LLM 时,会参考初始问题和当前的多轮对话内容做出回应(具体操作包括调用工具、语言回复或生成代码,见 ConversableAgent 类中实现)。UserProxyAgent 可以让用户参与、执行代码或调用工具来完成具体任务。

4 工具

4.1 使用预先定义的工具

  • 这里的工具是指预定义功能,而不是在对话中由 LLM 编写的代码。
  • 工具必须至少向两个代理注册,才能在对话中发挥作用。
    • 选择工具:向 AssistantAgent 注册,告诉 LLM 这些工具可供使用,由 LLM 判断何时调用它,并将输入信息转换为工具需要的格式。(register_for_llm)
    • 执行工具:向 UserProxyAgent 注册,让 UserProxyAgent 可以运行该工具。(register_for_execution)
    • 也可以使用 autogen.register_function 函数同时向两个代理注册工具。
  • 参考:在 autogen 中定义并使用 tool 的示例

4.2 autogen 自带的工具

功能并非全部是去年发论文时就有的,有些是在近几个月才加的。例如 graph_rag,各种 RAG;还可以调 langchain 和 llamaindex 提供的工具。autogen 并没有自己实现很多功能,但很擅长利用已有工具,给人一种集大成者的感觉。它还支持在 Docker 内部运行工具和代码。

具体代码见:autogen/agentchat/contrib/

4.3 示例代码

Autogen 是 Microsoft 出品的一款工具,从代码到文档再到示例都很完善。好消息是:你能想到的常用功能,在 demo 里都有;坏消息是:demo 有多达 70 多个,其中有些还很长。

具体示例见:autogen/notebook/*.ipynb

  • Async_human_input:异步对话,主要示例如何继承 Agent。
  • JSON_model_example:示例如何使用 LLM 的 JSON 回复,以及多 agent 协调。
  • agentchat_MathChat.ipynb:解决数学问题的 agent,示例了 config 的用法。这里示例 autogen 中原因数学工具的用法,参考它可以实现具体作为工具的 Agent。
  • agentchat_RetrieveChat.ipynb:使用 autogen 原生的 RetrieveUserProxyAgent 处理数据检索;可以检索网上的文档,并生成答案;还包含了往向量数据库里加数据,可定义上下文。
  • agentchat_RetrieveChat_pgvector.ipynb:向量数据库检索示例,这里嵌入使用了 SentenceTransformer,一个 BERT 模型。其原理是将数据切块后放入向量库,检索时从库中找到包含检索内容的块,再由 LLM 筛选并组织出有用内容。
  • agentchat_function_call.ipynb:用 autogen 执行自己定义的函数,类似于 Langchain 工具定义写法。
  • agentchat_group_chat_with_llamaindex_agents.ipynb:用 autogen 调用 LlamaIndex,并使用其内部定义的 Agent。autogen 专门实现了 LLamaIndexConversableAgent,以便与 LlamaIndex 衔接。
  • agentchat_langchain.ipynb:使用 Langchain 提供的工具作为函数,通过 autogen 的 function_call 方法,以 langchain 的 tool/toolkit 方式调用,跳过了 langchain 原生的 agent_executor 方式。
  • agentchat_memory_using_mem0.ipynb:使用 mem0 管理会话,以生成个性化 AI 体验。自我提升记忆是一种自适应系统,不断从用户交互中学习,随着时间推移完善理解,因此会话不用自己管理。
  • agentchat_multi_task_chats.ipynb:顺序执行多个任务,示例了 agent 参数用法,并调用 initiate_chats 串行多个任务。每个任务针对一个 Agent 对话都可能是多轮的;还示例了 chat_result 的解析,还涉及群聊。如果不指定数据流向,则 GroupChat(agents=[user_proxy, research_assistant..) 会从 agents 列表中从前向后流动。
  • agentchat_oai_assistant_retrieval.ipynb:使用了 autogen 调用 OpenAI Assistant 的增强生成工具实现 GPTAssistantAgent,封装了根据问题和提供的数据使用 LLM 回答问题。
  • agentchat_society_of_mind.ipynb:维护层级关系,实现了 SocietyOfMindAgent。UserProxy 与其对话,其内部可包含 ChatGroup,把内部操作对外屏蔽。
  • agentchat_web_info.ipynb:示例了需要从 Web 获取信息的任务,例如讨论论文和股票市场。通过生成和执行代码,从网页上抓取数据,而无需事先定义工具。

5 总结

对话在各个 Agent 之间流动,不必有一个主控来监督每一次交互,但可以设置一些控制点。程序员可以控制以下方面:

  • 定义不同层面的功能:GroupChat 的功能、各个 Agent 的功能、各个 Tools 的功能。
  • 设置默认回复和终止条件:如最大轮数、文本条件和程序条件。
  • 设计控制流:手动设定 Agent 之间的关系,指定用户在何种情况下参与对话。