MEMGPT: TOWARDS LLMS AS OPERATING SYSTEMS翻译

摘要

大型语言模型 (LLM) 彻底改变了AI,但受到有限的上下文窗口的限制,阻碍了它们在扩展对话和文档分析等任务中的实用性。为了能够在有限的上下文窗口之外使用上下文,我们提出了虚拟上下文管理,这是一种从传统操作系统的分层内存系统中汲取灵感的技术,该技术通过快速内存和慢速内存之间的数据移动提供大内存资源的访问。使用这种技术,我们引入了MemGPT(Memory-GPT),这是一个智能管理不同内存层的系统,以便在LLM有限的上下文窗口内有效地提供扩展的上下文,并利用中断来管理其自身和用户之间的控制流。我们在两个领域评估了受操作系统启发的设计,在这两个领域中,现代 LLM 的有限上下文窗口严重阻碍了其性能。一个是文档分析,MemGPT 能够分析远远超出底层 LLM 上下文窗口的大型文档,以及多会话聊天,其中 MemGPT 可以创建会话代理,通过与用户的长期交互来记忆、反思和动态进化。我们在 https://memgpt.ai 上发布了用于实验的 MemGPT 代码和数据。

1.介绍

在这里插入图片描述
  近年来,大型语言模型(LLM)及其底层transformer架构已成为对话式AI的基石,并导致了广泛的消费者和企业应用。尽管取得了这些进步,LLM使用有限的固定长度上下文窗口极大地阻碍了它们对长对话或长文档推理的适用性。例如,最广泛使用的开源LLM在超过其最大输入长度之前只能支持几十条来回消息或推理短文档。
  由于 Transformer 架构的自注意力机制,简单地扩展 Transformer 的上下文长度会导致计算时间和内存成本的成倍增加,这使得新的长上下文架构的设计成为紧迫的研究挑战。虽然开发更长的模型是一个活跃的研究领域,但即使我们能够克服上下文缩放所带来的计算挑战,最近的研究表明长上下文模型很难有效地利用额外的上下文。因此,考虑到训练SOTA的LLM所需的大量资源以及上下文扩展带来的明显回报递减,迫切需要一种替代技术来支持长上下文。
  在本文中,我们研究如何在继续使用固定上下文长度的同时提供无限上下文的错觉。我们的方法借鉴了虚拟内存分页的理念,该理念的开发是为了使应用程序能够处理远远超出可用内存的数据。我们利用 LLM agent函数调用能力的最新进展来设计 MemGPT,这是一个受操作系统启发的用于虚拟上下文管理的 LLM 系统。我们从传统操作系统的分层内存管理中汲取灵感,在上下文窗口(类似于操作系统中的“主内存”)和外部存储之间有效地“分页”进出信息。MemGPT 管理内存管理、LLM 处理模块和用户之间的控制流。这种设计允许在单个任务期间重复上下文修改,从而允许ganet更有效地利用其有限的上下文。
  在 MemGPT 中,我们将上下文窗口看作是有限的内存资源,并为 LLM 设计类似于传统操作系统中内存层的分层内存结构。传统操作系统中的应用与虚拟内存进行交互,这时操作系统通过将溢出的数据分页到磁盘并将数据(通过page fault)检索回内存,从而产生比物理(即主)内存中实际可用的内存资源更多的错觉。为了提供更长的上下文长度(类似于虚拟内存)的类似幻觉,我们允许 LLM 通过“LLM OS”(我们称之为 MemGPT)来管理放置在其自己上下文(类似于物理内存)中的内容。MemGPT 使 LLM 能够检索上下文中丢失的相关历史数据,类似于操作系统的page fault。此外,agent可以迭代地修改单个任务上下文中的内容,就像进程可以重复访问虚拟内存一样。图 1 说明了 MemGPT 的组件。
  分层内存结构、操作系统函数和基于事件的控制流的组合使用允许 MemGPT 使用具有有限上下文窗口的 LLM 来处理无限上下文。为了展示我们新的受操作系统启发的 LLM 系统的实用性,我们在两个领域评估了 MemGPT,这两个领域中现有 LLM 的性能都受到有限上下文的严重限制:文档分析,其中标准文本文件的长度可能很快超过现代 LLM 的输入能力。对话agent,其中受有限对话窗口约束的LLM在扩展对话期间缺乏上下文意识、角色一致性和长期记忆。在这两种情况下,MemGPT 都能够克服有限上下文的限制,从而优于现有的基于 LLM 的方法。

2.MEMORY-GPT (MEMGPT)

