不检索比检索更准:模型已经会的题,上RAG后F1 掉 0.15~0.38,token 多花 3~34 倍——彻底搞懂LLMWiki第三篇补一

4 阅读16分钟

30 秒判断:不检索,反而更准。 这是《LLM-Wiki 到底好在哪?》的补篇一:上一篇把 30 道题当成一个整体,量出"编译成页面只赢 0.006";这一篇只加两步——先量一条闭卷基线(同模型、不给知识库直接问),再按"模型闭卷能不能答出"把题分成两档。在"模型本来就答得出"的那 12 题上,闭卷 0.917 > 三条 agent 路线 0.69~0.76 > 经典 0.534(F1 掉 0.15~0.38),三轮 × 三条路线共 9 场对比闭卷全胜;而 token 反而多花 3~34 倍——闭卷每题 1,015,wiki 34,347。

适合谁读:已经在用 RAG、但效果不如预期的人;正在纠结"要不要上检索"的人;想知道"检索什么时候帮倒忙"的人;以及读过本系列前三篇的人。

结构速览:§1 怎么测的(含闭卷基线与分档判据);§2 主结果;§3 现场——四类"把对的换成错的";§4 为什么"不迭代"的那条最伤;§5 那另外 18 题呢(下一篇的引子);§6 结论与怎么用。附录 A 是逐题全表。

证据标记:✅ 实测(本机五条路线各 3 轮 × 30 题 + 闭卷基线 2 个模型 × 3 轮)· 📄 源码(Tencent/WeKnora v0.8.2)· 📎 原文(题目与论文原话)· 🤔 推断(会明确标出)。

先交代两个名词:

  • 闭卷基线:同一个回答模型、同一批题,不给知识库、不给任何工具,直接问。(论文里管这一行叫 None (Closed-book)。)
  • 记忆可解 / 记忆不可解:以闭卷 flash 的成绩划线——3 轮里 ≥2 轮 F1 ≥ 0.5 算"模型本来就答得出"。30 道题这样划出 12 / 18 两档。

系列位置:上一篇(检索篇)报了三件事——wiki 对同代 agentic 块检索只赢 0.006、对经典单次检索赢 0.26、论文那 6~7 分对不上。本篇是它的补篇一:只加一步(闭卷基线)+一次分档,就发现第一件事必须分两半说——一半成立,一半反了。另一半(记忆不可解的 18 题)留给补篇二。


0. 结论先行

不检索,反而更准——但这句话只在一半的题上成立。 把"模型本来就会的题"和"模型不会的题"混在一起算平均分,会得到一个谁都不像的结论;分档之后,两档的方向是相反的,这一篇只讲前一半:

结论
① 记忆可解档:加检索是负作用(✅ 实测)闭卷 0.917 > hybrid 0.762 ≈ smart 0.764 > wiki 0.694 > 经典 0.534;三轮 × 三条 agent 路线共 9 场对比,闭卷全胜——没有一次例外
② "不迭代"的那条最伤(✅ 实测)经典(一次 top-k + 一次生成)比闭卷掉 0.38;有迭代的三条路线能挤回一部分(0.69~0.76),但都没回到"不检索"的水平
③ 代价也是反的(✅ 实测)这 12 题上,闭卷每题 1,015 token,经典 2,866,smart 14,506,hybrid 20,035,wiki 34,347(34 倍)——最准的方案同时最省

一句话:在模型已经会的问题上,检索不是"锦上添花",而是"把对的答案换掉"。

三条边界(先说清)

  1. 一份语料、一个切片:MuSiQue 可答子集里的 30 道题(2/3/4 跳各 10 道)中的这 12 题。而且它不是随机抽样——是按闭卷成绩划出来的,天然偏向模型熟悉的领域。
  2. 单模型族:所有对照都在 DeepSeek 家族内(flash ⇄ v4-pro),跨家族没测。
  3. 判据是近似的:单题用"F1 ≥ 0.5"判对错,短答案会因为共享词被误判(§1.3 有实例);分档是事后做的,不是独立标注。

1. 怎么测的

1.1 底盘:沿用上一篇,不重复

