目录
什么是大模型 Agent ?
大模型Agent 有哪些部分组成?
规划(Planning)
Planning类型
不依赖反馈的计划
基于反馈的计划
拆解子目标和任务分解方法
COT
TOT
GOT
LLM+P
反思和完善
ReAct(融合推理与执行的能力)
Reflexion(动态记忆和自我反思)
记忆(Memory)
结构划分
格式划分
操作划分
工具(Tools)
Tools use
1. 函数描述【工具声明】
2. 调用 LLM 获得函数的请求参数【工具(集合)初始化】
3. 调用函数【执行工具】
行动(Action)
Agent的挑战
角色适应性问题
上下文长度限制
提示的鲁棒性
知识边界的控制
效率和成本问题
参考
什么是大模型 Agent ?
大模型 Agent,作为一种人工智能体,是具备环境感知能力、自主理解、决策制定及执行行动能力的智能实体。智能体是一种通用问题解决器。从软件工程的角度看来,智能体是一种基于大语言模型的,具备规划思考能力、记忆能力、自主调用函数的能力,能自主完成给定任务的计算机程序。
大模型Agent 有哪些部分组成?
在基于 LLM 的智能体中,LLM 的充当着智能体的“大脑”的角色,同时还有 4 个关键部分:如下图所示,Agent 共由4个关键部分组成:规划(Planning)、记忆(Memory)、工具(Tools)、行动(Action),下面详细剖析。
规划(Planning)
智能体会把大型任务分解为子任务,并规划执行任务的流程。智能体会对任务执行的过程进行思考和反思,决定是继续执行任务,或判断任务完结并终止运行。
Planning类型
大致分为两种类型,一种是不依赖反馈的计划,另一种则是基于反馈的计划。
不依赖反馈的计划
特点:
- 不参考执行反馈:在计划制定和执行过程中,不依赖于任务执行后的即时反馈。
- 预先确定:计划在执行前就已经完全确定,不随执行过程中的变化而调整。
常用策略:
- 单路径推理:
- 类似于决策树中的单路径探索,每一步都基于当前状态和预定规则或策略选择下一步行动,直到达到目标状态。
- 优点:简单直接,计算量相对较小。
- 缺点:对不确定性和动态变化的环境适应性差。
- 多路径推理:
- 生成多个可能的计划路径,并考虑不同路径之间的转换可能性。
- 优点:灵活性高,能应对一定的不确定性。
- 缺点:计算复杂度高,需要更多的计算资源。
- 使用外部规划器:
- 利用专门的规划算法(如A*、Dijkstra算法等)或规划系统(如HTN规划器)来搜索最优或可行的计划。
- 优点:能够找到高质量的解决方案,适用于复杂问题。
- 缺点:依赖于外部系统和算法的性能,可能需要大量的预处理和计算。
基于反馈的计划
特点:
- 动态调整:根据任务执行过程中的实时反馈来动态调整计划。
- 适应性强:能够很好地应对不确定性和动态变化的环境。
反馈来源:
- 任务执行结果的客观反馈:如传感器数据、任务完成状态等。
- 人的主观判断:在人类参与的任务中,根据人类的评价和指示来调整计划。
- 辅助模型提供的反馈:通过模拟、预测或分析等手段生成的反馈,用于优化计划。
优势:
- 提高系统在不确定性和复杂环境中的适应性和鲁棒性。
- 能够更好地应对突发情况和意外事件。
挑战:
- 需要实时处理和分析反馈数据,对系统的实时性要求较高。
- 在高度动态和复杂的环境中,反馈可能不完全准确或存在延迟,增加了规划的难度。
我们希望智能体也拥有类似人类规划能力的思维模式,因此可以通过 LLM 提示工程,为智能体赋予这样的思维模式。
在智能体中,最重要的是让 LLM 具备这以下两个能力:
- 子任务分解;
- 反思和完善。
拆解子目标和任务分解方法
通过大模型提示工程,比如:ReAct、CoT 推理模式,可赋予智能体类似思维模式,精准拆解复杂任务,分步解决。
COT
原论文:https://arxiv.org/pdf/2201.11903.pdf
关于使用COT:在现在应该是大模型本身就应该具备的能力,只需要在Prompt 中添加了一句 “Let's Step by Step” ,将艰难的任务分解成更小,更简单的步骤。CoT将大型任务转化为多个可管理的任务,并对模型的思维过程进 行了阐释。
Self-consistency with CoT(CoT的自我一致性)
原论文:https://arxiv.org/pdf/2203.11171.pdf
一种CoT在实际应用中的方案是:Self-consistency with CoT(CoT的自我一致性)。简单地要求模型对同一提示进行多次回答,并将多数结果作为最终答案。 它是CoT(Chain of Thought)的后续方法。
TOT
原论文:https://arxiv.org/pdf/2305.10601.pdf
具体结构图如下:虚线左边为基本Prompt、CoT以及CoT Self Consisitency,虚线右边为ToT。
从原始输入开始,在思维链的每一步,采样多个分支。逐渐形成树状结构,对每一个分支进行评估,然后在合适的分支上进行搜索。这就是ToT思维树的基本过程,进一步扩展CoT,在每一步都探索多种推理的可能性。它首先将问题分解为多个思考步骤,并在每个步骤中生成多个思考,从而创造一个树形结构。搜索过程可以是BFS(广度优先搜索)或DFS(深度优先搜索),每个状态由分类器(通过一个prompt)或少数服从多数的投票原则来决定。
任务分解可通过以下几种方式实现:
a. 给LLM一个简单的提示词“Steps for XYZ.\n1.”,“What are the subgoals for achieving XYZ?”;
b. 使用针对具体任务的指令,例如对一个写小说的任务先给出“Write a story outline.”指令;
c. 使用者直接输入;
GOT
原论文:https://arxiv.org/pdf/2308.09687
Graph of Thoughts:同时支持多链、树形以及任意图形结构的Prompt方案,支持各种基于图形 的思考转换,如聚合、回溯、循环等,这在CoT和ToT中是不可表达的。将复杂问题建模为操作图 (Graph of Operations,GoO),以LLM作为引擎自动执行,从而提供解决复杂问题的能力。某种程度上,GoT囊括了单线条的CoT和多分枝的ToT。
无论是CoT还是ToT,本质上是通过Prompt的精心设计,激发出模型原有的Metacognition,只是如何通过某条神经元的线索能更加精准的调动出大脑中最擅长Planning的部分
LLM+P
原论文:https://arxiv.org/pdf/2304.11477
通过借助一个外部的经典Planner来进行一个更加长序列的整体规划。这种方法利用规划域定义语言(Planning Domain Definition Language, PDDL)作为中间接口来描述规划问题。这是第一个将经典规划器的优点纳入 LLM 的框架。LLM+P 接收一个规划问题的自然语言描述,然后用自然语言返回一个解决该问题的正确(或最优)计划。LLM+P的做法是,首先将语言描述转换为用规划域定义语言(Planning Domain Definition Language)编写的文件,然后利用经典规划器快速找到一个解决方案,再将找到的解决方案翻译成自然语言。根本上讲, Planning Step是外包给外部工具的,当然也有一个前提:需要有特定领域的PDDL和合适的 Planner。
作者还定义了一组不同的基准问题,这些问题取自常见的规划场景。通过对这些基准问题的全面实验,作者发现LLM+P能够为大多数问题提供最优的解决方案,而 LLM 甚至不能为大多数问题提供可行的计划。
LLM的强项: 大语言模型(如GPT、BERT等)在处理自然语言理解、生成以及处理非结构化问题上表现突出。它们可以推理、生成文本,并根据已有的上下文生成合理的方案,特别适合处理灵活且复杂的任务。
但是,LLM在面对长序列规划问题时(需要多步骤的复杂推理和任务执行)存在一定的局限性。由于LLM是概率模型,随着推理步骤的增加,预测错误的累积会导致模型在长序列任务中的性能下降。
Planner的强项: 经典规划器(如A*算法、基于图的规划器等)在处理结构化问题和长序列任务上具有优势。它们可以精确地规划和推理,确保在给定条件下找到最优的执行步骤,但它们往往需要明确的规则和约束来进行规划,对非结构化问题的处理能力较弱。
LLM+P 的协作:
- LLM作为任务的高层次决策器,用于理解自然语言描述的复杂任务,识别任务的核心要素,并生成一个初步的任务框架或序列。这一过程涉及到从任务描述中推断出目标、子目标和可能的策略。
- Planner则接管具体的规划细节部分,借助经典规划算法,完成复杂任务的长序列规划。在这个阶段,Planner会优化由LLM生成的高层次策略,确保每一步的合理性,并对长序列任务进行整体优化。
经典的Planner算法种类繁多,每种算法都有其特定的应用场景和优势:
- A*、Dijkstra和Bellman-Ford等算法适用于图搜索和路径规划问题。
- RRT和PRM在处理复杂、高维空间中的机器人运动规划方面表现出色。
- HSP、STRIPS、SAT规划器以及PDDL等用于处理更加复杂、基于任务执行的自动规划问题。
反思和完善
上述规划模块不涉及任何反馈,这使得实现解决复杂任务的长期规划变得具有挑战性。为了解决这一挑战,可以利用一种机制,使模型能够根据过去的行动和观察反复思考和细化执行计划。目标是纠正并改进过去的错误,这有助于提高最终结果的质量。同时反思任务是否已经完成,并终止任务。这在复杂的现实世界环境和任务中尤其重要,其中试错是完成任务的关键。这种反思或批评机制的两种流行方法包括 ReAct 和 Reflexion。
ReAct(融合推理与执行的能力)
个人理解一下:CoT、ToT 都是作用在大模型本身的内在推理(Reason)过程上,而 ReAct 则是统筹整个系统,从推理过程,结合外部工具共同实现最终的目标(Reason + Action),通过结合推理(Reasoning)和行动(Acting)来增强推理和决策的效果。
- 推理(Reasoning): LLM 基于「已有的知识」或「行动(Acting)后获取的知识」,推导出结论的过程。
- 行动(Acting): LLM 根据实际情况,使用工具获取知识,或完成子任务得到阶段性的信息。
原论文:https://arxiv.org/pdf/2210.03629
以ReAct论文中那张图来看,可以更清晰的理解ReAct与CoT、ToT的区别:
对于ReAct这个框架可以理解为是一种结合了推理和行动的新型人工智能框架,主要用于增强AI系统在复杂环境中的决策能力和执行效率。ReAct框架的核心思想是通过实时检索相关信息和执行基于这些信息的行动,来辅助AI系统进行更准确的推理和决策。
为什么结合推理和行动,就会有效增强 LLM 完成任务的能力?
- 仅推理(Reasoning Only):LLM 仅仅基于已有的知识进行推理,生成答案回答这个问题。很显然,如果 LLM 本身不具备这些知识,可能会出现幻觉,胡乱回答一通。
- 仅行动(Acting Only): 大模型不加以推理,仅使用工具(比如搜索引擎)搜索这个问题,得出来的将会是海量的资料,不能直接回到这个问题。
- 推理+行动(Reasoning and Acting): LLM 首先会基于已有的知识,并审视拥有的工具。当发现已有的知识不足以回答这个问题,则会调用工具,比如:搜索工具、生成报告等,然后得到新的信息,基于新的信息重复进行推理和行动,直到完成这个任务。其推理和行动的步骤会是如下这样:
在ReAct框架中,AI系统不仅依赖于其预训练的知识,还会在遇到新情况时,主动检索外部信息(如数据库、网络资源等),并将这些信息整合到其决策过程中。这一过程可以看作是AI系统在“思考”(Reasoning)和“行动”(Acting)之间的循环,其中:
- 思考(Reasoning):AI系统基于当前状态和目标,进行推理和规划,确定下一步需要采取的行动或需要检索的信息。
- 行动(Acting):根据推理结果,AI系统执行相应的行动,如检索信息、执行任务等。
- 反馈:AI系统根据行动的结果,更新其状态和知识,然后再次进入思考阶段,形成一个闭环。
ReAct框架的优势在于,它使AI系统能够适应不断变化的环境,处理之前未见过的情况,而不仅仅是依赖于预训练数据。通过实时检索和整合新信息,AI系统可以做出更准确、更灵活的决策,提高其在复杂任务中的表现。
Reflexion(动态记忆和自我反思)
Reflexion是一个框架,旨在通过赋予智能体动态记忆和自我反思能力来提升其推理技巧。该方法采用标准的强化学习(RL)设置,其中奖励模型提供简单的二元奖励,行动空间遵循ReAct中的设置,即通过语言增强特定任务的行动空间,以实现复杂的推理步骤。每执行一次行动后,智能体会计算一个启发式评估,并根据自我反思的结果,可选择性地重置环境,以开始新的尝试。启发式函数用于确定轨迹何时效率低下或包含幻觉应当停止。效率低下的规划指的是长时间未成功完成的轨迹。幻觉定义为遭遇一系列连续相同的行动,这些行动导致在环境中观察到相同的结果。详细可以参考【Reflextion论文总结】-CSDN博客
原论文:https://arxiv.org/pdf/2303.11366
记忆(Memory)
Memory在Agent系统中扮演重要角色,它存储和组织从环境中获取的信息,以指导未来行动。
结构划分
结构上,内存模块通常包含短期记忆和长期记忆两个部分。短期记忆暂存最近的感知,长期记忆存储重要信息供随时检索。
- 短期记忆:指在执行任务的过程中的上下文,会在子任务的执行过程产生和暂存,在任务完结后被清空;例如,记住一个电话号码直到拨打完毕。
- 长期记忆:指长时间保留的信息(为Agent提供保留和召回长期信息的能力),一般是指外部知识库,通常用向量数据库来存储和检索。【长期记忆可以进一步分为显性记忆和隐性记忆。显性记忆,可以有意识地回忆和表达的信息,显性记忆又可以分为
情景记忆(个人经历的具体事件)和语义记忆(一般知识和概念)。隐性记忆,这种记忆通常是无意识的,涉及技能和习惯,如骑自行车或打字。】
短期记忆和长期记忆的对比
特性 | 短期记忆 | 长期记忆 |
---|---|---|
生命周期 | 对话或任务期间,短期有效 | 跨对话和任务,长期有效 |
存储位置 | 内存、缓存、内存数据库、对话管理器上下文存储 | 关系型数据库、NoSQL、向量存储、知识图谱、对象存储 |
访问速度 | 快速访问(通常在内存中) | 稍慢(通常持久化存储在数据库) |
数据类型 | 当前上下文、临时信息 | 用户偏好、历史记录、关系信息等 |
典型应用场景 | 多轮对话中的上下文追踪 | 跨会话的个性化服务、个性偏好、长期用户信息 |
示例技术 | Redis、内存数据库、对话管理上下文 | MySQL、MongoDB、FAISS、Neo4j、ES |
格式划分
格式上,内存信息可以用自然语言表达,也可以编码为向量嵌入提高检索效率,还可以利用数据库存储,或组织为结构化列表表示内存语义。
- 自然语言:内存信息有时可以用自然语言表达,这种方式对于人类易于理解和解释,但在机器处理时可能效率较低。
- 向量嵌入:为了提高检索效率,内存信息常被编码为向量嵌入(Vector Embeddings)。向量嵌入能够将信息映射到高维空间中的点,通过计算点之间的距离来评估信息的相似度,从而实现高效的检索和匹配。
- 数据库和结构化列表:对于需要精确管理和高效查询的信息,可以使用数据库或结构化列表来组织内存。这种方式不仅便于信息的存储和检索,还能够清晰地表达内存信息的语义关系。
操作划分
操作上,主要通过记忆读取、写入和反射三种机制与环境交互。读取提取相关信息指导行动,写入存储重要信息,反射总结见解提升抽象水平。
- 记忆读取(Read):Agent通过读取内存中的信息来提取相关知识,以指导其行动。以确保Agent能够获取到最相关和最有用的信息。
- 记忆写入(Write):当Agent从环境中获取到新信息或学习到新知识时,它需要将这些信息写入到内存中。写入操作可以是对短期记忆的更新,也可以是将重要信息存储到长期记忆中,以便将来使用。
- 记忆反射(Reflection):记忆反射是Agent对内存信息进行总结和抽象的过程。通过反思过去的经验和知识,Agent可以提炼出更高层次的见解和规律,从而提升其决策能力和适应性。这种过程类似于人类的反思和学习过程,是Agent实现智能的关键环节之一。
工具(Tools)
LLM 是数字世界中的程序,想要与现实世界互动、获取未知的知识,或是计算某个复杂的公式等,都离不开不工具。所以我们需要为智能体配备各种工具以及赋予它使用工具的能力。
为智能体配备工具 API,比如:计算器、搜索工具、日历、数据库查询工具、调用外部API获取额外信息、 也可以是函数(function)、软件开发工具包(sdk)、ChatPDF 解析文档插件、Midjourey 文生图多模态等。有了这些工具 API,智能体就可以是物理世界交互,解决实际的问题。
在智能体中,工具就是函数(Function),工具使用就是调用函数(Call Function)。在 LLM 中实现函数调用,使用到 LLM 的Function Calling能力。
Tools use
Function Calling 是一种实现大型语言模型连接外部工具的机制。通过 API 调用 LLM 时,调用方可以描述函数,包括函数的功能描述、请求参数说明、响应参数说明,让 LLM 根据用户的输入,合适地选择调用哪个函数,同时理解用户的自然语言,并转换为调用函数的请求参数(通过 JSON 格式返回)。调用方使用 LLM 返回的函数名称和参数,调用函数并得到响应。最后,如果需求,把函数的响应传给 LLM,让 LLM 组织成自然语言回复用户。
function calling 具体工作流程如下图所示:
不同 LLM 的 API 接口协议会有所不同,一文带你了解大模型——智能体(Agent)中详细展示了如何以OpenAI 的 API 协议为例,实现 Function Calling。下面简单的概述一下使用Function Calling需要的步骤:
1. 函数描述【工具声明】
假设你的函数(可以自行编码实现,也可以通过调用外部 API 实现)已经被实现,我们需要向 LLM 描述这个函数,函数描述的必备要素:
- 函数名
- 函数的功能描述
- 函数的请求参数说明
- 函数的响应参数说明(可选)
2. 调用 LLM 获得函数的请求参数【工具(集合)初始化】
Function Calling 是通过请求 LLM 的 chat API 实现的,在支持 Function Calling 模型的 chat API 参数中,会有一个 functions 参数 (或 tools,不同 LLM 的参数会有所不同) ,通过传入这个参数,大模型则会知道拥有哪些参数可供使用。并且会根据用户的输入,推理出应该调用哪些函数,并将自然语言转成函数的请求参数,返回给请求方。
3. 调用函数【执行工具】
调用方获得 LLM 返回的函数调用信息(函数名称和调用参数)后,自行调用函数,并得到函数执行的响应。如果有需要,还可以把函数执行的响应追加到 chat API 的对话中传给 LLM,让 LLM 组织成自然语言回复用户。
除了使用Function calling,还有MRKL、Toolformer、HuggingGPT等方法,详细可以参考——“AI”科普丨一文带你了解基于大模型的Agent。
行动(Action)
职责是依规划与记忆,使用工具执行具体行动。包括与外部互动或工具调用,实现输入至输出的转化。比如:智能客服回复、查询天气预报、预约会议等。
将抽象的决策转化为具体的行动,它就像是一个桥梁,连接了Agent的内部世界与外部环境。在执行任务时,需要考虑行动的目标、生成方式、应用范围以及可能产生的影响。
理想的行动应当是有目的,例如完成特定任务、与其他代理进行交流或者探索环境。行动的产生可以依赖于查询过去的记忆经验,或者遵循预设的计划。而行动的范围,不仅可以通过利用如API和知识库等外部工具来扩展,还需要发挥大型语言模型(LLM)的内在能力,例如规划、对话及理解常识等。架构就像PC的硬件,但仅依赖架构设计是不够的,我们还需要赋予Agent完成不同任务的能力,这些被视为“软件”资源。
在https://browse.arxiv.org/pdf/2308.11432论文中提出了几种方法,包括模型微调、提示工程和机械工程。其中提示工程应该是最为常见的一种形式了,我们常听说的提示词工程师就是在这个语境下的角色。
- 模型微调。使用特定任务数据对模型进行微调,提升相关能力。数据可以来自人类注释、LLM生成或实际应用中收集。这可以使Agent行为更符合人类价值观。
- 提示工程。通过自然语言描述向LLM灌输所需的能力,然后将描述作为提示指导Agent操作。这可以让Agent快速获得指定的软件能力。
- 机械工程。主要涵盖:
- 众包法:整合多个Agent的见解,形成更新的集体响应。
- 试错法:Agent先执行操作,根据效果调整行动,逐步优化。
- 经验积累法:Agent通过不断探索积累经验,逐步提升软件能力。
- 自我驱动法:Agent自主设置目标并在环境中不断探索,最终获得软件能力。
Agent的挑战
构建基于大型语言模型(LLM)的智能体是一个新兴领域,面临着众多挑战和限制。以下是几个主要的挑战及可能的解决方案:
角色适应性问题
智能体需要在特定领域内有效工作,对难以表征或迁移的角色,可以通过针对性地微调LLM来提高性能。这包括代表非常见角色或心理特征的能力提升。
上下文长度限制
有限的上下文长度限制了LLM的能力,尽管向量存储和检索提供了访问更大知识库的可能性。系统设计需要创新,以在有限的通信带宽内有效运作。
提示的鲁棒性
智能体的提示设计需要足够鲁棒,以防微小的变化导致可靠性问题。可能的解决方案包括自动优化调整提示或使用LLM自动生成提示。
知识边界的控制
控制LLM的内部知识,避免引入偏见或使用用户不知道的知识,是一个挑战。这要求智能体在处理信息时更加透明和可控。
效率和成本问题
LLM处理大量请求时的效率和成本是重要考量因素。优化 推理速度 和 成本效率 是提升多智能体系统性能的关键。
总的来说,基于LLM的智能体构建是一个复杂且多面的挑战,需要在多个方面进行创新和优化。持续的研究和技术发展对于克服这些挑战至关重要。
参考
https://www.51cto.com/article/766462.html
https://zhuanlan.zhihu.com/p/656683532
“AI”科普丨一文带你了解基于大模型的Agent
https://zhuanlan.zhihu.com/p/697706325
一文彻底理解大模型 Agent 智能体原理和案例_大模型agent-CSDN博客
Al Agent:大模型时代重要落地方向 - 大模型知识库|大模型训练|开箱即用的企业大模型应用平台|智能体开发|53AI
Agent : 一文读懂LLM Agent架构,详解Profile,Memory,Planning,Action模块作用-CSDN博客
“AI”科普丨一文带你了解基于大模型的Agent
LLM+P:赋予大语言模型最佳机器人规划能力-CSDN博客
Agent : 一文读懂LLM Agent架构,详解Profile,Memory,Planning,Action模块作用-CSDN博客
https://zhuanlan.zhihu.com/p/642360366
【Reflextion论文总结】-CSDN博客