用Yu-Gi-Oh卡片领域对照三种系统:基座模型、QLoRA微调、检索增强。实验证明当检索已够好,答案质量的瓶颈在「阅读器」而非「检索器」。
当前所有构建 RAG 系统的人都在调优检索器——更精细的重排序、更深入的检索、更智能的分块。我做了六个实验,看看在检索已经足够好的情况下,这些优化究竟能带来多少提升。
结论简述:一旦相关段落能够稳定地进入上下文窗口,我尝试的检索侧改动就不再提升答案质量——一个对照测试将限制因素指向了阅读器(reader),而非检索器(retriever)。以下是实验过程,包含我能用数据支撑的结论,以及一并报告的失败案例。
实验设置:三个系统,同一个模型
我刻意选用游戏王作为测试领域:成千上万张卡牌、复杂的时序规则、大量专有名词,以及一个对该领域先天薄弱的基础模型(闭卷条件下,基础模型正确性仅 1.83/5, groundedness 仅 0.18/2——见下文)。这种薄弱反而是优势——它让三个系统能够拉开差距,而不是都得分相近。
三个系统均使用同一个模型:google/gemma-2-2b-it。每次只变动一个变量:
系统 A——基础版。模型原始状态,闭卷。Adapter 关闭。
系统 B——微调版。在 2,683 对教师蒸馏、裁判验证的游戏王问答对上训练 QLoRA adapter(rank 16, α 32, 4-bit NF4,所有 linear 模块),在最佳验证 checkpoint 早停(约 1 个 epoch;3 个 epoch 开始过拟合)。仍然是闭卷。(验证困惑度为 3.87。这个指标衡量的是在 held-out 文本上的下一个 token 拟合度,而非事实正确性或 grounding——它是训练健康度指标,不代表答案质量的证据,我没有用它来证明答案质量。)
系统 C——微调 + 检索版。基于系统 B,在回答前加入混合检索器前置的真实段落。
保持使用同一个模型并通过 adapter 开关切换是关键:任何分数差异都来自我操作的变量,而非底层模型不同。

读结果的三个层次框架
在看数据之前,先建立一个让后续讨论更精确的框架。"RAG" 通常被画成检索 → 回答,但其中实际包含三个独立的层次,且它们可能各自失败:
检索层——相关证据是否进入了检索集合?(用 recall@k 衡量。)
证据可用性层——检索到的上下文是否实际包含对该问题充分、可用的证据?没有被埋在其他干扰信息中、没有分散在多个段落中、没有在一个事实与多个竞争事实混杂的情况下?
阅读器层——模型能否提取正确的条款、进行推理、并生成正确答案?
高 recall 只说明第一层。它没有说明第二层是否充分,也没有说明第三层能否利用它。将这些层次分开,才能让下面的结果说出有说服力的结论。
结果 1:微调改变了答案的形态;检索带来了更大的正确性提升
三个系统回答相同的 60 个 held-out 问题,每个答案由盲标、参考锚定的裁判(rubric 细节见后)打分 0–10。主要结果,配对统计:

两次提升在相同 60 个问题上的配对检验均达到统计显著(这是我要做的两个比较;将它们视为强探索性证据,而非确认性基准)。
更有趣的信号是每次提升来自哪里。将分数拆解为四个 rubric 分项:

