LLM 代理

基于LLM的代理,以下简称LLM代理,涉及通过使用将LLM与规划和记忆等关键模块相结合的架构来执行复杂任务的LLM应用。在构建LLM代理时,LLM作为主控制器或“大脑”,控制完成任务或用户请求所需的操作流程。LLM代理可能需要诸如规划、记忆和工具使用等关键模块。

为了更好地激发LLM代理的实用性,假设我们有兴趣构建一个系统,可以帮助回答以下问题:

2023年美国每日平均卡路里摄入量是多少?

上述问题可能可以通过一个已经具备直接回答问题所需知识的LLM来解答。如果LLM没有相关的知识来回答问题,可以使用一个简单的RAG系统,其中LLM可以访问健康相关的信息或报告。现在让我们给系统一个更复杂的问题,如下所示:

过去十年中,美国成年人平均每日卡路里摄入量的趋势如何变化,这可能对肥胖率产生什么影响?此外,您能否提供这一时期肥胖率趋势的图形表示?

要回答这样的问题,仅使用LLM是不够的。你可以将LLM与外部知识库结合,形成一个RAG系统,但这可能仍然不足以回答上述复杂查询。这是因为上述复杂问题需要LLM将任务分解为子部分,这些子部分可以使用工具和一系列操作流程来解决,从而得出所需的最终响应。一个可能的解决方案是构建一个LLM代理,该代理可以访问搜索API、健康相关出版物以及公共/私人健康数据库,以提供与卡路里摄入和肥胖相关的信息。

此外,LLM 将需要访问一个“代码解释器”工具,该工具有助于获取相关数据以生成有用的图表,帮助理解肥胖趋势。这些是假设的 LLM 代理可能的高级组件,但仍有一些重要的考虑因素,例如制定解决任务的计划,以及可能访问一个内存模块,帮助代理跟踪操作流程的状态、观察结果和整体进展。

🎓

了解更多关于基于LLM的代理和高级提示方法在我们新的AI课程中。立即加入!(在新标签页中打开)

使用代码 PROMPTING20 可额外享受 20% 的折扣。

LLM 代理框架

"LLM Agent Framework"

一般来说,一个LLM代理框架可以包含以下核心组件:

  • 用户请求 - 用户的问题或请求
  • 代理/大脑 - 作为协调者的代理核心
  • 规划 - 协助代理规划未来的行动
  • 内存 - 管理代理的过去行为

代理

一个具有通用能力的大型语言模型(LLM)作为系统的主脑、代理模块或协调者。该组件将通过一个提示模板激活,该模板包含有关代理如何操作以及它将访问的工具(包括工具详细信息)的重要细节。

虽然不是强制性的,但可以为代理进行画像或分配角色以定义其角色。这些画像信息通常写在提示中,可以包括角色细节、个性、社交信息和其他人口统计信息等具体细节。根据[Wang et al. 2023],定义代理画像的策略包括手工制作、LLM生成或数据驱动。

规划

无反馈规划

规划模块有助于分解代理将单独解决的必要步骤或子任务,以回答用户请求。这一步骤对于使代理能够更好地推理问题并可靠地找到解决方案非常重要。规划模块将利用LLM来分解一个详细的计划,该计划将包括帮助解决用户问题的子任务。任务分解的流行技术包括思维链 (在新标签页中打开)思维树 (在新标签页中打开),它们可以分别归类为单路径推理和多路径推理。下图比较了Wang等人,2023 (在新标签页中打开)中形式化的不同策略:

"LLM Agent Planning"

带反馈的规划

上述规划模块不涉及任何反馈,这使得实现长期规划以解决复杂任务变得具有挑战性。为了应对这一挑战,您可以利用一种机制,使模型能够基于过去的行动和观察迭代地反思和改进执行计划。目标是纠正和改进过去的错误,这有助于提高最终结果的质量。这在复杂的现实世界环境和任务中尤为重要,在这些环境中,试错是完成任务的关键。两种流行的反思或批评机制方法包括ReAct (在新标签页中打开)Reflexion (在新标签页中打开)

作为一个例子,ReAct结合了推理和行动,旨在通过在一系列步骤(重复N次)之间交替进行,使LLM能够解决复杂任务:ThoughtActionObservation。ReAct以观察的形式从环境中接收反馈。其他类型的反馈可以包括人类和模型的反馈。下图展示了ReAct的一个例子以及执行问题回答所涉及的不同步骤:

"ReAct Agent"

了解更多关于ReAct的信息:

