目前,业界一般认为基于大模型的应用集中在两个方向上:RAG 和 Agent,无论哪一种应用,设计、实现和优化能够充分利用大模型(LLM)潜力的应用都需要大量的努力和专业知识。随着开发人员开始创建日益复杂的LLM应用程序,开发流程不可避免地变得更加复杂。这种流程的潜在设计空间可能是巨大而复杂的,《如何构建基于大模型的App》一文给出了一种探索中的大模型应用开发基础框架,基本可以适用于RAG 和Agent。但是,对于面向Agent的大模型应用开发,有没有其独特之处呢?有没有聚焦于Agent的大模型应用开发框架呢?
那么,什么又是Agent 呢?
这里的Agent 指的是智能体,可以追溯到明斯基的《society of mind》一书。在那本书中,明斯基对Agent的定义有点抽象——“社会中某个个体经过协商后可求得问题的解,这个个体就是agent”。在计算机领域,agent是一种通过传感器感知其环境,并通过执行器作用于该环境的实体,因此,可以把实体定义为一种从感知序列到实体动作的映射。一般认为,Agent是指驻留在某一环境下,能持续自主地发挥作用,具备自主性、反应性、社会性、主动性等特征的计算实体。
智能,是Agent 与环境相互作用的涌现属性。
Agent 的一般结构如下图所示:
Agent 的主要特性有:
● 自主性(Autonomy) :运行无需人类或其它 Agent 的直接干预,对其自身行为及内部状态进行某种控制。
● 社会性(Social Ability) 能通过某种 通信与其它 Agent(或人类)进行交互。交互主要有 三种类型:协作(Cooperation)、协调(Coordination)和协商 (Negotiation)。
● 反应性(Reactivity):能感知环境(可以是物理世界、一个经图形用户接口连接的用户、一系列其 它Agent、Internet 或所有这些的组合),并能对环境的变化及时作出反应。
● 主动性(Pro-activeness):不但能对环境作出反应,能够积极主动地做出使其目标得以实现的行为。
如果尝试对Agent做一点儿形式化表达,可能是这样的:
Agent = platform+ agent program
platform = computing device + sensor+ action
agent program 是 agent function 的真子集
在大模型领域,大模型替代了传统agent 中的规则引擎以及知识库,Agent提供了并寻求推理、观察、批评和验证的对话通道。特别是当配置了正确的提示和推理设置时,单个LLM就可以显示出广泛的功能 ,不同配置的Agent之间的对话可以帮助以模块化并以互补的方式将这些广泛的LLM功能结合起来。
开发人员可以轻松、快速地创建具有不同角色的Agent,例如,使用Agent来编写代码、执行代码、连接人工反馈、验证输出等。通过选择和配置内置功能的子集,Agent的后端也可以很容易地进行扩展,以允许更多的自定义行为。
Multi-Agent(多智能体系统) 是指由多个自主个体组成的群体系统,其目标是通过个体间的相互信息通信和交互作用。
一般地,Multi-Agent由一系列相互作用的Agent及其相应的组织规则和信息交互协议构成,内部的各个Agent之间通过相互通信、合作、竞争等方式,完成单个Agent不能完成的,大量而又复杂的工作,是“系统的系统”。
Multi-Agent 系统(MAS) 主要可以分成以下类别:
Multi-Agent系统的主要具有以下的特点:
具体而言, 在基于大模型的应用领域中,当复杂任务被分解成更简单的子任务时,LLM已经被证明了拥有解决复杂任务的能力。Multi-Agent 的通信与协作可以通过“对话”这一直观的方式实现这种子任务的分拆和集成。
为了使基于大模型的Agent适合于Multi-Agent的对话,每个Agent都可以进行对话,它们可以接收、响应和响应消息。当配置正确时 ,Agent可以自动与其他代理进行多次对话,或者在某些对话轮次中请求人工输入,从而通过人工反馈形成RLHF。可对话的Agent设计利用了LLM通过聊天获取反馈并取得进展的强大能力,还允许以模块化的方式组合LLM的功能。
基于大模型的常见单Agent 系统包括:
基于大模型的常见Multi-Agent 系统包括:
在了解了Agent 和 Multi-Agent 的基本概念以及常见系统之后,如何开发一个基于大模型的Agent应用呢?上个月(2023年9月),微软提出了一个Autogen 的开源框架,为开发LLM的Agent 应用提供了有价值的参考。
AutoGen 是一个用于简化 LLM 工作流的编排、优化和自动化的开发框架。它提供了可定制和可对话的Agent,利用 LLM 的最强功能,如 GPT-4,同时通过与人和工具集成以及通过自动聊天在多个Agent之间进行对话来解决它们的局限性。
Autogen 使用Multi-Agent会话启用复杂的基于 LLM 的工作流,典型的示例如下:
左图代表基于AutoGen生成的可定制Agent,可以基于LLM、工具、人,甚至它们的组合。右上代表了Agent可以通过对话来解决任务,右下表示Autogen支持许多额外的复杂对话模式。
使用 AutoGen,构建一个复杂的Multi-Agent会话系统可以归结为:
这两个步骤都是模块化的,使这些Agent可重用和可组合。例如,要构建一个基于代码的问答系统,可以设计Agent及其交互,这样的系统可以减少应用程序所需的手动交互次数。一个解决代码中问题的工作流如下图所示:
commander接收用户提出的问题,并与writer和saftguard协调。writer编写代码并进行解释,tguard确保安全,commander执行代码。如果出现问题,该过程可以重复,直到问题得到解决。
AutoGen 中的Agent具有由 LLM、人工、工具或这些元素混合启用的功能。例如:
使用 AutoGen 助理Agent的一种简单方法是调用助理Agent和用户Agent之间的自动聊天,可以很容易地构建一个增强版的 ChatGPT + Code Interpreter + 插件(如下图所示),该插件具有可定制的自动化能力,可以在定制环境中使用,还可嵌入到更大的系统中。
在上图中,助理Agent扮演人工智能助理的角色,比如必应聊天。用户代理Agent扮演用户的角色,并模拟用户的行为,例如代码执行。AutoGen 将两个Agent之间的聊天进行自动化处理,同时允许人工反馈或干预。用户Agent无缝地与人类互动,并在适当的时候使用工具。
以Agent会话为中心的设计有许多好处,包括:
AutoGen 支持自动聊天和多样化的通信模式,使其易于编排复杂、动态的工作流程和实验的多功能性,在下图中,使用了一个称为“ GroupChatManager”的特殊Agent来支持多个Agent之间的群组聊天。
GroupChatManager是一个 特殊代理,它重复以下三个步骤: 选择一个演讲者(在本例中为 Bob) ,请演讲者做出回应,并将选定演讲者的信息广播给所有其他代理。
总而言之,AutoGen被设计为构建 LLM应用程序的通用基础设施。其对话模式几乎支持现有LLM系统的所有模式类型,在“静态”模式下 ,无论输入如何,Agent的拓扑结构都保持不变。AutoGen允许灵活的对话模式,包括可以根据不同的应用程序需求进行定制的静态和动态模式。其Multi-Agent系统可以执行LLM生成的代码,允许在系统执行过程中的人员参与。
Autogen 在github上提供了很多有意思的示例,这里以https://github.com/microsoft/autogen/blob/main/notebook/agentchathumanfeedback.ipynb 为例,简单介绍一下如何使用Autogen 生成基于Multi-Agent会话的应用实例——代码生成、执行、调试和人工反馈的任务解决。
AutoGen要求Python 版本大于3.8,安装如下:
pip install pyautogen
只需几行代码,您就可以快速实现强大的体验:
import autogen
config_list = autogen.config_list_from_json("OAI_CONFIG_LIST")
config_list 的参考文件如下:
config_list = [
{
'model': 'gpt-4',
'api_key': '<your OpenAI API key here>',
}, # OpenAI API endpoint for gpt-4
{
'model': 'gpt-4',
'api_key': '<your first Azure OpenAI API key here>',
'api_base': '<your first Azure OpenAI API base here>',
'api_type': 'azure',
'api_version': '2023-06-01-preview',
}, # Azure OpenAI API endpoint for gpt-4
{
'model': 'gpt-4',
'api_key': '<your second Azure OpenAI API key here>',
'api_base': '<your second Azure OpenAI API base here>',
'api_type': 'azure',
'api_version': '2023-06-01-preview',
}, # another Azure OpenAI API endpoint for gpt-4
{
'model': 'gpt-3.5-turbo',
'api_key': '<your OpenAI API key here>',
}, # OpenAI API endpoint for gpt-3.5-turbo
{
'model': 'gpt-3.5-turbo',
'api_key': '<your first Azure OpenAI API key here>',
'api_base': '<your first Azure OpenAI API base here>',
'api_type': 'azure',
'api_version': '2023-06-01-preview',
}, # Azure OpenAI API endpoint for gpt-3.5-turbo
{
'model': 'gpt-3.5-turbo',
'api_key': '<your second Azure OpenAI API key here>',
'api_base': '<your second Azure OpenAI API base here>',
'api_type': 'azure',
'api_version': '2023-06-01-preview',
}, # another Azure OpenAI API endpoint for gpt-3.5-turbo
]
# create an AssistantAgent instance named "assistant"
assistant = autogen.AssistantAgent(
name="assistant",
llm_config={
"seed": 41,
"config_list": config_list,
}
)
# create a UserProxyAgent instance named "user_proxy"
user_proxy = autogen.UserProxyAgent(
name="user_proxy",
human_input_mode="ALWAYS",
is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),
)
# the purpose of the following line is to log the conversation history
autogen.ChatCompletion.start_logging()
调用用户Agent的initiate_chat()方法来启动对话。运行下面的代码时,收到助理Agent的消息后,系统将提示用户提供反馈。如果用户没有提供任何反馈(直接按Enter键),用户Agent将尝试代表用心执行助理Agent建议的代码,当助理代理在消息末尾发送“terminate”信号时则终止。
math_problem_to_solve = """
Find $a + b + c$, given that $x+y \\neq -1$ and
\\begin{align}
ax + by + c & = x + 7,\\
a + bx + cy & = 2x + 6y,\\
ay + b + cx & = 4x + y.
\\end{align}.
"""
# the assistant receives a message from the user, which contains the task description
user_proxy.initiate_chat(assistant, message=math_problem_to_solve)
用户可以在每个步骤提供反馈。执行的结果和错误消息返回给助手,助理Agent能够根据反馈修改代码。最后,任务完成,助理Agent发出“TERMINATE”(终止)信号。用户最终跳过了反馈,对话结束。
对话结束后,可以通过autogen.ChatCompletion.logged_history保存两个Agent之间的对话日志。
json.dump(autogen.ChatCompletion.logged_history, open("conversations.json", "w"), indent=2)
这个示例演示了如何使用AssistantAgent和UserProxyAgent来解决一个具有挑战性的数学问题。这里的AssistantAgent是一个基于LLM的Agent,它可以编写Python代码执行用户的给定任务。UserProxyAgent是另一个Agent,它充当用户执行AssistantAgent编写的代码的代理。通过正确设置humaninputmode,UserProxyAgent还可以提示用户向AssistantAgent提供反馈。例如,当humaninputmode设置为“ALWAYS”时,UserProxyAgent将始终提示用户进行反馈。当提供用户反馈时,UserProxyAgent将直接将反馈传递给AssistantAgent。当没有提供用户反馈时,UserProxyAgent将执行AssistantAgent编写的代码,并将执行结果(成功或失败以及相应的输出)返回给AssistantAgent。
Agent 是与大模型主动交互的一种重要程序形式,而Multi-Agent则是多个Agent利用大模型完成复杂任务的系统机制。微软的AutoGen 是一个开源的、社区驱动、面向Multi-Agent会话的项目,还在在积极发展中。AutoGen 旨在为开发者提供一个有效且易于使用的框架来构建下一代应用程序,并且已经展示了构建创造性应用程序的良好机会,为创新提供了广阔的空间。