微调(A → B)移动最大的是 groundedness(0.18 → 0.87)——模型学会了像官方裁定答案那样表述,不再自信地编造卡牌文本。它也轻微推动了正确性(1.83 → 2.35)。所以微调确实编码了一些事实——我不是说它不能。但在检索侧(B → C: 2.35 → 3.85)获得了更大的正确性提升,那里真实段落进入了 prompt。
这是第一个发现,谨慎陈述:在本实验设置中,微调的主要贡献是答案形态和 grounding 行为,而检索贡献了更大的事实正确性提升。"微调教形态,检索供事实"是这个模式的有用助记口诀——但它是这里 magnitude 差异的隐喻,不是微调不能存储事实的字面声明。
结果 2:一旦检索已经足够好,我尝试的检索侧改动没有提升答案质量
系统 C 平均 8.05/10,而非 10——研究报告 60 个问题中已有 40 个达到满分 10,丢分集中在一个较短的尾部。为其供数的检索器已经很强:混合 dense(all-MiniLM-L6-v2)+ BM25,通过 Reciprocal Rank Fusion 融合,在 42,412 个 chunk 中取 top-5。recall@5 = 0.933;gold passage 约 72% 的时间排在第 1 位(recall@1 = 0.72),93% 进入 top-5。Recall 因来源不同而有差异——裁定类 0.96,卡牌事实类 0.93,构筑/背景 Lore 类较低(子样本较小)——所以"高 recall"是一个平均值,不是均匀分布。
所以我尝试从检索侧买回尾部分数。六个实验:
跨编码器重排序(检索 top-20 → 重排 → top-5)。结果:没有帮助,甚至略差——主集合从 8.05 降至 7.55;在平衡的 60 题拆分上,下降(8.25 → 7.37)达到统计显著。
重排器排序错误了吗? 结果:不是——recall@5 完全相同(0.933),gold 始终在第 1 位。分数下降追踪的是小阅读器对重新打乱上下文的反应,而非排序缺陷。
更深检索(重排更宽的候选池)。结果:recall 上升了(0.93 → 0.95 → 0.97),但平均分数没有移动。
分块修复(一张卡的效果文本被拆分到 1000 字符的分块中;我用相邻分块扩展重建了它)。结果:它修复了检索缺陷——孤立的条款回到了上下文中——但答案仍然不完整;阅读器没有使用恢复的条款。(这个缺陷很罕见:约 0.2% 的卡牌。)
按问题类型重新诊断失败。结果:剩余尾部被 yes/no 推理反转主导——模型在正确段落存在的情况下翻转了答案——而非缺失事实。
六个阅读器内部修复(自洽性、自验证、引文后回答等),在两张难题卡上测试。结果:模型内部技巧没有修复它;唯一有效的改动是在相同上下文中换用更强的阅读器(下一节)。
实验 1–4 的模式:每一项改动都改善了(或维持了)检索指标,但没有在最终评估上带来可衡量的端到端收益——而重排序实际上略微降低了分数。这是在这个高 recall 状态下检索优化端到端收益递减的证据——这比"检索不再重要"是一个更窄、更可捍卫的声明。

