给 RAG 建 baseline:别被"看起来不错"骗了
RAG 做到能跑、能答,很容易——跑几条查询,模型答得挺顺,就觉得自己做完了。但没有 baseline,后面所有优化都是自说自话:你不知道自己在进步还是退步,也不知道哪个改动值得留。
这篇讲我怎么给这条 RAG 链路建评测基线,以及过程中被"看起来不错"骗过的两次。
一、四项指标 + 一份 50 条的 golden set
评测之前先想清楚:RAG 链路要同时看四件事,缺一个都是盲人摸象。
| 指标 | 测什么 | 为什么不能只看它 |
|---|---|---|
| recall@5 | 检索准不准 | 检索准≠答得对,后面还有生成 |
| faithfulness(忠实度) | 生成有没有乱说 | 唯一衡量幻觉的指标 |
| abstain_rate | 该拒答时敢不敢拒 | 不该答的硬答,比拒答更糟 |
| 延迟 p95 + 成本 | 能不能上生产 | 效果好但 10 秒一条,没用 |
golden set 是评测的地基。我手写了 50 条,按难度分了五类:
| 类型 | 条数 | 考什么 |
|---|---|---|
| term | 25 | 关键词直查,基本是送分题 |
| semantic | 15 | 同义改写,考语义召回 |
| boundary | 5 | 有适用范围的边界题 |
| conflict | 2 | 不同文档说法冲突,考综合 |
| multi | 3 | 必须同时拿到多个来源才能答 |
为什么一定要分层?因为如果不分层,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 |
| 纯 BM25 | 0.25 |
| 混合 | 0.0 |
这才是这条链路最真实的弱点:它能把单点问题答得不错,但"把两个来源的信息拼起来"基本做不到。而这个弱点,只有 hard 例才能暴露。
Easy 题测的是"有没有下限",hard 题测的是"上限在哪"。只报 easy 题的命中率,等于只报了自己最不弱的地方。
这也反过来解释了为什么评测集一定要手工分难度——机器随机抽的 50 条,大概率全是 easy 题,测出来的全绿没有任何信息量。
四、评测口径:三条我自己定的规矩
数字会骗人,所以我给自己定了三条铁律:
- 50 条差 1 条 = 2 个百分点,<5 个百分点不下结论。别拿 0.64 和 0.66 去吹"提升了",那是噪声。
- 延迟看 p95,不看平均。平均延迟会被少数超快请求拉低,p95 才代表"最差的那批用户"体验到什么。
- 全量评测前先跑 5 条样本验证。脚本错了会污染所有数字,先小样验证再放量。
五、当前的 baseline 全景
hybrid 模式(当前主线)的四项基线:
| 指标 | 值 |
|---|---|
| recall@5 | 0.66 |
| faithfulness(下界) | 0.988 |
| abstain_rate | 0.20 |
| 延迟 p95 | 1464 ms |
| 单次成本 | ¥0.00088 |
这套数字我存成了机器可读的baseline.json,就是为了下一周做优化时能画出迭代曲线——每个改动往里一跑,就知道 recall 涨没涨、成本涨没涨、值不值。没有这张基线表,所有"我优化了 XX"都是空话。
小结
| 结论 | 数字 / 事实 |
|---|---|
| 四项指标 | recall@5 / 忠实度 / 拒答率 / p95+成本,缺一不可 |
| golden set 分层 | term25 / semantic15 / boundary5 / conflict2 / multi3 |
| 忠实度是下界 | 0.988 抓不住"用原文词拼错误结论" |
| 真实弱点 | 跨文档综合全中率 0~25% |
| 评测三铁律 | 差1条=2%、<5%不下结论、看 p95 不看平均 |
*上一篇:生成端的最后一道闸。