检索与排序指标
搜索和 RAG 返回的是一个排序列表,不是一个答案。召回率@k、精确率@k、MRR 和 nDCG 各自给这个列表的不同侧面打分。
分类器返回一个决定。搜索引擎或 检索增强生成(RAG) 检索器返回的是一个排序列表——一次查询的前 k 篇文档。评测一个列表是另一回事:你在意的不仅是正确的文档在不在里面,还有它们排在哪儿,因为没人会读到前几条之后,而生成器只能看到你喂给它的东西。下面这些指标都给排序列表打分,它们分成两个问题:对的东西在不在,以及它是不是靠前。
前提
对每个查询,你需要一组相关文档——标准答案,由人工标注或从点击行为推出。系统返回一个排序列表。每个指标都拿这个列表跟那组相关文档比。所有地方的「@k」都是「只考虑前 k 条结果」的意思,因为实际上起作用的只有最前面那几条。
召回率@k 与精确率@k:在不在
这两个就是把精确率(precision)与召回率(recall)限定在前 k 条上。
- 召回率@k = 所有相关文档中,有多少出现在前 k 条里。召回率@5 = 0.8 表示你本该找到的文档里有 80% 在前 5 条中。
- 精确率@k = 前 k 条结果里,有多少是相关的。精确率@5 = 0.6 表示前 5 条里有 3 条相关。
对 RAG 来说,召回率@k 通常是最要紧的那个指标。 如果装着答案的那段文字不在召回集合里,生成器就用不上它——任何 prompt 改动都救不回从未取回的信息。把检索的召回情况单独于生成质量来衡量,是 RAG 系统里最有价值的一项诊断,因为大多数 RAG 失败都是静默的漏召回。
它们的缺陷是:在前 k 条内部不看顺序。一篇相关文档排第 1 还是排第 5,得分一样。如果下游是一个会把 k 条都读一遍的生成器,这没问题;但对一个第 1 名就是全部的搜索页面,这就是错的。
MRR:第一个命中有多靠前
**平均倒数排名(MRR)**只关心第一个相关结果的位置。对每个查询,取该名次的倒数——第 1 名得 1 分,第 2 名 1/2,第 3 名 1/3,第 10 名 1/10——再对所有查询求平均。
当实质上只有一个正确答案、而且把它顶到最前就是全部任务时,MRR 才是对的指标:事实查询、「找到登录页」、已知条目检索。它忽略第一个命中之后的一切,所以当一个查询有许多相关结果需要露出来时,它就是错的选择。
nDCG:分级相关性,且看位置
上面几个指标把相关性当成二值的——一篇文档要么相关要么不相关。现实是分级的:搜「芝加哥最好的披萨」,完美匹配、还行的匹配和勉强沾边的页面是三回事。nDCG(归一化折损累计增益)同时处理分级相关性和位置,所以它成了衡量排序质量的标准。
它分三步构建:
- 增益:每条结果带一个相关性分数(比如 3 = 完美,1 = 勉强,0 = 不相关)。
- 折损累计增益(DCG):把增益相加,每项除以一个随名次增大的因子,这样排在列表深处的相关结果贡献更小。一篇很好的文档排在第 8 位帮助有限,因为没几个用户会翻到那里。
- 归一化:用 DCG 除以理想排序(同样这几篇文档所能达到的最好排序)的 DCG,得到 nDCG,一个 0 到 1 的分数,1 表示排序完美。
归一化让 nDCG 可以在相关文档数量不同的查询之间比较——一个有十个好答案的查询和一个只有两个的查询,各自对着自己的完美列表打分。再加上分级相关性和位置折损,这就是 nDCG 成为评测重排序模型和搜索相关性的默认选择的原因。
怎么选
让指标匹配任务形态:
- 给生成器供料的 RAG 检索:先看召回率@k(答案那段文字到底在不在),再看精确率@k(上下文里有多少噪声)。
- 已知条目 / 单一答案的搜索:MRR——把那个唯一正确的答案顶到最前。
- 分级的、多结果的排序(网页搜索、推荐、重排序):nDCG——位置和相关程度都算数。
而且要单独衡量检索,在它和生成纠缠到一起之前。RAG 评测如果只给最终答案打分,就分不清是漏召回还是生成出错,而这两者的修法正好相反。把两者分开,就是这些指标带来的实际收益。
要点回顾
- 检索和搜索返回排序列表;这些指标问两件事——相关内容在不在,以及它是不是靠前。
- 召回率@k(前 k 条里相关文档的占比)通常是 RAG 的关键指标:没被召回的东西生成器用不上。精确率@k 衡量前 k 条里的噪声。两者都不看 k 条内部的顺序。
- MRR 给第一个相关命中的名次打分——适合单一答案的搜索,对它之后的一切视而不见。
- nDCG 把分级相关性和位置折损结合起来,再对理想排序做归一化——衡量排序与重排序质量的标准。
- 把检索和生成分开评测,免得把漏召回误当成生成错误。
下一篇: 偏差-方差权衡