内存

内存模块帮助存储代理的内部日志,包括过去的思考、行动和来自环境的观察,包括代理和用户之间的所有交互。在LLM代理文献中报告了两种主要的内存类型:

  • 短期记忆 - 包括关于代理当前情况的环境信息;这通常通过上下文学习实现,这意味着由于上下文窗口的限制,它是短暂且有限的。
  • 长期记忆 - 包括代理过去的行为和思想,这些需要在较长时间内保留和回忆;这通常利用一个通过快速和可扩展检索访问的外部向量存储,根据需要为代理提供相关信息。

混合记忆集成了短期记忆和长期记忆,以提高代理在长期推理和经验积累方面的能力。

在构建代理时,还需要考虑不同的记忆格式。代表性的记忆格式包括自然语言、嵌入、数据库和结构化列表等。这些也可以组合使用,例如在《我的世界》中的幽灵(GITM (在新标签页中打开))中,它使用了一种键值结构,其中键由自然语言表示,值由嵌入向量表示。

规划和记忆模块都允许代理在动态环境中操作,并使其能够有效地回忆过去的行为并规划未来的行动。

工具

工具对应于一组工具,使LLM代理能够与外部环境(如Wikipedia搜索API、代码解释器和数学引擎)进行交互。工具还可以包括数据库、知识库和外部模型。当代理与外部工具交互时,它通过工作流执行任务,帮助代理获取观察结果或必要信息以完成子任务并满足用户请求。在我们最初的健康相关查询中,代码解释器是一个执行代码并生成用户请求的必要图表信息的工具示例。

LLMs以不同的方式利用工具:

"HuggingGPT"

LLM 代理应用

"ChemCrow" ChemCrow代理旨在完成有机合成、药物发现和材料设计等任务。图源:Bran等人,2023年

在本节中,我们重点介绍了基于LLM的代理因其复杂的推理和常识理解能力而被有效应用的领域和案例研究示例。

著名的基于LLM的代理

LLM 代理工具

"AutoGen" AutoGen 功能;图源:https://microsoft.github.io/autogen (在新标签页中打开)

以下是用于构建LLM代理的工具和框架的显著示例:

LLM 代理评估

"" AgentBench基准测试用于评估LLM-as-Agent在现实世界挑战和8种不同环境中的表现。图源:Liu等,2023年

与评估LLM本身类似,评估LLM代理也是一项具有挑战性的任务。根据Wang等人(2023年)的研究,常见的评估方法包括:

挑战

LLM代理仍处于起步阶段,因此在构建它们时仍存在许多挑战和限制:

  • 角色扮演能力: 基于LLM的代理通常需要适应一个角色以有效地完成领域内的任务。对于LLM没有很好描述的角色,可以在代表不常见角色或心理特征的数据上对LLM进行微调。
  • 长期规划和有限的上下文长度:在长时间的历史中进行规划仍然是一个挑战,可能会导致代理无法从中恢复的错误。LLMs 在支持的上下文长度上也有限制,这可能会限制代理的能力,例如利用短期记忆。
  • 广义人类对齐:将代理与多样化的人类价值观对齐也是一项挑战,这在标准LLM中也很常见。一个潜在的解决方案涉及通过设计先进的提示策略来重新对齐LLM的可能性。
  • 提示的鲁棒性和可靠性:一个LLM代理可能涉及多个提示,这些提示旨在为不同的模块(如记忆和规划)提供动力。在LLM中,即使对提示进行最轻微的更改,也常常会遇到可靠性问题。LLM代理涉及整个提示框架,这使得它更容易出现鲁棒性问题。潜在的解决方案包括通过试错法设计提示元素、自动优化/调整提示,或使用GPT自动生成提示。LLM的另一个常见问题是幻觉,这在LLM代理中也很普遍。这些代理依赖于自然语言与外部组件进行交互,这些外部组件可能会引入冲突信息,导致幻觉和事实性问题。
  • 知识边界: 类似于可能导致幻觉或事实性问题的知识不匹配问题,控制大型语言模型(LLMs)的知识范围具有挑战性,这可能会显著影响模拟的有效性。具体来说,LLM的内部知识可能会引入偏见或利用用户未知的知识,这可能会影响代理在特定环境中操作时的行为。
  • 效率: LLM代理涉及大量由LLM处理的请求,这可能会影响代理操作的效率,因为它将严重依赖于LLM的推理速度。在部署多个代理时,成本也是一个需要考虑的问题。

参考文献