MemoryLLM - Self Updatable LLM · essay
12. MemoryLLM:让大模型拥有可自更新的记忆池
论文:MemoryLLM: Towards Self-Updatable Large Language Models
本地原文:
![[papers/12-MemoryLLM-2402.04624.pdf]]
论文定位与阅读路径
核心定位
MemoryLLM 想解决的问题是:大模型部署后通常是静态的,遇到新知识只能靠 prompt、RAG、微调或模型编辑;论文提出在 Transformer 内部放一个固定大小的 memory pool,让模型能把新知识写进可更新的潜在记忆里。
概念解释:
不想每次有新知识都重训模型,于是给模型加一个可读写的“脑内笔记本”。
原文结构导读
| 部分 | 主要内容 | 阅读重点 |
|---|---|---|
| Abstract | 模型静态部署后难以注入新知识 | self-updatable parameters 是关键词 |
| Introduction | RAG、微调、模型编辑各有问题 | 为什么需要模型内部可更新记忆 |
| Method | Transformer + fixed-size memory pool | 记忆池、读写机制、训练目标 |
| Experiments | 知识注入、持续更新、保留旧知识 | 看效率、泛化、遗忘 |
| Analysis | memory size、更新步数等因素 | 理解记忆容量和更新能力 |
证据链阅读
| 证据点 | 读什么 | 工程判断 |
|---|---|---|
| Memory pool 结构 | 固定大小记忆池如何接入 Transformer | 这是内部记忆,不是外部数据库 |
| 更新过程 | 新知识写入是否只动 memory pool | 判断是否比微调更轻 |
| 持续更新实验 | 写入新知识后旧知识是否保留 | 重点看遗忘和污染 |
| 参数/容量分析 | memory size、更新步数影响 | 决定这种路线是否有工程可控性 |
研究背景与问题定义
它和普通更新方式的区别
| 方式 | 怎么更新知识 | 优点 | 缺点 |
|---|---|---|---|
| Prompt | 把新知识塞进上下文 | 最简单 | 上下文贵,不能长期保存 |
| RAG | 查外部文档 | 工程可落地 | 不是模型真正学会 |
| Fine-tuning | 更新模型参数 | 能内化知识 | 成本高,容易遗忘 |
| Model Editing | 定点改参数 | 针对事实修改有效 | 多次编辑后稳定性难 |
| MemoryLLM | 更新专门的 memory pool | 比全参数更新轻 | 需要改模型结构和训练 |
MemoryLLM 不是“外接向量库”,而是把记忆池放进模型潜在空间。
方法框架与核心机制
核心架构
flowchart TD
A[输入文本知识] --> B[Transformer 主干]
B --> C[读 memory pool]
C --> D[结合当前 hidden states]
D --> E[生成预测/回答]
A --> F[更新 memory pool]
F --> C
G[旧知识] --> F
这个架构要抓住两个点:
- Transformer 主体可以相对稳定。
- 变化主要发生在 memory pool。
memory pool 是什么
你可以先把它理解为一组可学习向量。
代码块收起展开
memory pool = [m1, m2, m3, ..., mn]每个 mi 不是一句人类可读文本,而是模型潜在空间里的记忆槽位。它更像“模型能理解的压缩笔记”。
| 记忆形式 | 人能直接看懂吗 | 更新方式 |
|---|---|---|
| 文本记忆 | 能 | 增删改文本 |
| 向量记忆 | 不能 | 更新向量 |
| 参数记忆 | 不能 | 梯度训练 |
| MemoryLLM 记忆池 | 不能 | 对记忆槽做自更新 |
Method 逐层拆解
1. 为什么固定大小
如果记忆池无限增长,就会变成另一种外部数据库。论文想研究的是:在有限大小的模型内部记忆里,能不能持续吸收新知识。
固定大小带来两个问题:
- 新知识写入哪里。
- 旧知识会不会被覆盖。
这就是持续学习里的经典难题:plasticity 和 stability。
| 英文 | 中文 | 含义 |
|---|---|---|
| Plasticity | 可塑性 | 能学新东西 |
| Stability | 稳定性 | 不忘旧东西 |
2. 读机制
读机制的目标是:当前 token 在推理时能访问 memory pool。
你可以把它理解成 attention:
代码块收起展开
当前 hidden state 问:我需要哪些记忆?
memory pool 回:这些槽位和你相关。
模型把相关记忆融合进推理。这里和 Memorizing Transformer 相似,都让模型在内部表示层取回记忆;不同点是:
| 维度 | Memorizing Transformer | MemoryLLM |
|---|---|---|
| 记忆来源 | 历史 hidden states | 固定 memory pool |
| 更新方式 | 写入外部 KNN store | 更新记忆池参数/向量 |
| 记忆大小 | 可外部扩展 | 固定大小 |
| 重点 | 检索 | 自更新 |
3. 写机制
写机制是这篇的核心。模型看到一段新知识后,需要把它压缩进 memory pool。
这不是简单追加,而是“把新知识融合进已有槽位”。可以类比成:
代码块收起展开
你只有一页 A4 复习纸。
每学一个新知识点,都要重新整理这页纸。
不能无限加页,所以必须压缩、覆盖、合并。4. 训练目标
论文关心的不是普通语言模型损失一个指标,而是更新后能否:
- 回答刚注入的新知识。
- 保持之前注入过的旧知识。
- 对相关问题有泛化。
- 不污染无关知识。
这四点分别对应:
| 能力 | 解释 |
|---|---|
| 编辑成功 | 新知识写进去了 |
| 保留能力 | 旧知识没忘 |
| 泛化能力 | 换种问法也会 |
| 局部性 | 不该改的别乱改 |
为什么这篇重要
应用层记忆系统通常是:
代码块收起展开
外部数据库 -> 检索 -> 拼 promptMemoryLLM 的路线是:
代码块收起展开
新知识 -> 写入模型内部记忆 -> 未来推理自动读取这更接近“模型真的吸收了知识”,但工程门槛也更高。
概念校准
RAG 像开卷考试:你不会也没关系,可以查资料。
Fine-tuning 像重新上课训练一遍:效果可能好,但成本高。
MemoryLLM 像给你一张可反复修改的随身速记卡:不用重学整本书,但你能把新重点写进去。
实验论证与评价方式
实验阅读方法
看这篇实验时,抓这几类问题:
- 注入一个新事实后,模型能不能答对。
- 连续注入很多事实后,前面的事实还记不记得。
- 问法变了,模型是否能泛化。
- 和 RAG、LoRA、模型编辑方法相比,成本和效果如何。
如果你只看一个结论:
它试图证明“可更新记忆池”可以成为全参数微调和外部检索之间的中间路线。
工程映射与实践启发
工程落地启发
你现在用 Java 后端做 Agent,暂时不会自己训练 MemoryLLM。但这篇对系统设计有启发:
| MemoryLLM 概念 | 应用层可借鉴版本 |
|---|---|
| 固定 memory pool | 给每个用户限制长期记忆容量 |
| 记忆写入 | 从对话中抽取事实/偏好 |
| 记忆合并 | 相似记忆合并、过期记忆覆盖 |
| 防遗忘 | 重要记忆加权、定期回归测试 |
| 局部性 | 用户隔离、项目隔离、权限隔离 |
一个工程版写入流程:
flowchart TD
A[新对话] --> B[抽取候选记忆]
B --> C[检索相似旧记忆]
C --> D{是否冲突}
D -->|不冲突| E[新增/合并]
D -->|冲突| F[版本化更新]
E --> G[更新用户记忆库]
F --> G
局限、对比与阅读检查
局限与边界
- 需要修改模型结构,不适合直接 API 调用。
- 记忆池不可读,调试比文本记忆难。
- 固定容量意味着必然有压缩和遗忘。
- 训练和评测复杂,不是普通后端项目能短期复现。
- 记忆写错后如何撤销,是一个很难的问题。
阅读检查清单
- MemoryLLM 为什么叫 self-updatable。
- memory pool 和向量数据库有什么不同。
- 固定容量记忆为什么会带来遗忘问题。
- 它和 RAG、微调、模型编辑分别差在哪里。
- 应用层 Agent 可以如何借鉴“写入、合并、防遗忘、局部性”。
深度精读:MemoryLLM 的核心是“可更新但受控的模型内部记忆”
1. 它为什么不满足于 RAG
RAG 的问题是:模型本身并没有改变。每次都要把资料查出来塞给模型。
MemoryLLM 想要的是:
代码块收起展开
新知识进入模型内部的 memory pool;
之后模型在推理时能自然读到;
不需要每次都把同一段资料塞进 prompt。这条路线更像“学习”,但也更难控制。
2. 固定大小 memory pool 是核心约束
如果 memory pool 无限大,那它就退化成外部数据库。固定大小意味着它必须解决:
- 新知识写入哪个槽。
- 旧知识如何保留。
- 相似知识如何合并。
- 冲突知识如何处理。
- 容量不够时忘掉什么。
这就是 lifelong learning 的稳定性/可塑性矛盾。
3. memory token 和 prompt token 的区别
| 类型 | 人能看懂吗 | 是否占 prompt 文本 | 是否可训练/更新 |
|---|---|---|---|
| Prompt token | 能 | 是 | 否 |
| Memory token | 不能 | 通常不是普通文本 | 是 |
| Model parameter | 不能 | 否 | 是,但成本高 |
MemoryLLM 的 memory token 更像模型内部的“压缩知识槽”,不是你能直接打开看的笔记。
4. 为什么会有遗忘问题
假设 memory pool 只有 100 个槽,你连续写入 1000 条知识,必然会发生覆盖或压缩。
这带来两个风险:
| 风险 | 含义 |
|---|---|
| Catastrophic forgetting | 新知识覆盖旧知识 |
| Interference | 相似知识互相污染 |
所以实验必须看连续更新,而不是单次写入。
5. 四个评价维度
读 MemoryLLM 时,你可以用模型编辑的四问:
| 问题 | 对应能力 |
|---|---|
| 新知识答对了吗 | reliability |
| 换种问法还会吗 | generalization |
| 旧知识还记得吗 | retention |
| 无关知识没被污染吗 | locality |
这四问比单一准确率重要。
6. 和 WISE 的区别
| 论文 | 记忆位置 | 核心问题 |
|---|---|---|
| MemoryLLM | 模型内部 memory pool | 如何自更新并保留旧知识 |
| WISE | 主记忆 + 侧记忆 | 长期编辑时如何平衡三角指标 |
MemoryLLM 更像给模型装一个可更新脑内缓存。WISE 更像给模型装一个补丁侧库。
7. 对应用层的迁移
你不能直接更新 GPT 的 memory pool,但可以做应用层等价物:
代码块收起展开
固定容量用户记忆池
每次写入前检索相似旧记忆
新旧记忆合并
低价值记忆降权
重要记忆保护
定期回归测试这其实就是把 MemoryLLM 的稳定性/可塑性问题搬到数据库层。
8. 一个容量控制策略
代码块收起展开
if memory_pool.full():
candidates = find_low_importance_and_low_access()
if new_memory.importance > candidates.min.importance:
replace_or_merge()
else:
discard_or_archive()大二阶段不用写复杂算法,先理解:长期记忆必须有容量治理。
精读补强:MemoryLLM 的证据链与工程判断
MemoryLLM 的关键不在“模型有记忆”这个口号,而在它怎样约束可更新记忆,避免把新知识写乱。
| 判断点 | 原文证据 | 工程含义 |
|---|---|---|
| 写入位置 | memory pool 而不是全量参数 | 工程上等价于把可变状态隔离在小模块 |
| 读取方式 | hidden state 与 memory 交互 | 读记忆不是拼 prompt,而是参与模型内部计算 |
| 容量限制 | 固定大小 memory slots | 必须设计淘汰、覆盖、冲突处理策略 |
| 训练目标 | 新知识更新与原能力保持 | 评估要同时看新事实命中率和旧能力退化 |
对普通 Agent 工程来说,这篇更像“模型内部记忆的理想形态”。你当前做 Personal Knowledge Agent 时不必复现它,但要吸收一个原则:可更新记忆必须有隔离边界、写入协议和回滚机制。
论文精读主线:问题-方法-验证-局限-启发
1. 核心结论
MemoryLLM 通过固定大小 memory pool 让模型在不全量改参数的情况下自更新知识,探索模型内部可控记忆。
本篇的阅读重心是:让模型在固定 memory pool 中自更新知识,避免全量微调的高成本。读完后要能说清它改变的是 runtime、存储、检索、更新还是评测层;否则只是记住了论文名。
2. 问题背景
RAG 能外接知识,但模型本体并没有更新;fine-tune 能更新参数,但成本高且容易灾难性遗忘。MemoryLLM 想解决的是:能否给模型一块受控内部记忆,让它吸收新知识又不破坏原能力。
把问题具体化为失败样例:模型需要吸收新知识,但 RAG 依赖外部文本,微调又慢且可能遗忘旧能力。用这个样例反推论文动机,比泛泛说“上下文不够”或“记忆不准”更有判断力。
3. 核心方法
模型维护固定容量 memory pool,通过读写机制把新知识写入记忆 token 或记忆槽,并在推理时读取这些内部记忆参与生成。固定容量迫使系统处理选择、覆盖和遗忘。
flowchart TD
N[新知识/新样本] --> W[写入 memory pool]
W --> P[固定容量记忆槽]
Q[查询] --> R[读取相关 memory]
P --> R
R --> G[模型生成]
P --> F[容量控制/遗忘]
方法部分按数据流读:新知识被编码进 memory tokens/pool,推理时模型读取内部记忆槽,更新和使用在模型结构内闭环。每一步都要能标出输入、输出、控制点和失败后该记录的日志。
4. 技术细节
关键是 memory token 与 prompt token 的区别:prompt token 是本轮输入,memory token 是模型维护的可更新内部状态。固定大小是约束,不是缺点,它让评测能观察容量管理和遗忘。
代码块收起展开
final class InternalMemoryPool {
private final MemorySlotAllocator allocator; // 决定新知识写入哪个固定槽位
private final MemoryReader reader; // 根据当前查询选择相关内部记忆参与生成
private final MemoryUpdater updater; // 更新槽位内容并控制覆盖策略
private final ForgettingEvaluator forgettingEval; // 检测新知识写入是否破坏旧知识或通用能力
MemoryResult handle(MemoryInput input) {
// 1. 决定新知识写入哪个固定槽位
// 2. 根据当前查询选择相关内部记忆参与生成
// 3. 更新槽位内容并控制覆盖策略
// 4. 检测新知识写入是否破坏旧知识或通用能力
// 返回前附带 evidenceIds、scoreBreakdown、traceId,避免只看到答案看不到记忆来源。
return MemoryResult.withTrace(input.traceId());
}
}字段检查重点是 memorySlot、writeGate、readAttention、capacityLimit、updateSignal 决定可更新性。这些字段不是装饰,它们决定后续能否检索、审计、回滚、限权和做离线评测。
5. 实验验证
实验要同时看知识更新、保留旧知识、泛化和遗忘。只看新知识答对不够;如果旧知识大幅下降,说明记忆更新不可控。固定容量变化的消融也很重要。
实验阅读重点:看新知识吸收、旧知识保持、容量上限和冲突写入;只看单次更新成功不够。如果论文没有直接给出这层证据,复现时就要自己补机制级指标。
6. 局限与启发
闭源 API 场景无法直接用,内部记忆也难审计。启发是应用层可以模拟 memory pool:给每类记忆固定预算和淘汰策略,而不是无限增长。
迁移到你的项目时,结论是:你当前阶段应吸收“写入门控和容量限制”的思想,而不是尝试改模型结构。先把边界做对,再追求更复杂的模型或更大的记忆规模。
7. 关键术语表
| 术语 | 在论文里的意思 | 工程落地时要看什么 |
|---|---|---|
| Memory pool | 固定容量内部记忆池 | 有限槽位、写入和覆盖策略 |
| Self-updatable LLM | 可自更新模型 | 不全量训练也能吸收新知识 |
| Memory token | 承载内部记忆的 token/槽位 | 不同于 prompt 文本 |
| Catastrophic forgetting | 灾难性遗忘 | 新知识破坏旧能力 |
8. 复现难点
难点是训练机制和容量控制。写入太激进会遗忘,写入太保守又学不到新知识。评测必须同时测新旧知识,不然会高估效果。
复现入口应从失败集开始:用小模型做有限槽位实验,构造新旧知识冲突,观察写入后是否污染无关问题。只有先证明旧方案会坏,才知道新机制是否真的解决了问题。
9. 代码框架建议
应用层可设计 FixedBudgetMemoryPool(type,capacity,evictionPolicy)。例如用户偏好最多 50 条,项目状态最多 100 条,超过容量必须合并、失效或归档。
代码验收门槛:内部记忆必须有可控写入协议;没有回滚和隔离,不应承载用户隐私或项目关键事实。这条门槛应写进测试或 trace 字段里,避免实现只停留在 demo。
10. 相关论文对比
MemoryLLM 和 WISE 都关注模型内部或近内部更新;WISE 更强调补丁与主参数分离。Memorizing Transformer 检索隐藏状态,MemoryLLM 更像可更新记忆槽。
横向比较时抓这个角度:MemoryLLM 更像模型内部可更新记忆,Mem0 是外部写入决策,WISE 是侧参数补丁。比较对象不是谁“更先进”,而是谁负责哪一层失败。
11. 批判性思考
MemoryLLM 的方向很有吸引力,但可解释性和可控性不足。真实用户记忆最好先放在可审计外部系统,内部记忆适合研究,不适合直接承载隐私和关键事实。
批判边界:模型内部更新看起来优雅,但工程审计弱;真实产品通常会先选择外部可见记忆。这不是否定论文,而是把论文结论放回真实系统的成本、权限和恢复约束里。