把大模型的记忆存到硬盘:KV Cache 外置的技术全景与动手实践

为什么我要研究这个

做 Agent 工程的人都被同一个问题折磨过:模型不长记性。
我在做 AI 安全评测时统计过失败案例,相当比例的根因不是模型能力不足,而是遗忘——它忘了几十轮工具调用前自己刚踩过的坑,于是一模一样地再踩一次。市面上主流的解法(RAG、图记忆、对话压缩)我都接过,实测下来有两个共同的原罪:
  1. 检索到的文本要重新占 prompt 上下文,上下文被吃掉一截,模型注意力被稀释;
  1. 文本是记忆的"二手转述"——模型读一段"你之前说过 X"的描述,和它自己真的"记得 X",行为上完全是两回事。
于是我开始关注一条更底层的路线:绕过文本,直接操作模型的内部张量状态——KV cache、线性注意力的递归态,把这些东西存到硬盘上,用的时候再装回来。这篇文章把我调研到的技术全景、业界的真实案例、以及我自己动手验证的代码整理出来,文末附参考文献和我的判断。

先搞清楚:模型的"记忆"到底以什么形式存在

要外置记忆,先得知道记忆长什么样。一次前向推理中,模型内部至少有三类值得关注的张量状态:

1. KV Cache —— 精确可寻址的短期记忆

标准注意力里,每个 token 会算出 Key 和 Value 两个向量。推理时把历史所有 token 的 K/V 缓存起来,新 token 的 Query 去和它们做点积打分——这就是"注意力"的物理实质:一个可寻址的字典查询。
KV cache 的体积可以精确计算:
以 Qwen3-8B 为例(36 层、8 个 KV 头、头维 128、FP16):
128K 上下文的 KV cache 要 18 GB 显存——比模型权重本身还大。这就是为什么"KV cache 放硬盘"不是玄学,而是推理系统的刚需。
notion image
▲ KV cache 的工作原理与分层外置路径(自制示意图)。左:注意力就是拿新 token 的 Q 去查缓存的 K/V 字典;右:热温冷三级存储,冷数据直接 torch.save 落盘。

2. 线性注意力的递归态 —— 有损压缩的长期摘要

2024 年后的主流开源模型(Qwen3-Next、Kimi K2 的 KDA 等)大量采用混合架构:少数 Full Attention 层 + 多数 Linear Attention 层。后者的代表是 Gated DeltaNet,它把整个历史压缩成一个 D×D 的固定大小矩阵(比如 128×128),通过 delta rule 做"先擦除旧关联、再写入新关联"的更新。
关键性质:无论历史是一百个 token 还是一百万个 token,这个矩阵的大小不变。它是历史的"有损摘要"——能记住语义方向,记不住精确内容。这正好和 KV cache 互补:一个管压缩,一个管精确。

3. 残差流上的 Hidden State —— 模型的"当下意识"

每一层都在往一条公共的"残差流"上读写信息,最后一个位置的隐藏向量经过 lm_head 就变成下一个 token 的 logits。可解释性研究(logit lens、activation patching)已经证明,可以用 hook 中途截获、替换、移植这些向量,直接改变模型行为。

业界案例:这条路线的每个零件都已被验证

"张量记忆外置"听起来激进,但它的每个组成部分在工业界或学术界都有成熟先例:

案例一:Prompt Caching —— 你已经在用的"临时张量记忆"

Anthropic Prompt Caching、DeepSeek Context Caching、Gemini Context Caching,本质都是把前缀的 KV cache 存在服务端复用:相同前缀不用重新 prefill,成本降 90%,首 token 延迟大幅降低。这就是"注意力状态持久化"的商业化落地——只是它是临时的(TTL 几分钟到一小时),且要求前缀逐字节匹配。

案例二:推理系统的 KV 分层卸载

  • FlexGen(2023):最早系统论证 GPU→CPU→Disk 三级卸载,用压缩的 KV cache 在单卡上跑 throughput 导向的推理;
  • LMCache:生产级 KV 分层存储,支持跨请求、跨引擎共享 KV,已被 vLLM 生态采用;
  • Mooncake(月之暗面):Kimi 生产环境的 KV cache 中心化存储架构,把闲置的 CPU DRAM 和 SSD 组织成分布式缓存池,实测吞吐提升数倍;
  • KVSwap(2025):专门为手机端 NVMe/UFS 存储特性设计的磁盘 KV 调度——连移动端都在把 KV 往闪存上搬。
这些工作的动机是省钱和加速,但它们证明了一个关键事实:KV cache 是可序列化、可传输、可重放的资产,不是推理过程的一次性副产物。
notion image
▲ Mooncake 的架构要点(根据论文自制的示意图):Prefill/Decode 分离 + 分布式 KVCache Pool。KV 在集群里被当成一等资产来调度——这正是"记忆外置"在生产环境的形态。
notion image

案例三:Memorizing Transformers —— 检索式 KV 记忆库

Google 2022 年的工作:给 Transformer 加一个 kNN 检索的外部记忆库,历史 token 的 (key, value) 存进库里,每步推理用当前 query 检索 top-k 注入注意力层。
▲ Memorizing Transformers 的 kNN 注意力架构(图源:arXiv:2203.08913)
效果也是实打实的:在 arXiv Math 数据集上,加持外部记忆的模型在 200M/1B/8B 三个规模上困惑度全面低于同尺寸基线:
notion image
▲ 相同模型规模下,外部记忆显著降低困惑度(图源:arXiv:2203.08913)
在 PG-19 长文本基准上,8K 上下文的模型加持检索记忆后追平了 5 倍计算量的基线。"KV 检索注入"这个思想四年前就存在,只是当年需要训练时集成。

