大模型代理框架AutoGen_实战篇
这文讲解了如何安装和使用 Microsoft 的 Autogen 工具。它能让多个“代理”协作完成任务,比如对话管理、调用工具等。文中还介绍了关键组件 ConversableAgent 和 GroupChat,以及一些实用的示例程序,比如绘制股票走势图、执行代码等,帮助用户轻松上手并解决复杂问题。
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 和逻辑推理等相关代码。
- agent ->
ConversableAgent:会话的基类,一般不直接使用,而是作为其他类的父类。它能保持对话状态、历史记录,并调用其他工具。
- groupchat:用于管理多个 Agent 的协作。
- GroupChat:管理多个代理之间的对话,相当于管理一个群聊房间。可通过字典图限定各个
Agent 可与谁交互。
- 通过多个 agent 以一定规则结合实现一个大功能,具体规则可以由聊天组来定义。
- 所有代理都参与到一个对话线程中并共享相同的上下文。这对于需要多个代理之间协作的任务非常重要。
- 如果有两个以上代理,就不确定的下一句话该传给谁,就需要使用 ChatGroup 管理,并利用 transitions 设置代理之间的衔接。
- GroupChatManager:管理多个 GroupChat,相当于多个群聊房间的管理者,负责统筹多个对话组的协调和资源分配。
- GroupChat:管理多个代理之间的对话,相当于管理一个群聊房间。可通过字典图限定各个
Agent 可与谁交互。
3 程序及分析
以下程序用于绘制 NVDA 和 TESLA 的股票走势图,并允许用户参与对话,共同推进任务的完成。在运行过程中,遇到找不到 yfinance 库的问题时,程序会将问题反馈给大模型,由大模型自动完成安装。
1 | import os |
- 对话至少包含一个 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 之间的关系,指定用户在何种情况下参与对话。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.