专栏名称: 计算机视觉深度学习和自动驾驶
讨论计算机视觉、深度学习和自动驾驶的技术发展和挑战
51好读  ›  专栏  ›  计算机视觉深度学习和自动驾驶

MemGPT: 带记忆的对话系统

计算机视觉深度学习和自动驾驶  · 公众号  ·  · 2024-04-13 12:41

正文


  • paper: https://arxiv.org/pdf/2310.08560.pdf

  • Github: https://github.com/cpacker/MemGPT

一、背景

近年来,大型语言模型(LLM)在自然语言处理领域取得了巨大进展。基于注意力机制的Transformer架构使其在任务场景不断拓展,从语言理解到对话应用再到多轮问答。但是,固定长度的上下文窗口也成为LLM发展的瓶颈。在需要理解长篇文档或进行多轮交互的场景下,LLM的有限上下文严重制约了其能力。

二、动机

面对有限上下文这个问题,直观的做法是继续扩大LLM的上下文长度。但研究表明,随着上下文的线性增加,模型的计算复杂度和参数规模呈 O( N 2 ) 增长;同时模型的注意力也难以有效覆盖过长的上下文。近期的工作也证明了单纯增加上下文长度收益有限。那么,如何在不改变模型复杂度的前提下,实现对超长上下文的支持,这成为一个重要的研究问题。

三、主要贡献

Memory-GPT(或简称 MemGPT)是一个智能管理 LLM 中不同记忆层(memory tiers)的系统,以便在 LLM 的有限上下文窗口内有效地提供扩展上下文。例如,MemGPT 知道何时将关键信息推送到vector database以及何时在聊天中稍后检索它,从而实现永久对话。


MemGPT的主要贡献在于其独特的虚拟上下文管理技术(virtual context management)。这种技术从传统操作系统中的分层(paging)内存系统中获得灵感,通过在快速和慢速内存(fast and slow memory)之间移动数据,为LLMs提供了大型内存资源的外观。此外,MemGPT还引入了中断机制,这一机制改变了与用户的交互方式,使其能够更加灵活地管理控制流。

  • 虚拟上下文管理 :MemGPT通过智能地管理不同的内存层次,克服了LLMs的有限上下文窗口限制。通过在快速和慢速内存之间移动数据,它可以在LLM的有限上下文窗口内有效地提供扩展上下文。

  • 中断机制 :MemGPT引入了中断机制,允许用户与LLM之间的交互更为灵活。这意味着用户可以在不中断会话的情况下发送新的指令或查询。

四、方案介绍


MemGPT的主体架构图

MemGPT 是一个使大型语言模型超越有限上下文窗口的内存管理系统。该系统采用操作系统的内存管理机制从根上解决大模型 context 限制的解决方案,可突破 llama 的 4k 限制,针对多轮对话、长文档等场景处理表现较好。MemGPT 在处理自然语言生成任务时引入了记忆管理的概念,旨在通过智能地管理不同存储层次,为模型提供扩展的上下文窗口,并利用中断来管理控制流。MemGPT 的核心思想是通过函数调用协调主上下文和外部上下文之间的数据移动,可以根据当前上下文自主更新和检索信息,从而实现更长的上下文窗口。

MemGPT的核心方法论集中在如何扩展LLM的上下文窗口,以及如何与用户进行更有效的交互。以下是其主要的方法和技术细节:

1. 虚拟上下文管理

分层内存系统(虚线框) :MemGPT采用了一个分层的内存管理系统,模仿了传统操作系统中的内存管理。内部存储分为主上下文(main context)和外部上下文(external context)。前者面向 LLM 直接访问,后者用于完整历史的存儲。主上下文又细分为系统指令、对话内容和工作内容三部分。

  1. 系统指令(system instructions):是只读的,并且在MemGPT代理程序的生命周期内保持不变。

SeaLLM中的”You are an AI assistant named SearchChat designed by Shopee. Use the following context and chat history to answer the human question at the end. The answer should be detailed, complete and in good format. If you don't know, simply say you don't know, don't try to make up an answer.”

  1. 对话上下文(conversational context):是只读的,并且有一个特殊的剔除策略(如果队列达到一定大小,会通过递归摘要(recursive summarization)来截断或压缩部分前端)。

  2. 工作上下文(working context):可以通过 函数调用 由 LLM 处理器进行写入。

这三个部分的总和不能超过 LLM 处理器的最大上下文大小。在实践中,会限制对话上下文和工作上下文的大小为一个固定的常数,该常数由处理器的上下文窗口和系统指令的长度决定。因此, MemGPT 通过合理划分主上下文,并使用适当的剔除策略,实现了无限上下文记忆的效果。

动态数据迁移 :这是MemGPT的核心机制。简言之,系统让LLM可以自主地在主 上下文和外部上下文之间移动数据 ,而无需外部干预。 具体来说,MemGPT在LLM的prompt中提供了详细的 Function Call 说明。 这些函数具有预定义的输入和输出格式。 在每次推理时,LLM 会根据当前上下文,主动调用这些函数来读取或修改内存。 当 LLM 需要引用过去的对话内容时,它可以调用搜索Recall Memory的函数。 该函数会在外部上下文中查找相关信息,并将结果页以明确格式返回到主上下文中。 LLM 就可以在当前的有限上下文里看到这些信息了。