同一条链路、同一份语料、同一批题:WeKnora(v0.8.2,本地锁定)+ MuSiQue 的可答子集(572 个段落文件,2/3/4 跳各 10 题)+ 五条路线(A quick 经典无重排/B quick+rerank 经典加重排/C smart agent+块检索/D wiki agent+页检索/E hybrid wiki 导航+块引用)+每条 3 轮+主指标词级 F1。细节和口径都在上一篇,这篇不重列。

这一篇只加两步:一条闭卷基线,和一次分档。

1.2 第一步:加一条闭卷基线

做法:同一批 30 题、同一个回答模型,不给知识库、不给任何工具,直接问(experiments/weknora/closedbook_direct.py,直连模型 API;无系统提示,只带一句作答格式约定,与五条路线同一套)。同样 3 轮 × 2 个模型。

它回答的是一个很朴素的问题:这份分数里,有多少是模型本来就记得的?

全 30 题口径(✅ 实测,3 轮 × 2 个模型):

口径F1EM空答
闭卷 flash0.4310.3897%
闭卷 pro0.5080.44411%

一条旁证(📎 原文) :论文自己的主表里就有这一行——MuSiQue 上 None (Closed-book) = 0.456 F1/0.372 EM。也就是说,"记忆底分不低"不是我们这份切片的特例:它那边 Dense 相对闭卷只多 +0.155,LLM-Wiki 相对闭卷多 +0.283。(顺便,这也解释了为什么它选的那份"前 500 条"切片上,稠密检索是正贡献。)

两个必须交代的口径坑:

  • "空答"要和"答错"分开记。 该模型先产出内部推理,预算给少了正文会被饿死(实测 max_tokens=4096 时难题直接空答,给到 16,384 才正常收尾);这批闭卷里 pro 的整体空答率 11%,flash 7%。把"没答完"混进"答错"会低估它。
  • 用 WeKnora 的 agent 跑"闭卷"是无效的:即使不给它挂工具,harness 仍然会注入系统提示与知识库语境,模型会吐 Let me search the knowledge base、还编出 <kb doc=…> 引用,分数只有 0.207。这条基线只认直连模型 API 的版本。

1.3 第二步:怎么分"记忆可解 / 记忆不可解"

判据一句话:以闭卷 flash 为准,3 轮里 ≥2 轮 F1 ≥ 0.5,就算"模型本来就答得出" ——30 题里划出 12 题可解 / 18 题不可解。(判分用的是全文同一个脚本、同一个 best_match:小写、去标点,对金标准与别名取最高分。)

