检索评估(Retrieval-Evaluation):你的 RAG 系统能找到正确的文档吗?
即使检索效果差,也可能产生一个好答案——而检索效果好,却仍可能导致一个差答案。检索评估能将这两个问题清楚地区分开来。
两个独立的问题
在一个 RAG 系统中,可能出错的环节有很多:要么是检索没有找到正确的文档(检索问题),要么是模型对找到的文档使用不当(生成问题)。如果只评估最终的回答,就会把这两种成因混在一起,最终也无法判断真正的错误出在哪里。
检索的精确率(Precision)与召回率(Recall)
精确率(Precision)衡量的是找到的文档中有多少确实相关——精确率高意味着上下文中的噪音较少。召回率(Recall)衡量的是真正相关的文档中有多少被找到了——召回率高意味着没有遗漏重要内容。这两个指标往往此消彼长:检索更多文档通常会提高召回率,但往往会降低精确率。
构建测试问题集
要进行可靠的评估,你需要一组已知正确答案的测试问题,以及真正包含该答案的相应文档。没有这个参照,精确率和召回率根本无法计算——只能靠猜测。
常见的错误来源
分块(Chunking)过粗或过细,会撕裂或稀释相关段落。不合适的嵌入模型(Embedding-Modell)难以很好地识别语义相似性。而缺乏同义词处理,会导致一个用词与文档不同的问题查不到任何结果,尽管答案其实是存在的。
示例
测试问题:“根据服务条款,退款期限是多久?” 参考文档:服务条款第 4.2 节,包含正确的期限。 检索结果(前 3 名命中):[第 4.2 节 ✓ 相关,第 7.1 节 ✗ 不相关,第 4.2 节(重复)✓ 相关] → 精确率 = 2/3(三个命中结果中有两个相关) → 召回率 = 1/1(唯一相关的文档被找到了) 如果第 4.2 节根本没有出现在前 3 名命中结果中,召回率就会是 0——无论模型之后如何处理这些错误的命中结果,都无济于事。
🛠️ 练习——自己动手试试
为你自己的(或一个虚构的)RAG 系统构建一个小型测试问题集,并手动计算精确率和召回率。
- 针对一个你熟悉的文档集合,选出 10 个问题,并为每个问题标注真正相关的一份或多份文档。
- 让你的 RAG 系统(或者用手动关键词搜索代替)为每个问题给出前 3 名命中结果。
- 对每个问题统计:3 个命中结果中有多少是相关的(精确率),以及相关文档是否真的出现在其中(召回率)。
- 计算全部 10 个问题的平均值。
✅ 自查清单
- ☐ 是否存在精确率高但召回率低的问题(相关的命中结果完全缺失)?
- ☐ 对于至少一个表现较差的问题,你能否说明其原因更可能是分块、嵌入模型选择,还是缺乏同义词处理?
小测验
为什么对于一个 RAG 系统来说,只评估最终的回答是不够的?
来源
- Ragas 文档:上下文精确率(Context Precision) ↗ docs.ragas.io
- Ragas 文档:上下文召回率(Context Recall) ↗ docs.ragas.io