Memory:Agent的核心组件,用来增强Agent需要的上下文知识
Memory用来解决多轮会话,以及上下文记忆的问题。
Memory只用来存储生成的方案。而不存储共性的input prompt 模版信息,来减少请求的prompt token数量
单次会话,分为几部分
- system_prompt
- user_prompt: base + tools schema + examples + 上下文会话
- Tool Action: 某个请求的执行结果。考虑幂等性,来判断是否query缓存
memory压缩:针对单个会话的user_prompt压缩
MemGPT
CoreMemory ArchivalMemory -> EmbeddingArchiveMemory RecallMemory -> DummyRecallMemory, BaseRecallMemory
调研-综述
虽然之前的研究已经设计了许多有前途的 Memory 模块,但仍然缺乏从整体角度看待 Memory 模块的系统研究。 为了弥补这一差距,在本文中,我们全面回顾了以前的研究,为设计和评估 Memory 模块提供了清晰的分类法和关键原则。 具体来说,我们讨论三个关键问题,包括: (1)基于LLM的代理的 Memory 是什么? (2) 为什么基于LLM的代理需要 Memory ? (3)如何在基于LLM的代理中实现和评估 Memory ?
首先,我们详细介绍了基于 LLM 的代理中的记忆概念,提供了狭义和广义的定义。 然后,我们分析了记忆在基于LLM的智能体中的必要性,从认知心理学、自我进化和智能体应用三个角度展示了其重要性。 基于“what”和“why”的问题,我们提出了设计和评估 Memory 模块的常用策略。 对于 Memory 设计,我们从内存来源、内存形式和内存操作三个维度讨论了前人的工作。 对于 Memory 评估,我们引入了两种广泛使用的方法,包括直接评估和通过特定代理任务的间接评估。 接下来,我们讨论角色扮演、社交模拟、个人助理、开放世界游戏、代码生成、推荐和专家系统等代理应用,以展示 Memory 模块在实际场景中的重要性。 最后,我们分析了现有工作的局限性并强调了未来的重要方向。
本文的主要贡献可以概括如下:
- 我们正式定义了 Memory 模块并全面分析了其对于基于LLM的代理的必要性。
- 我们系统地总结了关于设计和评估基于LLM的代理中的 Memory 模块的现有研究,提供了清晰的分类法和直观的见解。
- 我们提出了典型的代理应用程序来展示 Memory 模块在不同场景中的重要性。
- 我们分析了现有 Memory 模块的主要局限性,并展示了启发未来研究的潜在解决方案。 据我们所知,这是第一个关于基于 LLM 的代理的记忆机制的调查。
与环境进行交互和学习是基于 LLM 的代理的基本要求。在智能体与环境的交互过程中,存在三个关键阶段,即
- 智能体从环境中感知信息,并将其存储到内存中;
- 代理对存储的信息进行处理,使其更可用;
- 智能体根据处理后的记忆信息采取下一步行动。 在所有这些阶段中,记忆都起着极其重要的作用。 下面我们首先从狭义和广义两个角度来定义智能体的内存,然后基于内存模块详细介绍上述三个阶段的执行过程。
定义 1(Task, 任务)。 任务是智能体需要实现的最终目标,例如为Alice预订机票,为Bob推荐餐厅等。 形式上,我们使用 T 来表示一个任务,并在下面的内容中通过下标来标记不同的任务。
定义 2(Environment, 环境)。 从狭义上讲,环境是智能体完成任务所需交互的对象。 对于定义 1 中的示例,环境是 Alice 和 Bob,他们提供有关代理操作的反馈。 更广泛地说,环境可以是影响智能体决策的任何上下文因素,例如预订机票时的天气、推荐餐厅时的时间和地点等。
定义 3(Trial and Step尝试和步骤)。 为了完成任务,代理需要与环境交互。 通常,智能体首先采取行动,然后环境响应该行动。 最后,代理根据响应采取下一步行动。 这个过程不断重复,直到任务完成。
完整的Agent-环境交互过程称为试验(Trial),每个交互回合称为步骤(Step)。 对于每次试验,代理可以采取多个步骤来形成任务的潜在解决方案。
对于每项任务,智能体可以探索多个试验来完成任务 。 形式上,在step t 中,我们使用 $a_t$ 和 $o_t$ 分别表示代理动作和观察到的环境响应。
长度为T的trial可以表示为:``.
在上述定义中,任务和环境是最粗粒度的概念,而步骤是最细粒度的概念。 它们共同描述了完整的主体-环境交互过程。
从狭义上讲,智能体的记忆仅与同一试验内的历史信息相关。 形式上,对于给定的任务,第t步之前的试验的历史信息为 ψt = {a1, o1, a2, o2, ..., at−1, ot−1},然后根据 ψt 导出记忆 。
在上面的玩具示例中,对于任务(A),智能体在[步骤3]需要安排Alice的访问顺序; 此时,其内存中包含了[步骤1]和[步骤2]中选择的景点和到达时间的信息。 对于任务(B),智能体必须在[步骤3]为爱丽丝选择一部电影; 这时,它的记忆中就包含了安排好的看电影时间。
从广义上讲,智能体的记忆可以来自更广泛的来源,例如,不同Trial的信息以及智能体与环境交互之外的外部知识。
there are three key phases in the agent-environment interaction process. The agent memory module implements these phases through three operations including memory writing, memory management, and memory reading.
Memory Writer: 此操作的目的是将原始结果投影到实际存储的内存内容中,这些内容信息更丰富并且更简洁。它对应于Agent-环境交互过程的第一阶段。 对于每一个任务,都可以进行多次尝试来探索最终的解决方案,并且所有的尝试都可以被纳入记忆中。
Memory Manager: 该操作旨在处理存储的记忆信息以使其更加有效,例如,总结高级概念以使代理更具泛化性,合并相似信息以减少冗余,以及忘记不重要或不相关的信息以删除其负面影响。 该操作对应于Agent-环境交互过程的第二阶段。
Memory Reading: 该操作的目的是从内存中获取重要信息,以支持下一步的智能体动作。 它对应于Agent-环境交互过程的第三阶段。
通过迭代扩展该函数,可以轻松获得完整的主体-环境交互过程。 重点:该函数提供了Agent记忆过程的一般公式。
认知心理学的视角: 基于 LLM 的代理的一个主要目标是取代人类来完成不同的任务。 为了让智能体像人类一样工作,遵循人类的工作机制来设计智能体是一个自然而必要的选择。 由于记忆对人类很重要,因此设计记忆模块对智能体也很重要。 此外,认知心理学已经研究了很长时间,积累了许多有效的人类记忆理论和架构,可以支持智能体更高级的能力。
为了完成不同的实际任务,智能体必须在动态环境中自我进化(self-evolve)。 在智能体与环境的交互过程中,记忆对于以下几个方面至关重要:
- 经验积累。 记忆的一个重要功能是记住过去的错误计划、不适当的行为或失败的经历,从而使智能体在未来处理类似的任务时更加有效。 这对于提升智能体在自我进化过程中的学习效率极为重要。
- 环境探索。 为了在环境中自主进化,智能体必须探索不同的行为并从反馈中学习。 通过记住历史信息,记忆可以帮助更好地决定何时以及如何进行探索,例如,更多地关注以前失败的试验或探索频率较低的行动。
- 知识抽象。 记忆的另一个重要功能是从原始结果(raw observations)中总结和抽象高级信息,这是智能体对未见过的环境更具适应性和可推广性的基础。 综上所述,self-evolution(自我进化)是基于LLM的智能体的基本特征,而记忆对于self-evolution至关重要。
在上述三个视角中,第一个视角揭示了记忆构建了智能体的认知基础。 第二个和第三个表明记忆对于智能体不断发展的原理和应用是必要的,这为设计具有记忆机制的智能体提供了见解。
本节我们从内存来源、内存形式、内存操作三个角度来讨论内存模块的实现。 内存来源是指内存内容的来源。 记忆形式重点关注如何表示记忆内容。 内存操作的目的是处理内存内容。 这三个视角提供了对内存实现方法的全面回顾,这对未来的研究很有帮助。
这些来源可以分为三类,即Trial内部的信息、不同Trial间的信息以及外部知识。
- 在智能体与环境的交互过程中,试验中的历史步骤通常是支持智能体未来行动的最相关和信息量最大的信号。 之前的工作几乎都使用这些信息作为记忆源的一部分。
- 对于基于LLM的智能体来说,在环境中多次试验中积累的信息也是记忆的重要组成部分,通常包括成功和失败的行动及其见解,例如失败原因、成功的常见行动模式等。One of the most prominent studies is Reflexion
根据交叉试验(cross-trial)信息的累积记忆,智能体能够积累经验,这对于其进化非常重要。 根据过去的经验,智能体可以根据整个过程的整体反馈来调整自己的行动。 与充当短期记忆的内部试验(Inside-trial)观察相反,试验经历可以被视为长期记忆。 它利用不同试验的反馈来支持更广泛的Agent试验,为Agent提供更长时间的体验支持。 然而,其局限性在于,内部试验和跨试验信息都需要Agent亲自参与Agent与环境的交互,而外部经验和知识不包括在内。