这个判据是近似的,两种误差方向我都验过:

  • 共享词造成的假阳性:#1 金标准是 Miller County,闭卷三轮答的是 Los Angeles County/Los Angeles County/Douglas County——第三轮拿到 0.50,只是因为共享了 "County" 这个词,它其实答错了。所以我把阈值收紧到"≥2 轮",正是为了挡掉这种偶发命中。
  • 偶发答对造成的漏报:#15(Casa Loma)、#21(Green Bay)都是"三轮里对过一次",按严格口径算进了不可解档——它们更准确的说法是"模型知道,但不稳定"。
  • 换模型做交叉检验:拿闭卷 pro 当分类器,只有 2 道题(#21、#29)换边;换成宽松口径(≥1 轮)则 16 / 14 分档。两套口径下,本篇的结论方向不变(§2 有逐轮数据)。

顺带一个画像:这 12 题里 2 跳 6 道、3 跳 4 道、4 跳 2 道——偏简单档,符合"模型记忆更容易兜住短链题"的直觉。(全 30 题口径的闭卷是 0.431/0.508,两档一分开,差异就出来了:12 题那一档是 0.917。)


2. 主结果:这一档上的分数、稳定性与成本

路线F1(三轮均值)逐轮抖动token/题(均值)
闭卷 flash0.917.917/.833/1.0000.1671,015
闭卷 pro0.972.917/1.000/1.0000.083—
经典(B 加重排)0.534.548/.548/.5060.0422,866
wiki(agent+页)0.694.833/.667/.5830.25034,347
smart(agent+块)0.764.875/.625/.7920.25014,506
hybrid0.762.632/.736/.9170.28520,035

抖动=三轮 F1 的最大值与最小值之差。token/题=该题所有 LLM 调用的 prompt + completion(重排与向量检索的算力不计入)。

三条读数:

  1. 闭卷逐轮全胜。 三轮各比一次,闭卷(0.917/0.833/1.000)每一轮都高于每一条检索路线——9 场对比,没有一次例外。而且检索路线自己的抖动(0.25~0.29)是闭卷(0.17)的 1.5 倍:加了检索不但更低,还更不稳。
  2. 经典路线是最差的一条,而且差得最"稳"。 0.534,三轮 0.548/0.548/0.506,抖动只有 0.042——它稳定地错。这和它"一次 top-k + 一次生成"的形态有关(§4)。
  3. 三条 agent 路线之间仍然不可分辨。 0.694/0.764/0.762,看起来分三档,但名次每一轮都在变(第 1 轮 smart > wiki > hybrid、第 2 轮 hybrid > wiki > smart、第 3 轮 hybrid > smart > wiki)。所以这一档上只能说"有迭代比没迭代好",不能说"页面层比块层好"。

3. 现场:模型本来答对,检索把它换成了什么

分数只说明"低了",看不出"怎么低的"。12 题 × 4 条检索路线 × 3 轮,一条条看下来,替换的方式其实就四类;§3.5 再补一个反例。

3.1 换成同一个域里的另一个实体

#3(2 跳)📎 "Who did the screenwriter for Good Will Hunting play in Dazed and Confused?" ——《心灵捕手》的编剧,在《年少轻狂》里演了谁?

路线三轮作答
闭卷Fred O'Bannion ×3(全对)
经典David Wooderson ×3 —— 同一部电影里的另一个角色
smartFred O'Bannion/Ben Affleck/Fred O'Bannion

#14(3 跳)问"总部在纽约的那个足球组织,哪支球队所在的城市,是那张 No Wave 专辑的诞生地"。金标准 New York City FC,闭卷三轮全对;经典三轮全答 New England Revolution(同联盟的另一支球队) ,smart 有两轮答 New York Red Bulls。

⇒ 检索把同域里"长得更像答案"的那个实体捞了上来,模型照抄。这类题在语料里都是短段落、一实体一段(上一篇 §4.1 量过),检索单元和知识单元已经是同一个东西,于是"再检索一遍"没有带来新信息,只带来了换错的机会。

3.2 换成同一个实体的另一种表述

#11(3 跳)问"灰狗巴士在阿娜·塞尔兹尼克雇主总部所在城市从哪里发车"。金标准 Toronto Coach Terminal(车站名):

路线三轮作答
闭卷Toronto Coach Terminal ×3(全对)
经典610 Bay Street, Toronto ×3 —— 同一栋楼的地址
wiki/smart各有一轮答 610 Bay Street / **610 Bay Street**

#9(2 跳)问"阿什肯纳兹犹太人祖先定居地那些部族,哪一年年末入侵罗马帝国"。金标准 406:闭卷三轮全 406;经典三轮全 433;wiki 对了一轮,之后两轮跟着答 453。

⇒ 这两条最能说明问题:正确答案和模型的记忆完全一致,检索拿回来的却是同一实体的另一个侧面(名字 ↔ 地址、正确年份 ↔ 邻近数字)。模型没有判断"哪个才是被问的那个",直接采信了上下文。

3.3 停在链条的中间

#23(4 跳)问"那位想改革如今美国最大教派的德国神父,去世前讲圣母布道是在德国哪个州"。金标准 Saxony-Anhalt:

路线三轮作答
闭卷 flash/proSaxony-Anhalt ×6(6 轮全对)
经典Wittenberg/Saxony/Saxony
wikiWittenberg/Fribourg/Saxony
smartWittenberg/Saxony/Saxony
hybridWittenberg/Wittenberg/Saxony

⇒ 开卷 9 轮全错、闭卷 6 轮全对。断点不在知识,在链路:检索停在链条中间那个实体(维滕贝格、萨克森州)就不再往下走了。这条题在我们内部的逐题复盘里被完整拆过一遍——库里的答案齐全,缺的是"维滕贝格 → 州"这条跨页关系。

3.4 平均值看不见的偶发替换

有些题平均值几乎没掉,但同一件事在单轮里发生了:

  • #6:wiki 前两轮 Claudia Wells,第三轮 Elisabeth Shue(换成同一系列续作里换了演员的那位)。
  • #10:经典前两轮 Jennifer Connelly,第三轮 Jennifer Aniston——而且这个错答拿到 0.5 分,因为两个名字共享 "Jennifer"。这就是"F1 ≥ 0.5"只能当近似判据的原因。

⇒ 这类替换在均值上被稀释掉了,但它才是"检索让本来对的答案变得随机"的真实形态:不是稳定地错,而是时对时错。

3.5 反过来也要说:检索偶尔真的能纠回来

不能只挑对结论有利的样本。这 12 题里,闭卷没答稳的有 3 道,其中每一道都被检索补回来过:

题号金标准闭卷检索表现
#1819410 /1 /1(2/3)经典三轮全答 1902;smart/hybrid 三轮全对
#2719051 /0 /1(2/3)经典三轮全对;hybrid 有一轮写成 Answer: 1905(0.67)
#12Medieval Latin1 /0 /1(2/3)经典三轮全对;wiki 2/3(有一轮答 Old Norse);smart 两轮答 Old High German/Old Latin

所以把两边合起来数:闭卷答稳的 9 道里,7 道被至少一条检索路线拉低;闭卷没答稳的 3 道里,3 道被检索补回来。⇒ 准确的结论不是"检索没用",而是——检索把力气花在了模型已经会的地方,代价是把其中大部分换成了错的。

顺带一个口径提醒:有几轮答案其实是对的,分却低得离谱,那是指标对输出格式敏感——#9 有一轮把 <kb doc=…> 引用和整段解释一起吐出来(F1 0.06)、#12 有一轮先写推理链再给答案(0.12)、#27 有一轮写成 Answer: 1905(0.67)。这类分差不是知识差。


4. 为什么"不迭代"的那条最伤

同一档题上,经典路线(0.534)比三条 agent 路线(0.69~0.76)低 0.16~0.23,而经典和它们的差别只有一个:经典只有一次机会。

一次 top-k 就把 10 个块钉进上下文,模型必须在这批块里选一个答案——里面混着 David Wooderson、610 Bay Street、433、New England Revolution 这些"同域长得像答案"的内容,没有第二轮去把它们挤掉。agent 路线可以把一次查询拆成多轮、用新查到的证据覆盖旧的看法,所以能挤回一部分(0.16~0.23),但仍然回不到"不检索"(0.917)。

同一份语料上有一条很直接的旁证(🤔 推断的机制,✅ 实测的数据,口径是全 30 题):把经典的 top-k 从 10 提到 20,命中金标段落的题数从 14/30 涨到 18/30(+29%) ,可 F1 反而从 0.318 掉到 0.293(加重排那条同样:0.316 → 0.286)。证据量上去了,分数下来了——多塞进来的那 8~10 条块,大半是干扰。

把成本也摆上来,这一档的账是完整的:

路线F1token/题
闭卷0.9171,015
经典0.5342,866
smart0.76414,506
hybrid0.76220,035
wiki0.69434,347

质量最高的那一栏,成本也是最低的。 这是本文唯一一处"免费午餐":在这类问题上,不上检索同时赢得质量和成本。


5. 那另外 18 题呢

这一篇讲的是"记忆可解"那一半。另一半的结论正好相反,先把几个数放在这里,细节留给补篇二:

路线记忆不可解档(18 题)F1
闭卷0.108
经典0.195
smart0.372
wiki0.409
hybrid0.425

⇒ 在记忆兜不住的题上,多轮检索是真有用的(相对经典 +0.21、相对闭卷 +0.30);但页面层与块层在这一档仍然没分开(wiki − smart 只有 +0.037,换口径/换轮次符号还会翻)——上一篇那个"编译成页面只赢 0.006"的结论,在这一档继续成立。

两档合起来才是完整的话:检索的价值不在"更好的检索",而在"补上模型不知道的";一旦题目落在模型已经会的地方,多出来的检索只会增加换错的概率。


6. 结论与怎么用

  1. 先量"记忆底分",再谈检索增益。 做法很便宜:拿你自己的题集,不给知识库直接问一遍(同模型、3 轮)。如果底分已经高,说明你的题大量落在模型的记忆里——这时上检索要先做好"分数可能下降"的心理准备。
  2. 把"检索到的文本"和"模型的答案"分开对待。 本文量到的失败形态不是"检索不到",而是"检索到的东西覆盖了本来对的答案"(§3.1~§3.4)。所以在工程上,检索更适合做引用与校验,而不是无条件重写答案——🤔 这是推断,但从这 12 题的现场看方向是明确的。
  3. 迭代 >> 更强的单次检索。 同一档里,"一次 top-k+一次生成"稳定垫底(0.534,三轮几乎不变),而带迭代的三条都在 0.69 以上。想只靠"加重排/把 top-k 调大"解决,本文的数据是相反的(§4)。
  4. 别忘了这一档的绝对上限。 0.917 不是"知识库能力",是"这批题模型本来就会"——它的用处是当参照线,不是当成绩。

边界重申:这 12 题是按闭卷成绩挑出来的,偏向模型熟悉的领域(美国流行文化、历史年份这类)。换一份语料,这个比例会变,但机制不会——只要题目落在模型已有的记忆里,检索就在做"有可能把对的换掉"这件事。


附录

A. 记忆可解档 12 题逐题全表(✅ 实测,三轮均值 F1)

题号跳数金标准闭卷 flash经典wikismarthybrid
#22John D. Loudermilk1.001.001.001.001.00
#32Fred O'Bannion1.000.001.000.670.67
#62Claudia Wells1.001.000.671.001.00
#72Karen Fairchild1.001.001.001.000.89
#924061.000.000.331.000.69
#102Jennifer Connelly1.000.831.001.001.00
#113Toronto Coach Terminal1.000.290.330.330.47
#123Medieval Latin0.671.000.670.500.71
#143New York City FC1.000.290.670.670.83
#18319410.670.000.671.001.00
#234Saxony-Anhalt1.000.000.000.000.00
#27419050.671.001.001.000.89

加粗=该行最优(并列同加)。题面较长,只把正文里引用到的那几道(#3、#9、#10、#11、#12、#14、#18、#23、#27)译了出来。

B. 材料、口径与复现

被测对象:Tencent/WeKnora(标准版 Docker Compose),对话模型 deepseek-flash(对照 deepseek-v4-pro),向量模型 qwen3.7-text-embedding,重排 qwen3-rerank。

语料与题集:MuSiQue 可答子集,2/3/4 跳各 10 题(共 30 题);语料=这 30 题涉及段落的并集,572 个段落文件。

闭卷基线口径:同模型直连 API,不给知识库也不给工具(无系统提示,只带一句作答格式约定),temperature=0.7、max_tokens=16384、内部推理默认开启;空答率单独记,不与答错合并。2 个模型 × 3 轮 × 30 题。

分档判据:以闭卷 flash 为准,3 轮里 ≥2 轮 F1 ≥ 0.5 记"记忆可解"⇒ 12 题;其余 18 题记"记忆不可解"。稳健性做过两组:宽松口径(≥1 轮)为 16/14,换闭卷 pro 当分类器只有 #21、#29 换边。

token:该题所有 LLM 调用的 prompt + completion(按 (时间戳, purpose, prompt, completion, session) 去重后按题聚合);重排与向量检索的算力不计入。闭卷侧取自直连 API 返回的 usage。

抖动=三轮 F1 的最大值与最小值之差(不是标准差)。

复现路径(脚本在本仓库 experiments/weknora/):weknora_musique.py(建库/投喂/编译)→ weknora_qa_eval.py(agents/ask/score/tokens/mkarm)、closedbook_direct.py(闭卷基线)。数据产物在 data/tmp/weknora-musique/。

同系列:总论 · 编译篇 · 检索篇(本篇的上一篇)——本篇是它的补篇一。