一位MemGPT研究者的访谈,该系统使得人工智能伙伴拥有无限的记忆能力。
想象一下,如果你有一个最好的朋友,只能记住你在上个月告诉他们的一切。超出这个一个月的对话内容将会从记忆中抹去。这种滚动上下文窗口的描述正是我们如今与大型语言模型(LLM)的工作方式。
目前,LLM的记忆限制在于其上下文窗口的大小,这些窗口的数量被限制在指定的令牌数量上。LLM通过将以前的对话合并到每次新的互动中的提示中来回想起过去的互动,直到最终达到上下文窗口的限制。尽管在新模型的世代中这些上下文窗口的大小不断增加,但有限内存的挑战仍然存在。只保留少数过去的互动的伴侣并不能成为真正的伴侣。
在《神经笔记》第7集中,我们采访了查尔斯·帕克,MemGPT的共同作者和创造者,该论文提出了一种巧妙的方法来解决内存管理问题。点击这里查看访谈。
MemGPT旨在通过模仿操作系统的工作方式来解决内存管理问题。操作系统可以让我们使用内存层次结构处理大于计算机内存的文件。这种技术平衡了速度和大小。最快的内存类型(寄存器、高速缓存、主内存或RAM)容量小、价格昂贵,用于即时任务。当我们向层次结构下降时(存储驱动器、虚拟内存),内存速度变慢但容量增加,价格变得更便宜,适用于长期存储。操作系统管理这些层次以确保高效的数据访问和存储,提供了内存比您的CPU内存更大的“幻觉”。在Google Chrome中可能同时打开了50个标签页,这些标签页总体而言所需的内存超过了您的CPU提供的内存,但操作系统(以及我们在Google Chrome上工作的朋友)在幕后管理不同的内存类型,使得您的计算机可以处理它。
MemGPT的创建者们注意到了令牌窗口的限制,并想知道是否可能将这些概念应用于大型语言模型。例如,虽然ChatGPT使用GPT-4的当前窗口大小为128k令牌,但用户很常见地可能输入超过该窗口大小的上下文。
在LLMS中,内存层次结构相对于操作系统来说更简单:它们是适应变压器架构的内容和不适应的内容。 MemGPT创建了一个“虚拟上下文”窗口,以隐藏来自用户的上下文窗口限制。该论文概述了两种主要类型的内存:
- 主要上下文:这类似于传统计算系统中的主内存或物理内存(RAM)。在MemGPT的背景下,主要上下文代表现代语言模型中使用的标准固定上下文窗口。主要上下文中的数据被视为“上下文内”,可以在推理过程中被LLM处理器直接访问。
- 外部上下文:这种类型的存储器类似于传统系统中的硬盘存储或磁盘存储。外部上下文是指存储在LLM固定上下文窗口之外的信息。为了使LLM处理器可以使用此数据,必须显式地将其移入主上下文中。
为了有效利用内存层次结构,MemGPT使用“系统提示”,这些提示是用于指导LLM与其内存系统进行交互的指令。具体而言,这个预提示包含两个组成部分:
- 内存层次结构及其各自的用途的详细描述。
- 系统可以调用的功能模式,完整地包括自然语言描述,用于访问或修改其内存。
让我们在这个背景下定义“事件”和“功能”:事件促使系统采取行动,而功能是它采取的响应行动。事件包括各种类型的交互,例如聊天应用中的用户消息、主要上下文容量警告等系统消息、用户交互(例如有关用户登录或完成上传的警报)以及按照固定时间表运行的定时事件。这些事件使得MemGPT能够在没有用户干预的情况下运行。
例如,假设你首先表示你最喜欢的甜点是苹果派,然后又表示你最喜欢的甜点是胡萝卜蛋糕。MemGPT会察觉到这种改变,并根据工作环境自动更新其记忆。即使答案无法通过上下文信息回答,MemGPT也可以通过搜索先前的对话记录来找到答案。
另一个MemGPT的强大功能是它使LLM可以超越用户输入作为生成代理响应的唯一机制。正如查尔斯在我们的采访中告诉我们的那样:
MemGPT 引入了一种更高级别的抽象,其中有一个持续运行的事件循环,并且用户消息是 LLM 可以接收到的一种输入形式... 你还可以有其他事件,如系统消息和内存警告。
该论文将背景处理描述如下:
MemGPT通过由LLM处理器生成的函数调用,在主上下文和外部上下文之间协调数据移动。内存的编辑和检索完全是自主的:根据当前上下文,MemGPT自主更新和搜索自己的内存。例如,它可以决定何时在上下文之间移动项目(图2),并修改其主要上下文以更好地反映对当前目标和责任的不断演变的理解(图4)。
您还可以设置定时事件,例如,指示MemGPT每小时复查主要上下文并在需要时更新外部上下文。MemGPT的回应也是函数,这意味着LLM可以审查输出并决定是否与用户进行互动。例如,MemGPT可以查看时间戳并感知用户正在睡觉,然后等待发送消息。为了保持一致性,LLM可以自主地寻找可能更新其原有信息的新信息,然后再与用户重新互动。
当结合其他工具时,MemGPT表现出强大能力。例如,MemGPT内置有查询细化功能。如果MemGPT在浏览了几页结果后没有找到相关文档(即“黄金文档”),它可能会停止分页过程并要求用户帮助细化或缩小查询范围。这个过程提高了搜索效果,特别是当初始检索努力没有产生所需结果时。当与其他工具结合使用时,这种查询细化功能将变得更加强大。例如,通过查询细化和更好的检索器,能够改进检索增强生成(RAG)管道的性能。MemGPT内置了查询细化功能,遮蔽了手动迭代查询以提高性能的需求。
您可以想象一个将LLMs将记忆管理以外的任务外包给其他LLMs的未来。Charles描述了一个例子,在这个例子中,用户可能希望与一个LLM一起编辑Notion文档。这个请求将触发一个派发,找出最适合编辑Notion的工具,并将它们加载到工作内存中。由于不可能将每个任务所需的每个工具都加载到上下文窗口中,这种在处理过程中的委派克服了令牌窗口的限制,并预测了一个无限集合的代理能力。
借鉴操作系统的概念可以解决内存管理问题,为改进RAG管道和工具使用打开了大门。这或许是跨学科研究是创新可靠来源的又一证据。您可以在GitHub上找到MemGPT并阅读这篇论文。在Twitter/X上关注Charles,用户名为@charlespacker。