案例四:Titans —— 用"惊奇度"决定写什么进记忆

Google 2025 年的架构,核心思想:人不会记住意料之中的事,记忆应该由惊奇度(surprisal = −log P)驱动——模型越意外的信息越值得写入长期记忆模块,而且写入策略本身是训练出来的。
notion image
▲ Titans 的三层记忆设计:Contextual Memory(检索+更新)、Core(注意力)、Persistent Memory(图源:arXiv:2501.00663)
在 200 万 token 的大海捞针测试上超过了全注意力基线。

案例五:知识编辑 —— 直接对权重做手术

ROME、MEMIT 这条线证明了另一个极端:定位"事实存在哪个 MLP 权重里",然后直接修改权重植入新知识(把"埃菲尔铁塔在罗马"写进去)。这说明模型的知识在参数层面是可定位、可编辑的。缺点也明显:改权重有灾难性遗忘风险,不适合高频个人记忆。

动手实战:亲手把模型的"记忆"dump 出来

纸上得来终觉浅。下面是我实际跑通的几个实验,一张消费级显卡 + Qwen3 小模型就能复现。

实验 1:把 KV cache 存到硬盘再装回去

用 HuggingFace Transformers 的 hook 机制截获每一层的 KV:
这一步做完,你就拥有了一个"记忆文件"——它不依赖对话文本存在,本身就是模型注意力的原材料。

实验 2:计算惊奇度,找出"值得记"的 token

Titans 的思想可以直接离线验证——哪个 token 让模型最意外:
跑完你会看到清晰的规律:功能词("在""上")惊奇度接近 0,而"柴犬""煎饼"这种内容词惊奇度飙升。如果记忆容量有限只能存一部分 token 的 KV,存高惊奇度的那一小撮就够了——低惊奇度 token 模型自己就能从权重里补全。
notion image
▲ 实验跑起来的样子:上面是"一只柴犬在珠峰顶上卖煎饼"的逐 token 惊奇度(内容词飙升、功能词贴地),下面是 KV 落盘与成本估算的输出。

实验 3:估算记忆库的存储成本

这是最让人兴奋的部分——算一下"一个人一辈子的记忆"要多少硬盘:
再叠加 4bit 量化(KV 量化已被证明几乎无损),成本再降 4 倍。"硬盘多大记忆多大"在存储经济学上完全成立,瓶颈从来不在容量。

我的几点判断

1. 真正的天花板是检索,不是存储。 记忆库到了百万级条目后,query 和 key 的匹配质量会退化——RAG 就是死在这里的,张量空间检索并不能天然免疫。好在 ANN 索引(HNSW、PQ 量化)在向量数据库领域已经非常成熟,可以直接搬过来。但"什么值得记、什么时候该忘"的调度策略,长期看必须是学出来的,不能靠启发式。
2. 记忆架构会和计算机存储体系同构。 未来的模型大概率是三层结构:KV cache = CPU 缓存(快而小)、线性注意力递归态 = 内存(压缩摘要)、硬盘张量库 = 磁盘(大而慢,按需分页)。操作系统花五十年打磨的分页调度、置换算法、写回策略,会换一个形态在 LLM 上重演一遍。
3. 从安全视角补一刀:记忆可注入,就意味着记忆可投毒。 这是我的老本行,必须提醒:如果张量记忆库成为 Agent 标配,它就是新的攻击面。往记忆库里塞几条精心构造的高惊奇度"假记忆",比 prompt injection 更隐蔽——它绕过 prompt 直接作用于注意力层,模型会把投毒内容当成"自己的亲身经历"。做这类系统,记忆库的写入审计、来源签名、读取隔离要从第一天就设计进去。
4. 短期看工程,长期看训练。 推理时 hook 注入是当下就能用的外挂方案;但终局一定是记忆读写进入训练目标(Titans 已经把路探出来了),外挂变内置。中间态则是推理框架把"记忆槽位"做成一等功能——就像 prompt caching 今天的地位。

参考文献

  1. Wu et al., Memorizing Transformers, arXiv:2203.08913
  1. Behrouz et al., Titans: Learning to Memorize at Test Time, arXiv:2501.00663
  1. Yang et al., Gated DeltaNet, arXiv:2412.06464
  1. Gu & Dao, Mamba: Linear-Time Sequence Modeling with Selective State Spaces, arXiv:2312.00752
  1. Sheng et al., FlexGen: High-Throughput Generative Inference with Limited GPU Memory, arXiv:2303.06865
  1. Jin et al., Mooncake: A KVCache-centric Disaggregated Architecture for LLM Serving, 2024
  1. Meng et al., Locating and Editing Factual Associations in GPT (ROME), arXiv:2202.05262
  1. Meng et al., Mass-Editing Memory in a Transformer (MEMIT), arXiv:2210.07229
  1. Sun et al., Learning to (Learn at Test Time): RNNs with Expressive Hidden States (TTT), arXiv:2407.04620
  1. Anthropic, Prompt Caching Documentation;DeepSeek, Context Caching on Disk
Loading...