RAG 评估 - 检索指标
检索评估的主要目标是评估上下文相关性,即检索到的文档与用户查询的匹配程度。它确保提供给生成组件的上下文是相关和准确的,
- 命中率 hit_rate:检索文档有多少是目标文档
- 平均倒数排名 mrr:MRR 计算的是最相关文档的倒数排名的平均值。如果正确答案的排名是高的(即排名接近第一位),则倒数值会大。MRR 值的范围是 0 到 1,值越高表示检索系统性能越好
- precision:被检索出来的目标文档数量 / 检索数量,表示检索器的精准率
- recall:被检索出来的目标文档数量 / 目标文档数量,表示检索器找到目标文档的完整度
- ap: 首先计算每个查询的平均精确率,然后对所有查询的平均精确率进行平均。这里的 “精确率” 是指在每个排名阶段检索到的相关文档数量占到目前为止所有检索到的文档数量的比例。MAP 考虑了所有相关文档,并且对检索结果的排序非常敏感,值越高,表示检索系统的排名性能越好
- 归一化折现累积增益 ndcg:NDCG 倾向于赋予排在前面的相关文档更高的权重,是一种位置敏感的度量方法。NDCG 先计算一个未经归一化的折扣累积增益(Discounted Cumulative Gain, DCG),然后用这个值除以一个理想状态(即最佳排名顺序)下的 DCG,从而得到归一化的值。NDCG 的值范围在 0 到 1 之间,越接近 1 表示检索性能越佳,特别是在前面几个结果的质量方面。
- cohere_rerank_relevancy:不使用 expected_ids、expected_texts,直接 query+retrieved_texts 输入到 llm 回答问题,然后 llm 给定答案打分,然后取打分的均值或者最大值返回。
检索评估指标可以归纳为以下模式
指标 | 示例 |
---|---|
expected_ids | [1,2,3] |
retrieved_ids | [1,3,4] |
expected_texts | [‘ab’,‘shs’] |
retrieved_texts | [‘ab’,‘wjw’] |
通过以上 4 个列表,计算一个查询的评估值
命中率 hit_rate
方式 1:expected_ids 被命中的数量 /expected_ids 数量
方式 2: 只要 expected_ids 被命中,返回 1
1 | if self.use_granular_hit_rate: |
平均倒数排名 mrr
考虑命中率的同时,考虑 rank 顺序,命中越靠前,分数越高
方式 1:如果 retrieved_ids 的第 i 位在 expected_ids 中,分数 + 1/i,否则 + 0,最后取分数平均值
方式 2: 取 retrieved_ids 最先命中 expected_ids 的位置,假设是 i,直接取 1/i 作为最终结果
1 | if self.use_granular_mrr: |
precision
比较 retrieved_ids、expected_ids,计算 tp、fp、fn,然后计算出 precision
1 | retrieved_set = set(retrieved_ids) |
recall
比较 retrieved_ids、expected_ids,计算 tp、fp、fn,然后计算出 precision
1 | retrieved_set = set(retrieved_ids) |
ap
利用 rank 位置,通过积分求取 precision
1 | expected_set = set(expected_ids) |
归一化折现累积增益 ndcg
- 首先提取 retrieved_ids 命中 expected_ids 的位置,假设为 i,然后累加
1 / math.log2(i + 1)
- 使用 retrieved_ids、expected_ids 的最小长度再计算一次累加值
- 最终结果:第一个累加值 / 第二个累加值
1 | def discounted_gain(*, rel: float, i: int, mode: DiscountedGainMode) -> float: |
cohere_rerank_relevancy
不使用 expected_ids、expected_texts,直接 query+retrieved_texts 输入到 llm 回答问题,然后 llm 给定答案打分,然后取打分的均值或者最大值返回