在本节中,我们概述了 MemGPT 的实现,这是一个受操作系统启发的 LLM 系统,它教 LLM 管理自己的内存以实现无限上下文。MemGPT 的多级内存架构划分了两种主要内存类型:主上下文(类似于主内存/物理内存/RAM)和外部上下文(类似于磁盘内存/磁盘存储)。主上下文是语言模型中标准的固定上下文窗口——主上下文中的任何内容都被视为in-context的内容,并且可以在推理过程中由 LLM 处理器访问。外部上下文是指LLM固定上下文窗口之外的任何信息。这种上下文以外的数据必须始终显式移至主上下文中,以便在推理期间将其传递给 LLM 处理器。MemGPT 提供函数调用,使得LLM 处理器可以使用这些函数来管理自己的内存,而无需任何用户干预。

2.1 MAIN CONTEXT

在这里插入图片描述
  在 MemGPT 中,我们将 LLM 输入(受最大输入token数量限制)称为系统的主上下文。在基于 LLM 的对话agent中,主上下文有很大一部分通常用于保存“system message”或“preprompt”,这些prompt用于指示与系统交互的性质,而其余token可用于保存对话数据。这种preprompt是使系统能够采用各种不同角色而不需要对基础模型进行微调的主要方式;根据用例,preprompt的范围可以从基本入门(例如,“You are a helpful assistant.”)再到包含数千个token的复杂指令(例如,包含角色背景和对话示例的虚构角色)。除了对话agent之外,当LLM被用于解决需要长指令和/或带有许多上下文示例指令的复杂任务时,preprompt也很常见。
  由于preprompt在指示系统行为中的重要性,其消耗超过一千个token是很常见的,这意味着许多现代 LLM 中的整个上下文窗口将仅在用户和系统之间的几十个来回消息中耗尽。例如,当使用 llama-2 或 gpt-3.5-turbo 等 4K 上下文模型时,1000 个token提示(大约是我们实验中 MemGPT preprompt的大小)只为大约 60 条消息预留下空间(有关更多示例,请参阅表 1)。在期望用户频繁与系统通信的设置中(例如,虚拟伴侣或个性化助理),很容易想象即使对于具有 100k 上下文窗口的模型,在几天(或可能是几小时)内也会超过最大对话长度 )。递归摘要是解决上下文窗口溢出的一种简单方法,但是,递归摘要本质上是有损的,最终会导致系统记忆出现大漏洞(正如我们在第 3 节中演示的那样)。这就需要一种更全面的方法来管理用于长期设置的会话系统的内存。
  在我们关于多会话聊天和文档分析的实验中,我们进一步将主上下文分为三个部分:系统提示,其中包含基本LLM指令(例如,描述MemGPT功能和LLM控制流的信息),会话上下文,其中包含最近事件的历史记录(例如agent和用户之间的消息)的先进先出(FIFO)队列,以及充当agent的工作内存暂存器的工作上下文。系统提示是只读的,并固定到主上下文(它们在 MemGPT agent的生命周期内不会更改),会话上下文是只读的,具有特殊的提取策略(如果队列达到一定大小,则前面的一部分通过递归摘要被截断或压缩),并且工作上下文可由 LLM 处理器通过函数调用写入。主上下文的三个部分组合起来不能超过底层 LLM 处理器的最大上下文大小,并且在实践中,我们将会话上下文和工作上下文的大小限制为由处理器上下文窗口和系统指令长度确定的固定常量。

2.2 EXTERNAL CONTEXT

外部上下文是指位于 LLM 处理器上下文窗口之外的上下文存储,类似于操作系统中的磁盘内存(即磁盘存储)。外部上下文中的信息对于 LLM 处理器来说并不是立即可见的,但是,可以通过适当的函数调用将其带入主上下文中。实际上,外部上下文中的底层存储可以采取各种形式,可以针对特定任务进行配置:例如,对于会话agent,可能需要存储用户和agent之间的完整聊天日志(MemGPT 可以在以后访问),对于文档分析,大型文档集合可以存储在外部上下文中,MemGPT 可以通过对磁盘的分页函数调用将其带入有限的主上下文。
  在我们的实验中,使用 MemGPT 进行多会话聊天和文档分析,我们使用数据库来存储文本文档和嵌入向量,为 LLM 处理器提供几种查询外部上下文的方式:基于时间戳的搜索、基于文本的搜索和 基于嵌入的搜索。我们区分两种类型的外部上下文:recall storage,存储 LLM 处理器处理的整个历史记录(本质上是来自活动内存的完整未压缩队列),以及archival storage,用作通用读写,agent可以将其用作上下文中读写核心内存的溢出数据存储。在会话agent的上下文中,archival storage允许 MemGPT 存储超出主上下文的严格token限制的有关agent或用户的事实、经验、偏好等,并且通过recall storage进行搜索允许 MemGPT 查找与某个问题或指定时间戳相关的交互历史。 在文档分析的背景下,archival storage可用于搜索(并添加到)庞大的文档数据库。

2.3 SELF-DIRECTED EDITING AND RETRIEVAL

