/* 由 build.py 生成:顶栏命令面板的全站检索索引。请勿手改。 */ window.NM_SEARCH = [{"s":"index","p":"./","g":"概览","n":"00","pg":"总览","h":"","t":"接在本地 Qwen3.5-4B 上的模型内记忆层。模型重启后不携带历史聊天记录,仍能访问已保存的个人与项目事实,且不把全部历史转换成 GPU 上的长 KV Cache。","d":1},{"s":"index","p":"./","g":"概览","n":"00","pg":"总览","h":"总览","t":"Natural Memory · NM2.1 1,048,576 槽位 · 738 条活跃记录 · 730 个索引桶 模型重启之后, 它仍然记得。 1.22 % → 82.52 % 同一 264 题题集的可回答正确率:无记忆基线 → 批次 B。 批次 A 为 62.60%,两批配置不同、不可合并。 wpyw.site · wpy@wpy.email · 本地 Qwen3.5-4B · 4-bit NF4 01 / 08 地址空间 1,0"},{"s":"index","p":"./","g":"概览","n":"00","pg":"总览","h":"把历史扔掉,它还记得吗?","t":"下面不是示意动画,是工程里两次真实运行的逐字回放。同一条事实、同一个问题、同一份协议; 两次之间唯一的差别,是写入有没有真的落库。 修复前 修复后 重放 写入的事实 重启之后问 记忆库记录 0 重启时传入的历史 false 注入模型内部的前缀 0 tok 模型输出 · 逐字 图 1 · 读取路径 一次问答里记忆层做了什么。用户问题只与少量页面和记录交互, 全程没有对全量记忆做注意力 ; 命中的短证据作为模型内部前缀注入 Qwen。图为示"},{"s":"index","p":"./","g":"概览","n":"00","pg":"总览","h":"这是什么东西","t":"它接在本地 Qwen3.5-4B 上,是一个 模型内的记忆层 :把适合长期复用的个人事实、项目事实和短对话片段 写进 带地址的记忆记录 ;当前问题只读取少量相关记录,再把这些记录作为 模型内部前缀 交给 Qwen 生成答案。 它要解决的具体问题是: 模型重启后不携带历史聊天记录,仍能访问已经保存的个人或项目事实, 同时不把全部历史转换成 GPU 上的长 KV Cache。 当前状态:研究原型到工程验证之间。同一 264 题题集上,可回答"},{"s":"index","p":"./","g":"概览","n":"00","pg":"总览","h":"发布之后又做了什么","t":"上面所有数字都来自 v2。之后的 NM2.1 换掉了记忆路由器、修掉写入路径上一个会把事实互相销毁的缺陷, 并把「问库里没有的属性时照样编答案」这个 75% 的失败修到 0%。 未知拒答率 · 24 条同形候选 100.00 % 从 0.00% 起 —— 修好之前,模型 75% 的情况下照样编一个答案 这是整个项目最该被引用的一个数字。它回答的不是「能不能检索到」,而是 「不知道的时候会不会不懂装懂」 。 未知拒答率 · 同形候选 0."},{"s":"division","p":"./division","g":"原理","n":"01","pg":"记忆与 KV 的分工","h":"","t":"为什么不是简单加长上下文:哪些东西该留在 Qwen 的热 KV 里,哪些该写入带地址的记忆记录,各自的边界在哪里。","d":1},{"s":"division","p":"./division","g":"原理","n":"01","pg":"记忆与 KV 的分工","h":"记忆与 KV 的分工","t":"这一节回答一个问题: 既然模型已经有上下文窗口,为什么还要单独做一层记忆? 答案不是「窗口不够长」,而是 把长期事实塞进上下文,会以线性成本换来极低的复用率 。 下面把「哪些东西留在 Qwen 的热 KV 里、哪些写进记忆记录」这条分界线逐层讲清楚。"},{"s":"division","p":"./division","g":"原理","n":"01","pg":"记忆与 KV 的分工","h":"先看没有这层记忆时会发生什么","t":"同一套题、同一协议下,原版 Qwen3.5-4B 在 246 道 可回答 题上只答对 3 道(1.22%)。 它的典型回答不是答错,而是明确表示拿不到信息: 作为一个人工智能模型,我无法访问您的个人历史对话记录、系统配置或您之前设定的具体规则……每次对话对我来说都是全新的开始。 原版 Qwen3.5-4B · 评测样本 user-009 原始回答 这句话在事实上完全正确——模型确实没有这些信息。问题出在:这些信息 本来就应该被保存下来 "},{"s":"division","p":"./division","g":"原理","n":"01","pg":"记忆与 KV 的分工","h":"四层分工:谁存什么、为什么","t":"这是整份设计里最核心的一张表。判断标准只有一条: 这份信息是「这一轮才有意义」还是「跨轮次可复用」 。 层级 存放什么 由谁负责 为什么放在这一层 最近对话 这一轮前后的原话与顺序 Qwen 热 KV 指代、省略、语气、\"你刚才说的那句\"都依赖严格的先后顺序。这类信息复用价值低、时效性强,放 KV 最自然。 长期个人 / 项目事实 事实、版本、来源、置信度、短文本证据 Natural Memory 记录 跨会话反复被问到,且需要保留\"哪"},{"s":"division","p":"./division","g":"原理","n":"01","pg":"记忆与 KV 的分工","h":"分工落到数字上是什么样","t":"下面这组对照最能说明「不是把历史灌进去,而是把命中的少量证据灌进去」。两组数字分别来自批次 A 与批次 B(同一题集、同一协议)。 无记忆时的平均输入 30.75 token 批次 A 基线:只有问题本身,没有历史 有记忆时的平均输入 441.19 token 批次 B:命中的证据前缀(批次 A 为 641.42) 前缀命中率 96.97 % 批次 B 实际注入证据的题目占比(批次 A 为 90.91%) GPU cache 实际用量 "},{"s":"division","p":"./division","g":"原理","n":"01","pg":"记忆与 KV 的分工","h":"这条分工线换来了什么、付出了什么","t":"换来的 可回答正确率 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"},{"s":"division","p":"./division","g":"原理","n":"01","pg":"记忆与 KV 的分工","h":"这条线不能推到哪里","t":"✕ Natural Memory 已经等价于百万 token 的完整 KV UNSUPPORTED ✕ 长上下文限制已被解除(实测 8K 可跑,16K / 32K OOM) UNSUPPORTED ✕ 设计容量 1,048,576 条记录等于已经装入并验证了这么多 UNSUPPORTED 第三条尤其要注意: 1,048,576 是地址空间与分页结构的容量 , 本次两个批次实际装载的是 723 / 738 条 active records"},{"s":"mechanism","p":"./mechanism","g":"原理","n":"02","pg":"一次读取与一次写入","h":"","t":"从用户问题到证据前缀注入的八个环节,记录包含哪些字段,以及 active / superseded / quarantined / retracted 四个状态如何演化。","d":1},{"s":"mechanism","p":"./mechanism","g":"原理","n":"02","pg":"一次读取与一次写入","h":"一次读取与一次写入","t":"这一节把「 一次读取 」和「 一次写入 」拆开讲透:读取路径有哪八个环节、每一步的输入输出是什么、 一条记录里到底存了什么、四个状态如何演化,以及我们为这些决定付出了什么代价。"},{"s":"mechanism","p":"./mechanism","g":"原理","n":"02","pg":"一次读取与一次写入","h":"一、读取路径:从提问到证据注入","t":"点左侧任一环节查看它在做什么,也可以依次点一遍——注意整条链路上 没有一步是「和全部记忆做注意力」 , 这是显存可控的根本原因。 STAGE 01 / 08"},{"s":"mechanism","p":"./mechanism","g":"原理","n":"02","pg":"一次读取与一次写入","h":"一次读取与一次写入","t":"读取上限 2 records 候选页上限 4 pages 页容量 32 / page 全量注意力 否"},{"s":"mechanism","p":"./mechanism","g":"原理","n":"02","pg":"一次读取与一次写入","h":"每一步的输入、输出与约束","t":"括号里的数字是实测值,不是设计目标。 环节 输入 → 输出 约束或实测 01 用户问题 普通自然语言 不要求任何显式指令,不需要输入 /remember 之类的标记。 02 Qwen hidden state 问题 → 紧凑查询地址 地址由模型隐状态生成,不依赖外部 embedding 服务;语义地址编码用单条 batch 执行,避免编码阶段出现显存瞬时峰值。 03 LSH / 地址粗索引 查询地址 → 候选页 精确桶 + Hammin"},{"s":"mechanism","p":"./mechanism","g":"原理","n":"02","pg":"一次读取与一次写入","h":"二、一条记录里到底存了什么","t":"记录不是一段文本,而是一条带地址、带版本关系、带状态的结构化数据。下面左侧是全部字段, 右侧是 一条真实记录 (逐字取自评测结果里的命中记录)。"},{"s":"mechanism","p":"./mechanism","g":"原理","n":"02","pg":"一次读取与一次写入","h":"三、状态机:旧的答案不会凭空消失","t":"同一实体和属性出现新值时, 旧值被标记为 superseded,而不是被覆盖或删除 。 这是「时间冲突」类问题能答对的前提:既要给出当前有效值,也要能说清旧值去哪了。 写入路径的教训:检索救不回不存在的记录 早期版本的退役授权完全依赖一个学习打分(阈值 ≥0.95), 没有任何结构校验 。 结果是新写入把已有记录误判为旧值并退役:一次 20 条记录的测试里 active 只剩 12 条、retract 高达 16 次、目标记录只存活 8"},{"s":"mechanism","p":"./mechanism","g":"原理","n":"02","pg":"一次读取与一次写入","h":"四、四个设计决定与它们的代价","t":"决定 1 · 两段式读取 粗索引筛页 → 页内重排 ,而不是对全量记录做注意力。 好处:单次读取的候选规模被压到固定上限(≤4 页 / ≤2 条),成本与记忆总量解耦。 代价:两段都可能出错,且错误会叠加——粗索引错了就再没有机会。 决定 2 · 用地址索引而非向量库 语义地址 + LSH 桶放在模型包内, 不引入外部检索服务 。 好处:部署时没有额外进程与网络依赖,读取耗时稳定(批次 B 26.35 ms)。 代价:召回质量受地址质量"},{"s":"mechanism","p":"./mechanism","g":"原理","n":"02","pg":"一次读取与一次写入","h":"五、这套机制仍然做不到的事","t":"✕ 任何自然语言表达都能稳定召回正确记忆 UNSUPPORTED ✕ 记忆写入永远不会出错 UNSUPPORTED ✕ 检索召回率等于回答正确率(批次 B 召回 92.68% / 回答 82.52%,差 10.16pp) UNSUPPORTED"},{"s":"results","p":"./results","g":"证据","n":"03","pg":"测量结果","h":"","t":"同一 264 题题集的两个独立批次、结构化工程基准与记忆路由器工程线的全部实测数字,均标注出处与口径。","d":1},{"s":"results","p":"./results","g":"证据","n":"03","pg":"测量结果","h":"测量结果","t":"三个面板对应三组不同的题集与口径, 不能合并成一个总分 。 面板一是同一题集先后跑的两个独立批次(配置不同、分数不可合并,只能并列读); 面板二是结构化工程基准;面板三是记忆路由器工程线。每组数据都标注了出处、日期与口径。 读这些数字时请留意两件事: 所有对照都使用同一 tokenizer、同一 greedy 解码、同一 64 token 输出上限 ; 而 检索召回率与回答正确率是两个必须分开报告的量 ——这一点在面板一里体现得最清楚。"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"","t":"三处改动各自的测量依据、把端到端正确率锁死在 50% 的写入缺陷如何定位、75% 未知泄漏如何修到 0%,以及它接上运行时连续失败两次的完整记录。","d":1},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"NM2.1 · 之后做了什么","t":"发布页上的数字来自 v2。这一页讲**之后又做了什么**:三处改动各自凭什么、一个把端到端正确率 锁死在 50% 的写入缺陷怎么定位的、以及一个 75% 泄漏的失败怎么修到 0%——又怎么在接上运行时之后失败两次。 所有数字都来自磁盘上的报告文件,每张表都标了出处;**没有一条是估算或外推**。 先读这一句 这一页里**离线实验最好的数字(未知拒答 100.00%)不等于运行时可用**。它接上运行时之后 连续失败两次,最终被回退。把失败"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"净变化一览","t":"出处 · V2_dpskw\\NM2_VS_NM2_1.md (该文件自述:所有数字均从磁盘上的评分卡 / JSON 读取,不是手工抄录) 轴 v2(原版) NM2.1 净变化 路由器 Top-1 41.12% 94.14% +53.02 pp 路由器 Recall@3 46.73% 96.48% +49.75 pp 未知拒答率 0.00% 100.00% +100.00 pp 未知问题泄漏(同形候选) 75.00% 0.00% −75."},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"一 · 路由器工件本身的检索与排序","t":"出处 · router_scorecard_final.json (判定见 router_verdict_final.json )· 冻结 v6 评测集 21,920 条 / 10 类别 指标 v2 · V2-128 deployed(v3) NM2.1 · REPLAY-128 v7 final Top-1 正确率 41.12% 94.14% Recall@1 37.03% 88.58% Recall@3 46.73% 96.48% "},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"二 · 拒答与仲裁策略轴","t":"出处 · router_scorecard_final.json (门槛 0.50)+ threshold_sweep_check.json (0.30–0.80 全门槛扫描) 指标 v2 NM2.1 need F1 89.58% 100.00% need 召回 99.82% 100.00% need 精确率 81.24% 100.00% 未知拒答率 0.00% 100.00% 已知问题被误拒率 0.18% 0.00% 未知问题被误读率"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"三 · 端到端整体记忆能力(同一份运行时,只有模型包不同)","t":"出处 · nm2_battery_comparison_final.json · A 110 用例 / B 16 / C 48 / D 重启持久化 指标 原版 NM2 NM2.1(仅换路由器) NM2.1 最终 A 总体正确率 89.09% 88.18% 88.18% A 可回答正确率 100.00% 100.00% 100.00% A 未知拒答率 60.00% 56.67% 56.67% A 已知问题被误拒率 0.00% 0.00% "},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"四 · 零字面重叠改写的泛化","t":"出处 · replay_check_zov.json (路由器级)与上表 B / C 段(端到端)· 数据集 300 条、24 个 未见过 的问法 指标 v2 权重 NM2.1 权重 路由器 Top-1(250 条可回答) 18.40% 59.60% 路由器 Recall@3 36.00% 83.20% 路由器 MRR 35.07% 73.06% 端到端改写正确率(B 段) 43.75% 68.75% 端到端未知泄漏(C 段) 75.0"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"五 · 代价:几乎没有","t":"出处 · router_scorecard_final.json 、 router_latency_bench_prod.json (7 轮交错取中位数) 指标 v2 NM2.1 说明 参数量 2,037,774 2,037,774 未增加 每条记录地址字节 512 512 存储几何未变 单查询延迟中位数(GPU) 0.9549 ms 0.9169 ms 略快 批量 QPS(batch=64) 66,037 69,378 +5.1% 批"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"六 · 工程鲁棒性","t":"项目 v2 NM2.1 一次写 20 条不同属性事实后存活 12 / 20(8 条查询前被误删) 20 / 20 端到端(写入修复前后,16 用例) 37.50% 68.75% 替换兼容性 基线 DROP-IN OK(16 / 16 键) 单元测试 — 52 项通过 未知问题泄漏(同形候选) 75.00% 0.00%"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"七 · 三处改动,每处都有测量依据","t":""},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"改动 1 · 记录排序混合权重取 0.5","t":"memory_record_router_blend 控制「打包的词面重排器」与「学习出的路由器」各占多少。 调这个之前先测了剂量曲线 —— 而且**此前的同进程测量因顺序污染已作废**,下面这版是独立进程测的。"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"改动 2 · 把加法先验参数化,然后测出「不该动」","t":"假设是「加法先验压过了学习打分」。把它暴露成可调再测,结果**调小只会更差**: 这是一个 有价值的负面结论 :它否定了原来的假设。项目里这类结论和增益一样被保留下来, 因为它们决定了后面不再往哪个方向投入。"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"改动 3 · 覆盖门 —— 以及为了让它真正生效必须一起修的两处","t":"覆盖门本身很简单:先判断「这个提问在问哪个属性」,再查库里有没有这个属性。但单独加门是不生效的, 有两处**必须同时修**,否则门会被静默绕过: 01"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"_build_text_prefix 短路","t":"门拒绝之后如果继续往下回落,会走**旧版 16 槽注入路径**,把记忆又塞回去。 实测:不修这一处,泄漏只从 75.00% 降到 62.50%。 02"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"闭包要动态解析 bank","t":"reset_memory() 每次都会新建 memory_os_v2 ;闭包捕获了旧引用的话, 门会永远看到一个空 bank,于是**静默旁路** —— 实测诊断输出 applicable:0 / bypassed:1 。 03"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"门必须自门控","t":"只有当库的属性集合填充了头部词表的 ≥ 90% 时才让门生效。 这条阈值是必需的:放宽成「子集即可」会让门在通用套件上误判, 把 A 段可回答正确率从 100.00% 压到 92.50%、已知误拒升到 2.50%;收紧到 90% 后 A 段完全恢复, C 段泄漏仍为 0.00%。"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"八 · 写入路径:为什么 20 条事实会互相销毁","t":"出处 · V2_dpskw\\WRITE_PATH_FIX.md (根因由栈追踪确证,非推断) 症状 一次写入 20 条 不同属性 的事实后,库里有 20 条记录但只剩 12 条 active , 8 条在查询前就被 retract。16 个关键零重叠用例里有 8 个的目标记录已经不存在 —— 因此端到端正确率存在 50% 的硬上限 。**任何排序器都救不回一条已经被删掉的记录。** 16 次 retract 的调用栈完全一致: call"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"修复(两处,都是结构性的)","t":"01"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"confirmed_update 的两条打分类分支改为结构优先","t":"仅当候选文本的 entity::attribute 已经在库的 active_by_conflict 账本里存在(即确实是同一条事实的更新)才允许由打分授权; exact_slots 这条结构安全的分支保持不变,以保留「重复写入幂等」的既有语义。 02"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"retract 循环加冲突键守卫","t":"if record.conflict_key() != candidate_conflict_key: continue —— 循环只能退掉 描述同一属性 的记录,不再因「共享热槽」或「词面重叠高」销毁无关事实。 语义不受损:真·同属性更新本来就已经由 PagedMemoryBankV2.write 通过 active_by_conflict 做版本化(旧版本保留为 superseded、 version+1 ), 修复只是移除了那条 "},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"四级验证","t":"级 检验 修复前 修复后 ① status_transition_summary {\"active->retracted\": 16} {} ① retraction_calls / status_counts 16 次 / {retracted: 8, active: 12} [] / {active: 20} ② 正对照:同属性改值 — 旧值 superseded + 新值 active,其余 19 属性不受影响,0 retract "},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"九 · 未知拒答:从 75% 泄漏到 100% 拒答","t":"出处 · V2_dpskw\\ABSTENTION_BREAKTHROUGH.md 这是整个项目最差的一个数字:问库里不存在的属性时,75% 的情况下模型照样编一个答案。 下面按「先排除一整类无效修法 → 再给出有效机制 → 最后如实记录接上运行时的两次失败」来写。"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"9.1 先排除掉一整类无效修法(有测量支撑)","t":"最直觉的修法是「检索分数不够高就拒答」。用 只在训练集拟合、评测集算 AUC 的口径, 测了四种打分器的分数几何(top1 / margin / top-k 均值 / 离散度 / 熵 / 近邻数,共 9 个特征): 打分器 最佳单特征 AUC 拟合头 AUC(评测集) cosine(冻结键余弦) 0.6257(margin) 0.6086 打包 text_retriever 0.6076(margin) 0.4752 50/50 混合 "},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"9.2 有效的机制:先判「问的是哪个属性」,再查库里有没有","t":"换一个问题问就成立了:不是「有没有候选匹配得好」,而是「这个提问在问哪个属性,这个属性在库里吗」。 封闭词表 值 可回答 episode 中「预测属性在候选集内」 100.00%(250 条) 未知 episode 中「预测属性在候选集内」 0.00%(50 条) 未知拒答率 100.00% 已知问题被误拒率 0.00% 混淆矩阵 tp=50 fn=0 fp=0 tn=250 开放集: 真实用户会问模型没见过的属性。只靠最大概率调阈值不"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"9.3 接上运行时:连续失败两次(如实记录)","t":"指标 NM2.1(无门) + 覆盖门(第一轮) + 门 + 短路(第二轮) A 可回答正确率 100.00% 6.25% 0.00% A 已知问题被误拒率 0.00% 7.50% 7.50% A 未知拒答率 56.67% 43.33% — C 未知泄漏率 75.00% 62.50% 0.00% C 可回答正确率 65.00% 65.00% 65.00% 第一轮: 门把几乎全部可回答问题都拒掉了 (100.00% → 6.25%),而它本"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"十 · 关键负面结论:路由器排序不影响端到端答案","t":"出处 · V2_dpskw\\ZERO_OVERLAP_FINDINGS.md §5 NM2.1 的路由器在零重叠集合上 Top-1 提升了 41.20 pp ,但在 eval_router_critical_e2e.py (16 个零重叠用例)上,REPLAY-128 与 V2-128-v6 的结果 逐位相同 (默认 Top-K:37.50% / 37.50%,答成别的属性 25.00% / 25.00%,平均选中记录 5.88 / 5"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"memory_os_v2.py:1671 :路由器分数被逐位置覆盖","t":"带 semantic_key 的记录,其 _score_candidates() 分数会被 self.record_scorer 覆盖。实测残差与 text_retriever 匹配 18 / 18, 与 memory_router_v2 匹配 0 / 18。 02"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"「部署目录没有 text_retriever.pt 所以走余弦兜底」是错的","t":"重排器被烘焙进合并包(safetensors 内有 6 个 dynamic_memory.text_retriever.* 张量,1,573,377 参数), _text_retriever_ready 实测为 True ,余弦兜底分支根本不执行。 03"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"路由器在此配置下唯一实际生效的杠杆是 need_memory 门","t":"部署权重下门开启率 68.75% (11 / 16),而三份随机初始化的路由器只有 37.5% (6 / 16)。判决性探针只随机化了排序通路、保留了门控头,所以「端到端零变化」 是由构造保证的,不是巧合。 结论分两层,不要混为一谈: ① 路由器记分卡上 22 / 22 的统治性和 +41.20 pp 的零重叠提升, 都是路由器工件 真实 的增益;② 但在这套运行时里,记录级顺序由打包的 text_retriever 决定, 路由器分数"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"十一 · 仍未解决(不粉饰)","t":"短板 现状 说明 跨域未知拒答 未解决 覆盖头是 24 类闭集,只在其词表被库填充 ≥ 90% 时生效;开放词表的属性匹配实测仅 49.20% Top-1 / AUC 0.6560 (零训练),不足 答成别的属性 27.50% 同形候选间排序仍不理想;已排除先验重加权(更差)与单纯替换打分器(更差) A 段未知拒答率 56.67% 未见改善 规模验证 未做 仅 24 属性 / 300 条评测;生产需上千属性、上万改写问法 V2 库记录真"},{"s":"nm21","p":"./nm21","g":"证据","n":"04","pg":"NM2.1 · 之后做了什么","h":"十二 · 复现","t":"PowerShell · 整体电池(A / B / C / D 四段) 复制 $env:PYTHONPATH='H:\\Memory'; $env:PYTHONIOENCODING='utf-8'; cd H:\\Memory\\V2_dpskw # 整体电池(A/B/C/D 四段) pwsh -NoProfile -File .\\run_nm2_battery.ps1 -Package qwen3_5_4b_natural_memory_v"},{"s":"examples","p":"./examples","g":"证据","n":"05","pg":"实测样例","h":"","t":"五条逐字取自评测原始结果的问答对照,包含两条我们判错的样例。","d":1},{"s":"examples","p":"./examples","g":"证据","n":"05","pg":"实测样例","h":"实测样例","t":""},{"s":"ledger","p":"./ledger","g":"证据","n":"06","pg":"真实评测台账","h":"","t":"全部 108 条真实评测 episode 的逐条台账:模型逐字回复、判定结果、停止原因、选中记录数与分数,可按来源与判定筛选。","d":1},{"s":"ledger","p":"./ledger","g":"证据","n":"06","pg":"真实评测台账","h":"真实评测台账","t":"这一页不是挑出来的样例,是 全部 108 条真实评测 episode 的逐条台账 。 每条都带模型的逐字回复、判定结果、停止原因、选中记录数与分数。 数据来自 runtime_score_bands.json 与 nm2_1_final_runtime_e2e.json , 由 tools/make_ledger.py 生成 assets/js/ledger.js , 字段逐字复制,未做改写、润色或换算 。模型输出里的错字、冗余和编造的"},{"s":"cost","p":"./cost","g":"工程","n":"07","pg":"代价账本","h":"","t":"记忆带来的延迟、解码速度、前缀长度与显存开销,以及显存快照的口径说明。","d":1},{"s":"cost","p":"./cost","g":"工程","n":"07","pg":"代价账本","h":"代价账本","t":"VRAM · 12 GiB CARD allocated 与 reserved 均为每次请求结束后的快照, 不是 CUDA high-water mark ; reserved 还包含 PyTorch 分配器保留的缓存。因此这里不能当作\"模型峰值显存\"来引用。"},{"s":"capacity","p":"./capacity","g":"工程","n":"08","pg":"容量与存储","h":"","t":"地址空间、分页结构、有界 GPU cache 与嵌入式 weight-shard 持久化的实际数字与取舍。","d":1},{"s":"capacity","p":"./capacity","g":"工程","n":"08","pg":"容量与存储","h":"容量与存储","t":"「一百万记录容量」是 地址空间和分页结构的容量 ,不是本次已经装入了一百万条语义记忆, 也不是一百万条记录已经通过端到端测试。这一节把容量、实际用量与存储方式分开列清楚。 PAGE MAP · 32768 PAGES × 32 SLOTS 高亮部分为本次运行实际使用的页面(批次 A:23 页 / 723 条 active records;批次 B:24 页 / 738 条)。其余为地址空间余量。 PERSISTENCE"},{"s":"capacity","p":"./capacity","g":"工程","n":"08","pg":"容量与存储","h":"容量与存储","t":"TRADE-OFF"},{"s":"capacity","p":"./capacity","g":"工程","n":"08","pg":"容量与存储","h":"取舍","t":""},{"s":"limits","p":"./limits","g":"工程","n":"09","pg":"我们不宣称的内容","h":"","t":"没有足够证据支持的八条说法、五项主要局限,以及来自工程文档的原文引用。","d":1},{"s":"limits","p":"./limits","g":"工程","n":"09","pg":"我们不宣称的内容","h":"五项主要局限","t":""},{"s":"limits","p":"./limits","g":"工程","n":"09","pg":"我们不宣称的内容","h":"来自工程文档的原文","t":""},{"s":"roadmap","p":"./roadmap","g":"工程","n":"10","pg":"已解决的与下一步","h":"","t":"在 12 GiB GPU 上已经跑通的闭环,以及按对正确率最有帮助的顺序排出的下一阶段任务。","d":1},{"s":"roadmap","p":"./roadmap","g":"工程","n":"10","pg":"已解决的与下一步","h":"已解决的与下一步","t":"左侧是在 12 GiB GPU 上已经跑通的闭环;右侧是按 对正确率最有帮助的顺序 排出的下一阶段工程任务。 这里刻意不写时间表——顺序比日期更可信。"},{"s":"roadmap","p":"./roadmap","g":"工程","n":"10","pg":"已解决的与下一步","h":"已经解决的问题","t":""},{"s":"roadmap","p":"./roadmap","g":"工程","n":"10","pg":"已解决的与下一步","h":"下一阶段的工程任务","t":""},{"s":"reproduce","p":"./reproduce","g":"工程","n":"11","pg":"复现实验","h":"","t":"正式脏数据迁移测试的完整命令、协议参数与产物路径。","d":1},{"s":"reproduce","p":"./reproduce","g":"工程","n":"11","pg":"复现实验","h":"复现实验","t":"正式脏数据迁移测试的完整命令与产物路径。协议参数与批次之间的差异见下方说明—— 复现同一批次才能得到同一组数字 。 PowerShell · 工作目录 复制命令 PROTOCOL 基座模型 量化 4-bit NF4 解码 greedy 最大新生成 64 token 进程显存上限 10 GiB 记忆读取上限 2 records 地址编码 batch size 1 两个批次的差别 上面的命令复现的是批次 A(对外技术总结采用的口径,可答题 "}];