加载中...
加载中...
一个 RAG 答错,可能错在四个完全不同的地方——语料里没有、没被召回、召回了没进 prompt、进了 prompt 没读出来;只测端到端正确率,这四种在数字上完全一样,但你该改的东西完全不同。
检索质量评估把「RAG 答错了」从一句笼统的抱怨拆成可定位的故障:检索层看 hit rate / MRR / nDCG@10,生成层看 faithfulness / relevancy,再用七类失败点把每条错例归因到具体环节——不做这一步,优化就是在错的那一层烧钱。
一、为什么必须把检索和生成拆开测
二、检索层指标:先看命中,再看排序
三、生成层指标:三个必须同时看的维度
四、失败归因:七类失败点
五、更细的诊断:claim 级指标
六、少量人工标注换统计置信度
测试一:建黄金集(所有后续测试的前提)
测试二:检索层基线(先不看生成)
测试三:上下文增强与重排的收益验证
测试四:失败归因流水线(把错例分到 FP1-FP7)
测试五:噪声敏感度与抗干扰测试
测试六:不可回答问题与拒答率
测试七:改动前后回归(唯一能证明「改好了」的测试)
坑点一:用生成端指标诊断检索问题
faithfulness 掉了,很多人的第一反应是改提示词。但如果 ground-truth 片段压根没被召回,提示词怎么改都救不回来——模型只能用参数知识编。而且已有研究在长文档、学术论文语料上发现 RAGAS 的 faithfulness 在特定配置下可靠性有限,把它当唯一裁判有风险。正确顺序:先跑检索层指标(hit_rate / MRR / nDCG@10),确认检索没问题,再看生成层。
坑点二:答案对了就以为检索对了
RAGChecker 专门有一个 self-knowledge 指标,衡量「正确但检索上下文里没有依据」的断言比例。这个数高,说明模型在靠预训练知识答题——在你自己的语料上看着对,一旦制度更新、口径变化,它就会给出过时但自信的答案。银行场景里这是最危险的一类假成功。正确率必须和 faithfulness、self-knowledge 一起看。
坑点三:不做对照就上语义分块
「语义分块一定比固定长度好」是个流传很广的误解。有系统评测的结论是:语义分块的计算开销并不能被稳定的效果提升所证明,在更接近真实文档的非合成数据集上,固定长度分块常常更好。而 chunk 大小的最优值又高度依赖任务类型——有研究发现 64-128 token 的小分块适合简短事实型问答,512-1024 token 的大分块适合需要整体上下文理解的场景。做法:把 chunk size(256 / 512 / 1024)× overlap 做成网格,在同一份黄金集上跑 nDCG@10 对照,用数据选,不要用直觉选。
坑点四:黄金集里全是「能回答的问题」
只挑能回答的问题建测试集,等于把 FP1(语料缺失)这一整类风险排除在测试范围之外。上线后用户第一个问的,往往就是语料里没有的问题。黄金集必须按比例混入不可回答问题,并且单独统计拒答率。
坑点五:LLM 评判的随机性没被控制
RAGAS、ARES 这类指标都是 LLM 打分,换一个 judge 模型版本、温度没归零、prompt 措辞变一下,分数能漂几个百分点,看起来像优化了,其实是噪声。做法:固定 judge 模型与版本、温度设为 0、同一配置跑 3 次取均值、在结果里记录 judge 配置;关键决策点用 ARES 的 PPI 思路补几百条人工标注,给分数配上置信区间,而不是拿一个裸数字下结论。
「分享到微信」:手机浏览器打开时一键调起系统分享面板,选择微信即可分享到朋友圈或聊天。电脑上回退为复制文案。
暂无留言,来说两句吧