深度讲解 LLM Agent 的核心原理、工具调用、规划能力等;高质量综述对 Agent 应用开发有重要参考价值
以 LLM(大语言模型)作为核心控制器来构建 AI 智能体,是一个很酷的概念。AutoGPT、GPT-Engineer 和 BabyAGI 等多个概念验证演示提供了富有启发性的示例。LLM 的潜力并不局限于生成文笔流畅的文案、故事、文章和程序;它还可以被构建为一种强大的通用问题求解器。
在由 LLM 驱动的自主 AI 智能体系统中,LLM 充当智能体的大脑,并由以下几个关键组件辅助:
规划 子目标与分解:智能体将大型任务拆解为更小、更易于管理的子目标,从而能够高效处理复杂任务。反思与改进:智能体可以对过去的行动进行自我批评和自我反思,从错误中学习,并在后续步骤中加以改进,从而提升最终结果的质量。
子目标与分解:智能体将大型任务拆解为更小、更易于管理的子目标,从而能够高效处理复杂任务。
反思与改进:智能体可以对过去的行动进行自我批评和自我反思,从错误中学习,并在后续步骤中加以改进,从而提升最终结果的质量。
记忆 短期记忆:我认为,所有上下文学习(参见提示工程)本质上都是在利用模型的短期记忆进行学习。长期记忆:它使智能体能够在较长时间内保留和回忆(无限量的)信息,通常通过外部向量存储和快速检索来实现。
短期记忆:我认为,所有上下文学习(参见提示工程)本质上都是在利用模型的短期记忆进行学习。
长期记忆:它使智能体能够在较长时间内保留和回忆(无限量的)信息,通常通过外部向量存储和快速检索来实现。
工具使用 智能体学习调用外部 API,以获取模型权重中缺失的额外信息(模型权重在预训练后通常很难修改),包括当前信息、代码执行能力、对专有信息源的访问权限等。
智能体学习调用外部 API,以获取模型权重中缺失的额外信息(模型权重在预训练后通常很难修改),包括当前信息、代码执行能力、对专有信息源的访问权限等。
复杂任务通常包含许多步骤。智能体需要知道这些步骤是什么,并提前做好规划。
思维链(Chain of Thought,CoT;Wei 等,2022)已经成为提升模型复杂任务表现的一种标准提示技术。模型会被要求“逐步思考”,从而利用更多测试时计算,将困难任务拆解为更小、更简单的步骤。CoT 将大型任务转化为多个易于管理的任务,并为理解模型的思考过程提供了线索。
思维树(Tree of Thoughts;Yao 等,2023)扩展了 CoT,在每个步骤中探索多种可能的推理路径。它首先将问题分解为多个思考步骤,并在每一步生成多个想法,从而形成树状结构。搜索过程可以采用 BFS(广度优先搜索)或 DFS(深度优先搜索),其中每个状态都由分类器(通过提示实现)或多数投票进行评估。
任务分解可以通过以下方式完成:(1)使用简单提示让 LLM 完成,例如 "Steps for XYZ.\n1."、"What are the subgoals for achieving XYZ?";(2)使用特定于任务的指令,例如在创作小说时使用 "Write a story outline.";或者(3)由人类提供输入。
另一种截然不同的方法 LLM+P(Liu 等,2023)依赖外部的经典规划器来完成长时程规划。这种方法使用规划领域定义语言(Planning Domain Definition Language,PDDL)作为描述规划问题的中间接口。在此过程中,LLM 首先(1)将问题转换为“Problem PDDL”,然后(2)请求经典规划器基于现有的“Domain PDDL”生成 PDDL 计划,最后(3)将 PDDL 计划转换回自然语言。从本质上讲,规划步骤被外包给了外部工具,其前提是存在特定领域的 PDDL 和合适的规划器——这在某些机器人系统中很常见,但在许多其他领域并不常见。
自我反思是一个至关重要的方面,它使自主 AI 智能体能够通过改进过去的行动决策和纠正先前的错误,实现迭代式提升。在不可避免需要反复试错的现实世界任务中,它发挥着关键作用。
ReAct(Yao 等,2023)通过将行动空间扩展为特定于任务的离散行动与语言空间的组合,把推理与行动整合到 LLM 中。前者使 LLM 能够与环境交互(例如使用 Wikipedia 搜索 API),后者则通过提示让 LLM 以自然语言生成推理轨迹。
ReAct 提示模板包含供 LLM 思考的显式步骤,其大致格式如下:
Thought: ...
Action: ...
Observation: ...
... (Repeated many times)
在知识密集型任务和决策任务的实验中,ReAct 的表现都优于仅采用行动的基线方法;后者移除了 Thought: … 步骤。
Reflexion(Shinn 与 Labash,2023)是一个为智能体配备动态记忆和自我反思能力、从而提升推理能力的框架。Reflexion 采用标准的 RL 设置,其中,奖励模型提供简单的二元奖励,行动空间则沿用 ReAct 的设置:在特定于任务的行动空间中加入语言,以支持复杂的推理步骤。执行每个行动 $a_t$ 后,智能体都会计算启发式值 $h_t$,并可以根据自我反思的结果选择重置环境,以开始新的尝试。
启发式函数用于判断轨迹何时效率低下或包含幻觉,并应当被终止。低效规划是指耗时过长却未能成功的轨迹。幻觉则被定义为遇到一系列连续且完全相同的行动,而这些行动在环境中产生了相同的观察结果。
自我反思通过向 LLM 展示两个样本示例来产生,每个示例都是一个二元组(失败的轨迹,用于指导未来计划变更的理想反思)。随后,最多三条反思会被添加到智能体的工作记忆中,用作查询 LLM 时的上下文。
后见之明链(Chain of Hindsight,CoH;Liu 等,2023)通过明确向模型展示一系列过去的输出,并为每个输出附加反馈,鼓励模型改进自己的输出。人类反馈数据是一个集合 $D_h = {(x, y_i , r_i , z_i)}{i=1}^n$,其中 $x$ 是提示,每个 $y_i$ 是模型生成的补全结果,$r_i$ 是人类对 $y_i$ 的评分,$z_i$ 是相应的、由人类提供的后见反馈。假设这些反馈元组按奖励排序,$r_n \geq r{n-1} \geq \dots \geq r_1$。该过程采用监督微调,其中数据是形如 $\tau_h = (x, z_i, y_i, z_j, y_j, \dots, z_n, y_n)$ 的序列,其中 $\leq i \leq j \leq n$。模型经过微调后,只在以序列前缀为条件的情况下预测 $y_n$,从而使模型能够根据反馈序列进行自我反思,并生成更好的输出。在测试时,模型还可以选择接收来自人类标注者的多轮指令。
为了避免过拟合,CoH 添加了一个正则化项,以最大化预训练数据集的对数似然。为了避免走捷径和复制(因为反馈序列中存在许多常见词语),训练期间会随机遮蔽过去 token 中的 0%–5%。
他们实验中使用的训练数据集由 WebGPT 比较数据、基于人类反馈的摘要数据和人类偏好数据集组合而成。
CoH 的理念是在上下文中呈现一段输出依次改进的历史,并训练模型沿着这种趋势生成更好的输出。算法蒸馏(Algorithm Distillation,AD;Laskin 等,2023)将相同的理念应用于强化学习任务中跨回合的轨迹,其中,一个算法被封装在以长历史为条件的策略中。考虑到智能体会与环境交互多次,并且在每个回合中都会取得少许进步,AD 会将这段学习历史拼接起来并输入模型。因此,我们可以预期,下一步预测的行动将比之前的尝试带来更好的表现。其目标是学习 RL 的过程,而不是训练任务特定策略本身。
该论文提出假设:任何能够生成一组学习历史的算法,都可以通过对行动执行行为克隆而被蒸馏到神经网络中。历史数据由一组源策略生成,每个源策略都针对特定任务进行训练。在训练阶段,每次运行 RL 时都会随机采样一个任务,并使用多回合历史的一个子序列进行训练,从而使学习到的策略与具体任务无关。
与三个基准进行比较,包括 ED(专家蒸馏,用专家轨迹而不是学习历史进行行为克隆)、源策略(由 UCB 用于为蒸馏生成轨迹)、RL^2(Duan et al. 2017;由于需要在线 RL 而用作上界),AD 尽管仅使用离线 RL 但展示了性能接近 RL^2 的上下文 RL,并且学习速度比其他基准快得多。当以源策略的部分训练历史为条件时,AD 的改进速度也比 ED 基准快得多。
(非常感谢 ChatGPT 帮助我起草这一部分。我在与 ChatGPT 的对话中学到了很多关于人脑和快速 MIPS 数据结构的知识。)
记忆可以定义为用于获取、存储、保留和稍后检索信息的过程。人脑中有几种类型的记忆。
感觉记忆:这是记忆的最早阶段,提供在原始刺激结束后保留感觉信息(视觉、听觉等)印象的能力。感觉记忆通常仅持续几秒钟。子类别包括标志性记忆(视觉)、回声记忆(听觉)和触觉记忆(触觉)。
感觉记忆:这是记忆的最早阶段,提供在原始刺激结束后保留感觉信息(视觉、听觉等)印象的能力。感觉记忆通常仅持续几秒钟。子类别包括标志性记忆(视觉)、回声记忆(听觉)和触觉记忆(触觉)。
短期记忆(STM)或工作记忆:它存储我们当前意识到的信息,这些信息是执行学习和推理等复杂认知任务所需的。短期记忆被认为具有约 7 项的容量(Miller 1956),持续 20-30 秒。
短期记忆(STM)或工作记忆:它存储我们当前意识到的信息,这些信息是执行学习和推理等复杂认知任务所需的。短期记忆被认为具有约 7 项的容量(Miller 1956),持续 20-30 秒。
长期记忆(LTM):长期记忆可以存储相当长时间的信息,从几天到几十年不等,具有本质上无限的存储容量。LTM 有两个子类型:
显性/陈述性记忆:这是对事实和事件的记忆,指的是可以有意识地回忆的那些记忆,包括情景记忆(事件和经历)和语义记忆(事实和概念)。
隐性/程序性记忆:这类记忆是无意识的,涉及自动执行的技能和例程,如骑自行车或在键盘上打字。
我们可以粗略地考虑以下映射:
感觉记忆作为学习原始输入的嵌入表示,包括文本、图像或其他模态;
短期记忆作为上下文学习。它是短期和有限的,因为它受限于 Transformer 的有限上下文窗口长度。
长期记忆作为智能体可以在查询时访问的外部向量存储,可通过快速检索访问。
外部记忆可以缓解有限注意力跨度的限制。标准做法是将信息的嵌入表示保存到可支持快速最大内积搜索(MIPS)的向量存储数据库中。为了优化检索速度,常见的选择是近似最近邻(ANN)算法,它返回大约前 k 个最近邻,以牺牲少量精度换取巨大的速度提升。
用于快速 MIPS 的几个常见 ANN 算法选择:
LSH(局部敏感哈希):它引入了一个哈希函数,使得相似的输入项以高概率映射到相同的桶中,其中桶的数量远小于输入的数量。
ANNOY(近似最近邻,哦是的):核心数据结构是随机投影树,一组二叉树,其中每个非叶节点表示将输入空间分成一半的超平面,每个叶子存储一个数据点。树是独立且随机构建的,因此在某种程度上,它模拟了哈希函数。ANNOY 搜索发生在所有树中,迭代搜索最接近查询的一半,然后汇总结果。这个想法与 KD 树相关,但可扩展性要高得多。
HNSW(分层可导航小世界):它受到小世界网络思想的启发,其中大多数节点可以通过少数几步从任何其他节点到达;例如社交网络的"六度分离"特征。HNSW 构建这些小世界图的分层层,其中底层包含实际数据点。中间层创建快捷方式以加快搜索。执行搜索时,HNSW 从顶层的随机节点开始,并向目标导航。当它无法更接近时,它向下移动到下一层,直到到达底层。上层中的每次移动可能覆盖数据空间中的大距离,下层中的每次移动细化搜索质量。
FAISS(Facebook AI 相似性搜索):它基于以下假设运行:在高维空间中,节点之间的距离遵循高斯分布,因此应该存在数据点的聚类。FAISS 通过将向量空间分割为簇,然后在簇内细化量化来应用向量量化。搜索首先用粗量化寻找簇候选,然后进一步用更精细的量化查看每个簇。
ScaNN(可扩展最近邻):ScaNN 的主要创新是各向异性向量量化。它将数据点 $x_i$ 量化为 $\tilde{x}_i$,使得内积 $\langle q, x_i \rangle$ 尽可能接近原始距离 $\angle q, \tilde{x}_i$,而不是选择最接近的量化质心点。
在 ann-benchmarks.com 上查看更多 MIPS 算法和性能比较。
工具使用是人类一个显著而独特的特征。我们创建、修改和利用外部对象来做超越我们物理和认知限制的事情。为 LLM 配备外部工具可以显著扩展模型功能。
MRKL(Karpas et al. 2022),是"Modular Reasoning, Knowledge and Language"(模块化推理、知识和语言)的缩写,是一个用于自主智能体的神经-符号架构。MRKL 系统被提议包含一个"专家"模块的集合,通用 LLM 充当路由器,将查询路由到最合适的专家模块。这些模块可以是神经模块(例如深度学习模型)或符号模块(例如数学计算器、货币转换器、天气 API)。
他们进行了一项实验,对 LLM 进行微调以调用计算器,将算术作为测试用例。他们的实验表明,解决口头数学问题比解决明确说明的数学问题更困难,因为 LLM(7B Jurassic1-large 模型)无法可靠地为基本算术提取正确的参数。结果突出了当外部符号工具可以可靠地工作时,知道何时以及如何使用工具是关键的,由 LLM 的能力决定。
TALM(工具增强型语言模型;Parisi et al. 2022)和 Toolformer(Schick et al. 2023)都对 LM 进行微调以学习使用外部工具 API。数据集根据新添加的 API 调用注释是否可以改进模型输出的质量而扩展。有关更多详细信息,请参见提示工程的"External APIs"部分。
ChatGPT Plugins 和 OpenAI API 函数调用是 LLM 配备工具使用功能的实际应用的好例子。工具 API 的集合可以由其他开发人员提供(如在插件中)或自定义(如在函数调用中)。
HuggingGPT(Shen 等,2023)是一个使用 ChatGPT 作为任务规划器的框架,它根据模型描述从 HuggingFace 平台选择可用模型,并基于执行结果汇总响应。
该系统包含 4 个阶段:
(1) 任务规划:LLM 充当大脑,将用户请求解析为多个任务。每个任务都有四个相关属性:任务类型、ID、依赖项和参数。他们使用少样本示例来引导 LLM 进行任务解析和规划。
(2) 模型选择:LLM 将任务分配给专家模型,并将请求组织成多项选择题的形式。LLM 会获得一个可供选择的模型列表。由于上下文长度有限,需要根据任务类型进行筛选。
(3) 任务执行:专家模型执行特定任务并记录结果。
(4) 响应生成:LLM 接收执行结果,并向用户提供汇总后的结果。
要将 HuggingGPT 应用于现实世界,还需要解决若干挑战:(1) 需要提高效率,因为 LLM 的多轮推理以及与其他模型的交互都会拖慢整个过程;(2) 它依赖较长的上下文窗口来传递复杂的任务内容;(3) 需要提高 LLM 输出和外部模型服务的稳定性。
API-Bank(Li 等,2023)是一个用于评估工具增强型 LLM 性能的基准。它包含 53 个常用 API 工具、一套完整的工具增强型 LLM 工作流,以及 264 段带标注的对话,其中涉及 568 次 API 调用。API 的选择非常多样,包括搜索引擎、计算器、日历查询、智能家居控制、日程管理、健康数据管理、账户身份验证工作流等。由于 API 数量众多,LLM 首先可以访问 API 搜索引擎以找到正确的待调用 API,然后使用相应文档完成调用。
在 API-Bank 工作流中,LLM 需要做出若干决策,而我们可以在每一步评估这些决策的准确程度。这些决策包括:
是否需要调用 API。
确定要调用的正确 API:如果效果不够好,LLM 需要迭代修改 API 输入(例如,为 Search Engine API 决定搜索关键词)。
根据 API 结果生成响应:如果对结果不满意,模型可以选择优化后再次调用。
该基准从三个级别评估智能体使用工具的能力:
Level-1 评估调用 API 的能力。给定一个 API 的描述,模型需要判断是否调用该 API、正确调用它,并对 API 返回结果作出恰当响应。
Level-2 考察检索 API 的能力。模型需要搜索可能满足用户需求的 API,并通过阅读文档学习如何使用它们。
Level-3 评估除检索和调用之外的 API 规划能力。面对不明确的用户请求(例如安排多人会议,或为一次旅行预订航班、酒店和餐厅),模型可能需要进行多次 API 调用才能解决问题。
ChemCrow(Bran 等,2023)是一个特定领域的示例,其中 LLM 通过 13 个由专家设计的工具得到增强,用于完成有机合成、药物发现和材料设计等领域的任务。该工作流使用 LangChain 实现,体现了前文所述的 ReAct 和 MRKLs,并将 CoT 推理与任务相关工具结合起来:
LLM 会获得一份工具列表,其中包含工具名称、用途描述,以及预期输入/输出的详细信息。
随后,系统会指示它在必要时使用所提供的工具回答用户给出的提示。指令建议模型遵循 ReAct 格式——Thought、Action、Action Input、Observation。
一个有趣的观察是,尽管基于 LLM 的评估认为 GPT-4 与 ChemCrow 的表现几乎相当,但由专家进行的人工评估更关注解决方案的完整性和化学正确性,结果表明 ChemCrow 大幅优于 GPT-4。这说明,在需要深厚专业知识的领域中,让 LLM 评估自身表现可能存在问题。专业知识的缺乏可能导致 LLM 意识不到自身缺陷,因而无法准确判断任务结果是否正确。
Boiko 等(2023)也研究了由 LLM 赋能、用于科学发现的智能体,以处理复杂科学实验的自主设计、规划和执行。这种智能体可以使用工具浏览互联网、阅读文档、执行代码、调用机器人实验 API,并利用其他 LLM。
例如,当收到“开发一种新型抗癌药物”的请求时,模型给出了以下推理步骤:
询问当前抗癌药物发现领域的趋势;
请求一个以这些化合物为靶标的骨架;
确定化合物后,模型尝试对其进行合成。
他们还讨论了相关风险,尤其是非法药物和生物武器方面的风险。他们构建了一个测试集,其中包含一份已知化学武器制剂的列表,并要求智能体合成它们。在 11 个请求中,有 4 个(36%)被接受并获得了合成方案,智能体还尝试查阅文档以执行该流程。11 个请求中有 7 个被拒绝;在这 7 个被拒绝的案例中,5 个是在 Web 搜索后被拒绝的,另有 2 个仅根据提示就被拒绝。
Generative Agents(Park 等,2023)是一项非常有趣的实验:25 个虚拟角色分别由一个 LLM 驱动的智能体控制,在一个受《The Sims》启发的沙盒环境中生活并互动。生成式智能体可以为交互式应用创造可信的人类行为模拟。
生成式智能体的设计将 LLM 与记忆、规划和反思机制相结合,使智能体能够根据过往经验采取行动,并与其他智能体互动。
记忆流:一个长期记忆模块(外部数据库),使用自然语言完整记录智能体的经历。每个元素都是一条观察,即由智能体直接提供的事件。—智能体间的交流可以触发新的自然语言陈述。
每个元素都是一条观察,即一个直接由智能体提供的事件。