
在检索增强生成 (RAG) 管道或推荐系统中,您如何评估搜索结果的质量?虽然目前正在涌现许多新的指标来评估 RAG 管道中检索上下文的质量,但已经存在成熟的指标可以客观地衡量信息检索系统。
本文全面概述了在搜索和推荐系统中常用的评估指标。由于推荐系统可以看作是信息检索或搜索系统的一个特例,因此类似的指标适用于两者。
为了解释以下每个指标的计算方式,本文使用一个包含八种糕点的最小示例数据集——为了与我们的同事最近在关于如何选择和评估嵌入模型的讨论中使用的贝果示例保持一致——如下所示。

我们将使用 pytrec_eval Python 包来展示如何在您的代码中评估您的检索或推荐管道。请查看 相关的 GitHub 仓库中的代码。
pytrec_eval是一个 Python 接口,用于 TREC 的评估工具,trec_eval。它旨在停止在 Python 编程语言中培养自定义的信息检索评估措施。
要使用 pytrec_eval 包,您可以简单地使用 pip 安装它。
pip install pytrec_eval
评估信息检索系统的指标
本节涵盖了评估信息检索系统(例如搜索和推荐系统)的最流行的离线指标。它探讨了 precision@K、recall@K、MAP@K、MRR@K 和 NDCG@K。
正如您可能注意到的,所有这些指标都以“@K”结尾(发音为:“at K”)。这意味着我们只评估前 K 个结果。
所有以下指标的值都介于 0 和 1 之间,较高的值表示更好的性能。
此外,以下评估指标可以分为不考虑排序的指标与考虑排序的指标。而不考虑排序的指标,例如精确率和召回率,仅反映前 K 个结果中相关项目的数量,而考虑排序的指标,例如 MAP、MRR 和 NDCG,则同时考虑相关项目的数量及其在结果列表中的位置。
精确率
precision@K 指标衡量检索到的项目中相关项目的数量。此指标不考虑排序,因此仅考虑相关结果的数量,而不考虑其顺序。您可以通过将前 K 个结果中的相关项目数量除以 K 来计算 precision@K。

使用 pytrec_eval,您可以按如下方式评估您的搜索结果
import pytrec_eval
qrel = {
'sweet pastry' : {
'donut' : 1,
'muffin' : 1,
'scone' : 1,
},
}
run = {
'sweet pastry' : {
'donut' : 0.95,
'bagel' : 0.9,
'muffin' : 0.8,
'croissant' : 0.7,
},
}
evaluator = pytrec_eval.RelevanceEvaluator(qrel, {'P.4'})
results = evaluator.evaluate(run)
{
"sweet pastry": {
"P_4": 0.5,
},
}
召回率
recall@K 指标衡量从整个数据集中成功检索到的相关项目的数量。此指标不考虑排序,因此仅考虑相关结果的数量,而不考虑其顺序。您可以通过将前 K 个结果中的相关项目数量除以整个数据集中相关项目的总数来计算 recall@K。

使用 pytrec_eval,您可以按如下方式评估您的搜索结果
evaluator = pytrec_eval.RelevanceEvaluator(qrel, { 'recall.4' })
results = evaluator.evaluate(run)
{
"sweet pastry": {
"recall_4": 0.6666666666666666
},
}
平均倒数排名 (MRR)
平均倒数排名@K (MRR@K) 指标衡量系统将相关结果作为首个结果的程度。此指标仅考虑第一个相关结果的顺序,而不考虑其他相关结果的数量或顺序。您可以通过在多个查询(对于信息检索)或用户(对于推荐)U 中对倒数排名 (RR) 进行平均来计算 MRR@K。
倒数排名是按以下方式计算的

请注意,截至撰写本文时,MRR 指标在 pytrec_eval 包中不可用。
平均平均精度 (MAP)
平均平均精度@K (MAP@K) 指标衡量系统在将相关项返回到前 K 个结果中的能力,同时将更相关的项放在顶部。您可以计算 MAP@K 指标,方法是在多个查询(在信息检索的情况下)或用户(在推荐的情况下)U 中对 K 处的平均精度进行平均,这些查询或用户是在评估的数据集中。
平均精度@K (AP@K) 指标衡量在 K 个相关位置处的所有精度值,并对其求平均值。

这同时也是大规模文本嵌入基准 (MTEB) 排行榜中重排序类别的默认指标。
使用 pytrec_eval,您可以按以下方式评估您的搜索结果。
qrel = {
'sweet pastry' : {
'donut' : 1,
'muffin' : 1,
},
}
run = {
'sweet pastry' : {
'donut' : 0.95,
'bagel' : 0.9,
'muffin' : 0.8,
'croissant' : 0.7,
},
}
evaluator = pytrec_eval.RelevanceEvaluator(qrel, { 'map_cut.4'})
results = evaluator.evaluate(run)
{
"sweet pastry": {
"map_cut_4": 0.8333333333333333
}
}
请注意,pytrec_eval 包不会对多个查询求平均值。
归一化折损累积增益 (NDCG)
归一化折损累积增益@K (NDCG@K) 指标衡量系统根据相关性对项目进行排序的能力。与上述指标相比,此指标不仅需要知道文档是否相关,还需要知道它有多相关(例如,相关与略微相关与不相关)。
您可以通过计算折损累积增益 (DCG) 然后将其除以理想折损累积增益 (IDCG) 来计算 NDCG@K。
DCG 的计算方式如下

这是MTEB排行榜中用于检索类别的默认指标。
使用 pytrec_eval,您可以按如下方式评估您的搜索结果
qrel = {
'goes well with jam' : {
'bagel' : 2,
'croissant' : 2,
'roll' : 2,
'scone' : 1,
'muffin' : 1,
'donut' : 1,
},
}
run = {
'goes well with jam' : {
'pretzel' : 0.9,
'bagel' : 0.85,
'muffin' : 0.7,
'donut' : 0.6,
},
}
evaluator = pytrec_eval.RelevanceEvaluator(qrel, { 'ndcg_cut.4', })
results = evaluator.evaluate(run)
{
"goes well with jam": {
"ndcg_cut_4": 0.4672390440360399
}
}
总结
本文简要概述了在搜索和推荐系统中使用的最流行的评估指标:Precision@K、recall@K、MRR@K、MAP@K 和 NDCG@K。我们还讨论了 MAP@K 最常用于评估推荐系统,而 NDCG@K 则非常常用于评估检索系统。此外,您还了解了如何计算这些指标中的每一个,以及如何使用 pytrec_eval 库在 Python 中实现它们的计算。您可以查看 相关 GitHub 仓库中的代码来查看实现细节。
准备开始构建了吗?
请查看 快速入门教程,或使用 Weaviate Cloud (WCD) 的免费试用版构建令人惊叹的应用程序。