1 Recall@K、Precision@K、MRR、nDCG 分别在看什么
P0 · rag
🏷 标签:rag, retrieval, evaluation, metrics
1️⃣ 考察意图
这道题看似是背概念,实则考察三个层次:第一层,是否清晰理解四个指标的定义和计算逻辑,而非死记公式;第二层,是否知道每个指标的“盲区”——比如Recall@K不关心排序、MRR只认第一个相关结果;第三层,能否在RAG或搜索系统中根据业务目标(如问答、推荐、法律检索)组合使用指标。刁钻点在于:面试官会追问“如果K=10时Precision@10=0.8但Recall@10=0.2,你如何解释?”答好了能展示出工程直觉和指标选择能力,而非纸上谈兵。
2️⃣ 标准答
Recall@K:衡量检索系统“找全”的能力。公式:相关文档被召回数 / 总相关文档数。只看前K个结果里有多少相关文档,不关心排序。例如,总共有5篇相关文档,K=10时召回4篇,则Recall@10=0.8。
- 适用场景:法律文档检索、医疗文献搜索——漏掉关键文档代价极高。
- 坑:如果总相关文档数未知(如开放域问答),Recall无法计算,只能用其他指标替代。
Precision@K:衡量检索结果“精准”程度。公式:前K个结果中相关文档数 / K。同样忽略排序,只关心前K个里有多少是好的。
- 适用场景:广告推荐、商品搜索——用户只翻前几页,不相关的结果会降低体验。
- 工程取舍:Precision@K和Recall@K天然矛盾。调大K,Precision下降但Recall上升;调小K则相反。实际中常用F1@K或Precision-Recall曲线平衡。
MRR (Mean Reciprocal Rank):关注第一个相关结果的位置。对每个查询,取第一个相关文档排名的倒数,再对所有查询取平均。公式:MRR = (1/N) * Σ(1/rank_i)。
- 适用场景:问答系统(如FAQ)、语音助手——用户只关心第一个答案是否正确。
- 局限性:只关心第一个,后续相关结果再好也不计入。例如,第一个结果不相关但第2-5个全相关,MRR只有0.5,而实际体验可能不错。
nDCG (Normalized Discounted Cumulative Gain):最精细的指标,考虑排序位置和多级相关性(如0-3分)。先算DCG:DCG = Σ(rel_i / log2(i+1)),再用理想排序的IDCG归一化。
- 适用场景:搜索引擎、推荐系统——结果有不同相关等级(如“完美匹配” vs “部分相关”)。
- 实际落地的坑:需要人工标注相关性等级,成本高。在RAG中,常用LLM自动打分(如GPT-4对检索结果评0-3分),但存在偏差,需人工抽检校准。
组合使用示例:假设一个RAG系统,查询“如何配置Nginx反向代理”,相关文档集有5篇。K=5时,检索结果:[doc1(相关), doc2(不相关), doc3(相关), doc4(相关), doc5(不相关)]。
- Recall@5 = 3/5 = 0.6
- Precision@5 = 3/5 = 0.6
- MRR = 1/1 = 1.0(第一个结果相关)
- nDCG:假设相关性等级doc1=3, doc3=2, doc4=1,则DCG = 3/log2(2) + 2/log2(3) + 1/log2(4) = 3 + 1.26 + 0.5 = 4.76;IDCG(理想排序:doc1, doc3, doc4, 其余0) = 3 + 2/log2(3) + 1/log2(4) = 3 + 1.26 + 0.5 = 4.76;nDCG = 1.0。
- 结论:系统找全了但排序有瑕疵(doc2不相关排在前面),nDCG=1.0说明排序完美,但Recall只有0.6,说明还有2篇相关文档没被召回。
总结:没有万能指标,必须组合使用。推荐组合:
- RAG问答:MRR + Recall@K(关注首答准确性和覆盖度)
- 搜索排序:nDCG + Precision@K(关注排序质量和前K精准度)
- 召回阶段:Recall@K + MRR(评估检索器找全和首答能力)
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从定义、适用场景、局限性三个层面回答。Recall@K看找全率,Precision@K看精准度,MRR看第一个相关结果的位置,nDCG看排序质量和多级相关性。实际中,RAG问答用MRR+Recall@K,搜索排序用nDCG+Precision@K。总结一句:没有万能指标,必须根据业务目标组合使用,并注意每个指标的盲区。”
4️⃣ 高频追问 & 应对
追问 1:如果K=10时Precision@10=0.8但Recall@10=0.2,你怎么解释?
这通常意味着总相关文档数很大(比如50篇),但系统只召回了8篇相关文档,其中前10个结果里只有8篇相关(Precision高),但漏掉了42篇(Recall低)。可能原因:检索器过于保守,只返回高置信度结果;或者总相关文档数被高估(标注错误)。工程上,我会检查检索器的top-K截断策略,或者改用Recall@50/100来评估召回能力。如果业务要求高覆盖(如法律检索),需要降低Precision阈值,增加K值或使用多路召回。
追问 2:nDCG要求多级相关性标注,在RAG中如何低成本实现?
可以用LLM自动打分,但需要设计prompt。例如,给GPT-4一个查询和检索结果,要求输出0-3分(0=不相关,3=完全匹配)。但LLM打分有偏差(偏好长文本、过度自信),所以需要:1)人工抽检10%的样本校准;2)使用多个LLM投票(如GPT-4 + Claude)取平均;3)对低分结果(0-1)做二次验证。更轻量的方案:用BM25得分或embedding余弦相似度作为相关性代理,但精度不如人工标注。
追问 3:MRR和nDCG在什么情况下会给出矛盾的结果?
当第一个结果不相关但后续结果全相关时。例如,查询“Python列表推导式”,检索结果:[docA(不相关), docB(相关), docC(相关)]。MRR=1/2=0.5,但nDCG可能很高(因为docB和docC排序靠前且相关)。矛盾说明MRR过于保守,只惩罚第一个结果;nDCG更全面。如果业务中用户只关注第一个结果(如语音助手),MRR更合适;如果用户会浏览多个结果(如搜索引擎),nDCG更准确。
5️⃣ 避坑 · 常见错误答法
- ❌ 把MRR和nDCG混为一谈,说“MRR也考虑排序位置”。→ ✅ MRR只考虑第一个相关结果的位置,nDCG考虑所有结果的位置和多级相关性。MRR是nDCG的简化版,但丢失了后续信息。
- ❌ 认为Precision@K和Recall@K可以独立优化。→ ✅ 两者是trade-off关系:调大K提升Recall但降低Precision。实际中需根据业务设定K值,或使用F1@K平衡。
- ❌ 说“nDCG不需要人工标注,可以用BM25得分代替”。→ ✅ BM25得分是检索分数,不是相关性等级。nDCG需要人工标注或LLM打分,否则无法计算IDCG。用BM25得分代替会导致指标失真。
6️⃣ 简历呼应
- 如果你有RAG项目:从“我在项目中用MRR+Recall@5评估检索器,发现BM25的Recall比Dense Retriever高10%,但MRR低5%,说明BM25找全但排序差,最终用混合检索(BM25+ColBERT rerank)提升nDCG 8%”切入,展示指标驱动优化。
- 如果你只做过传统NLP:用“文本分类中常用Precision/Recall/F1,但检索评估需要排序指标。我迁移了nDCG的思想,在排序任务中用多级标签评估模型输出顺序”类比,体现跨领域理解。
- 如果你是校招无项目:聚焦“我复现了KILT benchmark的评估代码,手动计算Recall@K和nDCG,发现不同K值对指标影响很大,并写了一个可视化工具分析trade-off”,展示动手能力和对细节的把握。
- 《Information Retrieval: Implementing and Evaluating Search Engines》by Stefan Büttcher et al. — 经典IR评估教材
- TREC (Text REtrieval Conference) 官方评估指南 — 工业级指标定义和计算细节
- “RAG Evaluation: A Survey” (2024) — 综述RAG中常用评估指标和组合策略
- 论文:”nDCG: A Review of Its Use and Misuse” — 讨论nDCG的常见误用和正确计算方式
- 工具:
ir_measuresPython库 — 统一接口计算Recall/Precision/MRR/nDCG,支持TREC格式