内容提要
本文介绍检索相关性衡量方法:先构建带标注的黄金查询集(人工标注、日志采样、LLM合成),再用ranx库对比Qdrant检索结果与标注,计算recall@k、MRR、NDCG@k等指标。RAG宜用Recall@k,单答案用MRR,重排序用NDCG。需警惕合成查询失真、嵌入污染、近重复文档和时间漂移等陷阱。
延伸解读
黄金查询集的构建权衡
构建黄金查询集有三种方式:人工标注质量最高但成本高,适合高价值查询;日志采样能反映真实用户意图,但需要足够流量和反馈信号;LLM合成可低成本扩展,但合成查询通常比真实查询更容易检索,会虚高离线分数。选择时需权衡质量、成本和规模,并注意平衡样本,避免高频查询淹没稀有查询。
指标选择与k值设定
选择指标应基于下游用途:RAG管道关注召回率,因为LLM能容忍相关文档排名靠后但缺失会严重影响;单答案检索关注MRR或Hits@1,因为用户主要看第一个结果;重排序或推荐流关注NDCG@k,因为列表内顺序重要。k值应匹配实际使用,如UI展示5条就测@5,RAG传10个块就测@10,避免用@100虚高指标。
评估中的常见陷阱
需警惕四类陷阱:合成查询不真实,LLM常模仿源文档措辞,导致查询过于简单,应提示LLM模拟未见过文档的用户并对比分布;嵌入模型污染,若训练数据与黄金集重叠会高估性能,需确保训练/评估分离;近重复文档,检索返回未标注的近似文档会拉低指标,应先去重或聚类标注;时间漂移,语料变化会使标签过期,需固定语料快照并定期更新黄金集。
CI中持续评估与可复现性
每当检索栈变更(如新嵌入模型、索引配置或重排序器)时,应重新运行评估。在CI中,用固定黄金集计算recall@10,并设置阈值,低于阈值则失败。同时,版本化整个评估设置:语料快照、标签生成方式和预处理阈值,以便区分分数下降是模型/索引回归还是数据集漂移。
Q&A
如何构建检索相关性评估用的黄金查询集?
有三种方法:1. 人工标注,由领域专家对查询-文档对进行二元或分级相关性打分,质量最高但成本高;2. 从生产日志中采样真实用户查询,用点击或显式反馈作为相关性信号,需平衡样本避免高频查询淹没低频查询;3. 用LLM基于文档合成查询,可低成本扩展到数千对,但合成查询通常比真实查询更容易检索,会虚高离线分数。
ranx库在检索评估中怎么用?
ranx是一个Python排名指标评估库,提供recall@k、MRR、NDCG@k等标准指标的统一接口。使用分三步:1. 将标注数据整理成包含query_id、query_text和labels的格式;2. 构建Qrels(标注的真实相关性)和Run(Qdrant返回的检索结果及相似度分数);3. 调用evaluate(qrels, run, ["recall@10", "mrr", "ndcg@10"])计算指标,返回指标名到浮点数的字典,值越高越好。
RAG、单答案检索和重排序分别该用哪个相关性指标?
RAG管道(LLM读取top-k块)推荐Recall@k,因为相关文档排在第三还是第一影响不大,但完全缺失危害更大;单答案检索(FAQ或问答)推荐MRR或Hits@1,因为用户只关注第一个结果;重排序或推荐流推荐NDCG@k,因为结果列表内的顺序很重要。注意NDCG需要分级标签,二元标签则用recall@k和MRR。
评估检索相关性时,k值应该怎么设置?
k值应匹配实际使用情况:如果应用向用户展示5条结果,就测量@5;如果RAG管道向LLM传递10个块,就测量@10。为一个只展示5条结果的UI报告@100会让指标看起来虚高。
检索相关性评估中有哪些常见陷阱?
主要陷阱包括:1. 合成查询不真实,LLM常模仿源文档措辞,导致查询比真实用户输入简单,虚高离线分数;2. 嵌入模型污染,若模型训练数据与黄金集重叠,结果会好于真实泛化能力;3. 近重复文档,检索返回未标注的近重复文档会使指标看起来变差,需在标注前去重或对重复簇一起标注;4. 时间漂移,语料变化后标签会过时,需固定语料快照并在重大变化后重新生成黄金集;5. 设置可复现性,需对语料快照、标签生成方式和预处理阈值进行版本控制。
什么时候需要重新运行检索相关性评估?
每当检索栈发生变化时都应重新运行,包括:更换嵌入模型(同时需要重新嵌入查询和重建索引)、更改索引配置、或更换重排序器。在CI中,可以针对固定的黄金集计算recall@10,当分数低于目标阈值时让任务失败。