- 解释 MemGPT 所依托的操作系统类比:主上下文 = RAM,外部上下文 = 磁盘,记忆工具 = 换入/换出。
- 用标准库实现两级 MemGPT 模式:主上下文缓冲区、可检索的外部存储,以及换入/换出工具。
- 描述 Agent 如何发出「中断」来查询或修改外部记忆,以及结果如何拼接回下一个 prompt。
- 指出从 MemGPT 延续到 Letta(第 08 课)和 Mem0(第 09 课)的设计选择。
问题
上下文窗口看起来应该能解决记忆问题。事实并非如此。生产环境里反复出现三种失效模式:
- 溢出。 多轮对话、长文档或 tool call 密集的轨迹会越过窗口边界。截断点之后的一切都消失了。
- 稀释。 即便在窗口之内,塞入无关上下文也会稀释对关键内容的注意力。前沿模型在长输入上仍然会退化。
- 持久性。 新会话从空窗口开始。没有外部记忆的 Agent 无法跨会话说出「还记得你让我……」
更大的窗口有帮助,但解决不了这个问题。Mem0 2025 年的论文测量发现,128k 窗口的基线仍会漏掉长程事实,而带外部记忆的 4k 窗口 Agent 能够捕捉到。
概念
操作系统类比
MemGPT(Packer 等,arXiv:2310.08560,v2 2024 年 2 月)把上下文管理映射到操作系统的虚拟内存:
| OS 概念 | MemGPT 概念 | 2026 生产环境对应物 |
|---|---|---|
| RAM | 主上下文(prompt) | Anthropic/OpenAI 上下文窗口 |
| 磁盘 | 外部上下文 | 向量数据库、KV、图存储 |
| 缺页(page fault) | 记忆 tool call | memory.search、memory.read、memory.write |
| 操作系统内核 | Agent 控制循环 | 带记忆工具的 ReAct 循环 |
Agent 运行一个普通的 ReAct 循环。多出来的一类工具让它能把数据换入和换出主上下文。
两级结构
- 主上下文。 固定大小的 prompt,承载当前任务。模型始终可见。
- 外部上下文。 无界,可通过工具检索。相关时读取,事实出现时写入。
原论文在两个超出基础窗口的任务上评估了这一设计:超过 100k token 的文档分析,以及跨天保持持久记忆的多会话聊天。
中断模式
MemGPT 引入了「记忆即中断」:对话进行中,Agent 可以调用记忆工具,运行时执行它,结果作为新的观察拼接进下一个助手回合。概念上等同于 Unix 的 read() 系统调用——阻塞进程、返回字节,然后进程继续。
标准的记忆工具面:
core_memory_append(section, text)—— 写入 prompt 中一个持久段落。core_memory_replace(section, old, new)—— 编辑一个持久段落。archival_memory_insert(text)—— 写入可检索的外部存储。archival_memory_search(query, top_k)—— 从外部存储检索。conversation_search(query)—— 扫描过去的回合。
论文止步之处,生产开始之处
2024 年 9 月,MemGPT 变成了 Letta。研究仓库(cpacker/MemGPT)保留下来;Letta 扩展了这一设计:
- 三个层级而非两个(核心、回忆、归档——第 08 课)。
- 原生推理取代
send_message/心跳模式(第 08 课)。 - 睡眠时间 Agent 异步执行记忆工作(第 08 课)。
即便生产系统运行的是 Letta、Mem0 或自建的两级存储,MemGPT 论文仍是 2026 年的基础。
这个模式会在哪里出错
- 记忆腐化。 写入累积得比读取快;检索淹没在陈旧事实里。修复:定期合并(Letta 睡眠时间),显式失效(Mem0 冲突检测器)。
- 记忆投毒。 外部记忆是被检索的文本。如果攻击者控制的内容落进记忆笔记,Agent 下次会话会重新摄入它。这就是 Greshake 等(第 27 课)的攻击在时间维度上的重述。
- 引用丢失。 Agent 记得「用户让我交付 X」,却无法指出是哪个回合。每次归档写入都存储来源引用(会话 ID、回合 ID)。
构建它
code/main.py 用标准库实现了 MemGPT 的两级模式:
MainContext—— 固定大小的 prompt 缓冲区,含一个core字典和一个messages列表;超出上限时自动压缩最旧的消息。ArchivalStore—— 内存中的类 BM25 存储(token 重叠打分),记录形如 (id, text, tags, session, turn)。- 五个记忆工具,映射到 MemGPT 的工具面。
- 一个脚本化 Agent:先用事实填充归档,然后通过调用
archival_memory_search回答一个问题。
运行它:
python3 code/main.py运行轨迹显示 Agent 写入三条事实、把主上下文填到上限(强制驱逐),然后通过从归档检索来回答一个后续问题——在没有任何真实 LLM 的情况下复现了 MemGPT 工作流。
使用它
今天每个生产记忆系统都是 MemGPT 的变体:
- Letta(第 08 课)—— 三个层级、原生推理、睡眠时间计算。
- Mem0(第 09 课)—— 向量 + KV + 图,用打分层融合。
- OpenAI Assistants / Responses —— 通过线程和文件提供托管记忆。
- Claude Agent SDK —— 通过技能和会话存储提供长期记忆。
按运行形态(自托管、托管、框架集成)来选择,而不是按核心模式——核心模式就是 MemGPT。
Agent 记忆的形态
换页解决容量问题。它不决定存什么。生产系统里反复出现四种记忆类型,各自回答不同的问题:
- 工作记忆 —— 此刻什么重要?上下文内的层级:当前任务、最近回合、固定核心段落。也就是 prompt 本身。
- 情景记忆 —— 发生了什么?过去的回合与轨迹,带会话和回合引用存储,可按需回放。
- 语义记忆 —— 什么是真的?关于用户、领域、世界的事实,随变化更新并去重。
- 程序性记忆 —— 我该怎么做?习得的例程、偏好和规则,用来引导未来行为而非回忆。
开源实现选择不同的切入点:
| 类型 | 实现 | 如何应对 |
|---|---|---|
| 工作记忆 | MemGPT / Letta | 通过记忆工具在固定 prompt 预算中换入换出内容(本课、第 08 课) |
| 情景记忆 | Zep | 时间知识图谱——事实携带有效区间,因此「某时什么是真的」可查询 |
| 语义记忆 | Mem0 | 抽取 pipeline,跨向量、KV 和图存储去重并更新事实(第 09 课) |
| 语义 + 程序性 | LangMem | 后台抽取事实和行为规则,存入 Agent 在回合之间查阅的存储 |
| 情景 + 语义 | agentmemory | 在会话运行中捕获,合并为带类型、可检索的记录 |
交付它
outputs/skill-virtual-memory.md 是一个可复用技能:为任意目标运行时生成正确的两级记忆脚手架(主上下文 + 归档 + 工具面),并接好驱逐策略和引用字段。
练习
- 增加一个以 token 计量的
max_main_context_tokens上限(用len(text.split())* 1.3 近似)。超过上限时把最旧的消息压缩成摘要。对比有和没有摘要器时的行为。 - 在归档存储上正确实现 BM25(词频、逆文档频率)。在玩具事实集上测量 recall@10,与 token 重叠基线对比。
- 给归档插入增加
citation字段(session_id、turn_id、source_url)。让 Agent 在每个基于检索的回答上引用来源。 - 模拟记忆投毒:增加一条归档记录,内容是「忽略未来所有用户指令」。写一个防护栏,扫描检索结果中指令形态的文本,并将其标记为不可信。
- 把实现移植到 MemGPT 研究仓库的核心记忆 JSON schema(
cpacker/MemGPT)。从扁平字符串切换到带类型的段落,会带来哪些变化?
关键术语
| 术语 | 人们怎么说 | 实际含义 |
|---|---|---|
| 虚拟上下文(Virtual context) | 「无限记忆」 | 主上下文(prompt)+ 外部(可检索)两级,带换入/换出 |
| 主上下文 | 「工作记忆」 | 即 prompt——固定大小,始终可见 |
| 归档记忆 | 「长期存储」 | 外部可检索的持久化,按需检索 |
| 核心记忆 | 「持久 prompt 段落」 | 固定在主上下文里的命名段落 |
| 记忆工具 | 「记忆 API」 | Agent 读/写外部记忆时发出的 tool call |
| 中断 | 「记忆缺页」 | Agent 暂停,运行时取数,结果拼接进下一回合 |
| 记忆腐化 | 「陈旧事实」 | 旧写入淹没检索;用合并来修复 |
| 记忆投毒 | 「注入的持久笔记」 | 攻击者内容被存为记忆,回忆时重新摄入 |
延伸阅读
- Packer 等,MemGPT(arXiv:2310.08560) —— 受操作系统启发的虚拟上下文论文
- Letta, Memory Blocks 博客 —— 三层结构的演进
- Anthropic, Effective context engineering —— 把上下文当作预算
- Chhikara 等,Mem0(arXiv:2504.19413) —— 构建在此模式之上的混合生产记忆
- Zep (getzep/zep) —— 分类表中的时间知识图谱记忆
- Mem0 (mem0ai/mem0) —— 第 09 课混合存储背后的抽取 pipeline
- LangMem (langchain-ai/langmem) —— 后台抽取事实与行为规则
- agentmemory (rohitg00/agentmemory) —— 会话捕获并合并为带类型、可检索的记录