Initial commit: 自然记忆站:12 页纯标准库 Python 静态站点生成器,含真实评测台账(108 条)与全站客户端检索

This commit is contained in:
WpyQwq
2026-09-19 11:21:45 +08:00
commit 1da4b14c19
44 changed files with 9624 additions and 0 deletions
+585
View File
@@ -0,0 +1,585 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Natural Memory v2 — 模型内的记忆层</title>
<meta name="description" content="接在本地 Qwen3.5-4B 上的模型内记忆层。模型重启后不携带历史聊天记录,仍能访问已保存的个人与项目事实,且不把全部历史转换成 GPU 上的长 KV Cache。">
<meta name="color-scheme" content="dark">
<meta name="theme-color" content="#0a0a0a">
<!-- 动效的初始隐藏态只在 JS 可用时生效;脚本被禁用时内容照常可见 -->
<script>document.documentElement.classList.add("js");</script>
<meta property="og:type" content="website">
<meta property="og:title" content="Natural Memory v2 — 模型内的记忆层">
<meta property="og:description" content="接在本地 Qwen3.5-4B 上的模型内记忆层。模型重启后不携带历史聊天记录,仍能访问已保存的个人与项目事实,且不把全部历史转换成 GPU 上的长 KV Cache。">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="assets/favicon.svg">
<link rel="preload" href="assets/fonts/archivo-latin-wdth-normal.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="assets/fonts/geist-mono-latin-wght-normal.woff2" as="font" type="font/woff2" crossorigin>
<!-- 资源带构建指纹:内容一变 URL 就变,浏览器不可能再用到旧 JS/CSS -->
<link rel="stylesheet" href="assets/css/site.css?v=a9c21ef3a8">
</head>
<body data-page="index" data-layout="release">
<a class="skip" href="#doc">跳到正文</a>
<header class="site" id="site">
<div class="topbar">
<a class="brand" href="./" aria-label="Natural Memory v2 发布页">
<svg class="brand__mark" viewBox="0 0 32 32" aria-hidden="true">
<rect class="dim" x="2" y="2" width="7" height="7" rx="1.5"/>
<rect class="dim" x="12" y="2" width="7" height="7" rx="1.5"/>
<rect class="dim" x="22" y="2" width="7" height="7" rx="1.5"/>
<rect class="dim" x="2" y="12" width="7" height="7" rx="1.5"/>
<rect class="on" x="12" y="12" width="7" height="7" rx="1.5"/>
<rect class="dim" x="22" y="12" width="7" height="7" rx="1.5"/>
<rect class="dim" x="2" y="22" width="7" height="7" rx="1.5"/>
<rect class="dim" x="12" y="22" width="7" height="7" rx="1.5"/>
<rect class="on" x="22" y="22" width="7" height="7" rx="1.5"/>
</svg>
<span class="brand__name">Natural Memory</span>
<span class="pill pill--acc">v2</span>
</a>
<span class="crumb">
<span class="crumb__n">00</span>
<span class="crumb__t">总览</span>
</span>
<span class="topbar__spacer"></span>
<nav class="topnav" aria-label="快速导航">
<a class="topnav__a is-on" href="./" aria-current="page">发布页</a> <a class="topnav__a" href="./mechanism">机制</a> <a class="topnav__a" href="./results">测量</a> <a class="topnav__a" href="./nm21">NM2.1</a> <a class="topnav__a" href="./ledger">台账</a> <a class="topnav__a" href="./limits">边界</a> <a class="topnav__a" href="./reproduce">复现</a>
</nav>
<button class="palbtn" id="palBtn" type="button" aria-label="检索全站内容(快捷键 /)">
<span class="palbtn__t">检索</span><span class="kbd">/</span>
</button>
<span class="pill" id="serverChip" title="本站服务端运行时读数">
<i class="dot"></i><span id="serverChipText">读取中</span>
</span>
</div>
<div class="progress" id="progress"></div>
</header>
<main class="release" id="doc">
<!-- ============ BAND 1 · 地址空间(首屏即机制,不是标题块) ============
动效概念:地址空间下降。镜头从 1,048,576 个槽位一路降到一条记录,
每个环节的数字都是真的。机制来自题材自身的物理(读取路径本来就是寻址)。 -->
<section class="hero" id="hero">
<div class="hero__pin">
<canvas class="hero__cv" id="spaceCv" aria-hidden="true"></canvas>
<div class="hero__layer">
<div class="hero__row hero__row--top">
<span class="eyebrow">Natural Memory · NM2.1</span>
<span class="eyebrow hero__geo">1,048,576 槽位 · 738 条活跃记录 · 730 个索引桶</span>
</div>
<div class="hero__row hero__row--mid">
<h1 class="hero__h dsp">模型重启之后,<br>它仍然记得。</h1>
<!-- 头号数字就在第一屏里:读者不需要滚三屏才知道这页在说什么 -->
<p class="hero__fig">
<span class="hero__fig-row">
<span class="hero__fig-v">1.22<small>%</small></span>
<span class="hero__fig-a" aria-hidden="true">→</span>
<span class="hero__fig-v">82.52<small>%</small></span>
</span>
<span class="hero__fig-n">同一 264 题题集的可回答正确率:无记忆基线 → 批次 B。
批次 A 为 62.60%,两批配置不同、不可合并。</span>
</p>
</div>
<div class="hero__row hero__row--bot">
<div class="hero__lede-wrap">
<p class="hero__lede" id="heroLede"></p>
<p class="hero__byline mono">wpyw.site · [email protected] · 本地 Qwen3.5-4B · 4-bit NF4</p>
</div>
<div class="hero__hud" role="status" aria-live="off">
<span class="hero__hud-i mono" id="hudIdx">01 / 08</span>
<span class="hero__hud-n" id="hudName">地址空间</span>
<span class="hero__hud-v mono" id="hudVal">1,048,576 槽位 · 738 条活跃记录</span>
<span class="hero__hud-track"><i id="hudBar"></i></span>
</div>
</div>
</div>
<p class="hero__cue mono">向下滚动 · 走一遍读取路径</p>
</div>
</section>
<!-- ============ BAND 2 · 关键数字(紧贴首屏;以前这里空着一屏多) ============ -->
<section class="band band--tight">
<div class="wrap">
<p class="eyebrow band__k">Key numbers</p>
<div class="kpis reveal" id="heroKpis"></div>
<p class="src" style="display:block;margin-top:16px">出处 · <span id="heroSrc"></span></p>
<nav class="linkrow" aria-label="发布资源" style="margin-top:var(--sp-2xl)">
<a class="btn btn--pri" href="./reproduce">复现实验</a>
<a class="btn" href="./results">测量结果</a>
<a class="btn" href="./nm21">NM2.1 技术论证</a>
<a class="btn" href="./ledger">108 条真实台账</a>
<a class="btn" href="./limits">边界声明</a>
<a class="btn" href="https://wpyw.site" target="_blank" rel="noopener">作者网站 ↗</a>
</nav>
</div>
</section>
<!-- ============ BAND 2 · 重启实验(真实运行回放装置) ============ -->
<section class="band band--alt band--rst" id="restart">
<div class="wrap">
<p class="eyebrow">Evidence · 重启实验</p>
<h2 class="h2">把历史扔掉,它还记得吗?</h2>
<p class="lede2 rst__lede">
下面不是示意动画,是工程里两次真实运行的逐字回放。同一条事实、同一个问题、同一份协议;
两次之间唯一的差别,是写入有没有真的落库。
</p>
<div class="rst" id="rst">
<div class="rst__head">
<div class="seg" role="group" aria-label="选择运行版本">
<button class="seg__b" type="button" data-v="before">修复前</button>
<button class="seg__b is-on" type="button" data-v="after">修复后</button>
</div>
<button class="btn rst__play" type="button" id="rstPlay">重放</button>
<span class="rst__file mono" id="rstFile"></span>
</div>
<div class="rst__grid">
<div class="rst__aside">
<p class="rst__k">写入的事实</p>
<p class="rst__quote" id="rstFact"></p>
<p class="rst__k">重启之后问</p>
<p class="rst__quote rst__quote--q" id="rstQuery"></p>
<div class="rst__gauges">
<div class="rst__g">
<div class="rst__gt"><span>记忆库记录</span><b class="mono" id="rstRec">0</b></div>
<div class="rst__track"><span class="rst__fill rst__fill--store" id="rstRecBar"></span></div>
</div>
<div class="rst__g">
<div class="rst__gt"><span>重启时传入的历史</span><b class="mono" id="rstHist">false</b></div>
<div class="rst__track"><span class="rst__fill rst__fill--hist" id="rstHistBar"></span></div>
</div>
<div class="rst__g">
<div class="rst__gt"><span>注入模型内部的前缀</span><b class="mono" id="rstPf">0<small> tok</small></b></div>
<div class="rst__track"><span class="rst__fill rst__fill--pf" id="rstPfBar"></span></div>
<p class="rst__hint" id="rstPfHint"></p>
</div>
</div>
</div>
<ol class="rst__beats" id="rstBeats"></ol>
</div>
<div class="rst__out" id="rstOut">
<div class="rst__outhead">
<span class="mono">模型输出 · 逐字</span>
<span class="rst__verdict mono" id="rstVerdict"></span>
</div>
<p class="rst__resp mono" id="rstResp"></p>
<div class="rst__kv" id="rstKv"></div>
</div>
</div>
<p class="tiny rst__note" id="rstNote"></p>
</div>
</section>
<!-- ============ BAND 3 · Teaser(全宽读取路径图) ============ -->
<section class="band band--teaser">
<div class="wrap">
<figure class="teaser">
<svg class="dgm" viewBox="0 0 1120 250" role="img"
aria-label="读取路径示意:问题 → 隐状态地址 → LSH 粗索引 → 候选页 → 页内重排 → Top-K → 证据前缀 → 生成">
<!-- 连接线(pathLength=1 让描边可以按 0→1 精确绘制) -->
<g class="dgm__a">
<path pathLength="1" d="M132 78 L156 78" /><path pathLength="1" d="M270 78 L294 78" /><path pathLength="1" d="M408 78 L432 78" />
<path pathLength="1" d="M546 78 L570 78" /><path pathLength="1" d="M684 78 L708 78" /><path pathLength="1" d="M822 78 L846 78" />
<path pathLength="1" d="M960 78 L984 78" />
</g>
<!-- 8 个环节 -->
<g>
<rect class="dgm__box" x="12" y="46" width="120" height="64" rx="8"/>
<text class="dgm__n" x="24" y="66">01</text>
<text class="dgm__l" x="24" y="86">用户问题</text>
<text class="dgm__s" x="24" y="101">自然语言</text>
</g>
<g>
<rect class="dgm__box" x="156" y="46" width="114" height="64" rx="8"/>
<text class="dgm__n" x="168" y="66">02</text>
<text class="dgm__l" x="168" y="86">隐状态地址</text>
<text class="dgm__s" x="168" y="101">Qwen hidden</text>
</g>
<g>
<rect class="dgm__box" x="294" y="46" width="114" height="64" rx="8"/>
<text class="dgm__n" x="306" y="66">03</text>
<text class="dgm__l" x="306" y="86">LSH 粗索引</text>
<text class="dgm__s" x="306" y="101">730 桶</text>
</g>
<g>
<rect class="dgm__box" x="432" y="46" width="114" height="64" rx="8"/>
<text class="dgm__n" x="444" y="66">04</text>
<text class="dgm__l" x="444" y="86">候选页</text>
<text class="dgm__s" x="444" y="101">≤4 页 · 32/页</text>
</g>
<g>
<rect class="dgm__box" x="570" y="46" width="114" height="64" rx="8"/>
<text class="dgm__n" x="582" y="66">05</text>
<text class="dgm__l" x="582" y="86">页内重排</text>
<text class="dgm__s" x="582" y="101">text_retriever</text>
</g>
<g>
<rect class="dgm__box dgm__box--acc" x="708" y="46" width="114" height="64" rx="8"/>
<text class="dgm__n" x="720" y="66">06</text>
<text class="dgm__l" x="720" y="86">Top-K 记录</text>
<text class="dgm__s" x="720" y="101">≤2 条</text>
</g>
<g>
<rect class="dgm__box dgm__box--acc" x="846" y="46" width="114" height="64" rx="8"/>
<text class="dgm__n" x="858" y="66">07</text>
<text class="dgm__l" x="858" y="86">证据前缀</text>
<text class="dgm__s" x="858" y="101">注入 Qwen</text>
</g>
<g>
<rect class="dgm__box" x="984" y="46" width="124" height="64" rx="8"/>
<text class="dgm__n" x="996" y="66">08</text>
<text class="dgm__l" x="996" y="86">普通生成</text>
<text class="dgm__s" x="996" y="101">回答</text>
</g>
<!-- 关键约束注释 -->
<line class="dgm__rule" x1="12" y1="146" x2="1108" y2="146"/>
<text class="dgm__note" x="12" y="172">无全量注意力</text>
<text class="dgm__s" x="1108" y="172" text-anchor="end">BOUNDED READ</text>
<text class="dgm__note" x="12" y="190">当前问题不与全部记忆记录做注意力,只与少量页面和记录交互</text>
<text class="dgm__note" x="12" y="222">读取额外耗时 61.10 ms → 26.35 ms(批次 A → B) · 前缀命中率 96.97% · GPU cache 实际 17,990 / 上限 131,072 token</text>
</svg>
<figcaption class="teaser__cap">
<span class="teaser__k">图 1 · 读取路径</span>
一次问答里记忆层做了什么。用户问题只与少量页面和记录交互,<b>全程没有对全量记忆做注意力</b>;
命中的短证据作为模型内部前缀注入 Qwen。图为示意,环节顺序与实现一致。
</figcaption>
</figure>
</div>
</section>
<!-- ============ BAND 4 · 摘要 ============ -->
<section class="band">
<div class="wrap wrap--narrow">
<p class="eyebrow band__k">Abstract</p>
<h2 class="h2 arr-wipe">这是什么东西</h2>
<p class="lede2">
它接在本地 Qwen3.5-4B 上,是一个<strong>模型内的记忆层</strong>:把适合长期复用的个人事实、项目事实和短对话片段
写进<strong>带地址的记忆记录</strong>;当前问题只读取少量相关记录,再把这些记录作为<strong>模型内部前缀</strong>交给 Qwen 生成答案。
</p>
<p class="lede2" style="margin-top:20px">
它要解决的具体问题是:<strong>模型重启后不携带历史聊天记录,仍能访问已经保存的个人或项目事实,
同时不把全部历史转换成 GPU 上的长 KV Cache。</strong>
</p>
<p class="small" style="margin-top:24px">
当前状态:研究原型到工程验证之间。同一 264 题题集上,可回答正确率从 1.22% 提升到 62.60%(批次 A)
与 82.52%(批次 B);代价是输入前缀变长、解码速度下降约 10%。我们不在页面上把它说成通用智能,
也不把实验室结果表述成线上服务承诺。
</p>
</div>
</section>
<!-- ============ BAND 5 · 本次发布包含什么 ============ -->
<section class="band band--alt">
<div class="wrap">
<p class="eyebrow band__k">What's in this release</p>
<div class="grid g3">
<div class="card">
<p class="rel__k">记忆层与索引</p>
<p class="rel__v">738 <small>active records</small></p>
<p class="rel__d">批次 B 实际装载;24 个页面,页容量 32 条。地址空间设计容量 1,048,576。</p>
</div>
<div class="card">
<p class="rel__k">记忆路由器</p>
<p class="rel__v">2,037,774 <small>参数</small></p>
<p class="rel__d">16 张量 / float32 / 512 B 地址;结构 dim=128 · heads=8 · hidden=2560 · max_hops=3。</p>
</div>
<div class="card">
<p class="rel__k">有界 GPU cache</p>
<p class="rel__v">256 <small>records</small></p>
<p class="rel__d">上限 131,072 token;批次 B 实际用到 17,990 token,fallback 与分配失败均为 0。</p>
</div>
<div class="card">
<p class="rel__k">评测题集</p>
<p class="rel__v">264 <small>题</small></p>
<p class="rel__d">246 可回答 / 18 未知;真实仓库 220 题 + 项目对话事实 44 题。</p>
</div>
<div class="card">
<p class="rel__k">可复核性</p>
<p class="rel__v">逐字原文</p>
<p class="rel__d">样例页的问答全部取自评测原始结果、未经润色,并包含两条我们判错的样例。</p>
</div>
<div class="card card--acc">
<p class="rel__k">复现</p>
<p class="rel__v">一条命令</p>
<p class="rel__d">正式脏数据迁移测试的完整命令、协议参数与产物路径见复现页。</p>
<p style="margin:16px 0 0"><a class="btn" href="./reproduce">去复现 →</a></p>
</div>
</div>
</div>
</section>
<!-- ============ BAND 6 · 结果预览 ============ -->
<section class="band">
<div class="wrap">
<p class="eyebrow band__k">Headline result</p>
<div class="grid g-2-1">
<div class="bars" id="releaseResult">
<div class="barset">
<div class="barset__top">
<span class="barset__t">可回答正确率</span>
<span class="barset__n">同一 264 题题集 · 246 可回答</span>
</div>
<div class="bar bar--base"><span class="bar__l">原版 Qwen</span>
<span class="bar__track"><span class="bar__fill" data-fill="1.22"></span></span>
<span class="bar__v">1.22%<small>3/246</small></span></div>
<div class="bar bar--a"><span class="bar__l">批次 A</span>
<span class="bar__track"><span class="bar__fill" data-fill="62.60"></span></span>
<span class="bar__v">62.60%<small>154/246</small></span></div>
<div class="bar bar--nm2"><span class="bar__l">批次 B</span>
<span class="bar__track"><span class="bar__fill" data-fill="82.52"></span></span>
<span class="bar__v">82.52%<small>203/246</small></span></div>
</div>
<div class="legend">
<span><i class="l-base"></i>原版 Qwen3.5-4B</span>
<span><i class="l-a"></i>批次 A</span>
<span><i class="l-nm2"></i>批次 B</span>
</div>
<p class="small">
两个批次同一题集、同一协议,但配置不同,<strong>分数不可合并</strong>,只能并列读。
目标记忆召回:批次 A 67.48%、批次 B 92.68%——<strong>检索召回率不等于回答正确率</strong>。
</p>
</div>
<div>
<div class="kv">
<div class="kv__r"><span class="kv__k">总体正确率</span><span class="kv__v">7.58% → 64.39% → 82.95%</span></div>
<div class="kv__r"><span class="kv__k">符号定位</span><span class="kv__v">0/192 → 129/192 → 181/192</span></div>
<div class="kv__r"><span class="kv__k">未知拒答</span><span class="kv__v">17/18 → 16/18 → 16/18</span></div>
<div class="kv__r"><span class="kv__k">读取额外耗时</span><span class="kv__v">— → 61.10 → 26.35 ms</span></div>
<div class="kv__r"><span class="kv__k">解码速度</span><span class="kv__v">24.06 → 21.68 → 20.68 tok/s</span></div>
</div>
<p style="margin:20px 0 0"><a class="btn" href="./results">全部测量结果 →</a></p>
</div>
</div>
</div>
</section>
<!-- ============ BAND 7 · 发布之后(NM2.1) ============ -->
<section class="band band--alt">
<div class="wrap">
<p class="eyebrow">After this release · NM2.1</p>
<h2 class="h2">发布之后又做了什么</h2>
<p class="lede2" style="margin-top:20px">
上面所有数字都来自 v2。之后的 NM2.1 换掉了记忆路由器、修掉写入路径上一个会把事实互相销毁的缺陷,
并把「问库里没有的属性时照样编答案」这个 75% 的失败修到 0%。
</p>
<!-- 全页的头号数字;也是唯一一个用 .mega 的地方 -->
<div class="money">
<p class="eyebrow">未知拒答率 · 24 条同形候选</p>
<p class="money__row">
<span class="mega arr-num">100.00<small>%</small></span>
<span class="money__from">从 0.00% 起 —— 修好之前,模型 75% 的情况下照样编一个答案</span>
</p>
<p class="money__cap">
这是整个项目最该被引用的一个数字。它回答的不是「能不能检索到」,而是
<strong>「不知道的时候会不会不懂装懂」</strong>。
</p>
</div>
<div class="nm21grid" style="margin-top:var(--band-tight)">
<div>
<p class="rel__k">未知拒答率 · 同形候选</p>
<p class="rel__v"><em>0.00% →</em>100.00%</p>
<p class="rel__d">问库里不存在的属性时,正确说「不知道」的比例。修好之前,模型 75% 的情况下照样编一个答案。</p>
</div>
<div>
<p class="rel__k">写 20 条不同属性后存活</p>
<p class="rel__v"><em>12/20 →</em>20/20</p>
<p class="rel__d">v2 的写入路径会把 8 条<strong>无关</strong>事实互相 retract,让端到端正确率存在 50% 的硬上限——任何排序器都救不回一条已被删掉的记录。</p>
</div>
<div>
<p class="rel__k">零字面重叠改写</p>
<p class="rel__v"><em>43.75% →</em>68.75%</p>
<p class="rel__d">查询与事实之间没有任何独特字重叠时的回答正确率;24 条同句式候选的随机水平是 4.17%。</p>
</div>
</div>
<div class="grid g-2-1" style="margin-top:32px">
<div>
<p class="small">
<strong>代价几乎为零:</strong>参数量 2,037,774 不变、每条记录地址 512 字节不变、模型包 8.88 GB 不变;
交错基准(7 轮,消除顺序效应)单查询延迟 1.4203 → 1.4242 ms,差 +0.28%,
<strong>小于同一轮里原版自身 4.85% 的离散度</strong>。
</p>
<p class="small">
<strong>失败也一并写出来:</strong>那套「先判属性、再查库」的机制在离线实验里是 100.00% 拒答 / 0.00% 误拒,
但接上运行时<strong>连续失败两次</strong>——第一次把可回答正确率从 100.00% 压到 6.25%;
第二次修好了目标域(泄漏真的到 0.00%、可回答无损)却让另一个域崩到 0.00%。
最终该项已回退,原因也定位到了。
</p>
<p style="margin:22px 0 0; display:flex; flex-wrap:wrap; gap:12px">
<a class="btn btn--pri" href="./nm21">完整技术论证 →</a>
<a class="btn" href="./ledger">108 条真实台账 →</a>
</p>
</div>
<div>
<p class="eyebrow" style="margin-bottom:18px">路由器工件本身的提升</p>
<div class="kv">
<div class="kv__r"><span class="kv__k">Top-1 正确率</span><span class="kv__v">41.12% → 94.14%</span></div>
<div class="kv__r"><span class="kv__k">Recall@3</span><span class="kv__v">46.73% → 96.48%</span></div>
<div class="kv__r"><span class="kv__k">MRR</span><span class="kv__v">47.69% → 95.77%</span></div>
<div class="kv__r"><span class="kv__k">hop 正确率</span><span class="kv__v">73.23% → 100.00%</span></div>
<div class="kv__r"><span class="kv__k">hop 欠预测率</span><span class="kv__v">4.68% → 0.00%</span></div>
<div class="kv__r"><span class="kv__k">替换兼容性</span><span class="kv__v">DROP-IN OK(16/16 键)</span></div>
<div class="kv__r"><span class="kv__k">单元测试</span><span class="kv__v">52 项通过</span></div>
</div>
<p class="tiny" style="margin-top:16px">
这些是路由器工件在冻结评测集上的增益。它<strong>不会</strong>自动传递到最终答案 ——
原因见技术论证页的第十节。
</p>
</div>
</div>
</div>
</section>
<!-- ============ BAND 8 · 深入阅读 ============ -->
<section class="band">
<div class="wrap">
<p class="eyebrow band__k">Read further</p>
<div class="grid g3">
<a class="navcard" href="./division">
<span class="navcard__n">01</span>
<span class="navcard__t">记忆与 KV 的分工</span>
<span class="navcard__d">哪些留在热 KV、哪些写进记忆,判断标准与代价</span>
</a>
<a class="navcard" href="./mechanism">
<span class="navcard__n">02</span>
<span class="navcard__t">一次读取与一次写入</span>
<span class="navcard__d">八个环节、记录字段、四个状态与四个设计决定</span>
</a>
<a class="navcard" href="./nm21">
<span class="navcard__n">04</span>
<span class="navcard__t">NM2.1 · 之后做了什么</span>
<span class="navcard__d">根因、两级验证、两处改动的剂量曲线,以及两次失败的集成</span>
</a>
<a class="navcard" href="./ledger">
<span class="navcard__n">06</span>
<span class="navcard__t">真实评测台账</span>
<span class="navcard__d">108 条逐字原文,可按来源与判定筛选</span>
</a>
<a class="navcard" href="./examples">
<span class="navcard__n">05</span>
<span class="navcard__t">实测样例</span>
<span class="navcard__d">五条逐字原文,含两条我们判错的</span>
</a>
<a class="navcard" href="./cost">
<span class="navcard__n">07</span>
<span class="navcard__t">代价账本</span>
<span class="navcard__d">延迟、解码速度、前缀长度、显存</span>
</a>
</div>
</div>
</section>
<!-- ============ BAND 8 · 边界(正式章节,不是脚注) ============ -->
<section class="band">
<div class="wrap">
<p class="eyebrow band__k">Boundaries · 我们不宣称的内容</p>
<div class="claims claims--loose arr-cards">
<div class="claim"><span class="claim__x">✕</span><span class="claim__t">已经等价于百万 token 的完整 KV</span></div>
<div class="claim"><span class="claim__x">✕</span><span class="claim__t">已经击败生产级 embedding + reranker RAG</span></div>
<div class="claim"><span class="claim__x">✕</span><span class="claim__t">任何自然语言表达都能稳定召回正确记忆</span></div>
<div class="claim"><span class="claim__x">✕</span><span class="claim__t">记忆写入永远不会出错</span></div>
<div class="claim"><span class="claim__x">✕</span><span class="claim__t">一百万条记录已经完成端到端验证</span></div>
<div class="claim"><span class="claim__x">✕</span><span class="claim__t">当前 4B 结果可以直接外推到 14B、32B 或更大模型</span></div>
</div>
<p class="small" style="margin-top:24px">
完整的八条与五项主要局限见 <a href="./limits" class="linku">边界页</a>。
把它们放在发布页正面,是因为它们和上面的数字一样重要。
</p>
</div>
</section>
<!-- ============ BAND 9 · 引用 ============ -->
<section class="band band--alt">
<div class="wrap">
<p class="eyebrow band__k">Citation</p>
<div class="code">
<div class="code__bar">
<span class="code__t">BibTeX</span>
<button class="copy" id="citeCopy" type="button">复制</button>
</div>
<pre><code id="citeBlock">@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}
}</code></pre>
</div>
<p class="tiny" style="margin-top:16px">
引用时请一并注明「批次 A 与批次 B 配置不同、分数不可合并」,否则单个数字会被误读。
</p>
</div>
</section>
</main>
<footer class="footer">
<div class="wrap footer__in">
<div class="footer__col">
<p class="footer__h">作者</p>
<div class="author">
<a class="author__a" href="https://wpyw.site" target="_blank" rel="noopener">
<span class="author__k">个人网站</span><span class="author__v">wpyw.site</span>
</a>
<a class="author__a" href="mailto:[email protected]">
<span class="author__k">邮箱</span><span class="author__v">[email protected]</span>
</a>
</div>
</div>
<div class="footer__col footer__col--wide">
<p class="footer__h">来源</p>
<div class="readout" id="footFiles"></div>
<p class="footer__h" style="margin-top:20px">服务端读数</p>
<div class="readout mono" id="footServer"><span>读取中…</span></div>
</div>
<div class="footer__col footer__col--wide">
<p class="footer__h">说明</p>
<p class="footer__note" id="disclaimer"></p>
<p class="footer__meta">构建于 2026-09-16 20:39 · 所有数字取自工程内的正式报告,未做外推或估算。</p>
</div>
</div>
</footer>
<!-- 全站检索:客户端索引,无后端、无网络请求 -->
<div class="pal" id="pal" hidden>
<div class="pal__mask" id="palMask"></div>
<div class="pal__box" role="dialog" aria-modal="true" aria-label="检索全站内容">
<div class="pal__hd">
<span class="pal__ico" aria-hidden="true"></span>
<input class="pal__in" id="palInput" type="text" role="combobox" aria-expanded="true"
aria-controls="palList" autocomplete="off" spellcheck="false"
placeholder="检索全站内容:章节、数字、术语…">
<span class="kbd">Esc</span>
</div>
<div class="pal__list" id="palList" role="listbox" aria-label="检索结果"></div>
<div class="pal__ft">
<span><span class="kbd">↑</span><span class="kbd">↓</span> 选择</span>
<span><span class="kbd">↵</span> 打开</span>
<span class="pal__n mono" id="palN"></span>
</div>
</div>
</div>
<script src="assets/js/data.js?v=a9c21ef3a8"></script>
<script src="assets/js/examples.js?v=a9c21ef3a8"></script>
<script src="assets/js/restart.js?v=a9c21ef3a8"></script>
<script src="assets/js/nm21.js?v=a9c21ef3a8"></script>
<script src="assets/js/ledger.js?v=a9c21ef3a8"></script>
<script src="assets/js/search.js?v=a9c21ef3a8"></script>
<script src="assets/js/space.js?v=a9c21ef3a8"></script>
<script src="assets/js/site.js?v=a9c21ef3a8"></script>
</body>
</html>