论文
记忆机制
★ 必读
MemGPT: Towards LLMs as Operating Systems
MemGPT:把操作系统虚拟内存搬进 LLM
Charles Packer, Sarah Wooders, Kevin Lin, Vivian Fang, Shishir G. Patil, Ion Stoica, Joseph E. Gonzalez · UC Berkeley · arXiv · 2023-10 · 被引 1190
一句话 借操作系统虚拟内存分层换页的思路,让 LLM 通过 function call 自主管理上下文内外的记忆,在自建的 DMR 长对话任务上把 GPT-4 Turbo 的准确率从 35.3% 提到 93.4%;机制和工程影响扎实(演化为 24.5k star 的 Letta),但主结果的实验代码从未公开,DMR 任务本身也被 Zep 证明太容易。
这是什么 2023 年 10 月,LLM 上下文窗口普遍还在 8k-32k,长对话和长文档任务一超窗就只能靠截断或摘要硬扛。UC Berkeley 的 Packer 等人提出了一个不改模型、纯系统层面的解法:把上下文窗口当成 OS 里的物理内存(main context),把窗口外的数据库当成磁盘(external context),让 LLM 自己通过 function call 在两层之间换页——他们称之为 virtual context management,整个系统叫 MemGPT。
这篇论文的真正遗产不在实验数字,而在于它定义了 'agent 记忆管理' 这个工程方向:working context / recall storage / archival storage 的三层划分、memory pressure 警告、自我编辑记忆等设计,被后来几乎所有 agent 记忆系统(Zep、Mem0、A-MEM 等)沿用或对标。项目本身也从研究原型演化为公司 Letta(letta-ai/letta,24.5k stars,Apache-2.0,至今活跃开发),论文的 DMR 任务成了这个领域的事实标准 benchmark 之一。
系统总架构:虚线框内是 LLM 的固定上下文窗口(prompt tokens = 只读 System Instructions + 可读写 Working Context + FIFO Queue)。模型输出被 Function Executor 解释为函数调用,在窗口与两个外部数据库(Archival Storage 归档库、Recall Storage 消息历史库)之间搬运数据;Queue Manager 负责消息进出与逐出。这张图是理解全文的钥匙,后续所有 agent 记忆系统基本都是它的变体。 机制与做法 两层内存:main context 与 external context
Main context 就是 prompt tokens,分三段:只读的 system instructions(告诉模型这套内存体系怎么用、有哪些函数)、定长可读写的 working context(存用户关键事实、偏好、persona,只能通过函数写入)、以及 FIFO queue(滚动的消息历史,队首永远是一条被逐出消息的递归摘要)。External context 分两块:recall storage 存完整消息历史(数据库),archival storage 存任意长度的文本对象(默认 PostgreSQL + pgvector 向量检索)。窗口外的数据必须显式搬进 main context 才能被模型看到。
记忆写入与修正的实例:左列收到 'System Alert: Memory Pressure' 警告后,模型主动调用 working_context.append 把 '生日 2/7'、'男友 James' 写入常驻记忆;中列用 recall_storage.search 搜出几周前提过的 'six flags';右列用户说分手后,模型调用 working_context.replace 把 'Boyfriend' 改成 'Ex-boyfriend'——展示自我编辑记忆如何保持信息最新。 Queue Manager:用 memory pressure 触发换页
Queue manager 负责消息进出和逐出策略:prompt tokens 超过 warning token count(如窗口的 70%)时,往队列里插一条 'memory pressure' 系统警告,提示模型趁早把重要信息用函数写进 working context 或 archival storage;超过 flush token count(100%)时强制清队——逐出约半个窗口的消息,用旧摘要加被逐出消息生成新的递归摘要。被逐出的消息不会丢,永久存在 recall storage 里,随时可以搜回来。
多文档 QA 结果:横轴是检索文档数,固定上下文 baseline(GPT-4 深蓝、GPT-3.5 青色、GPT-4 Turbo 绿)随文档增多因截断而持续下滑(GPT-4 在 200 篇时跌到 0.12),MemGPT(红色水平线,约 0.72)靠分页查询 archival storage 不受文档数影响。注意橙色虚线:MemGPT 用 GPT-3.5 时只有 0.40,方法强依赖底层模型的 function calling 能力。 Function executor:模型自己编辑自己的记忆
所有记忆读写都由 LLM 生成的 function call 驱动,完全自主:何时把对话要点存档、何时搜索历史、何时修正 working context 里过时的信息(比如用户说分手了就把 'Boyfriend named James' 改成 'Ex-boyfriend'),都是模型自己决定的。MemGPT 解析输出、校验参数、执行函数,并把结果(包括运行时错误,比如 working context 写满了)回喂给模型,形成反馈循环。检索函数都带分页,避免搜索结果本身撑爆窗口。
Nested KV 多跳检索结果:横轴是嵌套层数(需要连续查几次 key→value)。MemGPT(GPT-4)(红线)全程 100%,所有 baseline 在 3 层嵌套时都归零。同时暴露一个反直觉现象:MemGPT(GPT-4 Turbo)(紫线)反而比 MemGPT(GPT-4) 差,说明性能瓶颈在模型执行多步函数调用的可靠性,而非窗口大小。 事件驱动与 function chaining
系统由事件触发推理:用户消息、系统警告、定时器等都是事件,这让 agent 可以'无人提示'地自主运行。函数调用可以带一个 request_heartbeat=true 标志,要求执行完立刻把控制权还给模型继续推理——这就是 function chaining,靠它才能做多步检索(比如翻好几页搜索结果、跨文档收集信息)后再回复用户。这个 heartbeat 设计后来成了很多 agent 框架里 'agentic loop' 的原型。
关键结果 Deep Memory Retrieval(DMR,自建任务,问 5 个 session 之前聊过的细节):MemGPT + GPT-4 Turbo 准确率 93.4%、ROUGE-L(R) 0.827,对应固定上下文 baseline(递归摘要)只有 35.3% / 0.359;GPT-4 上是 92.5% vs 32.1%。 Conversation opener(用积累的用户信息开启新对话):MemGPT 的开场白与 persona 的相似度(SIM-1 最高 0.868,GPT-4)超过人类手写开场白的 0.800。 多文档 QA(NaturalQuestions-Open,50 题):固定上下文 baseline 随检索文档数增加先升后降(GPT-4 峰值 0.70,塞到 200 篇文档时因截断跌到 0.12),MemGPT 通过分页查询 archival storage 保持约 0.72 不随文档数变化。 Nested KV 多跳检索(140 对 UUID,0-4 层嵌套):MemGPT + GPT-4 在所有嵌套层数上保持 100%,而 GPT-4 baseline 到 3 层嵌套时降到 0%。 方法强依赖底层模型的 function calling 能力:换用 GPT-3.5,MemGPT 在 doc QA 上掉到约 0.40(还不如 GPT-4 Turbo baseline 的峰值),nested KV 从 2 层嵌套开始崩;nested KV 上 MemGPT(GPT-4 Turbo) 反而不如 MemGPT(GPT-4)。 论文附带发布了扩充版 MSC 数据集(加了第 6 个 session 的 QA 对)、nested KV 数据集和 2000 万条 Wikipedia 文章 embeddings。 实证核查
有水分 系统设计真实可用且影响深远(演化为 Letta,DMR 成为领域标准 benchmark),但'发布全部实验代码'的声称不实——主结果 DMR 的代码从未公开;且 Zep 后来证明 DMR 任务本身太容易,整段对话直接塞窗口就能超过 MemGPT 的分数。
论文声称 'We release MemGPT code and data for our experiments'(摘要)、'Our code for the benchmarks is available'(实验节)。
只兑现了一半。仓库历史上的 paper_experiments/ 目录(后在 commit c8d36168 'cleaning up our OSS repo' 中删除)只有 doc_qa_task 和 nested_kv_task 两个文档实验;对话实验(DMR 93.4% 这个主结果)的代码从未公开——issue #1277 中作者回复'在另一个 repo,发邮件给我们可以分享',楼下用户回帖称发了邮件没有收到回复。
DMR 上 93.4% vs baseline 35.3%,证明分层记忆管理对长对话一致性有巨大提升。
Zep 的论文(arXiv 2501.13956, Sec 4.2)复查发现:DMR 每段对话只有约 60 条消息,直接把完整对话塞进 gpt-4-turbo 上下文的 full-conversation baseline 就能拿 94.4%,高于 MemGPT 的 93.4%——论文选的递归摘要 baseline(35.3%)是个弱对照。Zep 还称'由于方法细节不足,无法用 gpt-4o-mini 复现 MemGPT 的结果',且 MemGPT/Letta 框架无法直接灌入既有对话历史来跑 LongMemEval。
MemGPT 是可用的开源系统,而非论文原型。
属实且超预期:letta-ai/letta 24,495 stars、Apache-2.0、2026-08 仍在活跃推送;已从研究代码演化为公司产品 Letta(README 显示 2026 年原仓库退役为 landing page,V1 server 保留在 archive 分支,当前开发在 letta-ai/letta-code)。S2 引用数 1190,DMR 被 Zep、A-MEM 等后续工作直接采用为评测任务。
(后续争议)MemGPT/Letta 在第三方长记忆评测中是否仍领先。
存在 benchmark 之争:Mem0 的评测(mem0.ai 博客)用 LoCoMo 声称超过 MemGPT;Letta 创始人 Packer 公开反驳其配置错误,并在官方博客给出 Letta(文件系统方案)LoCoMo 74% vs Mem0 68.5%。同时社区审计(r/AIMemory)发现 LoCoMo 答案键本身有 6.4% 错误。结论:这个领域的横向对比数字普遍要打折看待。
与我们方向的关系 对 continual-learning 方向,MemGPT 是 'agent 记忆管理' 这条线绕不开的起点:它把'学习新知识'重新表述为'管理有限工作记忆 + 无限外部存储'的系统问题,不动模型权重就能让 agent 跨 session 积累和修正知识。working context 的自我编辑(可看作显式的、可解释的在线知识更新)与 memory pressure 触发的主动固化,和我们关心的灾难性遗忘/知识保持问题是同一个问题的工程化表述,值得作为无参数更新的 baseline 纳入对比。
可直接借鉴的资产:扩充版 MSC / DMR 任务设计(考察跨 session 一致性,虽然要注意 Zep 指出的'塞满上下文即可解'的缺陷,评测时务必加 full-context 对照)、nested KV 多跳检索任务(合成、可控、便宜,适合快速验证记忆检索能力)、以及 request_heartbeat 式的 function chaining 控制流设计。教训也很清楚:做记忆系统评测,baseline 必须包含'整段历史直接进上下文',否则结果没有说服力。
阅读笔记 读代码找 DMR 实现会扑空:公开过的 paper_experiments/ 只有 doc QA 和 nested KV(现已从主分支删除,要看去 commit 5511a080 之前的历史)。今天的 Letta 与论文里的 MemGPT 差别已很大(memory blocks、sleep-time agents 等),引用论文机制时以 tex 源码为准。论文版本对应 gpt-4-0613 / gpt-4-1106-preview 时代,数字不要直接与现代模型比。
材料清单 TeX 源码 已存档:Raw/memgpt/source/
同类条目