Skip to main content

多智能体对话框架

AutoGen提供了一个统一的多智能体对话框架,作为使用基础模型的高级抽象。它具有功能强大、可定制和可对话的智能体,通过自动化的智能体聊天,将LLM、工具和人类整合在一起。 通过自动化多个能力强大的智能体之间的聊天,可以轻松地使它们集体自主地执行任务,或者通过人类的反馈来执行任务,包括需要通过代码使用工具的任务。

该框架简化了复杂LLM工作流的编排、自动化和优化。它最大限度地提高了LLM模型的性能,并克服了它们的弱点。它使得基于多智能体对话构建下一代LLM应用变得轻松。

智能体

AutoGen对可对话的智能体进行了抽象和实现,旨在通过智能体之间的对话来解决任务。具体而言,AutoGen中的智能体具有以下显著特点:

  • 可对话:AutoGen中的智能体可对话,这意味着任何智能体都可以向其他智能体发送和接收消息,以启动或继续对话。

  • 可定制:AutoGen中的智能体可以定制,以整合LLMs、人类、工具或它们的组合。

下图显示了AutoGen中内置的智能体。 智能体聊天示例

我们设计了一个通用的ConversableAgent类,用于能够通过交换消息进行对话以共同完成任务的智能体。一个智能体可以与其他智能体进行通信并执行动作。在接收到消息后,不同的智能体可能在执行动作方面有所不同。两个典型的子类是AssistantAgentUserProxyAgent

  • AssistantAgent被设计为充当AI助手,默认使用LLMs,但不需要人类输入或代码执行。当接收到消息(通常是需要解决的任务描述)时,它可以为用户编写Python代码(在Python代码块中)。在幕后,Python代码是由LLM(例如GPT-4)编写的。它还可以接收执行结果并提出修正或错误修复建议。可以通过传递新的系统消息来改变其行为。LLM的inference配置可以通过[llm_config]进行配置。 UserProxyAgent 在概念上是一个人类的代理机器人,通过默认方式在每个交互回合中征求人类的输入作为代理机器人的回复,并且具备执行代码、调用函数或工具的能力。当接收到的消息中检测到可执行代码块且没有提供人类用户输入时,UserProxyAgent 会自动触发代码执行。可以通过将 code_execution_config 参数设置为 False 来禁用代码执行。默认情况下,禁用了基于LLM的回复。可以通过将 llm_config 设置为与 推理 配置相对应的字典来启用。当 llm_config 设置为字典时,UserProxyAgent 可以在不执行代码时使用LLM生成回复。

ConversableAgent 的自动回复功能允许更自主的多代理通信,同时保留了人类干预的可能性。还可以通过使用 register_reply() 方法注册回复函数来轻松扩展。

在下面的代码中,我们创建了一个名为 "assistant" 的 AssistantAgent 作为助手,以及一个名为 "user_proxy" 的 UserProxyAgent 作为人类用户的代理。我们稍后将使用这两个代理来解决一个任务。

import os
from autogen import AssistantAgent, UserProxyAgent
from autogen.coding import DockerCommandLineCodeExecutor

config_list = [{"model": "gpt-4", "api_key": os.environ["OPENAI_API_KEY"]}]

# 使用LLM配置创建一个名为 "assistant" 的 AssistantAgent 实例。
assistant = AssistantAgent(name="assistant", llm_config={"config_list": config_list})

# 使用docker上的代码执行创建一个名为 "user_proxy" 的 UserProxyAgent 实例。
code_executor = DockerCommandLineCodeExecutor()
user_proxy = UserProxyAgent(name="user_proxy", code_execution_config={"executor": code_executor})

多代理对话

基本的两个代理对话示例

一旦正确构建了参与的代理,可以通过初始化步骤开始一个多代理对话会话,如下面的代码所示:

# 助手从用户那里接收到一条消息,其中包含任务描述
user_proxy.initiate_chat(
assistant,
message="""今天是几号?今年哪只大型科技股票的年初至今涨幅最大?涨幅是多少?""",
)

初始化步骤完成后,对话可以自动进行。下面是用户代理和助手协同解决上述任务的可视化示例: Agent Chat Example

  1. 助手从用户代理接收到包含任务描述的消息。
  2. 助手尝试编写 Python 代码来解决任务,并将响应发送给用户代理。
  3. 用户代理收到助手的响应后,尝试通过征求人类输入或准备自动生成的回复来进行回复。如果没有提供人类输入,用户代理执行代码并将结果用作自动回复。
  4. 助手为用户代理生成进一步的响应。用户代理可以决定是否终止对话。如果不终止,则重复步骤 3 和 4。

支持多样化的对话模式

具有不同自主性和人类参与模式的对话

一方面,可以在初始化步骤之后实现完全自主的对话。另一方面,AutoGen 可以通过配置人类参与水平和模式(例如将 human_input_mode 设置为 ALWAYS)来实现人类参与的问题解决,因为在许多应用中期望和/或需要人类参与。

静态和动态对话

AutoGen 通过整合编程和自然语言的对话驱动控制,固有地支持动态对话。这种动态性使得代理拓扑可以根据实际对话流程在不同的输入问题场景下进行调整。相反,静态对话遵循预定义的拓扑结构。动态对话在无法预先确定交互模式的复杂环境中特别有益。

  1. 注册的自动回复

通过可插拔的自动回复功能,可以根据当前消息和上下文的内容选择调用与其他代理的对话。例如:

  • 类似于 OptiGuide 中的分层聊天。
  • 动态群聊,这是一种特殊形式的分层聊天。在系统中,我们在群聊管理器中注册了一个回复函数,它在群聊设置中广播消息并决定下一个发言者是谁。
  • 有限状态机图来设置发言者转换约束,这是一种特殊形式的动态群聊。在这种方法中,将有向转换矩阵输入到群聊中。用户可以指定合法的转换或指定不允许的转换。
  • 类似于 conversational chess 中的嵌套聊天。
  1. 基于LLM的函数调用 另一种方法是基于LLM的函数调用,LLM根据每次推理过程中对话的状态决定是否调用特定的函数。这种方法实现了动态的多代理对话,如多用户数学问题求解场景,其中学生助手通过函数调用自动寻求专业知识。

使用AutoGen实现的多样化应用

下图展示了使用AutoGen构建的六个应用示例。 应用示例

在此页面中可以找到更多示例:自动化代理对话示例

进一步阅读

对导致该软件包的研究感兴趣吗?请查阅以下论文。