跳到主要内容

多代理对话框架

AutoGen 提供了一个统一的多代理对话框架,作为使用基础模型的高级抽象。它具备能力强、可定制且可对话的代理,这些代理通过自动化代理聊天集成了大型语言模型(LLMs)、工具和人类。 通过自动化多个能力强代理之间的聊天,可以轻松使它们自主地或通过人类反馈集体执行任务,包括需要通过代码使用工具的任务。

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

代理

AutoGen 抽象并实现了可对话的代理,旨在通过代理间的对话来解决问题。具体来说,AutoGen 中的代理具有以下显著特点:

  • 可交流的:AutoGen 中的代理是可交流的,这意味着任何代理都可以发送和接收来自其他代理的消息,以发起或继续对话。

  • 可定制:AutoGen中的代理可以定制,以集成LLMs、人类、工具或它们的组合。

下图显示了AutoGen中的内置代理。 Agent Chat Example

我们设计了一个通用的ConversableAgent类,用于那些能够通过交换消息来进行对话,以共同完成任务的代理。一个代理可以与其他代理进行通信并执行操作。不同的代理在接收到消息后执行的操作可能有所不同。两个代表性的子类是AssistantAgentUserProxyAgent

  • AssistantAgent 被设计为一个AI助手,默认使用LLMs,但不需要人工输入或代码执行。当接收到消息(通常是需要解决的任务描述)时,它可以为用户编写Python代码(在Python代码块中)供其执行。实际上,Python代码是由LLM(例如,GPT-4)编写的。它还可以接收执行结果并提出修正或错误修复建议。通过传递新的系统消息可以改变其行为。LLM 推理配置可以通过[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"]}]

# create an AssistantAgent instance named "assistant" with the LLM configuration.
assistant = AssistantAgent(name="assistant", llm_config={"config_list": config_list})

# create a UserProxyAgent instance named "user_proxy" with code execution on docker.
code_executor = DockerCommandLineCodeExecutor()
user_proxy = UserProxyAgent(name="user_proxy", code_execution_config={"executor": code_executor})

多代理对话

一个基础的双代理对话示例

当参与代理正确构建后,可以通过初始化步骤启动多代理会话,如下代码所示:

# the assistant receives a message from the user, which contains the task description
user_proxy.initiate_chat(
assistant,
message="""What date is today? Which big tech stock has the largest year-to-date gain this year? How much is the gain?""",
)

在初始化步骤之后,对话可以自动进行。下面展示了用户代理和助手如何协作自主解决上述任务的可视化说明: Agent Chat Example

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

支持多样化的对话模式

不同自主性级别的对话,以及人类参与模式

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

静态和动态对话

AutoGen 通过集成利用编程和自然语言的对话驱动控制,天生支持动态对话。这种动态特性使得代理拓扑能够根据不同输入问题场景下的实际对话流程进行调整。相反,静态对话则遵循预定义的拓扑。在复杂的场景中,动态对话尤其有益,因为交互模式无法预先确定。

  1. 注册自动回复

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

  • 类似于OptiGuide中的分层聊天。
  • 动态群聊 是一种特殊形式的层级对话。在系统中,我们在群聊管理器中注册了一个回复函数,该函数在群聊设置中广播消息并决定下一位发言者。
  • 有限状态机图用于设置说话者转换约束,这是一种特殊形式的动态群聊。在这种方法中,一个有向转换矩阵被输入到群聊中。用户可以指定合法的转换或指定不允许的转换。
  • 对话式象棋中的嵌套聊天。
  1. 基于LLM的函数调用

另一种方法涉及基于LLM的函数调用,其中LLM根据每次推理期间的对话状态决定是否应调用特定函数。这种方法支持动态的多代理对话,如在多用户数学问题解决场景中所见,其中学生助手通过函数调用自动寻求专家的帮助。

使用AutoGen实现的各种应用

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

在本页面找到示例列表:自动代理聊天示例

进一步阅读

对该包背后的研究感兴趣?请查看以下论文。