评测:不测就不知道改了什么
这一章讲三件事: 为什么必须评测(以及为什么肉眼不行);公开基准和自建评测各管哪一段; 用 ragas 对一条真实管道打分的完整流程,包括那套值得记住的真实数字。 原书一句话立论:改了什么、变好没变好,不测就永远不知道1。
1. 评测管两件事
开发期: RAG 管道每个零件都有多个选项(embedding 模型、向量库、检索算法、LLM), 组合起来更是天文数字。系统性地换组合、测结果,才能知道哪套搭配最适合你的任务—— 比如「免费的开源 embedding 到底比付费 API 差多少?差的那点值不值差价?」这类问题, 只有评测能回答2。
部署后: 系统会悄悄变坏。原书给了个具体场景:一家财富管理公司的 RAG, 语料是各大机构过去五年的分析报告——突然 一场五级飓风登陆,用户问「这场飓风对我持仓明年有什么影响」, 五年语料里根本没这种事。数据的价值随时间衰减,不持续监控就发现不了3。
出错时评测还能定位问题出在哪一段:检索器?提示词?还是 LLM 本身?4
2. 第一层:公开基准,只管初选
还没写代码时,可以用公开榜单缩小候选范围。三类零件各有榜单5:
| 零件 | 榜单 | 测什么 |
|---|---|---|
| embedding 模型 | MTEB | 十几个检索数据集上的平均表现(ArguAna、FiQA2018 金融问答、HotpotQA 多跳、SciFact 科学断言……),可按单项排序 |
| 向量搜索 | ANN-Benchmarks / BEIR | 搜索精度、速度、内存;BEIR 还做 zero-shot(不给任何示例)跨域评测 |
| LLM | Artificial Analysis / Open LLM Leaderboard | 能力分项 + 吞吐(每秒能处理多少 token)/延迟/价格;开源模型看 ARC、MMLU、GSM8K 等分项 |
但原书把话说得很清楚:基准只够做初选。它测不到「你的输入、你的输出」的表现; 要真正知道 自己的系统好不好,必须自建评测6。
3. 第二层:ground truth,评测的地基
ground truth(标准答案集)= 「如果系统处于巅峰状态,理想回答长什么样」的数据。 定义朴实,造起来最难7。
原书的例子:做一个「狗狗癌症最新兽医研究」问答系统,语料是 PubMed 的相关论文—— 那 ground truth 就是「目标用户真实会问的问题 + 你心目中的理想答案」,一问一答一组8。
四个来源,成本与质量各不同9:
| 来源 | 做法 | 代价 |
|---|---|---|
| 人工标注(标注即由人逐条给出判断) | 人工写理想回答 | 质量最高,最贵最慢 |
| 领域专家 + 规则模板 | SME 填模板;例:手机客服模板「To resolve [issue], you can try [solution]」,专家填入「battery drain → 调低亮度、关后台应用」 | 折中 |
| 众包 | MTurk 等平台外包 | 量大,需质控 |
| 合成 | 用 LLM 生成问答对 | 最快最便宜,要人工抽查 |
4. 第三层:ragas,给整条链打分
4.1 它是什么
ragas 是专为 RAG 设计的评测平台。核心能力两个:从你的文档自动合成测试集; 按检索、生成、端到端三段给管道打分。作者用它评测的正是第 05 章留下的那个问题: 同一个语料,dense 检索和 hybrid 检索,到底谁好?10
4.2 先说成本,这是书里少见的醒目警告
ragas 是「LLM 辅助评测」——生成每个测试样本、算每个指标,背后都在调 LLM API,真金白银。 作者的实际账单:10 个样本、6 个指标,跑一轮 2 到 2.5 美元;样本更多则显著上涨。 他的对策:结果立刻存 CSV(一种以逗号分隔的表格文件格式),避免重跑11。
4.3 走查:一轮评测从头到尾
- 合成测试集: 用生成 LLM 从文档造 10 组问答(实际生成 7 组——合成也会失败,7 组就用 7 组,省钱)12;
- 跑两条管道: 同一批问题分别喂给 dense 链与 hybrid 链,收集各自的回答与检索内容;
- 打分: 三个层面六个指标,全部落在 0 到 1 之间;
4.4 真实结果
下表是原书跑出的全部数字(相似度检索 vs 混合检索)13:
| 层面 | 指标 | dense | hybrid | 差值 |
|---|---|---|---|---|
| 检索 | context_precision(检索信噪比) | 0.906 | 0.841 | +0.065 |
| 检索 | context_recall(该找到的都找到了吗) | 0.950 | 0.925 | +0.025 |
| 生成 | faithfulness(回答忠于检索材料吗) | 0.978 | 0.946 | +0.032 |
| 生成 | answer_relevancy(回答切题吗) | 0.968 | 0.965 | +0.003 |
| 端到端 | answer_correctness(对照标准答案对不对) | 0.776 | 0.717 | +0.059 |
| 端到端 | answer_similarity(与标准答案语义像不像) | 0.970 | 0.969 | +0.001 |
结果:这一局 dense 完胜 hybrid。 这本身就是一堂评测课——第 05 章讲混合检索千好万好, 放到这份数据上一测,六个指标全输。作者的解读保持了克制:测试集和语料都太小, 别过度解读这些数字;这个实验真正示范的是方法论——换组件前先测, 用数字而不是感觉做决策14。
顺带把六个指标说人话15:
- context_precision: 检索回来的东西里,相关的排得靠前吗(信噪比);
- context_recall: 该找到的相关材料,都找到了吗;
- faithfulness: 生成的话,是不是都出自检索材料(幻觉的反向指标);
- answer_relevancy: 回答切题吗,有没有废话冗余;
- answer_correctness / answer_similarity: 整条链的最终输出对照标准答案,比事实正确度和语义接近度。
这三个层面正好对应管道的分段:检索坏了修检索,生成坏了修生成——混合评测的分段价值就在这。