Memory for agents

代理的记忆

5 分钟阅读

在三月份的红杉资本 AI Ascent 大会上,我谈到了代理的三个局限性:规划、用户体验和记忆。查看那次演讲此处。在这篇文章中,我将更深入地探讨记忆。查看关于规划的上一篇文章此处,以及关于用户体验的之前的文章此处此处此处

如果说代理是 2024 年 LLM 应用程序开发中最大的流行语,那么记忆可能是第二大流行语。但记忆到底是什么呢?

在高层次上,记忆只是一个记住先前交互信息的系统。这对于构建良好的代理体验至关重要。想象一下,如果你的同事从不记得你告诉他们的事情,迫使你不断重复这些信息——那将是令人非常沮丧的!

人们常常期望 LLM 系统天生就具有记忆,也许是因为 LLM 已经感觉非常像人类了。然而,LLM 本身并不会天生地记住事情——因此你需要有意识地添加记忆。但是,究竟应该如何考虑这样做呢?

记忆是特定于应用程序的

我们已经思考记忆一段时间了,我们认为记忆是特定于应用程序的。

Replit 的代码编写代理可能选择记住关于给定用户的哪些信息,与 Unify 的研究代理可能记住的信息大相径庭。Replit 可能会选择记住用户喜欢的 Python 库;Unify 可能会记住用户正在研究的公司的行业。

不仅代理记住的内容因应用程序而异,而且代理记住的方式也可能不同。正如在之前的一篇文章中讨论的那样,代理的一个关键方面是围绕它们的用户体验。不同的用户体验提供了不同的方式来收集和相应地更新反馈。

那么,我们在 LangChain 是如何处理记忆的呢?

💡
就像我们处理代理的方法一样:我们的目标是让用户对记忆进行低级别控制,并能够根据自己的需要对其进行自定义。

这种理念指导了我们对 记忆存储 的大部分开发工作,我们上周将其添加到 LangGraph 中。

记忆的类型

虽然你的代理拥有的记忆的确切形式可能因应用程序而异,但我们确实看到了不同高级别的记忆类型。这些记忆类型并不新鲜——它们模仿了人类的记忆类型

已经有一些很棒的工作将这些人类记忆类型映射到代理记忆。我最喜欢的是 CoALA 论文。以下是我对每种类型的粗略、ELI5 解释以及今天的代理可能如何使用和更新这种记忆类型的实际方法

来自 CoALA 论文的决策程序图(Sumers、Yao、Narasimhan、Griffiths 2024)

程序性记忆

该术语指的是长期记忆如何执行任务,类似于大脑的核心指令集。

人类的程序性记忆:记住如何骑自行车。

代理的程序性记忆:CoALA 论文将程序性记忆描述为 LLM 权重和代理代码的组合,这从根本上决定了代理的工作方式。

在实践中,我们没有看到许多(任何?)代理系统自动更新其 LLM 的权重或重写其代码。但是,我们确实看到了一些代理更新其自身系统提示的示例。虽然这是最接近的实际示例,但仍然相对少见。

语义记忆

这是某人长期存储的知识。

人类的语义记忆:它由诸如在学校学到的事实、概念的含义以及它们之间的关系等信息组成。

代理的语义记忆:CoALA 论文将语义记忆描述为关于世界的知识库。

今天,代理最常使用它来个性化应用程序。

实际上,我们看到这是通过使用 LLM 从代理进行的对话或交互中提取信息来完成的。此信息的具体形式通常是特定于应用程序的。然后,在未来的对话中检索此信息并将其插入到系统提示中,以影响代理的响应。

情景记忆

这指的是回忆起特定的过去事件。

人类的情景记忆:当一个人回忆起过去经历的特定事件(或“情景”)时。

代理的情景记忆:CoALA 论文将情景记忆定义为存储代理过去行为的序列。

这主要用于使代理按预期执行。

在实践中,情景记忆被实现为少样本示例提示。如果你收集了足够多的这些序列,那么可以通过动态少样本提示来完成。如果存在执行以前执行过的特定操作的正确方法,那么这通常非常适合指导代理。相比之下,如果没有必要以正确的方式做事,或者如果代理不断地做新的事情,以至于以前的例子没有太大帮助,那么语义记忆更相关。

如何更新记忆

除了考虑代理中要更新的记忆类型之外,我们还看到开发人员在考虑如何更新代理记忆。

更新代理记忆的一种方法是“在热路径中”。这是指代理系统在响应之前显式决定记住事实(通常通过工具调用)。ChatGPT 采用了这种方法。

更新记忆的另一种方法是“在后台”。在这种情况下,后台进程在对话期间或之后运行,以更新记忆。

比较这两种方法,“在热路径中”方法的一个缺点是在交付任何响应之前引入了一些额外的延迟。它还需要将记忆逻辑与代理逻辑相结合。

但是,在后台运行避免了这些问题——没有增加延迟,并且记忆逻辑保持分离。但是“在后台”运行也有其自身的缺点:记忆不会立即更新,并且需要额外的逻辑来确定何时启动后台进程。

更新记忆的另一种方法涉及用户反馈,这与情景记忆尤其相关。例如,如果用户将交互标记为积极的交互,则可以保存该反馈以供将来回忆。

为什么我们关心代理的记忆?

这如何影响我们在 LangChain 构建的产品?嗯,记忆极大地影响了代理系统的实用性,因此我们对尽可能轻松地为应用程序利用记忆非常感兴趣

为此,我们在我们的产品中构建了许多功能。这包括

我们甚至构建了我们自己的一些应用程序,这些应用程序利用了记忆!虽然现在还处于早期阶段,但我们将继续学习关于代理记忆以及它可以有效使用的领域 🙂