大型语言模型(LLMs)作为一种生成式AI技术,在近两年内获得了显著的关注和应用。但是在实际部署中,LLMs的知识局限性和幻觉问题仍然是一个挑战。检索增强生成(Retrieval Augmented Generation,RAG)通过为LLM提供额外的外部知识和上下文,有效地解决了这些问题。截至2024年RAG已经成为应用生成式AI领域中最具影响力的技术之一。事实上,几乎所有基于LLM的应用都在某种程度上采用了RAG技术。
RAG通过引入非参数记忆访问来增强LLM的参数记忆能力
RAG评估:超越表面实现
为了充分发挥RAG的潜力,使LLM的响应能够切实地建立在可靠数据基础之上,我们需要超越简单的索引、检索、增强和生成的实现方式。要实现这一目标,首先需要建立有效的性能度量标准。RAG评估为建立系统性能基准提供了重要依据,进而为后续的优化提供了方向。
构建RAG概念验证(PoC)管道的复杂度相对较低。借助LangChain和LlamaIndex等工具,这一过程已经变得相对简单。通过简短的训练和有限样本的验证即可实现初步功能。但是为了提高系统的鲁棒性,在真实反映生产环境用例的数据集上进行全面测试至关重要。值得注意的是RAG管道本身也可能产生幻觉。从宏观角度来看,RAG系统存在三个主要的失效点:
- 检索器未能检索到完整或相关的上下文
- LLM虽然接收到上下文,但未能有效利用
- LLM没有针对查询给出回答,而是从上下文中提取了不相关信息
本文将重点讨论几个专注于评估第一个失效点的指标 —— "检索器未能检索到完整或相关上下文"。换言之这些指标旨在评估检索器的质量。
检索指标概述
用于评估RAG系统的指标可以大致分为三类:
- 信息检索任务中使用的检索指标(本文的讨论重点)
- 专注于评估生成内容流畅性、相关性和语义相似性的指标,如BLEU、ROUGE、METEOR等
- 随RAG应用发展而演变的特定指标
RAG的检索组件可以独立评估确定检索器满足用户查询的能力。我们将详细介绍七个广泛应用于RAG、搜索引擎、推荐系统等信息检索任务的重要指标。
注:在RAG中,知识库是一个核心概念。它是一个非参数记忆存储,用于存储RAG系统将处理的所有文档。
核心检索指标详解
1. 准确率(Accuracy)
准确率在信息检索领域通常定义为正确预测(包括真阳性和真阴性)占总样本的比例。这一概念源自监督学习中的分类问题,但在检索和RAG语境下有其特定解释:
准确率 = (检索到的相关文档数 + 未检索到的不相关文档数) / 知识库中总文档数
尽管准确率是一个直观的指标,但它并不是评估检索系统的最佳选择。在大型知识库中,对于任何给定查询大多数文档通常都是不相关的,这可能导致准确率呈现误导性的高值。此外该指标并不考虑检索结果的排序质量。
2. 精确率(Precision)
精确率聚焦于检索结果的质量,衡量检索到的文档中与用户查询相关的比例。它回答了这样一个问题:在所有被检索到的文档中,有多少是真正相关的?
精确率 = 检索到的相关文档数 / 检索到的总文档数
高精确率表明检索器能够有效地识别和提取相关文档。
注:精确率在分类任务中也是一个常用指标,定义为模型预测为正例的样本中实际为正例的比例,即真阳性 /(真阳性 + 假阳性)。
Precision@k
Precision@k是精确率的一个变体,它仅考虑检索结果中排名前k的文档。这一指标在RAG系统中尤为重要,因为通常只有排名靠前的结果会被用于增强。例如如果RAG系统仅使用前5个文档进行增强,那么Precision@5就成为一个关键指标。
Precision@k = 前k个结果中相关文档的数量 / k
例如,Precision@5为0.8(或4/5)意味着在前5个检索结果中,有4个是相关的。
Precision@k在比较不同系统的检索性能时特别有用,尤其是当系统间检索的总文档数可能不同时。但是它的局限性在于k值的选择可能带有主观性,且该指标不考虑k之外的结果。
3. 召回率(Recall)
召回率评估检索系统的覆盖范围,衡量从知识库中所有相关文档中成功检索到的比例。它回答了这样一个问题:在所有相关文档中,实际检索到了多少?
召回率 = 检索到的相关文档数 / 知识库中相关文档总数
与精确率不同召回率的计算需要预先知道知识库中相关文档的总数。在大规模系统中这可能是一个挑战。召回率同样不考虑检索文档的排序。理论上检索所有文档可以获得完美的召回率,但这显然不符合实际需求。
Recall@k
类似于Precision@k,Recall@k考虑了前k个检索结果中的相关文档比例:
Recall@k = 前k个结果中相关文档的数量 / 知识库中相关文档总数
召回率和精确率的不同场景
4. F1分数
F1分数是精确率和召回率的调和平均值,提供了一个平衡检索器质量和覆盖范围的单一指标。
F1分数 = 2 (精确率 召回率) / (精确率 + 召回率)
F1分数的特点是当精确率或召回率任一指标较低时,分数会受到显著影响。只有当两个指标都较高时,F1分数才会较高。这种特性使得F1分数不会被单一指标的高值所误导。
F1分数平衡了精确率和召回率。中等水平的精确率和召回率可能获得比一个指标很高而另一个很低时更高的F1分数。
F1分数提供了一个综合度量,便于比较不同系统的整体性能。但是它不考虑检索结果的排序,且默认给予精确率和召回率相同的权重,这在某些应用场景中可能不够理想。
重要说明:
文档相关性判定:大多数讨论的指标都涉及"相关"文档的概念。确定文档相关性的最直接方法是通过人工评估。通常由领域专家审查文档并判定其相关性。为减少个人偏见,这种评估往往由专家小组而非个人完成。但是从规模和成本的角度考虑,人工评估存在局限性。因此任何能可靠建立相关性的数据都变得极为宝贵。在这一背景下,基准事实(Ground Truth)指的是已知真实或正确的信息。在RAG和生成式AI领域,基准事实通常表现为一组预先准备的提示-上下文-响应或问题-上下文-响应示例,类似于监督学习中的标记数据。为知识库创建的基准事实数据可用于RAG系统的评估和优化。
高级检索评估指标
前面讨论的四个指标主要关注检索的整体效果,而不考虑结果的排序。接下来介绍的三个指标则进一步考虑了检索结果的排序质量,为评估提供了更深入的视角。
5. 平均倒数排名(Mean Reciprocal Rank, MRR)
平均倒数排名(MRR)是一个专门用于评估相关文档排名的指标。它计算的是一组查询中,每个查询的第一个相关文档的排名倒数的平均值。其数学表达式如下:
MRR = 1/N * Σ(i=1 to N) [1/rank(i)]
其中,N为查询总数,rank(i)为第i个查询中第一个相关文档的排名
MRR特别适用于评估系统快速找到相关文档的能力,因为它考虑了结果的排序。但是由于MRR只关注第一个相关结果,在需要多个相关结果的场景中,其应用可能受到限制。
![]
MRR考虑了排名,但仅关注第一个相关文档
6. 平均精确率均值(Mean Average Precision, MAP)
平均精确率均值(MAP)是一个综合性指标,它结合了不同截断级别(k值)的精确率和召回率。MAP首先计算每个查询的平均精确率,然后取所有查询的平均值。其计算过程如下:
- 单个查询(i)的平均精确率:
AP(i) = 1/R(i) Σ(k=1 to n) [Precision@k rel(k)]
其中,R(i)为查询i的相关文档总数,Precision@k为前k个结果中的精确率,rel(k)为第k个文档的相关性(0或1)
- 平均精确率均值:
MAP = 1/N * Σ(i=1 to N) [AP(i)]
其中,N为查询总数
MAP提供了一个在不同召回率水平上的综合质量度量。当结果的排序质量很重要时,MAP是一个非常有效的指标。但是其计算过程相对复杂。
MAP考虑了所有检索到的文档,并对更好的排序给予更高的分数
7. 归一化折损累积增益(Normalized Discounted Cumulative Gain, nDCG)
归一化折损累积增益(nDCG)是一个更为精细的排序质量评估指标。它不仅考虑了相关文档的位置,还为较早出现的相关文档分配更高的权重。nDCG特别适用于文档具有不同程度相关性的场景。
计算nDCG涉及以下步骤:
- 计算折损累积增益(DCG):
DCG = Σ(i=1 to n) [(2^rel(i) - 1) / log2(i+1)]
其中,rel(i)为第i个文档的相关性分数
- 计算理想DCG(IDCG),即完美排序情况下的DCG
- 计算nDCG:
nDCG = DCG / IDCG
nDCG考虑了文档的相关性程度,并对不正确的排序进行惩罚
nDCG是一个计算较为复杂的指标。它要求为每个文档分配相关性分数,这可能引入一定的主观性。折损因子的选择也会显著影响最终结果。尽管如此nDCG能够有效地处理文档间不同程度的相关性,并给予排名较高的项目更多权重,使其成为评估高级检索系统的有力工具。
结语
检索系统不仅在RAG中发挥关键作用,还广泛应用于网络和企业搜索引擎、电子商务产品搜索、个性化推荐、社交媒体广告投放、档案管理系统、数据库查询优化、智能虚拟助手等多个领域。上述检索指标为评估和改进这些系统的性能提供了重要依据,有助于更好地满足用户需求。
本文详细介绍了七个核心检索指标,从简单的准确率到复杂的nDCG,每个指标都有其特定的应用场景和优缺点。在实际应用中,选择合适的指标组合对于全面评估和优化RAG系统至关重要。
https://avoid.overfit.cn/post/ab01407621314acba8e53099b94eba11
作者:Abhinav Kimothi
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。