Natural Memory v2 00 总览 读取中
Natural Memory · NM2.1 1,048,576 槽位 · 738 条活跃记录 · 730 个索引桶

模型重启之后,
它仍然记得。

1.22% 82.52% 同一 264 题题集的可回答正确率:无记忆基线 → 批次 B。 批次 A 为 62.60%,两批配置不同、不可合并。

01 / 08 地址空间 1,048,576 槽位 · 738 条活跃记录

向下滚动 · 走一遍读取路径

Evidence · 重启实验

把历史扔掉,它还记得吗?

下面不是示意动画,是工程里两次真实运行的逐字回放。同一条事实、同一个问题、同一份协议; 两次之间唯一的差别,是写入有没有真的落库。

写入的事实

重启之后问

记忆库记录0
重启时传入的历史false
注入模型内部的前缀0 tok

    模型输出 · 逐字

    01 用户问题 自然语言 02 隐状态地址 Qwen hidden 03 LSH 粗索引 730 桶 04 候选页 ≤4 页 · 32/页 05 页内重排 text_retriever 06 Top-K 记录 ≤2 条 07 证据前缀 注入 Qwen 08 普通生成 回答 无全量注意力 BOUNDED READ 当前问题不与全部记忆记录做注意力,只与少量页面和记录交互 读取额外耗时 61.10 ms → 26.35 ms(批次 A → B) · 前缀命中率 96.97% · GPU cache 实际 17,990 / 上限 131,072 token
    图 1 · 读取路径 一次问答里记忆层做了什么。用户问题只与少量页面和记录交互,全程没有对全量记忆做注意力; 命中的短证据作为模型内部前缀注入 Qwen。图为示意,环节顺序与实现一致。

    Abstract

    这是什么东西

    它接在本地 Qwen3.5-4B 上,是一个模型内的记忆层:把适合长期复用的个人事实、项目事实和短对话片段 写进带地址的记忆记录;当前问题只读取少量相关记录,再把这些记录作为模型内部前缀交给 Qwen 生成答案。

    它要解决的具体问题是:模型重启后不携带历史聊天记录,仍能访问已经保存的个人或项目事实, 同时不把全部历史转换成 GPU 上的长 KV Cache。

    当前状态:研究原型到工程验证之间。同一 264 题题集上,可回答正确率从 1.22% 提升到 62.60%(批次 A) 与 82.52%(批次 B);代价是输入前缀变长、解码速度下降约 10%。我们不在页面上把它说成通用智能, 也不把实验室结果表述成线上服务承诺。

    What's in this release

    记忆层与索引

    738 active records

    批次 B 实际装载;24 个页面,页容量 32 条。地址空间设计容量 1,048,576。

    记忆路由器

    2,037,774 参数

    16 张量 / float32 / 512 B 地址;结构 dim=128 · heads=8 · hidden=2560 · max_hops=3。

    有界 GPU cache

    256 records

    上限 131,072 token;批次 B 实际用到 17,990 token,fallback 与分配失败均为 0。

    评测题集

    264 题

    246 可回答 / 18 未知;真实仓库 220 题 + 项目对话事实 44 题。

    可复核性

    逐字原文

    样例页的问答全部取自评测原始结果、未经润色,并包含两条我们判错的样例。

    复现

    一条命令

    正式脏数据迁移测试的完整命令、协议参数与产物路径见复现页。

    去复现 →

    Headline result

    可回答正确率 同一 264 题题集 · 246 可回答
    原版 Qwen 1.22%3/246
    批次 A 62.60%154/246
    批次 B 82.52%203/246
    原版 Qwen3.5-4B 批次 A 批次 B

    两个批次同一题集、同一协议,但配置不同,分数不可合并,只能并列读。 目标记忆召回:批次 A 67.48%、批次 B 92.68%——检索召回率不等于回答正确率。

    总体正确率7.58% → 64.39% → 82.95%
    符号定位0/192 → 129/192 → 181/192
    未知拒答17/18 → 16/18 → 16/18
    读取额外耗时— → 61.10 → 26.35 ms
    解码速度24.06 → 21.68 → 20.68 tok/s

    全部测量结果 →

    After this release · NM2.1

    发布之后又做了什么

    上面所有数字都来自 v2。之后的 NM2.1 换掉了记忆路由器、修掉写入路径上一个会把事实互相销毁的缺陷, 并把「问库里没有的属性时照样编答案」这个 75% 的失败修到 0%。

    未知拒答率 · 24 条同形候选

    100.00% 从 0.00% 起 —— 修好之前,模型 75% 的情况下照样编一个答案

    这是整个项目最该被引用的一个数字。它回答的不是「能不能检索到」,而是 「不知道的时候会不会不懂装懂」。

    未知拒答率 · 同形候选

    0.00% →100.00%

    问库里不存在的属性时,正确说「不知道」的比例。修好之前,模型 75% 的情况下照样编一个答案。

    写 20 条不同属性后存活

    12/20 →20/20

    v2 的写入路径会把 8 条无关事实互相 retract,让端到端正确率存在 50% 的硬上限——任何排序器都救不回一条已被删掉的记录。

    零字面重叠改写

    43.75% →68.75%

    查询与事实之间没有任何独特字重叠时的回答正确率;24 条同句式候选的随机水平是 4.17%。

    代价几乎为零:参数量 2,037,774 不变、每条记录地址 512 字节不变、模型包 8.88 GB 不变; 交错基准(7 轮,消除顺序效应)单查询延迟 1.4203 → 1.4242 ms,差 +0.28%, 小于同一轮里原版自身 4.85% 的离散度。

    失败也一并写出来:那套「先判属性、再查库」的机制在离线实验里是 100.00% 拒答 / 0.00% 误拒, 但接上运行时连续失败两次——第一次把可回答正确率从 100.00% 压到 6.25%; 第二次修好了目标域(泄漏真的到 0.00%、可回答无损)却让另一个域崩到 0.00%。 最终该项已回退,原因也定位到了。

    完整技术论证 → 108 条真实台账 →

    路由器工件本身的提升

    Top-1 正确率41.12% → 94.14%
    Recall@346.73% → 96.48%
    MRR47.69% → 95.77%
    hop 正确率73.23% → 100.00%
    hop 欠预测率4.68% → 0.00%
    替换兼容性DROP-IN OK(16/16 键)
    单元测试52 项通过

    这些是路由器工件在冻结评测集上的增益。它不会自动传递到最终答案 —— 原因见技术论证页的第十节。

    Boundaries · 我们不宣称的内容

    ✕已经等价于百万 token 的完整 KV
    ✕已经击败生产级 embedding + reranker RAG
    ✕任何自然语言表达都能稳定召回正确记忆
    ✕记忆写入永远不会出错
    ✕一百万条记录已经完成端到端验证
    ✕当前 4B 结果可以直接外推到 14B、32B 或更大模型

    完整的八条与五项主要局限见 边界页。 把它们放在发布页正面,是因为它们和上面的数字一样重要。

    Citation

    BibTeX
    @misc{naturalmemoryv2,
      title  = {Natural Memory v2: an in-model memory layer for local LLMs},
      author = {wpy},
      year   = {2026},
      note   = {Research prototype on Qwen3.5-4B. 264-question dirty-corpus
                transfer test; two independent batches.},
      url    = {https://wpyw.site}
    }

    引用时请一并注明「批次 A 与批次 B 配置不同、分数不可合并」,否则单个数字会被误读。