在这里插入图片描述
  MemGPT 通过 LLM 处理器生成的函数调用协调主上下文和外部上下文之间的数据移动。内存编辑和检索完全是自主的:MemGPT 根据当前上下文自主更新和搜索自己的内存。例如,它可以决定何时在上下文之间移动数据(图 2)并修改其主上下文,以更好地反映其对当前目标和任务不断发展的理解(图 4)。我们通过在preprompt中提供明确的指令来指导系统如何与其内存系统交互,从而实现自主编辑和检索。 这些指令包含两个主要组成部分:(1) 内存分层结构及其各自用法的详细描述,以及 (2) 系统可以调用以访问或修改其内存的函数模式(包含其自然语言描述)。
  在每个推理周期中,LLM 处理器将主上下文(连接成单个字符串)作为输入,并生成输出字符串。该输出字符串由 MemGPT 解析以确保正确性,如果解析器验证了函数参数,则执行该函数。调用结果,包括发生的任何运行时错误(例如,当主上下文已达到最大容量时尝试添加到主上下文),然后由 MemGPT 反馈给处理器。这种反馈循环使系统能够使LLM从其行为中学习并相应地调整其行为。了解上下文限制是使自编辑机制有效工作的一个关键方面,为此,MemGPT 会向处理器提示有关token限制的警告,以指导其内存管理决策(图 3)。此外,我们的内存检索机制旨在识别这些token约束并实现分页以防止检索调用溢出上下文窗口。
在这里插入图片描述

2.4 CONTROL FLOW AND FUNCTION CHAINING

在 MemGPT 中,事件会触发 LLM 推理:事件是 MemGPT 的广义输入,可以包含用户消息(在聊天应用中)、系统消息(例如主上下文容量警告)、用户交互(例如用户刚刚登录的警报,或 他们完成上传文档的警报),以及定期运行的定时事件(允许 MemGPT 在无需用户干预的情况下“无提示”运行)。MemGPT 使用解析器处理事件,将其转换为纯文本消息,这些消息可以附加到主上下文中,并最终作为输入馈送到 LLM 处理器中。
  许多实际任务需要按顺序调用多个函数,例如,浏览单个查询的多页结果,或者从单独的查询中整理主上下文中不同文档的数据。函数链允许 MemGPT 在将控制权返回给用户之前顺序执行多个函数调用。在 MemGPT 中,可以使用特殊标志来调用函数,该标志在请求的函数完成执行后立即将控制权返回给处理器。如果存在此标志,MemGPT 会将函数输出添加到主上下文(而不是暂停处理器执行)。如果此标志不存在,MemGPT 将不会运行 LLM 处理器,直到下一个外部事件触发(例如用户消息或计划中断)。

3.EXPERIMENTS

在这里插入图片描述

### AI-Native Memory 的定义与发展 AI-native memory 是指一种专为人工智能设计的记忆机制,它不仅能够存储大量的数据,还能支持复杂的推理、学习以及动态更新。这种记忆形式超越了传统的大语言模型(LLMs)所依赖的静态参数化结构,而是更接近于人类的认知记忆体系[^1]。 #### LLMs 中的记忆特性 在现有的大型语言模型中,“记忆”主要体现在两个方面:一是预训练阶段的数据吸收;二是上下文窗口内的短期记忆能力。然而,这些方法存在局限性——它们无法长期保存特定信息或灵活调整已有的知识库。当讨论从LLMs向AGI过渡时,构建一个可以持续积累经验并有效调用的历史记录系统变得至关重要[^2]。 #### AGI 对记忆的需求 为了实现真正意义上的通用智能(AGI),需要开发出具有以下特性的新型记忆架构: - **持久性和适应性**: 能够长时间保留重要信息的同时不断纳入新知; - **关联检索功能**: 支持快速找到与当前情境最相关的过往经历片段; - **跨模态整合能力**: 不仅限于文字资料,还应涵盖图像、声音等多种感官输入形式[^3]。 这样的高级别记忆框架将允许未来的AI agents更好地理解世界,并作出更为精准恰当的行为选择。 ```python class AIMemorySystem: def __init__(self): self.long_term_memory = {} self.short_term_context = [] def store(self, data, type='short'): if type == 'long': self.long_term_memory.update(data) elif type == 'short': self.short_term_context.append(data) def retrieve(self, query): results = [] for key in self.long_term_memory.keys(): if query in key: results.append((key,self.long_term_memory[key])) return results # Example Usage memory_system = AIMemorySystem() memory_system.store({"fact":"The capital of France is Paris."},type="long") print(memory_system.retrieve("France")) ``` 上述代码展示了一个简单的模拟版本的人工智能记忆系统的类定义及其基本操作函数。 ### 结论 综上所述,在通往AGI的路上,创建和完善AI-native memory将是不可或缺的一环。这一步骤旨在克服现有技术瓶颈,使机器拥有类似于甚至优于人类的学习进化潜力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值