Files
natural-memory-site/assets/js/search.js
T

3 lines
29 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 由 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 · [email protected] · 本地 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(对外技术总结采用的口径,可答题 "}];