为什么更多 recall 没有帮助?因为 recall 是一个第一层指标。这里的尾部失败看起来是第二层/第三层的问题:证据存在但阅读器误读了(yes/no 反转),或者恢复的条款被忽略了。高检索 recall 不能保证成功的证据利用——而剩余的分数就丢在这个差距里。
阅读器测试——它做了什么和没做什么
实验 6 是信息量最大的,因为它固定了检索到的上下文,只改变了阅读器:
相同问题 → 相同检索上下文 → 不同阅读器 → 不同答案。
在最两张最难卡(Blackwing FAM 和 Endymion)上,给定相同的段落,更强的阅读器产生了微调的 2.6B 阅读器持续交付不出的完整正确答案,包括它一直遗漏的精确效果条款。
这里要诚实说明范围。这是一个对照的、相同上下文比较——比单纯观察 RAG 有帮助更有力地证明了阅读器的局限性。但它只在两张卡上运行,参考锚定的裁判每次运行有随机性,所以研究报告的是定性结果(完整 vs 回答不完整),而非固定的逐题分数。因此可捍卫的结论是:
这个比较提供了证据,说明阅读器能力是至少部分剩余失败的限制因素——而非证明阅读器是整个尾部的唯一绑定约束。
实验 5 的失败分类(尾部在段落存在的情况下被推理反转主导)是与上述解读一致的,但那是一个诊断,而非对照操作。澄清这个问题的干净方式是做一个我没有运行的实验——见"最有力的下一个测试"。
如果你在构建 RAG,这暗示了什么
范围限定于与本实验相似的设置(小阅读器、事实密集领域、already-high recall):
如果 recall 已经很高,在投入之前验证增加的检索努力是否真的在改变答案——在本研究中,重排序/更深检索/分块修复各自移动了检索指标,但没有移动答案质量。
Recall 是必要条件,非充分条件。上下文窗口中有段落不等于答案中有事实;要检查证据可用性和阅读器行为,而不只是 recall@k。
当检索足够好、质量已经 plateau 时,杠杆更高的动作可能是阅读器——更强的模型,或 RAG 感知的训练(RAFT / preference-tuned 路线)——而非更精巧的检索器。
不是说检索不重要:5.25 → 8.05 是检索带来的。它说的是一旦 recall 已经很高,检索的边际收益在这里递减了。
一个比任何单一数字更具泛化能力的诊断工作流:
1. 测量检索 recall(第一层)
2. 在失败案例上检查证据充分性(第二层)
3. 测量端到端答案质量
4. 用 oracle / gold 上下文测试(隔离检索上限)
5. 在相同上下文上比较阅读器(隔离阅读器上限)
6. 判断检索还是阅读器是主要限制因素——然后在那里投入精力
评估设计如何减少裁判偏差
每个答案由 LLM 裁判(gemini-3.1-flash-lite)打分,该裁判是参考锚定的(提供 gold answer 和逐字证据,告知按此评分而非其自身知识——这让它能公平地评估一个未经训练过的领域)、盲标的(不知道哪个系统产出了答案)、逐点的(一次一个答案),并在随机打乱顺序下运行以增加盲性。Rubric 总分 10(正确性 0–5,完整性 0–2,groundedness 0–2,清晰度 0–1),两个 guardrails:编造卡牌细节强制 groundedness 为 0,正确的拒答必须高于自信的错误答案。系统间用相同 60 问题配对比较,用 bootstrap 95% CI 交叉验证,配对 t 检验和 Wilcoxon。
这个设计尚未确立的,以及在称测量无懈可击前我会补充的:裁判 temperature 未固定,每个答案只评判一次(没有重复裁判一致性测量),裁判分数从未与人类评分校准过。研究报告已指出裁判对每个问题是随机的;该方差是真实的但未被量化。将 60 题均值视为可靠的,个别逐题分数视为有噪声的。
整个研究花费约 3.26 美元的 GPU 和 API 消耗。
本实验的边界,以及我不会延伸结论的地方:
单一专业领域(游戏王)。在法律、医疗、金融、科学文献、企业知识库、多跳或开放域设置中,检索行为和阅读器难度可能大相径庭。
60 个 held-out 问题。足够让两次配对提升达到显著;不足以概括 RAG 的整体情况或确定通用的 recall 阈值。
LLM 即裁判,单次运行,temperature 未固定,无人类一致性校准。
未排除实体重叠。Held-out 集由训练时 held-out 的页面构建(文档级拆分),并对训练问题进行了去污染——所以它测试的是对未见页面/问题的泛化。但相同的卡牌/实体可能出现在训练和测试页面中,所以这不是实体不相交的评估。
阅读器发现基于两张卡上的受控交换,定性报告。
Recall ≠ 证据可用性——我测量了 recall,从错误分析推断可用性失败,而非直接测量充分性。
一种 retriever/reranker 配置(MiniLM + BM25, RRF, 一个 cross-encoder)。其他配置可能有不同行为。
没有运行 oracle-context 实验,所以检索上限和阅读器上限没有用数字干净地分开。
发现对小阅读器在高 recall 状态下最强;在 recall 是实际瓶颈或多跳推理主导的地方可能不成立。
没有人类评估或跨域复现——两者都需要才能称此为比案例研究更有力的结论。
总结
微调改变了这个模型的回答方式并改善了 grounding,但检索产生了更大的事实正确性提升。一旦 recall 已经很高,我测试的检索侧改动没有改善端到端答案质量,而在两张难题卡上相同上下文的阅读器交换指向阅读器能力是至少部分剩余失败的限制因素。
这些发现来自 60 题评估,涵盖单一专业领域、一个模型和一个检索器,所以最好将其读作一个受控的工程案例研究——而非通用 recall 阈值,也非阅读器总是优于检索器的证明。可迁移的教训是诊断性的:一旦相关证据稳定地进入上下文窗口,在投入更多精力优化检索之前,先测量阅读器是否真的能利用它。
最有力的下一个测试
将阅读器故事从"暗示"变成"证明"的最干净方式是做一个分离两个上限的 2×2——这是我尚未运行的:
比较列显示有多少质量损失于不完美证据(检索上限);比较行显示有多少损失于阅读器(阅读器上限)。在所有 60 个问题上用固定裁判设置和重复评判运行,它会将两张卡的定性结果替换为定量的分离——这是在做出更强声明前我要优先做的实验。
代码、60 题评估集、裁判和全部六个实验:github.com/Ace-2504/short-answers-broken-rag。实时 arena,三个系统同时回答,实时裁判打分:harman-ygo-slm.vercel.app。