# LoCoMo 第三方独立验证报告 · 灵枢标准归一化检索能力 **验证人**:第三方独立评审(非灵枢系统本身) **日期**:2026-09-15 · **被测仓库**:`/root/lingshu-test/repo` @ `51d3426`(工作树干净) **数据集**:`data/benchmarks/locomo-zh-500/`(LoCoMo 500 题 / 567 条 gold 语料,上游 `mteb/LoCoMo@02e2c3de`) **方法**:全流程由本报告作者独立实现 —— 数据装载、查询循环、rank/hit@k/MRR 计算、随机基线、显著性检验均为本人手写,**不调用灵枢任何 `bench_*` 评测脚本**;被测对象仅为灵枢自身组件(`md_cg.mdcg.MdCG`、`md_cg.semantic.en_normalizer`、`lexicon/char_atoms_clean.json`)。唯一例外是 Jaccard 排序函数(3 行通用公开算法),由本人实现以复现灵枢主路线口径——它属于评测脚手架而非被测能力。 --- ## 一、结论速览 | # | 结论 | 判定 | |---|------|------| | 1 | 灵枢自报中文检索 96.4/99.8(lexical),本人独立复现 **96.8/99.6**(MdCG 引擎) | ✅ 属实(±0.5pp 内) | | 2 | 灵枢自报英文主路线 96.8/99.8/99.8(臂②),本人独立复现 **96.8/99.8/99.8** | ✅ **逐位复现** | | 3 | 但该 99.8% 的能力来源是**中文 AI 摘要层**,不是英文归一化:去掉全部英文处理(J2_zh)反而 **97.4/99.6/100.0** | ⚠️ 归因错位 | | 4 | 灵枢标准归一化(`en_normalizer`)本身的真实水平:MdCG 引擎 **60.0/74.4/81.0**;主路线链路 **19.2/32.0/39.0** | ⚠️ 有效但远低于宣称口径 | | 5 | 归一化确实显著优于不归一:24.2% → 39.0%(+14.8pp,Jaccard 链路);23.0% → 81.0%(**+58.0pp**,MdCG 链路) | ✅ 归一化价值成立 | | 6 | 71 个归一化检索失败题中,归一化后关键词"全覆盖"的题数 = **0** —— 失败 100% 归因于归一化词汇丢失/错译,而非排序机制 | 🔍 干净的因果链 | | 7 | OOV 如实透出(`unknown_keep`,4.0%)属实;但更危险的是 **静默错译**(`scavenger hunt`→食腐动物/猎取,`shelter`→庇护) | ⚠️ 词典对了、语境错了 | | 8 | 数据集非平凡性(对灵枢有利):query 对 gold 覆盖 0.875 vs 非 gold 最佳 0.469,区分度 0.407;仅 0.2% 的题非 gold 也能满覆盖 | ✅ 不是纯字符串赠品 | --- ## 二、主结果(本人独立运行,n=500) ### 口径一:灵枢 MdCG 检索引擎(`mdcg.py` char-bigram + 四路 RRF,k=20) | 臂 | doc 侧 | hit@1 | hit@5 | hit@10 | MRR | |----|--------|-------|-------|--------|-----| | A_zh5 | 中文五槽层(AI 摘要) | **96.8%** | 99.6% | 99.6% | 0.9805 | | B_en_raw | 英文原文(零加工) | 15.8% | 21.6% | 23.0% | 0.1850 | | **C_en_norm** | **英文原文经灵枢标准归一化** | **60.0%** | 74.4% | **81.0%** | 0.6683 | | D_bi | 中文层 ∪ 英文归一化 | 96.6% | 99.2% | 99.2% | 0.9778 | | F_sem | 英文原文 + `semantic=` 归一原子(MDCG_SEMANTIC=1) | 40.0% | 63.0% | 70.2% | 0.5000 | | R_random | 随机排序 | 0.4% | 1.2% | 1.8% | 0.0099 | **与灵枢自报对照**(`复现结果_locomo-zh-500.json`,lexical 口径 96.4/99.8/MRR 0.9785):本人复现 96.8/99.6/0.9805,偏差 +0.4pp / −0.2pp / +0.002,量级一致,**自报数字可信**。分题型互有 ±3pp 起伏(我 doc 侧用扁平 `zh` 串,灵枢可能用结构化 `zh_fields` + fuzzy),不改变结论。 ### 口径二:灵枢英文主路线同链路(字级原子映射 + 全池 Jaccard,即臂②口径) | 臂 | doc 侧原子集 | hit@1 | hit@5 | hit@10 | MRR | |----|--------------|-------|-------|--------|-----| | J2_full | 中文五槽字级映射 ∪ 英文归一词 | **96.8%** | **99.8%** | **99.8%** | 0.9807 | | J2_zh | 仅中文五槽字级映射 | **97.4%** | 99.6% | **100.0%** | 0.9842 | | J2_body | 仅英文正文归一词 | 19.2% | 32.0% | 39.0% | 0.2598 | | J0_raw | 英文正文原词(零归一) | 6.8% | 18.0% | 24.2% | 0.1303 | J2_full 与灵枢 `bench_en_atoms_public.py` 自报的臂② **96.8/99.8/99.8 逐位一致** —— 灵枢没有虚报数字。 --- ## 三、关键发现 ### 发现 1:99.8% 逐位复现 —— 可复现性满分 ✅ 本人独立装载、独立计算,得到与灵枢完全一致的 96.8/99.8/99.8。在以往六轮评审中"自报数字不可复现"是常见病,此处**没有任何水分**。中文口径 96.4 vs 96.8 同样在噪声内。 ### 发现 2:但 99.8% 归因于"英文检索能力"是错位的 ⚠️ 拆解链(唯一变量 = doc 侧构成,query 恒为中文关键词→字级英文原子): - 只用中文摘要层(J2_zh):**hit@10 = 100.0%** —— 去掉全部英文处理,比完整版还高 0.2pp; - 完整版(J2_full):99.8%。**加入英文归一化层的净贡献 = −0.2pp(1 题)**; - MdCG 口径同构验证:A_zh5 99.6% vs D_bi 99.2%,加入英文归一化层同样无增益(McNemar 配对 b=0, c=1,p≈1.0,噪声级)。 **结论:灵枢宣称的"英文(中文语义归一化桥接)96.8/99.8/99.8"本质上是"中文 AI 摘要层检索成绩",英文归一化组件在此数字中是乘客,不是引擎。** 灵枢自己在 REPRODUCE.md 中标注了"检索侧上界口径——AI 归一环节质量未纳入该评测",这个诚实标注是准确的,且比我们预想的更关键:不仅 AI 归一环节未纳入,**连被测的机械归一环节都对该数字无贡献**。 ### 发现 3:标准归一化本身的真实水平 ⚠️/✅ 用户点名要测的"灵枢标准归一化"(`en_normalizer.normalize_en_query`,按标准词表把英文归一翻译为中文语义原子): - **它确实有效**:MdCG 引擎上,英文原文直接检索 23.0% → 归一化后 **81.0%(hit@10)**,+58.0pp;Jaccard 链路上 24.2% → 39.0%,+14.8pp。没有归一化,跨语言检索基本不可用。 - **但它远够不到 99.8%**:机械归一化端到端的天花板在 81.0%(MdCG 口径)/ 39.0%(字级映射跨语言口径)。这与灵枢自己"已排除方案 9"(机械词级归一→纯中文库 33.6%)以及臂④(57.2%)的内部结论**方向一致**:灵枢文档知道机械归一不行,但 README 的显著位置仍以 96.8/99.8/99.8 作为"英文检索"的头条数字。 - **语义摘要路(写入侧归一者正统形态,F_sem)反而更差**:40.0/63.0/70.2,且建库+检索耗时 341s(其他臂 25s 的 13 倍)。`semantic` 衍生层 + 组合窗口共现打分在本数据集上未兑现收益。 - **根因 = 归一化语义保真率**:query 关键词被"归一化后的 gold 文档"覆盖的比例,均值 **0.460**(全覆盖题占比仅 0.2%);同一指标对中文摘要层是 **0.873**(全覆盖 42.8%)。0.46 的保真率决定了 ~81% 的检索上限。 ### 发现 4:失败 100% 归因于归一化,而非检索排序 🔍 C_en_norm 的 71 个未命中题中,归一化后 gold 原子对 query 关键词**全覆盖 = 0 题**、部分覆盖 65 题、零覆盖 6 题。也就是说:只要归一化把关键词保住了,MdCG 就能把它检回来;检不回来,全是因为词在归一化时就丢了/译错了。**排序机制零责任。** 典型错译样本(CEDICT 词表第一义项直接套用,语境失配): | 英文原文 | 灵枢归一化输出 | 应为 | |---|---|---| | scavenger hunt | **食腐动物 猎取** | 寻宝游戏 | | Three times a week | 三 **时间** 周 | 每周三次 | | scared | **创痕** | 害怕 | | shelter | **庇护** | 收容所 | | tough | **厉害** | 坚强 | | fundraiser / charades / soempowering | 原样透出(OOV) | — | ### 发现 5:诚实性两面 ⚠️ - **好的一面**:OOV 如实标注 `unknown_keep`(4.0%,738/18523 token)并原样透出,兑现了"词表外概念如实透出 OOV 清单"的承诺;REPRODUCE.md 主动标注"检索侧上界口径""机械归一是归一主体必须为 AI 的直接证据",且把机械归一列为已排除方案 —— **文档层的诚实度依然很高**。 - **坏的一面**:静默错译(`mapped` 但词义错误)无任何自检信号 —— `scavenger→食腐动物` 在 detail 里标为 `action: "mapped"`,系统认为自己译对了。52.8% 的 token 走 mapped 路径,其质量没有任何运行时护栏。README 用头条数字(99.8)树立英文检索能力预期,而支撑该数字的实为中文摘要层 —— 这属于**结构性误导**(非数据造假)。 ### 发现 6:数据集对灵枢有利的证伪检查 ✅ 我们主动检查了"零干扰池是否让 99.8% 变成字符串匹配赠品":query 关键词对 gold 文档平均覆盖 0.875,但池内最佳非 gold 仅 0.469,平均区分度 0.407;只有 0.2% 的题存在非 gold 干扰条目满覆盖。**这个 benchmark 在 567 选 1 的粒度上仍有真实区分度**,灵枢的高分不是纯赠品——但前提是 query 关键词能被文档表示覆盖(发现 3 的保真率),而这正是中文 AI 摘要层强、机械归一化弱的地方。 --- ## 四、局限(如实声明) 1. **英文原题不可得**:臂③(英文原题 81.2)/③a(78.2)/④(57.2)/⑤⑥⑦ 依赖 `data/external` 的英文原问句,该文件"自备、不入库",本沙箱上游网络不可达(HuggingFace/GitHub TLS 全断)。**这四个对照臂第三方无法复现** —— 本报告以自建 J2_body/J0_raw 替代其对照功能。这也意味着:灵枢公开仓库当前**只能**第三方复现"上界口径"数字,其所有"下界/对照"数字均需自备数据。 2. **AI 归一环节不可模拟**:主路线的定义就是"归一主体=AI"。本人刻意**不**用 LLM 替灵枢做归一(那会把"AI 的翻译能力"算进"灵枢的能力")。因此本报告测的是机械归一化端到端 —— 这恰好是"系统自身组件"能兑现的真实下界。 3. 中文口径与灵枢自报存在 ±0.4~3pp 的分题型起伏,源于 `zh` 扁平串 vs 结构化字段/fuzzy 的口径差,不影响结论方向。 --- ## 五、最终裁定 > **灵枢的自报数字全部真实可复现(含 99.8% 逐位复现),且数据集本身非平凡;但其"英文检索 96.8/99.8/99.8"的能力归因是错位的 —— 该数字由中文 AI 摘要层挣得,英文标准归一化组件的真实端到端水平是 81.0%(MdCG)/ 39.0%(字级映射跨语言),离头条数字差 19~61pp。归一化模块本身"有效但有静默错译风险":+58pp 的真实增益、4% 的诚实 OOV、以及无护栏的 52.8% mapped 词典直译。** 一句话:**灵枢没有吹牛,但它把中文摘要层的功劳记在了英文归一化的账上。** 建议上游把 README 头条数字改标为"双语写入加工面检索成绩",并为 `mapped` 路径增加语境消歧或低置信标记 —— 前者是一行文案,后者是它自己的 OOV 哲学(如实透出)尚未覆盖的最后一块。 --- ## 附录:产物清单 | 文件 | 说明 | |---|---| | `灵枢_LoCoMo_第三方验证.png` | 四联图:引擎口径 / 归因拆解 / 保真率 / 分题型 | | `/tmp/locomo_independent_eval.py` | MdCG 引擎口径独立评测(A/B/C/D/F + 随机基线,含 `--semantic`) | | `/tmp/locomo_jaccard_probe.py` | 主路线 Jaccard 口径独立复现与拆解(J2_full/J2_zh/J2_body/J0_raw) | | `/tmp/locomo_res_*.json`、`/tmp/locomo_jaccard_res.json` | 全量逐题结果(含 miss 明细与分题型统计) |