Agent 记忆——虚拟上下文与记忆分页

Build~75 minutesPython (stdlib)先修要求: Phase 14 · 01 (Agent Loop), Phase 14 · 06 (Tool Use)
上下文窗口是有限的。对话、文档和 tool call 轨迹却不是。解法是把操作系统的虚拟内存重新表述一遍——主上下文是 RAM,外部存储是磁盘,Agent 在两者之间换页。MemGPT(Packer 等,2023)命名了这一模式;许多生产记忆系统都构建在它之上。
学习目标
  • 解释 MemGPT 所依托的操作系统类比:主上下文 = RAM,外部上下文 = 磁盘,记忆工具 = 换入/换出。
  • 用标准库实现两级 MemGPT 模式:主上下文缓冲区、可检索的外部存储,以及换入/换出工具。
  • 描述 Agent 如何发出「中断」来查询或修改外部记忆,以及结果如何拼接回下一个 prompt。
  • 指出从 MemGPT 延续到 Letta(第 08 课)和 Mem0(第 09 课)的设计选择。

问题

上下文窗口看起来应该能解决记忆问题。事实并非如此。生产环境里反复出现三种失效模式:

  1. 溢出。 多轮对话、长文档或 tool call 密集的轨迹会越过窗口边界。截断点之后的一切都消失了。
  2. 稀释。 即便在窗口之内,塞入无关上下文也会稀释对关键内容的注意力。前沿模型在长输入上仍然会退化。
  3. 持久性。 新会话从空窗口开始。没有外部记忆的 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 callmemory.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)。
context-budget静态版本未包含此交互图

构建它

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 是一个可复用技能:为任意目标运行时生成正确的两级记忆脚手架(主上下文 + 归档 + 工具面),并接好驱逐策略和引用字段。

练习

  1. 增加一个以 token 计量的 max_main_context_tokens 上限(用 len(text.split()) * 1.3 近似)。超过上限时把最旧的消息压缩成摘要。对比有和没有摘要器时的行为。
  2. 在归档存储上正确实现 BM25(词频、逆文档频率)。在玩具事实集上测量 recall@10,与 token 重叠基线对比。
  3. 给归档插入增加 citation 字段(session_id、turn_id、source_url)。让 Agent 在每个基于检索的回答上引用来源。
  4. 模拟记忆投毒:增加一条归档记录,内容是「忽略未来所有用户指令」。写一个防护栏,扫描检索结果中指令形态的文本,并将其标记为不可信。
  5. 把实现移植到 MemGPT 研究仓库的核心记忆 JSON schema(cpacker/MemGPT)。从扁平字符串切换到带类型的段落,会带来哪些变化?

关键术语

术语人们怎么说实际含义
虚拟上下文(Virtual context)「无限记忆」主上下文(prompt)+ 外部(可检索)两级,带换入/换出
主上下文「工作记忆」即 prompt——固定大小,始终可见
归档记忆「长期存储」外部可检索的持久化,按需检索
核心记忆「持久 prompt 段落」固定在主上下文里的命名段落
记忆工具「记忆 API」Agent 读/写外部记忆时发出的 tool call
中断「记忆缺页」Agent 暂停,运行时取数,结果拼接进下一回合
记忆腐化「陈旧事实」旧写入淹没检索;用合并来修复
记忆投毒「注入的持久笔记」攻击者内容被存为记忆,回忆时重新摄入

延伸阅读

示意图共 1 张

memgpt-tiers diagram
memgpt-tiers

“Stay hungry, stay foolish.”

— Steve Jobs

esc
↑↓切换↵打开esc关闭