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代理框架可以包含以下核心组件:
- 用户请求 - 用户的问题或请求
- 代理/大脑 - 作为协调者的代理核心
- 规划 - 协助代理规划未来的行动
- 内存 - 管理代理的过去行为
代理
一个具有通用能力的大型语言模型(LLM)作为系统的主脑、代理模块或协调者。该组件将通过一个提示模板激活,该模板包含有关代理如何操作以及它将访问的工具(包括工具详细信息)的重要细节。
虽然不是强制性的,但可以为代理进行画像或分配角色以定义其角色。这些画像信息通常写在提示中,可以包括角色细节、个性、社交信息和其他人口统计信息等具体细节。根据[Wang et al. 2023],定义代理画像的策略包括手工制作、LLM生成或数据驱动。
规划
无反馈规划
规划模块有助于分解代理将单独解决的必要步骤或子任务,以回答用户请求。这一步骤对于使代理能够更好地推理问题并可靠地找到解决方案非常重要。规划模块将利用LLM来分解一个详细的计划,该计划将包括帮助解决用户问题的子任务。任务分解的流行技术包括思维链 (在新标签页中打开)和思维树 (在新标签页中打开),它们可以分别归类为单路径推理和多路径推理。下图比较了Wang等人,2023 (在新标签页中打开)中形式化的不同策略:
带反馈的规划
上述规划模块不涉及任何反馈,这使得实现长期规划以解决复杂任务变得具有挑战性。为了应对这一挑战,您可以利用一种机制,使模型能够基于过去的行动和观察迭代地反思和改进执行计划。目标是纠正和改进过去的错误,这有助于提高最终结果的质量。这在复杂的现实世界环境和任务中尤为重要,在这些环境中,试错是完成任务的关键。两种流行的反思或批评机制方法包括ReAct (在新标签页中打开)和Reflexion (在新标签页中打开)。
作为一个例子,ReAct结合了推理和行动,旨在通过在一系列步骤(重复N次)之间交替进行,使LLM能够解决复杂任务:Thought
、Action
和Observation
。ReAct以观察的形式从环境中接收反馈。其他类型的反馈可以包括人类和模型的反馈。下图展示了ReAct的一个例子以及执行问题回答所涉及的不同步骤:
了解更多关于ReAct的信息:
内存
内存模块帮助存储代理的内部日志,包括过去的思考、行动和来自环境的观察,包括代理和用户之间的所有交互。在LLM代理文献中报告了两种主要的内存类型:
- 短期记忆 - 包括关于代理当前情况的环境信息;这通常通过上下文学习实现,这意味着由于上下文窗口的限制,它是短暂且有限的。
- 长期记忆 - 包括代理过去的行为和思想,这些需要在较长时间内保留和回忆;这通常利用一个通过快速和可扩展检索访问的外部向量存储,根据需要为代理提供相关信息。
混合记忆集成了短期记忆和长期记忆,以提高代理在长期推理和经验积累方面的能力。
在构建代理时,还需要考虑不同的记忆格式。代表性的记忆格式包括自然语言、嵌入、数据库和结构化列表等。这些也可以组合使用,例如在《我的世界》中的幽灵(GITM (在新标签页中打开))中,它使用了一种键值结构,其中键由自然语言表示,值由嵌入向量表示。
规划和记忆模块都允许代理在动态环境中操作,并使其能够有效地回忆过去的行为并规划未来的行动。
工具
工具对应于一组工具,使LLM代理能够与外部环境(如Wikipedia搜索API、代码解释器和数学引擎)进行交互。工具还可以包括数据库、知识库和外部模型。当代理与外部工具交互时,它通过工作流执行任务,帮助代理获取观察结果或必要信息以完成子任务并满足用户请求。在我们最初的健康相关查询中,代码解释器是一个执行代码并生成用户请求的必要图表信息的工具示例。
LLMs以不同的方式利用工具:
- MRKL (在新标签页中打开) 是一个将LLMs与专家模块结合的框架,这些专家模块可以是LLMs或符号模块(如计算器或天气API)。
- Toolformer (在新标签页中打开) 微调LLMs以使用外部工具API。
- Function Calling (在新标签页中打开) - 通过工具使用能力增强LLMs,这涉及定义一组工具API并将其作为请求的一部分提供给模型。
- HuggingGPT (在新标签页中打开) - 一个由LLM驱动的代理,利用LLM作为任务规划器,连接各种现有的AI模型(基于描述)来解决AI任务。
LLM 代理应用
ChemCrow代理旨在完成有机合成、药物发现和材料设计等任务。图源:Bran等人,2023年
在本节中,我们重点介绍了基于LLM的代理因其复杂的推理和常识理解能力而被有效应用的领域和案例研究示例。
著名的基于LLM的代理
- Ma et al. (2023) (在新标签页中打开) 分析了对话代理在心理健康支持方面的有效性,发现该代理可以帮助用户应对焦虑,但有时可能会产生有害内容。
- Horton (2023) (在新标签页中打开) 赋予基于LLM的代理禀赋、偏好和个性,以在模拟场景中探索人类经济行为。
- 生成代理 (在新标签页中打开) 和 代理模拟 (在新标签页中打开) 都旨在通过构建多个代理来模拟虚拟城镇中人类的日常生活。
- Blind Judgement (在新标签页中打开) 使用多种语言模型来模拟多位法官的决策过程;以优于随机准确率预测现实世界最高法院的决策。
- Ziems 等人 (2023) (在新标签页中打开) 提出了可以协助研究人员完成生成摘要、编写脚本和提取关键词等任务的代理。
- ChemCrow (在新标签页中打开) 是一个LLM化学代理,它利用与化学相关的数据库自主规划和执行驱虫剂、三种有机催化剂的合成,并指导发现新型发色团。
- [Boiko 等人 (2023)] 结合了多个 LLMs 来自动化科学实验的设计、规划和执行。
- Math Agents 帮助研究人员探索、发现、解决和证明数学问题。EduChat (在新标签页中打开) 和 CodeHelp (在新标签页中打开) 是另外两个为教育设计的LLM代理的显著例子。
- Mehta et al. (2023) (在新标签页中打开) 提出了一个交互式框架,使人类建筑师能够在3D模拟环境中与AI代理互动以构建结构。
- ChatDev (在新标签页中打开), ToolLLM (在新标签页中打开), MetaGPT (在新标签页中打开) 是显著的例子,展示了AI代理在自动化编码、调试、测试以及协助其他软件工程任务方面的潜力。
- D-Bot (在新标签页中打开) 一个基于LLM的数据库管理员,它不断积累数据库维护经验,并为数据库提供诊断和优化建议。
- IELLM (在新标签页中打开) 应用LLMs来解决石油和天然气行业的挑战。
- Dasgupta 等人 2023 (在新标签页中打开) 提出了一个统一的代理系统,用于具身推理和任务规划。
- OS-Copilot (在新标签页中打开) 一个框架,用于构建能够与操作系统(OS)中的各种元素进行交互的通才代理,包括网络、代码终端、文件、多媒体和各种第三方应用程序。
LLM 代理工具
AutoGen 功能;图源:https://microsoft.github.io/autogen (在新标签页中打开)
以下是用于构建LLM代理的工具和框架的显著示例:
- LangChain (在新标签页中打开): 一个用于开发由语言模型驱动的应用程序和代理的框架。
- AutoGPT (在新标签页中打开): 提供构建AI代理的工具。
- Langroid (在新标签页中打开): 简化了使用多代理编程构建LLM应用程序的过程:代理作为一等公民,通过消息协作完成任务。
- AutoGen (在新标签页中打开): 一个框架,支持使用多个代理开发LLM应用程序,这些代理可以相互对话以解决任务。
- OpenAgents (在新标签页中打开): 一个用于在野外使用和托管语言代理的开放平台。
- LlamaIndex (在新标签页中打开) - 一个用于将自定义数据源连接到大型语言模型的框架。
- GPT Engineer (在新标签页中打开): 自动化代码生成以完成开发任务。
- DemoGPT (在新标签页中打开): 自主AI代理,用于创建交互式Streamlit应用程序。
- GPT Researcher (在新标签页中打开): 一个为各种任务设计的全面在线研究的自主代理。
- AgentVerse (在新标签页中打开): 旨在促进在各种应用中部署多个基于LLM的代理。
- Agents (在新标签页中打开): 一个用于构建自主语言代理的开源库/框架。该库支持的功能包括长短期记忆、工具使用、网页导航、多代理通信,以及全新功能,如人机交互和符号控制。
- BMTools (在新标签页中打开): 使用工具扩展语言模型,并作为社区构建和共享工具的平台。
- crewAI (在新标签页中打开): 为工程师重新构想的AI代理框架,提供强大的功能,简化构建代理和自动化的过程。
- Phidata (在新标签页中打开): 一个用于使用函数调用构建AI助手的工具包。
LLM 代理评估
AgentBench基准测试用于评估LLM-as-Agent在现实世界挑战和8种不同环境中的表现。图源:Liu等,2023年
与评估LLM本身类似,评估LLM代理也是一项具有挑战性的任务。根据Wang等人(2023年)的研究,常见的评估方法包括:
- 人工标注: 包括人工评估者,他们直接对LLM结果在不同方面进行评分,这些方面在应用中很重要,如诚实性、帮助性、参与度、无偏见性等。
- 图灵测试:人类评估者被要求比较来自真实人类和代理的结果,其中无法区分的结果意味着代理可以达到类似人类的表现。
- 指标: 这些是精心设计的指标,反映了代理的质量。显著的指标包括任务成功指标、人类相似性指标和效率指标。
- 协议: 对应于常见的评估协议,这些协议决定了如何使用指标。示例包括现实世界模拟、社会评估、多任务评估和软件测试。
- Benchmarks: Several benchmarks have been designed to evaluate LLM agents. Notable examples include ALFWorld (在新标签页中打开), IGLU (在新标签页中打开), Tachikuma (在新标签页中打开), AgentBench (在新标签页中打开), SocKET (在新标签页中打开), AgentSims (在新标签页中打开), ToolBench (在新标签页中打开), WebShop (在新标签页中打开), Mobile-Env (在新标签页中打开), WebArena (在新标签页中打开), GentBench (在新标签页中打开), RocoBench (在新标签页中打开), EmotionBench (在新标签页中打开), PEB (在新标签页中打开), ClemBench (在新标签页中打开), and E2E (在新标签页中打开).
挑战
LLM代理仍处于起步阶段,因此在构建它们时仍存在许多挑战和限制:
- 角色扮演能力: 基于LLM的代理通常需要适应一个角色以有效地完成领域内的任务。对于LLM没有很好描述的角色,可以在代表不常见角色或心理特征的数据上对LLM进行微调。
- 长期规划和有限的上下文长度:在长时间的历史中进行规划仍然是一个挑战,可能会导致代理无法从中恢复的错误。LLMs 在支持的上下文长度上也有限制,这可能会限制代理的能力,例如利用短期记忆。
- 广义人类对齐:将代理与多样化的人类价值观对齐也是一项挑战,这在标准LLM中也很常见。一个潜在的解决方案涉及通过设计先进的提示策略来重新对齐LLM的可能性。
- 提示的鲁棒性和可靠性:一个LLM代理可能涉及多个提示,这些提示旨在为不同的模块(如记忆和规划)提供动力。在LLM中,即使对提示进行最轻微的更改,也常常会遇到可靠性问题。LLM代理涉及整个提示框架,这使得它更容易出现鲁棒性问题。潜在的解决方案包括通过试错法设计提示元素、自动优化/调整提示,或使用GPT自动生成提示。LLM的另一个常见问题是幻觉,这在LLM代理中也很普遍。这些代理依赖于自然语言与外部组件进行交互,这些外部组件可能会引入冲突信息,导致幻觉和事实性问题。
- 知识边界: 类似于可能导致幻觉或事实性问题的知识不匹配问题,控制大型语言模型(LLMs)的知识范围具有挑战性,这可能会显著影响模拟的有效性。具体来说,LLM的内部知识可能会引入偏见或利用用户未知的知识,这可能会影响代理在特定环境中操作时的行为。
- 效率: LLM代理涉及大量由LLM处理的请求,这可能会影响代理操作的效率,因为它将严重依赖于LLM的推理速度。在部署多个代理时,成本也是一个需要考虑的问题。
参考文献
- LLM驱动的自主代理 (在新标签页中打开)
- MRKL系统:一种模块化的神经符号架构,结合了大型语言模型、外部知识源和离散推理 (在新标签页中打开)
- 基于大型语言模型的自主代理调查 (在新标签页中打开)
- 大型语言模型代理的崛起与潜力:一项调查 (在新标签页中打开)
- 基于大型语言模型的多智能体:进展与挑战综述 (在新标签页中打开)
- 语言代理的认知架构 (在新标签页中打开)
- LLM代理简介 (在新标签页中打开)
- LangChain 代理 (在新标签页中打开)
- 构建您的第一个LLM代理应用程序 (在新标签页中打开)
- 构建用于生产的LLM应用程序 (在新标签页中打开)
- Awesome LLM agents (在新标签页中打开)
- Awesome LLM-Powered Agent (在新标签页中打开)
- 使用LangChain的函数、工具和代理 (在新标签页中打开)