RAG 评估怎么做:检索和生成要分开看
RAG是什么RAG 的基本思路是用户提一个问题系统先从知识库文档库、结构化表格、网页等里检索出相关的内容再把这些内容连同问题一起交给 LLM让它基于检索到的上下文生成回答。跟直接让 LLM 回答不同RAG 是一条流水线至少包含两个独立的环节检索和生成。每个环节都可以独立出错而且环节之间有依赖关系如果检索没有找到正确的文档生成端无论多强也答不对。反过来检索找对了文档生成端也可能编造内容或答非所问。所以只看最终答案对不对是不够的还需要分清是检索的问题还是生成的问题。这就引出了这一章的核心原则在RAG系统的评估中要先评检索再评生成。 检索是地基地基不行上面再修也没用。检索的两个阶段现代 RAG 系统通常采用两阶段检索架构两个阶段各自追求不同的目标对应不同的评估指标。第一阶段粗筛。用轻量的方法向量相似度、BM25 等快速从整个语料库里捞出一批候选文档。这一步的目标是高召回宁可多捞一些不太相关的也不能漏掉正确的文档。因为漏掉了就再也找不回来后续的环节全白费。第二阶段重排。对粗筛的结果做精细排序。用更重的模型cross-encoder 或 LLM把查询和每个候选文档放在一起联合打分把最相关的排到前面。这一步的目标变成了高精度和排序质量因为 LLM 的上下文窗口有限需要确保最有用的内容排在最前面。检索怎么评先要有测试数据评估检索需要一个数据集每条数据包含一个查询和它对应的正确文档块。有了这种配对才能衡量检索器找没找对。手动标注这种数据质量最高但成本也高书里给了一套用 LLM 合成的方法来降低成本。基础合成对语料库里的每个文档块让 LLM 从中提取一个核心事实再生成一个只能靠这个事实回答的问题。这样每个问题天然对应一个正确的文档块不需要人工去标。进阶合成基础版的问题在于合成的问题措辞往往跟原文高度重合关键词匹配就能找到正确的块对检索器没什么挑战。进阶版的做法是先找到跟目标块相似但不包含答案的干扰块再让 LLM 生成一个只有目标块能回答、但用词跟干扰块也重叠的问题。这样检索器如果只靠关键词匹配就会被干扰块误导必须学会区分看起来相关和真正回答了问题。书里举了一个金融新闻的例子。目标块说2020 年 4 月该公司季度收入下降 17%是 2008 年以来最大降幅干扰块说该公司在 2008 年金融危机期间遭受重大损失。两个块都提到了同一家公司和 2008 年关键词高度重叠。生成的问题是该公司自 2008 年金融危机以来最大的收入降幅发生在什么时候只有目标块能答但干扰块对关键词匹配的检索器来说看着也很像正确答案。过滤合成的问题可能不够真实或脱离实际场景。书里建议用 LLM 对合成问题做真实性打分过滤掉不合格的。同时也特别提醒合成数据不能完全替代真实查询定期用真实用户的查询做验证是必要的。用什么指标衡量检索质量有了测试数据就可以用指标来衡量检索器的表现了。书里介绍了四个常用指标各自衡量不同的东西适合不同的场景。1、Precisionk前 k 个结果里有多少是相关的Precisionk即精确率衡量的是检索返回的前 k 个文档中真正相关的占多少比例。计算方式前 k 个结果中相关文档的数量 / k。比如检索器返回了前 5 个文档其中 3 个是相关的Precision5 3/5 0.6即 60% 的结果是有用的。Precisionk 关注的是**“返回的东西里有多少是好的”**对精度要求高的场景有用。但在 RAG 的第一阶段粗筛中它通常不是最重要的指标因为粗筛阶段宁可多捞一些不相关的也不能漏掉关键文档。真正不能接受的是漏掉。2、Recallk该找到的有没有找到Recallk即召回率衡量的是所有相关文档中有多少比例出现在了检索结果的前 k 个里。计算方式前 k 个结果中相关文档的数量 / 该查询对应的全部相关文档数量。比如某个查询一共有 4 个相关文档块检索器的前 5 个结果里包含了其中 3 个Recall5 3/4 0.75意思是 75% 的相关内容被找到了还有 25% 被漏掉了。在 RAG 的第一阶段粗筛中Recallk 是最重要的指标。原因是如果一个关键文档在粗筛阶段就被漏掉了重排和生成都没有机会弥补因为它们只能在粗筛结果的范围内工作。LLM 有一定的能力在上下文中忽略无关内容但如果关键信息根本不在上下文里它无论如何也生成不了正确答案。3、MRR第一个相关文档排得多靠前MRR 的全称是 Mean Reciprocal Rank即平均倒数排名。它衡量的是第一个相关文档在排序列表中出现得有多早。对单个查询先算它的倒数排名找到第一个相关文档的排名位置取倒数。比如第一个相关文档排在第 1 位倒数排名就是 1/1 1.0排在第 3 位就是 1/3 ≈ 0.33。如果前 k 个结果里一个相关文档都没有记为 0。MRR 是所有查询的倒数排名的平均值。第一个相关文档的位置倒数排名第 1 位1/1 1.0第 2 位1/2 0.5第 3 位1/3 ≈ 0.33第 5 位1/5 0.2第 10 位1/10 0.1之所以用倒数是因为它的衰减方式符合排序位置的实际价值。从第 1 到第 2 掉了 0.5从第 5 到第 6 只掉了 0.03。靠前的位置之间差异大靠后的位置之间差异小。把答案从第 5 位提到第 4 位用户体感几乎没差别但从第 2 位提到第 1 位是一眼就看到和要往下找的区别。MRR 只关心第一个相关文档后面还有没有其他相关文档它不看。所以它适合那种只需要一个关键事实就能回答的问题比如123 Main St 的房产税是多少。但如果问题需要综合多个文档块才能回答比如我们在西伯克利的房源里哪一套房产税最高需要同时用到房源列表和税务信息MRR 就不合适了这种多跳问题应该用 Recallk 或 NDCGk。这里还涉及一个叫 “lost in the middle” 的效应LLM 对上下文的注意力分布不均匀排在开头和末尾的内容更容易被关注排在中间的内容更容易被忽略。所以即使相关文档被检索到了排在什么位置也会实实在在影响最终效果。4、NDCGk排序质量的综合衡量前面三个指标有一个共同的简化它们都把相关性简单地分成相关和不相关两类没有中间地带。但现实中文档的相关程度是有层次的。比如查询总结市中心豪华公寓的市场趋势一份最新的市场分析报告是高度相关的一份笼统的城市经济概览是略微相关的一份餐厅指南是完全不相关的。如果只按相关/不相关来看前两个都算相关区分不出来。NDCGk 的全称是 Normalized Discounted Cumulative Gain即归一化折扣累积增益。它用分级相关性比如 0 到 3 分来衡量排序质量越相关的文档排得越靠前分数就越高。NDCG 看着复杂但它是一步步打补丁构建出来的每一步都是为了修补前一步的缺陷。第一步CG累积增益把相关性分数加起来。最朴素的想法既然每个文档有相关性分数比如 0/1/2/3那把前 k 个结果的分数加起来就行了。假设前 3 个文档的相关性分数是 3、1、2CG 3 1 2 6。缺陷CG 完全不管顺序。排成 [3, 1, 2] 和排成 [1, 2, 3]CG 都是 6。但好的检索器应该把最相关的排最前面。第二步DCG折扣累积增益给靠后的位置打折。要让顺序起作用就得让靠后位置的文档贡献变小。DCG 的做法是每个文档的相关性分数除以 log₂(位置 1)位置越靠后除的数越大贡献越小。各位置的折扣效果位置除以 log₂(位置1)贡献保留比例第 1 位log₂(2) 1100%不打折第 2 位log₂(3) ≈ 1.58约 63%第 3 位log₂(4) 250%第 5 位log₂(6) ≈ 2.58约 39%第 10 位log₂(11) ≈ 3.46约 29%用一个例子来看效果。同样三个文档分数 3、1、2好的排序 [3, 1, 2]DCG 3/1 1/1.58 2/2 3 0.63 1 4.63差的排序 [1, 2, 3]DCG 1/1 2/1.58 3/2 1 1.27 1.5 3.77同样的文档好的排序 DCG 更高顺序现在起作用了。用对数而不是直接除以位置数是因为对数的下降先快后慢前几位之间的差距被放大靠后的位置之间差距被压缩符合靠前的位置更值钱的实际情况,这跟 MRR 用倒数是同一个思路。缺陷DCG 的绝对值没法跨查询比较。一个查询有多个高度相关的文档DCG 天然就高另一个查询只有一个略微相关的文档DCG 天然就低。高不代表排得好只是这个查询本身料多。第三步NDCG归一化跟自己的满分比。把同一批文档按相关性从高到低重新排列得到理想排序算出它的 DCG叫 IDCG理想 DCG。然后 NDCG DCG / IDCG。接上面的例子。排序 [3, 1, 2] 的 DCG 是 4.63。理想排序应该是 [3, 2, 1]其 IDCG 3/1 2/1.58 1/2 3 1.27 0.5 4.77。所以 NDCG 4.63 / 4.77 ≈ 0.97接近满分说明排序很好但不完美2 和 1 的位置反了。如果排序是 [1, 2, 3]DCG 3.77NDCG 3.77 / 4.77 ≈ 0.79说明只发挥了理想排序约八成的价值。归一化后NDCG 永远在 0 到 1 之间1.0 是完美排序0.5 是只拿到了一半的理想价值。不同查询的 NDCG 可以放在一起比较因为都是跟自己的满分对照。NDCG 在 RAG 里什么时候用重排阶段。因为重排的目标就是把最相关的文档排到最前面而 NDCG 恰好衡量的就是有没有把好东西排在前面。一个要留神的坑NDCG 可能给出反直觉的分数。一个系统只检索到一堆略微相关的文档但排得很完美NDCG 可能很高另一个系统检索到了高度相关的文档但排得靠后NDCG 反而更低。所以NDCG 要跟 Recall 一起看Recall 管该找的找到没有NDCG 管找到的排得好不好。怎么选指标一个汇总指标衡量什么适合什么场景局限Precisionk前 k 个结果中相关文档的比例对精度要求高的场景不关心是否漏掉了相关文档Recallk所有相关文档中被检索到的比例第一阶段粗筛不关心排序只关心有没有找到MRR第一个相关文档排得多靠前只需要一个关键事实的问题只看第一个相关文档忽略其余NDCGk排序质量越相关的是否排越前重排阶段需要区分相关程度不直接衡量是否漏掉了文档要跟 Recall 配合书里给了一个实用的默认建议第一阶段用 Recallk重排阶段用 NDCGk。Recall 确保正确的文档进入了候选集NDCG 确保它们被排到了前面。检索效果不理想时先看分块策略检索的结果直接取决于文档怎么切块。块太小一个完整的信息可能被切成两半检索器只找到其中一半块太大混进去大量无关内容既浪费 LLM 的上下文窗口也干扰生成质量。最简单的分块方式是按固定大小切比如每 256 个 token 一块。为了避免在块边界处把一个完整的信息切断可以加重叠即相邻的块共享一部分 token。比如块大小 256、重叠 128第一个块覆盖 token 1-256第二个块覆盖 token 129-384边界附近的内容至少出现在两个块里。书里建议用网格搜索调参选几组块大小和重叠量的组合对每组重新建索引用测试数据集量 Recallk 和 NDCGk挑最好的组合。书中给了一组假设的网格搜索结果块大小token重叠tokenRecall5NDCG512800.820.69128640.880.7525600.860.742561280.890.7751200.800.725122560.830.74两个规律加重叠在所有块大小下都能提升效果减少了边界处信息被切断的概率太大的块512反而不如中等大小的256可能是因为包含了太多无关内容。除了固定大小分块还有其他方式按文档结构切标题、段落、主题边界让每个块对应一个完整的语义单元给每个块补上文档标题和章节标题等上下文信息让块更自包含帮助检索器更准确地理解它的内容。这些方式可以跟固定大小分块做对比用同样的检索指标来判断哪种更好。生成怎么评即使检索找对了文档LLM 在生成环节仍然可能出问题因此生成质量需要单独评估主要看两个维度。忠实度回答是否忠于检索到的上下文忠实度检查的是生成的回答有没有老老实实基于检索到的文档有没有超出文档内容的范围。三种典型的失败方式幻觉编造了检索结果里没有的信息遗漏忽略了检索结果里有的相关信息曲解歪曲或不准确地表达了检索结果里的信息忠实度的评估用 LLM-as-Judge把检索到的上下文和生成的回答一起交给裁判 LLM让它检查回答里的每一条陈述是否都能在上下文中找到支撑。注意判断标准是上下文里有没有依据而非这句话客观上对不对。哪怕一条信息客观上是正确的只要上下文里没有提到在 RAG 的框架下也算不忠实。相关性回答是否针对用户的问题一个回答可以完全忠实于上下文但答非所问。比如用户问这套房的 HOA 费用是多少检索到的文档里同时有 HOA 费用和税务信息而回答只谈税务忠实度没问题相关性出了问题。相关性的评估要分情况。如果问题有明确的实体或主题比如HOA 费用用代码检查回答里有没有提到这个关键点就够了快且确定。如果是开放式问题比如总结这个片区的市场趋势没有固定的关键词可以匹配需要用 LLM-as-Judge 判断回答是否切题。一个调试技巧上下文替换书里还介绍了一个叫上下文替换的调试方法用来验证系统到底有没有在使用检索结果。做法是保持查询不变把检索到的文档换成完全不相关的、来自其他主题的文档再跑一遍生成。如果回答基本没变说明 LLM 根本没看检索到的文档而是在靠自己预训练时学到的知识回答。这个问题隐蔽的地方在于当 LLM 碰巧自己知道答案时不用检索结果也能答对从结果上看不出问题。但一旦遇到 LLM 自己不知道答案的问题比如只存在于私有知识库中的信息它不会去用检索结果而是会编造一个答案。上下文替换就是在这种隐蔽的情况还没暴露之前主动把它检测出来。书里提到如果验出了生成的问题修法通常是改 prompt比如加上只根据提供的文档回答或如果文档里没有答案请直接说明这类指令。几个容易踩的坑只看端到端指标。只看最终答案对不对不分开评检索和生成出了错分不清该修哪个环节。过度依赖合成数据。合成的问题往往跟原文措辞高度重合导致检索指标虚高。如果 Recallk 在合成数据上表现很好但用户实际使用中还是答不对需要补充 20-30 条真实用户查询来验证。选错指标。比如只需要一个关键事实的问题用了 Recallk看不出排序好坏需要综合多个文档的问题用了 MRR只看第一个相关文档指标选错会导致优化方向跑偏。忽略分块策略。同一个检索模型换一组分块参数Recallk 就可能有明显变化分块是一个值得认真调优的参数。评生成时不检查接地性。回答听起来流畅、跟参考答案也对得上但实际上可能跟检索到的文档矛盾或根本没用检索结果需要忠实度检查来验证生成确实基于检索内容。总结评估 RAG 的核心思路是沿流水线拆开评先确保检索能稳定找到正确的文档用 Recallk、NDCGk 等指标量化再验证生成是否忠实于检索结果、是否切中用户的问题。分块策略作为检索的前置参数也需要调优。只有分开看才能在出了问题时准确定位是哪个环节的责任。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】