Natural Memory v2 01 记忆与 KV 的分工 读取中
01 / DIVISION OF LABOUR

记忆与 KV 的分工

为什么不是简单加长上下文:哪些东西该留在 Qwen 的热 KV 里,哪些该写入带地址的记忆记录,各自的边界在哪里。

441.19tok 批次 B 平均输入前缀 token

这一节回答一个问题:既然模型已经有上下文窗口,为什么还要单独做一层记忆? 答案不是「窗口不够长」,而是把长期事实塞进上下文,会以线性成本换来极低的复用率。 下面把「哪些东西留在 Qwen 的热 KV 里、哪些写进记忆记录」这条分界线逐层讲清楚。

先看没有这层记忆时会发生什么

同一套题、同一协议下,原版 Qwen3.5-4B 在 246 道可回答题上只答对 3 道(1.22%)。 它的典型回答不是答错,而是明确表示拿不到信息:

作为一个人工智能模型,我无法访问您的个人历史对话记录、系统配置或您之前设定的具体规则……每次对话对我来说都是全新的开始。 原版 Qwen3.5-4B · 评测样本 user-009 原始回答

这句话在事实上完全正确——模型确实没有这些信息。问题出在:这些信息本来就应该被保存下来, 而它们不属于「当前这轮对话」,所以每轮都重新粘一遍历史是最笨的保存方式。

四层分工:谁存什么、为什么

这是整份设计里最核心的一张表。判断标准只有一条:这份信息是「这一轮才有意义」还是「跨轮次可复用」。

层级存放什么由谁负责为什么放在这一层
最近对话 这一轮前后的原话与顺序 Qwen 热 KV 指代、省略、语气、"你刚才说的那句"都依赖严格的先后顺序。这类信息复用价值低、时效性强,放 KV 最自然。
长期个人 / 项目事实 事实、版本、来源、置信度、短文本证据 Natural Memory 记录 跨会话反复被问到,且需要保留"哪个版本才是当前有效"的关系。它们不依赖顺序,只依赖地址与内容。
当前问题 由问题生成的有界读取 路由 + Top-K 不是所有记忆都该被读。当前问题只与少量页面和记录交互,避免"记忆越多、噪声越大"。
原始持久化状态 记忆快照与索引 嵌入式 memory safetensors 随模型包一起加载,运行时不需要额外数据库进程,也避免了磁盘分页带来的延迟抖动。

关键判断

Memory Slot 不试图逐 token 模拟完整 KV。它接管的是 KV 里最昂贵、最适合长期保存、 也最容易重复利用的那一部分;而当前对话的顺序关系,仍然由 Qwen 的原生上下文负责。

分工落到数字上是什么样

下面这组对照最能说明「不是把历史灌进去,而是把命中的少量证据灌进去」。两组数字分别来自批次 A 与批次 B(同一题集、同一协议)。

无记忆时的平均输入 30.75token 批次 A 基线:只有问题本身,没有历史
有记忆时的平均输入 441.19token 批次 B:命中的证据前缀(批次 A 为 641.42)
前缀命中率 96.97% 批次 B 实际注入证据的题目占比(批次 A 为 90.91%)
GPU cache 实际用量 17,990token 有界上限 131,072 token,用到约 13.7%

注意最后一项:上限是 131,072 token,实际只用了 17,990。 这说明读取路径被"有界"约束住了——不会因为记忆库变大就把显存吃满。

这条分工线换来了什么、付出了什么

换来的

可回答正确率1.22% → 82.52%
目标记忆召回0% → 92.68%
符号定位(192 题)0/192 → 181/192
跨会话问题1/6 → 5/6

付出的

平均输入前缀30.75 → 441.19 token
平均总延迟(批次 B)2854.9 → 2878.3 ms
平均解码速度(批次 B)22.34 → 20.68 tok/s
reserved 显存峰值3.234 → 5.180 GiB

这条线不能推到哪里

✕Natural Memory 已经等价于百万 token 的完整 KVUNSUPPORTED
✕长上下文限制已被解除(实测 8K 可跑,16K / 32K OOM)UNSUPPORTED
✕设计容量 1,048,576 条记录等于已经装入并验证了这么多UNSUPPORTED

第三条尤其要注意:1,048,576 是地址空间与分页结构的容量, 本次两个批次实际装载的是 723 / 738 条 active records,分别是 23 / 24 个页面。 容量上限与已装入量是两个概念,我们不在页面上把它们混为一谈。