通过代码彻底搞懂 Ragas 的 Context Precision 是什么
在信息检索和机器学习中,评估检索结果的质量非常重要。
Context Precision 是一个用于衡量"检索上下文"中相关文本块比例的指标。它的计算方法是对上下文中每个文本块的精度@k值取平均。精度@k是指在排名k位置的相关文本块数量与该位置文本块总数的比值。
代码示例
From: ragas/src/ragas/metrics/_context_precision.py
import numpy as np
import typing as t
def _calculate_average_precision(self, verdict_list: t.List[int]) -> float:
score = np.nan
denominator = sum(verdict_list) + 1e-10
numerator = sum(
[
(sum(verdict_list[: i + 1]) / (i + 1)) * verdict_list[i]
for i in range(len(verdict_list))
]
)
score = numerator / denominator
return score
代码解析
-
输入参数:
verdict_list
是一个整数列表,其中每个元素表示一个片段是否相关(1表示相关,0表示不相关)。 -
分母计算:
denominator
是相关片段的总数加上一个很小的常数(1e-10),以避免除以零的情况。 -
分子计算:
numerator
是每个片段的相关性加权和。对于每个片段,我们计算到该片段为止的相关片段的比例,并将其乘以该片段的相关性。 -
最终得分:
score
是分子除以分母的结果,表示平均精度。
数据示例
为了更好地理解这个函数的工作原理,我们来看几个具体的例子。
示例 1
verdict_list = [1, 0, 1, 1, 0]
score = _calculate_average_precision(verdict_list)
print(score) # 输出结果
解释:
- 相关片段的总数为3。
- 计算每个片段的相关性加权和:
- 第一个片段:1 / 1 * 1 = 1
- 第二个片段:1 / 2 * 0 = 0
- 第三个片段:2 / 3 * 1 = 0.6667
- 第四个片段:3 / 4 * 1 = 0.75
- 第五个片段:3 / 5 * 0 = 0
- 分子总和:1 + 0 + 0.6667 + 0.75 + 0 = 2.4167
- 最终得分:2.4167 / 3 ≈ 0.8056
示例 2
verdict_list = [1, 1, 0, 0, 1]
score = _calculate_average_precision(verdict_list)
print(score) # 输出结果
解释:
- 相关片段的总数为3。
- 计算每个片段的相关性加权和:
- 第一个片段:1 / 1 * 1 = 1
- 第二个片段:2 / 2 * 1 = 1
- 第三个片段:2 / 3 * 0 = 0
- 第四个片段:2 / 4 * 0 = 0
- 第五个片段:3 / 5 * 1 = 0.6
- 分子总和:1 + 1 + 0 + 0 + 0.6 = 2.6
- 最终得分:2.6 / 3 ≈ 0.8667
示例 3
verdict_list = [0, 0, 1, 1, 1]
score = _calculate_average_precision(verdict_list)
print(score) # 输出结果
解释:
- 相关片段的总数为3。
- 计算每个片段的相关性加权和:
- 第一个片段:0 / 1 * 0 = 0
- 第二个片段:0 / 2 * 0 = 0
- 第三个片段:1 / 3 * 1 = 0.3333
- 第四个片段:2 / 4 * 1 = 0.5
- 第五个片段:3 / 5 * 1 = 0.6
- 分子总和:0 + 0 + 0.3333 + 0.5 + 0.6 = 1.4333
- 最终得分:1.4333 / 3 ≈ 0.4778
总结
通过上述代码示例和具体数据,希望大家理解Context Precision的计算逻辑。这个函数帮助我们评估检索结果中相关内容的比例,是信息检索和机器学习中一个重要的评估指标。
参考资料:
标签:片段,Ragas,示例,list,Precision,score,verdict,搞懂 From: https://blog.csdn.net/engchina/article/details/144818806