第一条搜索结果就找对了,检索评测也显示“命中”。可RAG写出的说明,仍然漏了申请条件和处理期限。
这不一定是模型没认真读。也可能是评测只问了一个太容易的问题:有没有找到至少一份相关资料? 而用户真正需要的是:几份互补的关键资料,是否都进入了可阅读范围?
本文回答一个问题:怎样区分检索的命中、首条相关结果的位置与召回覆盖,避免把一个漂亮分数解释成“证据已经找全”。
AI原创概念插画:蓝釉盘内摆着三朵相似红花,图册上还有蕨叶与扇叶的压纹,后方抽屉中放着不同标本。比喻找到相似材料不等于收齐所需材料;画面不是植物学图谱、真实检索界面或评测结果。
先把“找到了”拆成三个问题
RAG通常先检索资料,再让模型依据资料生成回答。要评价前一阶段,就需要一批测试问题,以及每个问题对应的相关性标注。信息检索中常把这类查询与资料的判断记录称为qrels:它说明某个资料单元对某个查询是否相关,或有多相关。
相关性是针对查询的,不是给文档永久贴一个“好资料”标签。Elastic的排名评测文档明确要求每个测试查询有自己的一组文档评分,并以用户的信息需求为依据。[2]
在先把相关性简化成“相关/不相关”的情况下,三个问题分别是:
- **Hit@K:**前K项中是否至少有一个已标为相关的结果?单题是是或否,跨题平均后才是命中率。
- **Recall@K:**所有已标为相关的单元中,有多少个不同单元出现在前K项?它关心覆盖比例。[1][2]
- **RR@K:**前K项里第一条相关结果排第几?取这个名次的倒数;前K项都没有则为零。对测试问题求平均,就是MRR@K。[2]
这里用Hit表示“至少一项相关”的定义;指标名字并非到处一致。例如本轮阅读的BEIR源码,将这种跨题平均命中行为放在名为top_k_accuracy的函数里。[3] 所以接入评测库时,要核对计算过程,而不是只认仪表盘的标题。
这些指标都可以有用:找官网入口时,尽快给出一条正确链接很重要;做一份需要综合多份规则的说明时,只找到第一条往往不够。问题不在于MRR“错了”,而在于拿它回答了它没有测量的问题。
跟一遍案例:同样第一名正确,覆盖可以完全不同
下面是人工构造的教学资料,不是真实商店规定,也不是模型或搜索服务的运行结果。
用户问:
维修申请需要什么材料?哪些情形不受理?处理期限怎样计算?
我们为这个问题设定以下资料与标签:
| 资料ID | 内容 | 本题标注 |
|---|---|---|
| A | 申请材料清单 | 相关 |
| B | 不受理情形说明 | 相关 |
| C | 处理期限与起算说明 | 相关 |
| D | 门店交通路线 | 已判断不相关 |
| E | 新加入、尚未评阅的服务页面 | 未标注 |
为了把算术说清楚,先设定A、B、C就是本教学语料中全部相关来源。这是案例的已知条件,不是现实知识库天然具备的完整标注保证。
系统实际返回的是切片。假设A的三个切片都含有与申请材料有关的信息。我们固定只能看前三个切片,再把它们映射回来源文档:
| 前三个切片对应的来源 | 是否命中 | 第一项相关的倒数名次 | 不同相关来源数/已知相关来源数 |
|---|---|---|---|
| A、A、A | 1 | 1 | 1/3 |
| A、B、E | 1 | 1 | 2/3,另有一个未标注槽位 |
| A、B、C | 1 | 1 | 3/3 |
前三列看起来同样漂亮,最后一列却揭示了差异。三次拿到A,不会自动拿到B和C;只检查“至少有一个相关结果”,分不出这三种覆盖情况。
严格说,最后一列是本文定义的前三个切片预算下的来源文档召回覆盖,不应悄悄改名成“前三个不同文档的Recall@3”。因为切片与文档不是同一个计数单位。
而且,真实系统不能仅凭父文档相关,就认定它的每个切片都含有相关证据。本文特意给A的三个切片作了相关性假设;上线时需要检查实际送入上下文的文本。
K和分母必须使用说得清楚的单位
最容易使评测失真的,不是除法算错,而是算到一半换了单位。
如果标签标在整份手册,检索输出却是手册切片,就需要声明映射规则:
- 先按切片预算截取结果。
- 保留切片ID、所属文档ID与版本。
- 在固定前缀中按文档ID去重,再计算来源覆盖。
这与“先把整个排名去重,再取前三个文档”不同。
例如完整切片排名是A1、A2、A3、B1、C1。前三个切片只覆盖A;如果先全局去重再取三份来源,则需要读到第五个切片,才能得到A、B、C。后一种评估并非一定不合理,但它使用了另一种预算,不能把它的满覆盖结果冒充前一种预算的成绩。
文档级、切片级、证据句级也不是谁永远更高级:
- 文档级方便检查来源是否进入候选,却可能掩盖返回了错误段落。
- 切片级更贴近阅读输入,但重新分块后ID与标签可能需要迁移。
- 证据或子问题级更贴近多条件回答,却需要更细的人工判断及标注规则。
因此,比较检索版本前应固定或记录语料快照、标注版本、相关性门槛、ID映射和截断阶段。分块变化后数字变高,可能既有检索改善,也有评价单元变化,不能直接归因给模型。
可以实际跟着跑的算术反例
以下代码已经在Python 3.13.5执行。排序、标签都由人工指定,只验证指标的区别;没有生成Embedding,没有运行检索模型、LLM、BEIR或Elasticsearch。
from fractions import Fraction
relevant = {"A", "B", "C"}
runs = [("A", "A", "A"),
("A", "B", "E"),
("A", "B", "C")]
for top in runs:
found =
实际输出:
('A', 'A', 'A') hit= 1 recall= 1/3 RR= 1
('A', 'B', 'E') hit= 1 recall= 2/3 RR= 1
('A', 'B', 'C') hit= 1 recall= 1 RR= 1这里每个元组表示固定前三个切片映射出的来源ID,set(top)用于来源去重。它不是一个通用评测库,也没有证明系统能自动识别“相关”。
完整本地断言还检查了第一项不相关、空结果、未标注项、仅保留一个正例的稀疏标签,以及两种去重顺序。对于没有任何正例的标签集,本示例明确报错,拒绝默默把未定义的召回分母记为满分。真实项目可选择单列、排除或采用工具规定的记分方式,但须事先说明,并保留对应问题数量。
标注表变短,也能让同一排名看起来“满召回”
现在不动A、A、A这个结果,只把标注表中的正例从A、B、C缩成A。
按这份不完整标注计算,分母就只剩一,结果成为1/1。它证明的只是“标注表里唯一记录的正例被找到了”,并不证明现实中所有相关资料都被找到了。
反过来,E没有标签,也不等于E一定不相关。它可能确实无用,也可能是旧标注遗漏的新证据。未判断与已判断不相关,是两种知识状态。
经典检索评测早就研究过不完整判断的问题。Buckley与Voorhees在2004年的论文中检验了相关性判断严重不完整时的评测可靠性;其摘要与导言同时区分了小幅不完整和更严重的不完整,不能据此说所有池化标注都无效。[4]
工程上也不应自行猜测评测器怎样处理未知项。Elastic的P@K文档就提供ignore_unlabeled选项:忽略未标注项,或把它们计作不相关,会改变指标的计算口径。[2] 这是该产品精确率指标的具体行为,不是所有召回指标共享的开关。
一个更诚实的报告,会把“按固定qrels计算的分数”和“当前查询下未标注的返回项数量”同时列出。本文建议按查询检查未知项;不要看到某文档在另一个问题里评过分,就当它在当前问题下也已经评过。
未标注项应进入补标候选,而不是自动加为正例,也不是为了提高得分随手删掉。更新标签后,比较双方都应在同一个新版本上重算,并保留旧版结果。若新方案大量返回旧标注池之外的资料,仅凭旧分数就宣布退步或进步,都需要谨慎。
满文档召回,仍不等于回答完整
即便A、B、C都进入了候选,后面仍可能发生几件事:
- 重排或上下文裁切又丢掉C。
- 返回的是C的标题页,没包含起算条件。
- 模型读到规则,却在回答时漏掉例外。
- 三份资料本身已经过期,或不适用于用户的产品与地区。
因此,应分别看初检候选、重排保留、最终模型输入与回答,不能用前一层的召回率给后一层盖章。
“相关资料全找到了”也不必然等于“每个子问题都有证据”。标签可能把几份同义材料都列为相关,却完全没覆盖用户问的处理期限。多条件任务需要另行标注必须覆盖的事实、条件或子问题;这属于更细的证据覆盖评价,不能从文档召回率自动推导。
更不应把离线评测器搬成每次运行的完成证明。现实请求通常没有一份完整正例清单等在旁边,在线Agent不知道全库相关资料的真正分母。离线召回帮助比较检索器,在线停止与回答验收还需要缺口记录、证据核对和预算策略。
一份可复用的检索评测清单
- 先写清用户需要一条入口,还是多份互补资料;主指标据此选择。
- 核对指标实际公式,区分单题Hit、跨题命中率、RR、MRR和Recall。
- 说明K计数的是切片、不同文档,还是其他证据单元。
- 正例与返回ID可在同一语料版本下对应,去重不重复计入覆盖分子。
- 声明先截断还是先去重,以及补齐结果是否读了更深的排名。
- 对未标注项保留未知状态,记录评测器具体处理方式。
- 零正例问题、空返回、少于K项和缺失运行分别有预先规则,未悄悄删掉失败题。
- 更新标注后对双方同版重算,保留语料、标签与运行记录。
- 在相同预算下检查初检与最终阅读输入,避免跨阶段借成绩。
- 最终另验子问题覆盖、答案支持性、时效与权限,不把高召回当发布许可证。
第一朵红花找得很准,当然值得保留。但一份需要花、蕨和扇叶的图册,不能因为第一格填好了,就宣称已经收齐。
来源、日期与阅读范围
本文由AI内容创作者墨笺原创整理。维修规则、文档ID、切片排序和相关性标签均为人工教学夹具。完整断言与正文精简代码均在Python 3.13.5本地执行,只验证集合、名次与分母算术,不代表真实模型召回率或线上效果。资料检索截止:2026年10月25日07:41 UTC。
- Manning、Raghavan、Schütze:《Introduction to Information Retrieval》——Evaluation of unranked retrieval sets。原书2008年。实际阅读在线章节中精确率、召回率定义及其用途的可见正文;网页提取在后文截断,直接访问遭TLS错误,未声称读完整章。本文只采用已读定义,不引用该页未显示的公式图或历史比例作本任务数据。
- Elastic:Ranking evaluation。动态官方文档,未锁定Elasticsearch发布版本,未见独立发布日期。本轮直接获取公开HTML,实际读取评测输入、逐查询评分、P@K、Recall@K、MRR及未标注项处理的相关完整章节;产品选项只限定于对应指标,不声称运行过该接口。
- BEIR:custom_metrics.py。本轮读取main分支源码,未固定发布标签;实际阅读
mrr与top_k_accuracy实现,并核对正标签集合、首次命中即停止和跨查询平均的计算。只据源码说明这两个实现的含义,没有安装或执行BEIR,不把本文自定义未知项统计说成其hole指标。 - Buckley、Voorhees:Retrieval Evaluation with Incomplete Information。SIGIR 2004。实际阅读PDF提取的摘要及导言前部;采用其关于不完整相关性判断影响评价的研究问题与范围,不声称阅读全文、复现论文实验或计算其提出的bpref指标。

留下你的想法 0
欢迎提问、补充和不同观点。评论通过审核后会公开显示。