由 Charles Packer、Vivian Fang、Shishir G. Patil、Kevin Lin、Sarah Wooders、Joseph E. Gonzalez 组成的加州大学伯克利分校团队开发的 MemGPT https://memgpt.ai
摘要
大语言模型(LLM)已经在人工智能领域带来了革命性的变化。然而,它们的应用受限于处理信息的上下文窗口较小,这在执行长对话和文档分析等任务时尤其成问题。为了突破这一限制,我们提出了一种名为虚拟上下文管理的新技术。这种技术借鉴了传统操作系统中层次化内存系统的理念,能够通过在不同速度的内存间转移数据,从而扩展大语言模型处理信息的能力。基于这种技术,我们开发了 MemGPT(Memory-GPT),这是一个智能系统,它能够有效地在大语言模型本身有限的上下文窗口内提供更广泛的上下文信息。此外,MemGPT 还采用中断机制,以优化系统与用户间的交互控制流。我们在两个重要领域对这种受操作系统启发的设计进行了评估:一是文档分析,在这一领域,MemGPT 能够处理远超大语言模型本身上下文限制的庞大文档;二是多回合对话,在这里,MemGPT 能够构建出能够记忆、反思并在与用户长期互动中不断进化的对话智能体。我们已经在 https://memgpt.ai 上发布了 MemGPT 的代码和实验数据供大家参考。
1 引言
在最近几年,一种被称为大语言模型 (LLM) 的技术及其独特的 Transformer 架构(由 Vaswani et al., 2017;Devlin et al., 2018;Brown et al., 2020;Ouyang et al., 2022 等人提出)迅速崛起,成为智能对话系统的核心。它们不仅改变了我们与电子设备交流的方式,还在众多消费者和商业领域发挥了重要作用。然而,这些模型在处理长篇对话或分析长文档时遇到了一定的挑战,因为它们只能处理有限长度的内容。举个例子,目前最流行的开源大语言模型处理的信息量有限,通常只能应对几十轮的对话或在达到输入上限之前分析一篇短文档(Touvron et al., 2023)。
在 Transformer 结构中,简单地扩大上下文长度会导致计算时间和内存成本成二次方级增加。这一自注意机制的特点使得开发能够处理更长上下文的新架构成为一项迫切的研究课题 (Dai et al., 2019; Kitaev et al., 2020; Beltagy et al., 2020)。尽管目前正在积极研究如何构建更长的模型 (Dong et al., 2023),但即使我们能够解决上下文规模扩大带来的计算挑战,最新研究也表明,长上下文模型在有效利用更多上下文方面还存在困难 (Liu et al., 2023a)。因此,考虑到培训先进的大语言模型 (LLM) 需要大量资源,且上下文扩展的效益逐渐降低,寻找支持长上下文的替代技术显得尤为重要。
图 1: MemGPT(图中阴影部分所示)通过增添一个分层记忆系统和一些管理自身记忆的功能,对固定上下文的大语言模型 (LLM) 进行了扩展。该模型的 LLM 处理器以 主上下文(类似于操作系统的主内存/RAM)为输入,输出的文本由解析器处理,可能是文本输出或函数调用。MemGPT 利用特定功能,在 主上下文 和 外部上下文(类似于操作系统的磁盘存储)之间转移数据。当处理器触发函数调用时,它可以提前申请控制权限,以便串联多个功能。在生成输出时,处理器会暂停,直到遇到下一个外部事件(比如用户的消息或预定的中断)为止。
在这篇论文中,我们探讨了如何在保持固定上下文模型的同时创造出无限上下文的体验。我们的方法灵感来源于虚拟内存技术,这项技术最初是为了让应用程序能处理超出实际内存容量的大型数据集而设计的。我们利用了最近大语言模型(LLM)在函数调用方面的突破性进展(见 Schick et al., 2023 年的研究; Liu et al., 2023 年的研究 b),来开发一种名为 MemGPT 的系统,这是一个受操作系统(OS)启发的,用于管理虚拟上下文的大语言模型。我们借鉴了传统操作系统在内存管理上的层次结构设计,高效地在上下文窗口(相当于操作系统中的主内存)和外部存储间转移信息。MemGPT 负责协调内存管理、大语言模型处理模块和用户之间的交互。这种设计使得在执行单一任务时,智能体可以反复调整其有限的上下文,从而更高效地利用资源。
在 MemGPT 中,我们把上下文窗口看作有限的内存资源,并为大语言模型设计了一种类似于传统操作系统中内存分层的结构(参考 Patterson et al., 1988 年的研究)。在传统操作系统中,应用程序通过与虚拟内存的交互,可以使用超出物理(即主要)内存实际容量的资源,操作系统通过将多余数据分页存储到磁盘,并在应用程序需要时将其重新载入内存。为了营造出更长上下文长度的感觉(类似于虚拟内存),我们允许大语言模型自主管理其上下文中的内容(类似于物理内存),通过一个我们称之为 MemGPT 的“大语言模型操作系统”。MemGPT 使大语言模型能够检索从上下文中遗漏的相关历史数据,这类似于操作系统处理缺页中断的方式。此外,智能体还可以在执行单一任务时,像处理虚拟内存那样,反复调整其上下文内容。图 1 生动展示了 MemGPT 的各个组成部分。
MemGPT 结合了分层内存结构、操作系统的功能和基于事件的流程控制,这使得即使是内存窗口有限的大语言模型也能处理无界限的上下文。我们用这种新型、受操作系统启发的大语言模型系统对 MemGPT 进行了测试,这在文档分析和对话代理这两个领域尤为显著。在这两个领域,传统大语言模型因其有限的处理窗口而在性能上受到严重限制。在文档分析中,文本文件的长度很容易超过现代大语言模型的处理能力;在对话代理方面,由于对话窗口有限,这些模型在长时间对话中往往缺乏上下文感知、角色一致性和长期记忆能力。MemGPT 通过突破这些有限上下文的约束,在这两个场景中都实现了优于现有大语言模型方法的表现。
2Memory-GPT (MemGPT)
在这一部分,我们将介绍 MemGPT 的构建,这是一种启发自操作系统的大语言模型系统。它使得大语言模型能够自我管理记忆,从而处理无限的上下文范围。MemGPT 采用双层记忆架构,分为两种主要的记忆类型:主要上下文(类似于主内存或物理内存)和外部上下文(类似于硬盘存储)。主要上下文是大语言模型中常见的固定上下文窗口,其中的信息被视为处于上下文中,可以在模型推理时被处理器访问。外部上下文则涵盖了超出大语言模型固定上下文窗口的信息。这些位于上下文之外的数据必须明确地转移到主要上下文中,才能在推理过程中被处理器使用。MemGPT 提供了一系列函数调用,使得大语言模型的处理器能够自主管理其记忆,无需用户干预。
2.1 主要背景
在 MemGPT 中,我们将大语言模型 (LLM) 输入的上限称为系统的主要上下文。在基于 LLM 的对话智能体中,主要上下文的大部分令牌通常用于包含一个“系统消息”或“预设提示”(preprompt),这决定了用户与系统的互动方式。剩余的令牌则用来记录对话内容(Touvron et al., 2023; SillyTavern, 2023)。这种预设提示是让系统在不需要对基础模型进行微调的情况下,采用不同的人格角色的主要方式。根据不同的应用场景,预设提示可以是简单的引导语(例如:“你是一个有帮助的助理。”),也可以是包含数千令牌的复杂指令(例如,包括角色背景和样例对话的虚构人物资料)。除了对话智能体,当 LLM 用于处理需要长期指导和/或许多上下文示例的复杂任务时,也常见使用大量的预设提示(Liu et al., 2023b)。
表 1: 比较常用模型 / API 的上下文长度(数据收集于 2023 年 9 月)。*假定预设提示为 1k 令牌,平均消息大小约为 ∼50 令牌(∼250 字符)。
模型 / API 名称 | 可用性 | 最大令牌数 | 最大对话长度* |
---|---|---|---|
llama-1 模型家族 | 开源 | 2k 令牌 | 20 条总消息 |
llama-2 模型家族 | 开源 | 4k 令牌 | 60 条总消息 |
gpt-3.5-turbo | API | 4k 令牌 | 60 条总消息 |
gpt-4 | API | 8k 令牌 | 140 条总消息 |
gpt-3.5-turbo-16k | API | 16k 令牌 | 300 条总消息 |
gpt-4-32k | 限量 API | 32k 令牌 | 约 600 条总消息 |
claude-instant-1 | 限量 API | 100k 令牌 | 约 2000 条总消息 |
claude-2 | 限量 API | 100k 令牌 | 约 2000 条总消息 |
由于在控制系统行为方面,“预先设定的提示”起着关键作用,它们通常会占用超过一千个 token。这就意味着在许多现代大型语言模型(LLM)中,仅用户与系统间的几十轮对话就可能耗尽整个上下文空间。例如,一个含 1000 个 token 的预设提示(大致与我们实验中使用的 MemGPT 预设提示的大小相当)在使用 4K 上下文的模型(如 llama-2 或 gpt-3.5-turbo)时,只能容纳大约 60 条后续消息(更多实例见表 [1](https://1)。在用户需要频繁与系统互动的场景中(比如虚拟伙伴或个人助理),很容易想象,即便是拥有 100k 上下文窗口的模型,也可能在几天甚至几小时内就超出最大对话长度。递归式总结(Wu et al., 2021b)是一种简便的解决方法来应对上下文窗口溢出,但这种方法本质上会丢失信息,最终可能导致系统记忆出现较大缺口(我们在第 3 节中展示了这一点)。因此,我们需要更全面的方法来管理长期使用环境下的对话系统记忆。
在我们对多场景的聊天和文档分析实验中,我们将主要上下文分成三部分:首先是系统指令,它包含了大语言模型(LLM)的基础操作说明(比如,介绍 MemGPT 功能和对大语言模型的操作流程);其次是会话上下文,它像一个排队系统,记录了最近发生的事件(例如,智能体和用户之间的对话);最后是工作上下文,相当于智能体的“临时记事本”。系统指令是固定不变的,会话上下文则是只读的,当信息量达到一定程度时,会自动压缩历史信息以节省空间;而工作上下文则可以由大语言模型根据需要进行修改。这三个部分的总大小受限于大语言模型的处理能力,在实际应用中,我们会根据需要对会话上下文和工作上下文的大小进行调整。
2.2 外部上下文
外部上下文是一种超出大语言模型直接处理范围的存储空间,类似于电脑操作系统中的磁盘存储。这部分信息不会立即显示给大语言模型,但可以通过特定的操作调用到主上下文中。在实际应用中,这种存储空间的形式多样,可以根据不同任务进行配置。例如,在会话智能体应用中,我们可以在这里存储用户和智能体之间完整的聊天记录,以供 MemGPT 日后访问;在文档分析中,则可以存储大量的文档资料。在我们的实验中,我们使用数据库存储文本和数据,为大语言模型提供了多种查询外部上下文的方法,如基于时间戳的搜索、基于文本的搜索和基于数据模型的搜索。我们区分了两种类型的外部存储:一种是回忆存储,用于存放大语言模型处理过的所有事件记录;另一种是档案存储,它是一个通用的读写存储空间,智能体可以用它存储额外的信息。在会话智能体应用中,档案存储可以帮助 MemGPT 记录关于智能体或用户的各种信息,如事实、经历、偏好等,超出了主上下文的限制。通过搜索回忆存储,MemGPT 可以找到过去相关的互动记录。在文档分析中,档案存储可以用来搜索和增加大量的文档资料,形成一个庞大的信息库。
2.3 自我引导的编辑与检索
图 2: 一个示例对话片段,展示了 MemGPT 如何在没有系统内存警告的情况下,将对话详情记入工作上下文。
MemGPT 利用大语言模型(LLM)处理器生成的函数调用,实现了主上下文和外部上下文间的数据传输。这种内存的编辑和检索完全由 MemGPT 自行掌控:它会根据当前的上下文情况,自动更新和搜索自己的内存。例如,MemGPT 能够根据需要在不同的上下文中移动信息(参见图 [2](#S2.F2 “图 2 ‣ 22.3 自主式编辑与检索 ‣ 2 MemGPT(MemGPT) ‣ MemGPT: 向着大语言模型作为操作系统的方向前进”)),同时调整其主上下文内容,以更准确地反映其对当前目标和职责的理解(见图 [4](#S2.F4 “图 4 ‣ 2.4 控制流程和函数链 ‣ 2 MemGPT(MemGPT) ‣ MemGPT: 向着大语言模型作为操作系统的方向前进”)。为了实现这种自主式编辑和检索,我们在预处理命令中加入了明确的指令,这些指令告诉系统如何与其内存系统进行交互。这些指令主要包含两部分:(1) 对内存层级结构及其功能的详细描述;(2) 系统用以访问或修改内存的函数架构,以及这些函数的自然语言描述。
在每次推理过程中,大语言模型 (LLM) 的处理器会接收一个由多个部分合成的字符串作为输入,并输出一个新的字符串。MemGPT 负责检查这个输出字符串的正确性,并在函数参数被确认无误后执行相关功能。这其中包括处理可能发生的运行错误,比如当输入的内容过多而超出了处理器的处理能力。这些信息和错误报告会由 MemGPT 反馈回处理器,帮助系统从实际操作中学习并调整行为。系统能够意识到处理能力的限制是其自我调整编辑机制高效运作的关键。因此,MemGPT 会向处理器发送关于记忆体积限制的提醒,以指导其更好地管理内存(图 3:3)。此外,我们设计的记忆检索机制也会考虑到这些处理能力的限制,并采用分页技术来避免因为数据量过大而超出处理范围。
图 3 展示了一个例子,其中 MemGPT 在收到关于内存压力的系统提示后,将对话中的信息记录到内存中。
2.4 控制流程与功能串联
在 MemGPT 中,所谓的 事件 是激发大语言模型 (LLM) 进行推理的信号。这些事件可以是用户在聊天应用中的消息、系统发出的警告(比如主要上下文容量超标)、用户的某些操作(如登录提示或文件上传完成的通知),以及定时安排的事件,使得 MemGPT 能够在无需用户操作的情况下自动运行。MemGPT 通过一个解析器处理这些事件,将它们转换为文本消息,然后添加到主要上下文中,最终作为输入送入 LLM 进行处理。
在实际应用中,我们经常需要依次调用多个功能,比如在单一查询的多个页面中导航,或者从不同的查询结果中汇总数据。MemGPT 的功能串联可以在将控制权还给用户之前,顺序执行多个功能。在 MemGPT 中,可以用一个特别的标志来调用功能,该标志要求在功能执行完毕后,立即返回控制权给处理器。如果设置了这个标志,MemGPT 将功能的输出结果添加到主要上下文中,并继续处理,而不是暂停。如果没有设置这个标志(即 让步 (yield)),MemGPT 将等待下一个外部事件(如用户消息或定时中断)再启动 LLM。
图 4: 一个示例对话片段,展示了 MemGPT 如何通过修改主要上下文中的内容(并替换工作上下文的部分文本)来纠正关于用户的信息。
3 实验
我们在两大长上下文应用领域对 MemGPT 进行了测试:会话助手和文档分析。对于会话助手,我们扩充了现有的多会话聊天数据集 Xu et al. (2021),并增加了两项新的对话任务,以检验助手在长时间对话中保持信息连贯性的能力。在文档分析方面,我们使用 Liu et al. (2023a) 的任务对 MemGPT 进行了基准测试,这些任务包括对长篇文档进行问答和关键信息检索。我们还设计了一个新的任务,即嵌套关键信息检索,它要求从多个数据源中汇总信息,测试了助手在多步检索方面的能力。我们还公开了增强版的 MSC 数据集、嵌套 KV 检索数据集,以及 2000 万篇维基百科文章的嵌入数据集,以促进未来的研究。我们所有会话和文档分析的完整代码,都可以在 https://memgpt.ai 上找到。
3.1 面向对话代理的 MemGPT
虚拟伴侣和个性化助手等对话代理的目标是与用户进行自然的长期互动,这可能持续几周、几个月甚至几年。对于那些只能参考有限对话历史的固定长度上下文模型来说,这是一个挑战。一种理想的“无限上下文”代理,应无缝处理持续的对话交流,不受边界或重置的限制。在与用户对话时,这样的代理需要满足两个核心标准:
-
一致性 – 代理应保持对话的连贯性。新提到的事实、偏好和事件应与用户和代理之前的陈述保持一致。
-
参与度 – 代理应利用对用户的长期了解来个性化回应。引用之前的对话会使对话更自然、更引人入胜。
因此,我们的 MemGPT 模型需要在这两个标准上进行评估:
-
MemGPT 是否利用其记忆功能提升对话的一致性?它是否能够回忆起以往互动中的相关事实、偏好和事件,以保持对话的连贯性?
-
MemGPT 是否能通过记忆功能产生更具吸引力的对话?它是否能够自然地结合用户的长期信息,以个性化其消息?
图 5: 深度记忆检索任务示意图。示例中,用户询问的问题需要利用以往会话中的信息才能回答(这些信息已不在当前上下文中)。即使答案不能直接从当前上下文中得到,MemGPT 也能通过搜索其存储的旧对话来找到答案。
通过评估一致性和参与度,我们可以了解 MemGPT 在处理长期对话互动方面的表现,与固定上下文基准相比。其在这些标准上的表现将展示无限上下文是否真正为对话代理带来了有意义的优势。
3.1.1 数据集
我们使用由 Xu 等人于 2021 年提出的多轮会话聊天(Multi-Session Chat,MSC)数据集来评估 MemGPT 和固定上下文基线。该数据集包含人类标注员生成的多轮会话记录,每位标注员在整个会话期间扮演一个固定的角色。MSC 数据集中的每个多轮会话包含五个总体会话,每个会话大约包含十几条消息。在我们的一致性实验中,我们又新增了一个会话(第六会话),这个会话包含同一两个角色间的一个问题与答案对。
3.1.2 深度记忆检索任务(一致性)
我们在 MSC 数据集的基础上,提出了一个名为“深度记忆检索”(DMR)的全新任务,用来测试对话型 AI 智能体在对话中保持信息一致性的能力。在这个任务中,用户会向对话智能体提出一个问题,这个问题直接关联到之前的对话内容,并且答案的范围非常具体和有限(参见图 5 以获取一个示例)。为了生成这种问答对,我们使用了另一个大语言模型,该模型的任务是创造出这样的问题:只有通过之前会话中获取的信息才能正确回答(更多细节请参阅附录)。
我们采用 ROUGE-L 分数(Lin,2004)和一个“大语言模型评判员”来评价生成回答的品质,并将其与标准回答进行对比。这个评判员的任务是判断生成的回答是否与标准回答保持一致(已有研究表明,GPT-4 在这方面与人类评估者的一致性很高(Zheng 等,2023))。我们注意到,无论是 MemGPT 还是其他基准方法生成的回答,通常比标准回答更加详细。ROUGE-L 指标(评价生成文本和参考文本之间最长公共子序列的长度)能够有效处理正确回答中的语义差异,因为它主要关注生成答案中是否包含了标准答案的关键词。此外,我们还报告了在计算 ROUGE-L(F1)分数时使用的精确度和召回率。
表 2: 深度记忆检索(DMR)性能。在这项任务中,智能体被询问关于之前会话(第 1 至 5 会话)中讨论过的特定主题的问题。智能体的回答将与标准答案进行对比评分。标记为‡的方法使用了标准角色(oracle)。在这项任务中,MemGPT 显著超越了其他(非 oracle)固定上下文的基准方法。
| | | | | | ||---|---|---|---|---|---|||||ROUGE-L| | ||模型|可用信息|准确度 ⇑|F1 ⇑|P ⇑|R ⇑||gpt-3.5‡|persona5 + 前五次对话总结1:5|70.0%|0.190|0.134|0.674||gpt-4‡|persona5 + 前五次对话总结1:5|79.8%|0.225|0.151|0.716||MemGPT‡|persona5 (核心信息) + 前五次对话回顾1:5 (回想)|84.0%|0.171|0.105|0.746||gpt-3.5|前五次对话总结1:5|56.2%|0.157|0.114|0.585||gpt-3.5|前四次对话总结1:4 + 第五次对话内容|55.6%|0.120|0.080|0.602||gpt-4|前五次对话总结1:5|63.0%|0.159|0.101|0.607||gpt-4|前四次对话总结1:4 + 第五次对话内容|79.2%|0.171|0.107|0.713||MemGPT|前五次对话回顾1:5 (回想)|82.4%|0.173|0.106|0.743|MemGPT 通过内存功能维持对话的连贯性:表 [2](#S3.T2 "表 2 ‣ 3.1.2 深度记忆检索任务(一致性)‣ 3.1 MemGPT 对话智能体 ‣ 3 实验 ‣ MemGPT:朝向大语言模型作为操作系统") 展示了 MemGPT 相较于固定内存模型的优势。我们比较了三种固定上下文模型:一种能够查阅过去五次对话的概要 (前五次对话总结1:5),一种能够查阅前四次对话的概要 (前四次对话总结1:4) 加上最近一次对话的详细内容,以及一种拥有完整信息的模型,能查阅两位聊天参与者的详细个人信息及对话概要。我们使用 GPT-3.5 和 GPT-4 分别测试了这些不同的上下文模式。
所有黄金标准的人格模型都表现出色,这是因为 MSC 数据集中的人工标记的黄金人格非常详细,它们是之前所有聊天中人格信息的精确概括 – 也就是说,一个写得好的黄金人格模型应该能回答 DMR 问题。在那些不依赖先验知识的固定上下文模型中,GPT-4 明显胜过 GPT-3.5。对于这两种模型,那些可以访问完整先前对话内容的版本在实时处理中的表现略为优越。从“概要 1:4 加 对话 5”到“概要 1:5”的性能下降是符合预期的,因为后者包含的信息明显少于前者(假设有一个限制长度的完美总结器)。MemGPT 在大语言模型的判断准确性和 ROUGE-L 分数方面明显优于 GPT-4 和 GPT-3.5:与其依赖递归式的总结来扩展上下文,MemGPT 能够通过查询其回忆存储中的过往对话历史来回答 DMR 问题。
3.1.3 对话开场任务(吸引力)
在“对话开场”任务中,我们关注智能体制定引人入胜的开场白的能力,这些开场白要能巧妙利用之前对话中积累的知识。要评估一个开场白在 MSC 数据集中的吸引力,我们会将其与“金标准人格”(即在 MSC 中概括了所有先前对话中积累知识的关键数据点)进行比较:一个引人入胜的开场白应能巧妙引用这些人格数据点中的一个或多个(具体示例请见图 6)。此外,我们还会与人工编写的优质开场白进行对比,这通常是下一轮对话中的首次回应。由于优质的对话开场白不完全受限于上下文长度——即使是对之前对话的简短总结或几个片段也足以构建出利用既有知识的开场白——因此我们利用此任务来分析 MemGPT 不同功能组件的效果(而非与固定上下文的基准模型进行比较)。
我们在表 3 中展示了 MemGPT 开场白的 CSIM(对话开场白吸引力指标)评分。我们测试了多种 MemGPT 变体,包括无工作上下文(不存储人格信息)和无回忆存储(不存储对话信息)的 MemGPT,只有工作上下文或只有回忆存储的 MemGPT,以及同时启用工作上下文和回忆存储功能的 MemGPT。
MemGPT 通过利用内存来提高用户参与度:从表 3 和图 6 可见,MemGPT 能创造出引人入胜的开场白,其效果与人工编写的开场白不相上下,有时甚至更佳。我们发现,MemGPT 所创造的开场白不仅更加详细,还能覆盖更多的角色信息,这一点比人类的基准水平要高。此外,关键在于将信息储存在实时工作环境中,这对于生成引人入胜的开场白至关重要。如果没有实时工作环境,MemGPT 生成的开场白质量会大幅下降。而将对话记录存储在回忆库中对开场白的影响不大,因为 MemGPT 在生成开场白前通常不会检索之前的对话记录。
3.2 MemGPT 在文档分析中的应用
在文档分析领域,当前 Transformer 模型(如 OpenAI 的 GPT 模型)面临着一个主要挑战:它们只能处理有限数量的输入令牌(即文本单元)。例如,流行的 ChatGPT 聊天机器人最多只能处理 32,000 个令牌,而开源的先进 Llama 2 模型的限制甚至只有 4,000 个令牌(详见表 1)。虽然 Anthropic 推出了能处理高达 100,000 令牌的模型,但对于像斯蒂芬·金的《The Shining》这样的畅销小说,它的单词数约 150,000,转换成令牌大约有 200,000 个,甚至更不用说法律文件或财务报告这样可能超过一百万令牌的长文档了。同时,许多实际的文档分析任务还需要在多份长文档之间建立联系。因此,仅仅扩大模型的处理范围并不是解决这一问题的有效方案。最近的研究(刘等人,2023 年)也表明,在大范围的上下文中,模型的注意力分布往往不均匀,更倾向于记住文档的开头和结尾,而忽略中间部分。为了能够在多个文档之间进行有效的推理,可能需要像 MemGPT 这样更灵活的内存架构。
表 3: 会话开场白的表现(第 5 次会话)。这里使用了与标准人物标签的相似性得分来评估 AI 智能体的会话开场白。CSIM-1 评分反映了开场白与最接近的人物片段的匹配程度,而 CSIM-3 则是前三个最佳匹配的平均分。
方法 | CSIM-1 ⇑ | CSIM-3 ⇑ | CSIM-H ⇑ |
---|---|---|---|
最佳开场白(人类标准) | 0.823 | 0.787 | 1.000 |
— | — | — | — |
MemGPT(结合工作记忆和回忆库) | 0.817 | 0.787 | 0.760 |
MemGPT(仅使用工作记忆) | 0.820 | 0.790 | 0.762 |
MemGPT(仅使用回忆库) | 0.749 | 0.738 | 0.737 |
图 6: 吸引人的对话开场白应当利用提供的人格特征信息。在缺乏相关背景信息的情况下,MemGPT 生成的开场白质量会大幅下降。即使将对话内容储存在记忆中,也不会影响开场白,因为 MemGPT 通常不会在制定开场白之前回顾对话历史。
图 7: 在文档问答和嵌套键值检索任务中的表现。在这两个任务中,即使上下文长度增加,MemGPT 的表现也不受影响。尽管像截断这样的技术可以扩展固定长度模型(比如 GPT-4)的有效上下文范围(超过红色虚线表示的限度),但当压缩程度加大时,这种方法会降低性能。特别是在键值检索任务中,由于压缩可能会破坏键值对,性能下降尤为严重。
3.2.1 多文档问题回答(Doc-QA)
我们对 MemGPT 进行了一项测试,以评估其在分析文档方面的能力。此测试基于 Liu et al.(2023a)提出的检索器 – 阅读器文档 QA 任务,其中 MemGPT 与固定上下文的基准模型进行了比较。在这项任务中,首先从 NaturalQuestions-Open 数据集中选取一个问题,然后通过检索器挑选出与该问题相关的维基百科文档。之后,大语言模型作为阅读器,使用这些文档来回答问题。与 Liu et al.(2023a)的研究相似,我们评估了随着检索文档数量增加,阅读器的准确度变化。在我们的实验中,无论是 MemGPT 还是固定上下文的基准模型,都使用了相同的检索器,该检索器基于 Faiss 高效相似性搜索(Johnson et al., 2019)(即近似最近邻搜索),在 OpenAI 的 text-embedding-ada-002 嵌入上选取最相关的 N 篇文档。在 MemGPT 中,整个文档集存储于其存档存储中,通过基于嵌入的相似性搜索功能实现了自然的检索。而在固定上下文的基准模型中,检索器会在大语言模型进行推理前独立地获取最相关的 N 篇文档。此外,我们使用了 2018 年末的维基百科数据作为测试基础,这一选择遵循了 Izacard 和 Grave(2020)以及 Izacard et al.(2021)的先前研究。在本研究中,我们随机选取了 50 个问题样本,用于生成图表中的每个数据点。
MemGPT 与其他基于固定上下文的系统不同,后者的性能受限于检索器能提供的信息范围。例如,如果检索器未能找到某个关键文章,那么这些系统就无法获取到这篇文章的内容。相反,MemGPT 可以通过查询其存档库多次调用检索器,从而处理更大范围的信息。MemGPT 不仅能够从存档中检索文档,还能反复浏览检索结果,这意味着它能够接触到的文档数量远超过大语言模型处理器一次性能处理的文档数量。
对于文档问答这一任务,所有方法都面临挑战,原因在于基于嵌入式相似性搜索的局限性。我们发现,根据 NaturalQuestions-Open 标注的最佳文档,通常不在检索结果的前几位,甚至更靠后。GPT-3.5 和 GPT-4 在检索到较少文档时准确率较低,但随着更多文档被添加至上下文,准确率逐渐提升。尽管理论上 MemGPT 不会受到不理想的检索器性能的限制(即便基于嵌入式的排名有误差,只要完整的检索结果中包含了关键文档,MemGPT 最终还是有可能找到它),但实际上,我们发现 MemGPT 在检索过程中往往会在未完全搜遍数据库之前就停止翻页。例如,在浏览了几页无关的结果后(并未找到关键文档),MemGPT 会停止翻页,并请求用户帮忙缩小搜索范围。在我们的评估中,这种情况被视为查询失败,因为并没有人来协助 MemGPT 完成搜索。
MemGPT 在操作上的复杂性导致了在检索文档容量上的一种权衡:在 Token 预算相同的情况下(即使用相同的大语言模型 (LLM)),MemGPT 需要用一部分预算来执行其操作系统 (OS) 组件的系统指令,如内存管理的函数调用。这就意味着,与基线模型相比,MemGPT 同时保持在上下下文中的文档数量会有所减少。这种权衡在图 7 中得到了体现:与 GPT-4 相比,MemGPT 的平均准确率较低(但仍高于 GPT-3.5),不过它能更轻松地处理更多文档。为了评价固定上下文基线与 MemGPT 在超出默认上下文长度时的表现,我们截断了检索器返回的文档段落,以便将固定数量的文档纳入现有上下文中。预料之中的是,随着文档内容的缩减,由于可能会遗漏关键段落,准确率也随之下降。我们认为,MemGPT 在文档问答方面的性能可以通过增加特定的任务指令来进一步提升,这些指令可以减少 MemGPT 将控制权返还给用户的情况(例如,减少提问),并增加其阅读由检索器排名的所有文档的可能性。
图 8: 嵌套键值任务的示意图。示例中,MemGPT 反复查询档案记忆,以寻找最新的键值。当档案记忆显示当前键的值不再是另一个键时,MemGPT 会向用户报告最终的值。
3.2.2 嵌套键值检索(KV)
在此,我们介绍一个基于之前研究提出的合成键值检索的新任务(Liu et al., 2023a)。这项任务的目标是展示 MemGPT 如何能从多个数据源汇总信息。在原有的 KV 任务中,研究者创建了一组键值对的合成数据集,每个键和值都是一个 128 位的 UUID(一种全球唯一标识符)。在这个任务中,智能体会接收到一个键,并需要找出与之对应的值。我们对这个任务进行了拓展,创造了一种新的形式:嵌套的键值检索。在这个版本中,某些值本身也是键,要求智能体进行多次查找。我们设定了 140 对 UUID,相当于大约 8,000 个 tokens(即我们 GPT-4 基准的上下文长度)。嵌套层次从 0 到 4 不等(即最多需要 4 次查找才能找到最终的值),并测试了 30 种不同的键的配置。
尽管 GPT-3.5 和 GPT-4 在原始 KV 任务上表现不俗,但在嵌套版本中却遇到了难题。GPT-3.5 在嵌套任务上完全无法应对,一旦涉及嵌套,其性能急剧下降,嵌套一层时准确率就降到了 0%(我们发现它通常只会返回最初的值)。而 GPT-4 虽然表现更好,但也面临相似的问题,当嵌套达到四层时,其准确率同样跌至 0%。具体来说,GPT-4 常常无法正确处理超过特定层次的嵌套,而只是返回某个之前层次的嵌套值。与此相反,MemGPT 对嵌套层数无影响,能够通过函数查询,反复从主内存中获取键值对,从而成功进行嵌套式查找。MemGPT 在嵌套 KV 任务上的表现证明了它能够结合多次查询,实现多步骤的查找。
4 相关工作
近期的研究主要关注于提升每次大语言模型(LLM)调用时能处理的上下文长度,改进检索增强生成(RAG)的搜索与检索能力,以及利用语言模型来支持交互式智能体的应用。
4.1 长上下文的大语言模型
在大语言模型 (LLMs) 中处理长篇的上下文对于确保对话型 AI 智能体能够流畅连贯地进行对话至关重要。同样,这也对于在问答 (QA) 系统中,使用大语言模型整合和串联不同来源的信息非常关键。面对固定长度上下文的限制,一种解决方案是采用递归式的摘要方法(参考 Wu et al., 2021a)。在这种方法中,大语言模型通常会在一个滑动的时间窗口内生成精简的内容摘要,以便适应设定定的 Token 数量限制。但这种摘要过程可能会造成信息的部分丢失,有时候关键细节或微妙之处可能被遗漏。由于许多基于大语言模型的应用受到上下文长度的限制,因此,如何增强大语言模型处理更长序列的能力成为了一个研究热点。这方面的研究包括了 Press et al. (2021),Guo et al. (2021),Dong et al. (2023) 和 Beltagy et al. (2020) 等。MemGPT 利用了这些对上下文长度的改进,它能够在其主内存中存储更多信息。这就像 GPU 缓存增大后,处理器能够更快地处理数据,因为它能更频繁地命中缓存一样。
4.2 搜索和检索功能
在检索增强生成 (RAG) 范式下,搜索和检索功能已广泛应用于会话智能体,涵盖了从文档问题解答、客户支持到娱乐聊天机器人等多个领域。这些功能一般会利用外部数据库或内部对话记录,以提供与语境紧密相关的回应。例如,Lin 等人在 2023 年的研究中(链接)展示了如何在指导调优过程中同时训练检索器和大语言模型,以提升文档的召回效果。其他研究则专注于独立优化检索器或大语言模型,如 Ram 等人(链接)、Borgeaud 等人(链接)、Karpukhin 等人(链接)、Lewis 等人(链接)、Guu 等人(链接)。Trivedi 等人在 2022 年的研究中(链接)将检索过程与连贯推理相结合,以提高解决多步骤问题的能力。在本研究中,我们对采用的检索机制保持开放态度;不同的检索技术可以灵活更换,甚至可以集成为 MemGPT 的磁盘内存部分。
4.3 大语言模型作为智能体
近期,研究人员开始探索如何让大语言模型(LLM)具备更多能力,使其能在交互环境中扮演智能体的角色。例如,Park et al. 在 2023 年的研究提出为大语言模型增加记忆功能,并利用它进行规划,结果在一个类似于《模拟市民》视频游戏的多智能体沙盒环境中观察到了有趣的社交行为。在这个环境中,智能体可以进行诸如做家务、业余爱好、上班和与其他智能体交流等基本活动。而 Nakano et al. 在 2021 年的工作中,训练了能在回答问题前先进行网络搜索的模型,并采用了类似 MemGPT 的方法来管理网络浏览环境中的内容。Yao et al. 于 2022 年展示,通过交替使用链式思考推理(由 Wei et al. 在 2022 年提出),可以有效提升基于大语言模型的交互式智能体在规划方面的能力。在 MemGPT 的案例中,我们看到大语言模型在执行任务时能够“大声思考”(具体例子见图 5 和图 8)。最后,Liu et al. 在 2023 年提出了一套评估大语言模型在交互环境中表现的标准,这些环境包括视频游戏、思维谜题和网络购物。
与以往不同,我们的研究致力于解决如何赋予智能体能够长期记忆用户输入这一难题。
5 结论及未来展望
本文介绍了 MemGPT,这是一种新颖的大语言模型 (LLM),其灵感来源于操作系统。MemGPT 能够有效管理大语言模型的有限上下文窗口。我们借鉴了传统操作系统的内存层级和控制流设计,使得大语言模型似乎拥有了更广泛的上下文处理能力。我们在文档分析和会话智能体两个领域对这种方法进行了测试。这两个领域都是现有大语言模型因上下文长度限制而性能受限的典型例子。在文档分析方面,MemGPT 通过有效管理内存中的相关上下文,可以处理远超现有大语言模型限制的长篇文本。而在会话智能体方面,MemGPT 能够在长时间的对话中保持记忆的连贯性和发展性。总体来看,MemGPT 证明了操作系统的一些技术,如分层内存管理和中断处理,能够在大语言模型面对固定上下文长度限制时发挥其潜能。这项工作为未来的研究开辟了新的道路,包括将 MemGPT 应用于处理大量或无界限上下文的其他领域、融合不同的内存技术(比如数据库或缓存)以及进一步完善控制流和内存管理策略。MemGPT 将操作系统架构的理念引入到 AI 系统中,为在大语言模型的基本限制内最大化其能力提供了一种前景光明的新方向。
5.1 局限性
我们的参考实现是基于 OpenAI 的 GPT-4 模型,这些模型经过了特别的微调,以适应函数调用。虽然 OpenAI 模型的内部机制是保密的,未向公众披露,但根据 OpenAI 的 API 文档,使用经过函数微调的模型时,所提供的函数模式会被转换成系统消息,模型则是通过微调过程学会如何解释这些消息。尽管经过函数调用微调的 GPT 模型仍需一个解析器来验证输出的函数语法是否有效,但我们发现,针对 MemGPT 函数集微调过的 GPT-4 模型在语法或语义上的错误极为罕见。相比之下,GPT-3.5 经过微调的模型则常常生成错误的函数调用,或错误地使用函数。同样地,即使是最受欢迎的 Llama 2 70B 模型的变体,包括那些经过函数调用微调的,也会频繁产生错误的函数调用,甚至编造出模式外的函数。目前,只有使用专门的 GPT-4 模型才能获得合理的性能。然而,我们预期未来的开源模型将通过在更大的函数调用数据集上进行微调、使用更专业化的函数调用数据集进行微调、改善提示工程或提升基础模型的质量等方式,最终达到支持 MemGPT 风格操作的水平。尽管如此,目前对专有闭源模型的性能依赖,仍然是我们工作的一个重要局限性。