
给 RAG 建 baseline别被看起来不错骗了RAG 做到能跑、能答很容易——跑几条查询模型答得挺顺就觉得自己做完了。但没有 baseline后面所有优化都是自说自话你不知道自己在进步还是退步也不知道哪个改动值得留。这篇讲我怎么给这条 RAG 链路建评测基线以及过程中被看起来不错骗过的两次。一、四项指标 一份 50 条的 golden set评测之前先想清楚RAG 链路要同时看四件事缺一个都是盲人摸象。指标测什么为什么不能只看它recall5检索准不准检索准≠答得对后面还有生成faithfulness忠实度生成有没有乱说唯一衡量幻觉的指标abstain_rate该拒答时敢不敢拒不该答的硬答比拒答更糟延迟 p95 成本能不能上生产效果好但 10 秒一条没用golden set 是评测的地基。我手写了 50 条按难度分了五类类型条数考什么term25关键词直查基本是送分题semantic15同义改写考语义召回boundary5有适用范围的边界题conflict2不同文档说法冲突考综合multi3必须同时拿到多个来源才能答为什么一定要分层因为如果不分层50 条里 40 条送分题recall 做到 0.9 也说明不了什么——全是 easy 题喂出来的虚高。分层的价值在于暴露你到底哪里弱。二、第一次被骗忠实度是下界不是忠实度我一开始用引用编号命中的实体占比当忠实度指标跑出来 hybrid 是 0.988很好看。但后来发现这个 0.988 是下界不是真实的忠实度它抓得住整段编造抓不住用原文的词拼出一个错误结论。模型完全可以用文档里出现过的词拼出一句文档没表达的意思——实体都对结论是错的。这种幻觉实体重叠法测不出来。而且我还在这个指标上犯过一个实打实的 bug把答案里的[1]引用编号也当成实体去跟原文匹配导致每条答案的忠实度被系统性低估——修掉之后从 0.848 涨到 0.988。教训指标的定义要反复拷问它到底测的是什么测不到什么。忠实度的下界能当及格线但真要衡量幻觉得加 LLM-as-judge。三、第二次被骗easy 题的天花板效应做分块策略对比时我一度得出结论原子分块和固定分块命中率打平87.5%所以分块策略无所谓。这个结论是错的——因为那批评测题全是 easy 题。真正的短板藏在 hard 题里跨文档综合题multi全中率只有 0~25%。三种检索模式里纯向量 0.0、纯 BM25 0.25、混合 0.0。模式跨文档综合全中率纯向量0.0纯 BM250.25混合0.0这才是这条链路最真实的弱点它能把单点问题答得不错但把两个来源的信息拼起来基本做不到。而这个弱点只有 hard 例才能暴露。Easy 题测的是有没有下限hard 题测的是上限在哪。只报 easy 题的命中率等于只报了自己最不弱的地方。这也反过来解释了为什么评测集一定要手工分难度——机器随机抽的 50 条大概率全是 easy 题测出来的全绿没有任何信息量。四、评测口径三条我自己定的规矩数字会骗人所以我给自己定了三条铁律50 条差 1 条 2 个百分点5 个百分点不下结论。别拿 0.64 和 0.66 去吹提升了那是噪声。延迟看 p95不看平均。平均延迟会被少数超快请求拉低p95 才代表最差的那批用户体验到什么。全量评测前先跑 5 条样本验证。脚本错了会污染所有数字先小样验证再放量。五、当前的 baseline 全景hybrid 模式当前主线的四项基线指标值recall50.66faithfulness下界0.988abstain_rate0.20延迟 p951464 ms单次成本¥0.00088这套数字我存成了机器可读的baseline.json就是为了下一周做优化时能画出迭代曲线——每个改动往里一跑就知道 recall 涨没涨、成本涨没涨、值不值。没有这张基线表所有我优化了 XX都是空话。小结结论数字 / 事实四项指标recall5 / 忠实度 / 拒答率 / p95成本缺一不可golden set 分层term25 / semantic15 / boundary5 / conflict2 / multi3忠实度是下界0.988 抓不住用原文词拼错误结论真实弱点跨文档综合全中率 0~25%评测三铁律差1条2%、5%不下结论、看 p95 不看平均*上一篇生成端的最后一道闸。