揭示RAG检索架构评测中常见的度量陷阱,包括chunksize、top-k等变量控制的正确方法。
检索增强生成(Retrieval-Augmented Generation)已成为一种常见架构,用于为 LLM 提供基础支撑。但围绕检索的讨论往往听起来出人意料地绝对化。
Graph RAG 是未来。
更大的模型能产生更好的答案。
这里的目标不是简单地宣布一个赢家。而是要理解每种检索架构如何工作、在哪里失效、以及它的性能取决于什么。
这意味着需要在受控条件下构建三个检索管道,并且只改变一个组件:检索器。
基准测试比较了三种检索策略:
其他一切都保持不变。只有检索器发生了变化。

图检索器在小规模语料上表现良好。后来我将数据集从大约 100 个文档增加到 500。突然之间,一个一直正常的查询开始失败了。
What is the capital of Afghanistan?
检索结果:Not enough information.
检索是确定性的,所以我很清楚这不是随机的。我检查了排名。
获胜的文档不是 Afghanistan,而是一个 Wikipedia 页面,列的是 June(六月)的国定假日。它与这个问题的语义相似度是字面意义上的 0.000。
罪魁祸首不是图检索本身,而是我的评分函数:
$$\text{Final Score} = \text{Semantic Similarity} + \text{Entity Bonus}$$
语义相似度正确地倾向于 Afghanistan。但实体奖励分数压过了所有其他因素。提及大量实体的文档积累了巨大的奖励,即使它们毫不相关。
我的评分函数测量的不再是相关性,而是实体数量。

修复本身很简单——对实体奖励做归一化。
困难的部分是决定归一化多少。我确信一个温和的惩罚会胜出。但在保留验证集上评估六种归一化策略时,出乎意料的是,强归一化策略赢了。
有趣的是,不同的归一化在一个测试数据集上产生了略好的分数。切换到那种方法会提升基准测试成绩,但也会使实验失效。
这恰恰就是验证集和测试集存在的意义。
评分函数可以精确地优化你要求它优化的事物,同时完全遗漏你真正关心的东西。
永远要检查文档排名第一的原因,而不仅仅是它排名第一。
基准测试、实现和评估代码是开源的:
完整仓库包含检索实现、基准测试配置、评估代码以及本文讨论的实验。
这是系列文章的第一部分。更多陷阱敬请期待。
有些教训只能 hard way 才能学到。
正如我们法语里说的:"C'était Guy Olivier." ✌️