类似地,LLM 也可以主动调用写ArchivalMemory的函数,来将重要信息保存到外部上下文中。 MemGPT 使用解析器来验证和执行 LLM 生成的函数调用。 并将执行结果反馈给 LLM,这样可以训练 LLM 学习和调整自己的记忆策略。


Function Call的示例, 初始化Agent的时候,会将 FunctionCall作为输入进行传入,然后在调用OpenAI的接口的时候作为参数, OpenAI Function Call

如果response中出现maximu_context_length的异常情况,我们会调用相关summary和trim的接口进行处理。

内存中常驻的messages包括如下类型,就是对应着上面提到的内存存储的 main contenxt

{"role""system""content": full_system_message},{"role""assistant""content": xxxxx},{"role": "function", "name": "send_message", "content":package_function_response(True, None)},  {"role": "user", "content": first_user_message},

2. 中断机制

在传统的计算机系统中,中断是一种机制,允许硬件或软件暂停当前执行的任务,以便处理更紧迫或更重要的事情。借鉴这一概念,MemGPT在用户与模型的交互中引入了“智能中断”。

用户指令中断:

  • 在与MemGPT的交互过程中,用户可以发送特定的指令来改变会话的方向或请求特定的上下文信息。例如,用户可能希望模型回顾之前的某个主题,或者暂时忽略某些信息。

  • 这些指令可以被看作是“中断”,它们使用户能够直接与模型的内部状态交互,实现更为灵活的会话管理。

  • 一个例子:假设用户在与MemGPT讨论天气时突然想知道关于某部电影的信息。用户可以直接发送一个指令如“转到昨天关于《星际穿越》的讨论”。MemGPT会识别这个“中断”,并迅速切换到与该电影相关的上下文。

上下文切换:

  • 当用户发出中断指令时,MemGPT需要快速地调整其当前的上下文,以便满足用户的新请求。这就是所谓的“上下文切换”。

  • 例如,继续上面的情景,一旦用户请求回顾关于《星际穿越》的讨论,MemGPT会从其存储的历史上下文中检索该部分,并在当前会话中为用户呈现

中断优先级:

  • 不是所有的中断指令都有相同的优先级。有些请求可能比其他请求更紧迫或更重要。MemGPT通过为每个中断指令分配一个优先级来管理这些请求。

  • 当多个中断请求同时出现时,根据其优先级,MemGPT会决定首先处理哪一个,确保最关键的任务得到优先处理。

  • 例如,用户在与MemGPT的会话中同时发送了两个指令:“告诉我明天的天气”和“请提醒我5分钟后喝水”。尽管这两个指令都是中断,但“请提醒我5分钟后喝水”可能具有更高的优先级,因为它涉及到时间敏感性。

通过这种智能中断机制,MemGPT不仅提供了更大的上下文窗口,而且还为用户提供了与模型更为深入和灵活的交互方式。


从MemGPT源代码的 step函数 中我们来看一下,所谓的中断机制,就是通过Function Call来实现对上下文数据的更改,从而影响实际用户请求的上下文:

  • Step 0: add user message

  • Step 1: send the conversation and available functions to GPT

  • Step 2: check if LLM wanted to call a function

    • (if yes) Step 3: call the function

    • (if yes) Step 4: send the info on the function call and function response to LLM

  • Step 4: extend the message history

如果在Step3 中返回的需要去search recall memory的话,就可以获得如下case

3. 扩展的上下文窗口技术

上下文窗口分段:为了更高效地处理超出其原始上下文窗口的信息,MemGPT将长上下文分段,并在需要时动态地加载它们。

优先级排序:MemGPT为上下文中的每一部分分配了一个优先级,基于其与当前交互的相关性。这确保了最相关的信息始终处于快速内存中,并随时可供访问。

  • 越早来的优先级越低

  • 优先级:系统指令 >  对话

通过以上的方法,MemGPT成功地扩展了LLM的上下文窗口,同时提供了与用户更为灵活和高效的交互方式。

CoreMemory: 指的是系统块,它为人工智能提供了必要的、基础的上下文。 这包括人物信息、重要的用户详细信息,以及您认为人工智能的基本功能所必需的任何其他基线数据。

Recall Memory : The AI's capability to search through past interactions, effectively allowing it to 'remember' prior engagements with a user.

Archival Memory : A more structured and deep storage space for the AI's reflections, insights, or any other data that doesn't fit into the active memory but is essential enough not to be left only to the recall memory.


五、评估

MemGPT的评估主要集中在两个关键应用领域:文档分析和多次会话聊天。

1、多次会话场景:与传统的LLMs相比,MemGPT能够更好地追踪和维持与用户的多次会话,即使在会话之间存在时间间隔。这使得MemGPT可以创建的聊天代理更加人性化,能够记住、反映并随着与用户的长期互动而动态演化。

  • 检索历史信息任务中 :当被问到只能依赖过去对话内容的问题时,MemGPT的正确率达到82.4%,明显优于固定上下文的GPT-3.5(55.6%)和GPT-4(79.2%)。MemGPT可以搜索外部存储的完整对话,而GPT只有递归摘要。

  • 生成开场白任务中 :配备工作记忆的MemGPT与人类编写的开场白在个性化和相关性上达到了可比性。删除工作记忆后,其性能大幅下降。







请到「今天看啥」查看全文