MemGPT: Towards LLMs as Operating Systems
阅读难度:★★☆☆☆ | 预计阅读时间:15 分钟
来源:arXiv 2310.08560 | Charles Packer et al., UC Berkeley | 2023
一句话总结
这篇论文本质上是在解决 LLM 上下文窗口有限、无法支持长期记忆和超长文档分析 的问题——借鉴操作系统虚拟内存思想,让 LLM 自己管理自己的"内存"。
背景知识
什么是上下文窗口?
LLM 工作时有一个"工作台",只有放在工作台上的信息才能被看到。GPT-3 时代这个工作台只有 4k Token(大约 60 条消息),GPT-4 是 8k,即使是当时最大的 Claude 2 也只有 100k Token(约 2000 条消息)。
一旦超过这个限制,LLM 就"忘记"了之前说过的话——就像一个金鱼,永远记不住 7 秒前发生的事。
为什么直接扩大窗口很难?
Transformer 的自注意力机制计算量是 O(n²)——窗口翻倍,计算量翻四倍。而且研究发现即使有了大窗口,LLM 对"窗口中间"的内容关注度反而更差("中间遗忘"问题)。
为什么会出现这篇论文
技术演进路线:
早期 LLM(短上下文)
↓
Retrieval-Augmented Generation(RAG)— 外挂检索,但 LLM 自身不主动管理
↓
Long-context LLM(稀疏注意力、RoPE外推)— 治标不治本,中间遗忘
↓
Function Calling(LLM 主动调用工具)— 能力出现
↓
MemGPT — LLM 自主管理分层记忆,像 OS 管理虚拟内存
原来大家怎么做的?
- 截断:把最旧的消息直接扔掉,简单粗暴但丢失信息。
- 递归摘要:把旧消息压缩成摘要塞回去,有损且难以精确检索。
- RAG:由外部系统决定检索什么,LLM 被动接受,无法迭代追问。
这些方案的共同问题:LLM 是被动的,没有主动权来决定"我现在需要什么信息"。
论文试图解决的问题
问题 1:超长对话记忆丢失
- 现象:聊了几十轮后,AI 不记得用户之前说过喜欢什么、做什么工作
- 为什么难:上下文满了只能扔旧的,而"重要"和"旧"并不等价
- 现实影响:个人助手无法建立真正的"了解",每次都像第一次见面
问题 2:超长文档无法完整分析
- 现象:一份法律合同、年报动辄百万 Token,远超任何模型上限
- 为什么难:不能截断(关键信息可能在任何位置),RAG 检索质量不稳定
- 现实影响:企业级文档分析几乎不可用
问题 3:多跳推理跨文档失败
- 现象:需要从文档 A 找到一个 Key,再用这个 Key 去文档 B 查答案
- 为什么难:固定上下文的 LLM 无法"主动再查一次"
- 现实影响:复杂知识库问答严重受限
核心创新
创新 1:分层内存架构(类比操作系统虚拟内存)
作者做了什么: 把 LLM 的记忆分成两层——
- 主上下文(Main Context):LLM 能直接"看到"的,等同于物理内存/RAM
- 外部上下文(External Context):存在外部数据库里,等同于磁盘
直觉理解: 就像你的桌子(RAM)放不下所有书,你把不常用的书放到书架(磁盘),需要时再拿出来。OS 帮你管理这个换进换出,让你感觉"好像有无限的桌子"——MemGPT 让 LLM 自己做这件事。
主上下文的三层结构:
┌─────────────────────────────┐
│ 系统指令(只读,静态) │ ← 告诉 AI 怎么用记忆工具
├─────────────────────────────┤
│ 工作上下文(读写,固定大小) │ ← 存用户偏好、关键事实(相当于便利贴)
├─────────────────────────────┤
│ FIFO 消息队列(滚动历史) │ ← 最近的对话消息
└─────────────────────────────┘
外部上下文的两类存储:
- Recall Storage(回忆存储):全量对话历史,可按时间/关键词搜索
- Archival Storage(档案存储):任意长度文本对象,支持向量相似度搜索
| 对比维度 | 旧方案(截断/摘要) | MemGPT |
|---|---|---|
| 谁决定保留什么 | 固定策略,机械截断 | LLM 自主判断 |
| 信息损耗 | 有损(摘要失真) | 无损(原文存储) |
| 检索方式 | 无法检索 | 关键词 + 向量搜索 |
| 可追溯性 | 丢失 | 完整保存 |
创新 2:自导向记忆编辑(LLM 主动管理)
作者做了什么: 给 LLM 提供一套"内存管理函数",LLM 自己决定何时调用:
archival_memory_search(query)— 在档案里搜索archival_memory_insert(content)— 写入档案core_memory_append(section, content)— 更新工作上下文core_memory_replace(section, old, new)— 替换工作上下文内容
直觉理解: 不是让别人帮你整理桌子,而是你自己有一双手,能主动决定把哪本书放回书架、把哪本拿出来。
为什么有效: LLM 在生成回复的过程中,已经"理解"了当前信息的重要性。让它自己决定记什么,比固定策略更智能。
创新 3:事件驱动控制流 + 函数链式调用
作者做了什么:
- 事件驱动:触发 LLM 推理的不只是用户消息,还有系统消息(如"内存快满了"警告)、定时事件(允许 Agent 主动触发,不需要用户催)
- 函数链:LLM 可以连续调用多个函数再返回结果,不必每步都等用户(类似程序里的循环)
直觉理解: 你去图书馆查资料,传统 LLM 是找到第一本就停下来等你说"继续"。MemGPT 可以自己接着翻第二本、第三本,直到找到答案再来告诉你。
内存压力机制:
- 上下文使用达到 70%:插入"内存压力"警告,提示 AI 应该把重要信息存起来
- 达到 100%:自动触发 FIFO 队列 Flush,生成递归摘要,原始消息存入 Recall Storage
算法流程
Step 1: 事件触发(用户消息 / 系统警告 / 定时事件)
↓
Step 2: Queue Manager 将消息追加到 FIFO 队列
↓
Step 3: 拼接 Main Context(系统指令 + 工作上下文 + FIFO 队列)→ 输入 LLM
↓
Step 4: LLM 生成输出(可能包含函数调用)
↓
Step 5A: 若包含函数调用
→ Function Executor 执行(读/写 External Context)
→ 结果追加回 Main Context
→ 若函数带"continue"标志 → 回到 Step 4(链式调用)
→ 若函数带"yield"标志 → 等待下一个外部事件
↓
Step 5B: 若为普通回复
→ 输出给用户 / 执行 yield
↓
Step 6: 检查内存压力 → 必要时触发 Flush
→ 生成递归摘要
→ 旧消息归档到 Recall Storage
实验说明了什么
实验 1:深度记忆检索(对话一致性)
作者想证明:MemGPT 能记住几轮对话前的细节,而普通 LLM 不行。
结果:MemGPT + GPT-4 达到 92.5% 准确率,而纯 GPT-4 只有 32.1%。提升极其显著。
提升来自:MemGPT 把过去对话中的关键事实存进了工作上下文(Working Context),能精确召回;而纯 LLM 的递归摘要有损,细节丢失。
实验 2:文档问答
作者想证明:MemGPT 能处理超过上下文限制的文档。
结果:MemGPT 通过多次主动查询 Archival Storage,有效突破了文档数量限制。固定上下文模型性能被检索器质量"卡死",MemGPT 可以迭代分页搜索直到找到正确文档。
实验 3:嵌套 KV 检索(多跳推理)
结果:GPT-4 在 3 层嵌套时准确率降为 0%,MemGPT + GPT-4 在 4 层嵌套下依然保持高准确率,因为它可以主动多次查询函数、完成多跳推理。
与 LLM 后训练的关系
MemGPT 对现代 Agent RL 训练有重要启示:
-
工具调用能力的重要性:MemGPT 依赖 LLM 的 Function Calling 能力正确调用记忆函数。这直接推动了后续模型训练中对 Tool Use 能力的强化,成为 Agent RL 训练的核心目标之一。
-
自我反思与主动规划:MemGPT 中 LLM 需要判断"什么时候该存记忆、存什么、检索什么"——这种自主决策能力正是后续 Agent RL 环境(RLE)设计的核心奖励信号来源。
-
记忆作为 State:MemGPT 的 Working Context 本质上是一个可持久化的 Agent State,这个设计影响了后续 SWE-Agent、OpenHands 等框架对 Agent 内部状态的管理方式。
现实应用情况
- Anthropic:Claude 系列的 Memory 功能(Claude.ai "Projects")借鉴了类似的分层记忆思路。
- OpenAI:ChatGPT 的长期记忆功能(2024年推出)与 MemGPT 架构高度相似——核心记忆 + 可搜索历史。
- MemGPT 项目本身:已演进为 Letta 框架,成为有状态 Agent 的开源基础设施,被多个生产环境采用。
- 字节跳动、阿里等:其 Agent 产品中的长期记忆模块均采用了类似的"核心记忆 + 向量检索"架构。
对 Agent 的意义
| Agent 方向 | 影响 |
|---|---|
| Tool Use | MemGPT 证明 LLM 可以可靠地"自主"决策工具调用序列,是 Tool Use 能力成熟的重要里程碑 |
| RAG | 从"外部决策检索什么"升级为"LLM 自主决策检索什么",大幅提升 RAG 质量上限 |
| Multi-Agent | Working Context 模式为多 Agent 间共享状态提供了参考架构 |
| SWE Agent | 函数链式调用的控制流设计,直接影响了 SWE-Agent、OpenHands 的 Action 设计 |
| Deep Research | Deep Research 的"主动迭代查询"模式与 MemGPT 的函数链几乎同构 |
| RLE | MemGPT 的 State(Working Context)+ Action(Function Call)+ 观测(函数返回值)三元组,是典型的 RL Environment 接口 |
对初学者最值得学什么
Top 1:从 OS 类比理解 Agent 架构 把 LLM 看作 CPU,上下文看作 RAM,外部存储看作磁盘——这个类比极为深刻。Agent 系统设计本质上是在做"资源调度",OS 领域几十年的智慧都可以借鉴。
Top 2:主动 vs 被动的架构区别 被动 RAG(系统决定检索什么)vs 主动记忆管理(LLM 自己决定)——这个区别在后续 Agent 演进中反复出现,理解这个转变是理解 Agent 智能化趋势的关键。
Top 3:函数链使 Agent 具备"深思熟虑"能力 允许 LLM 在返回结果前反复调用工具,是从"单步反应"到"多步规划"的关键跨越,也是 Chain-of-Thought → ReAct → Agent RL 演进链中的重要一环。
论文局限性
- 依赖强 Function Calling 能力:GPT-3.5 的 MemGPT 性能显著差于 GPT-4,说明记忆管理本身需要强大的指令理解能力,弱模型不适用。
- 检索质量上限:Archival Storage 的向量检索仍然会漏掉相关文档,MemGPT 的多跳补偿有限。
- 延迟开销:函数链会导致多次 LLM 推理,实时对话场景下延迟明显。
- Working Context 大小固定:核心记忆容量有限,复杂任务可能不够用。
- 未解决"遗忘什么"的决策质量:LLM 决定遗忘哪些信息的策略没有经过 RL 优化,可能不够优。
技术演进图谱
固定上下文 LLM
↓
Retrieval-Augmented Generation(外挂检索)
↓
Recursive Summarization(递归摘要)
↓
Function Calling + Tool Use
↓
MemGPT(自主记忆管理,OS 类比)← 本论文
↓
Letta / Stateful Agent Framework
↓
Agent RL + 记忆优化(RLE 中的 Memory State 设计)