RAG 评估指南:从检索到生成的 LLM 性能评估方法
RAG 评估涉及检索与生成两个核心环节。检索评估关注召回率、准确率等指标,生成评估则涵盖基于参考(如 BLEU、ROUGE)和无参考(如语义相似度、事实一致性)的多种方法。LLM 作为评估器提供了可扩展性,而代码生成需关注功能正确性与语法规范。选择合适的评估框架(如 RAGAS)结合具体业务场景,能有效优化系统性能并保障输出质量。

RAG 评估涉及检索与生成两个核心环节。检索评估关注召回率、准确率等指标,生成评估则涵盖基于参考(如 BLEU、ROUGE)和无参考(如语义相似度、事实一致性)的多种方法。LLM 作为评估器提供了可扩展性,而代码生成需关注功能正确性与语法规范。选择合适的评估框架(如 RAGAS)结合具体业务场景,能有效优化系统性能并保障输出质量。

本文从时间线出发对 RAG(检索增强生成)的评估方式进行对比。这些评估方式不仅限于 RAG 流程之中,其中基于大语言模型(LLM)的评估方式更加适用于各行各业。
上一节我们讲了如何用 ROUGE 这个方法评估摘要的相似度。由于篇幅限制,没有讲到图片与文本之间的评估。由于涉及图片与文本评估的场景多见于 RAG 流程中,包括检索评估方法和生成评估方法。其中生成评估方法也就是通过对答案进行评估的方法,从而对 LLM 这个模型的生成能力进行间接评估,也适用于我们的图片与上下文之间的评估。
此外本文还会对 RAG 中的其他重要内容的评估方式进行详尽的讲解。
常用的检索评估方式有以下几种,包括文字和图片的检索评估,评估方式侧重点各不相同,没有好坏之分。


其中,这里的 k 一般取 10, 5, 3。
这些指标用于衡量一个系统在处理问答(Q&A)任务时的表现,特别是涉及到大型语言模型(LLM)和视觉增强服务时。下面是对表格中每个指标的解释:


表格的描述强调了这些指标的重要性,它们提供了对系统每个部分有效性的宝贵见解。这些指标有助于分别衡量系统的搜索能力和生成部分,以便理解实验对每个组件的影响。
我们通过系统地测试不同的方法进行实验,一次调整一个配置设置并评估其对预定义基线的影响。使用下面概述的特定检索和生成指标来评估性能。对这些指标的详细分析有助于我们决定是否使用新配置更新基线或保留现有配置。

为了在实验过程中进行准确评估,整理一组多样化的问答对至关重要。这些问答对应涵盖一系列文章,涵盖各种数据格式、长度和主题。这种多样性可确保全面的测试和评估,有助于提高结果和所获见解的可靠性。以下是可供参考的问答数据集示例。

数据集应该确保问答数据集中的问题均衡,既有来自文本的问题,也有来自图像和文本的问题,还有一些问题仅来自图像。还确保问题分布在各种源文档中。
当评估集相对较小时,可以通过纳入各种边缘情况来确保其多样性。可以从彻底的探索性数据分析 (EDA) 开始,图片中的例子提取了诸如文章长度、表格长度和文本表格数量以及图像类型、分辨率和图像数量等特征。然后,仔细地将评估集分布在这些特征上,以实现特征空间的全面表示和稳健覆盖。此外,该系统还支持同一问题的替代来源和图像。
# 模拟的检索结果,即检索算法返回的结果
retrieved_images = ['img1.jpg', 'img2.jpg', 'img3.jpg', 'img4.jpg', 'img5.jpg']
# 真实的标注结果,即与查询图像相关的所有图像
ground_truth_images = ['img1.jpg', 'img2.jpg', 'img3.jpg', 'img6.jpg', 'img7.jpg']
# 计算召回率
def calculate_recall(retrieved, ground_truth):
# 将列表转换为集合,以便使用集合操作
retrieved_set = set(retrieved)
ground_truth_set = set(ground_truth)
# 计算召回率
recall = len(retrieved_set.intersection(ground_truth_set)) / len(ground_truth_set)
return recall
# 调用函数计算召回率
recall = calculate_recall(retrieved_images, ground_truth_images)
print(f"召回率:{recall:.2f}")
我们这里用比较简单的方式抽象一下,具体从 markdown 中提取图像的标签的细节就不罗嗦了,实际上是差不多的。

评估方法衡量我们系统的表现。对每个摘要进行手动评估(人工审核)既耗时又费钱,而且不可扩展,因此通常用自动评估来补充。许多自动评估方法试图衡量人类评估者会考虑的文本质量。这些质量包括流畅性、连贯性、相关性、事实一致性和公平性。内容或风格与参考文本的相似性也是生成文本的重要质量。
下图包括用于评估 LLM 生成内容的许多指标及其分类方法。

基于参考的指标用于将生成的文本与参考(人工注释的地面实况文本)进行比较。许多此类指标是在 LLM 开发之前为传统 NLP 任务开发的,但仍然适用于 LLM 生成的文本。
指标 BLEU (Bilingual Evaluation Understudy), ROUGE (Recall-Oriented Understudy for Gisting Evaluation), and JS divergence (JS2) 是基于重叠的指标,使用 n-gram 来衡量输出文本和参考文本的相似性。
BLEU(双语评估测试)分数用于评估从一种自然语言到另一种自然语言的机器翻译文本的质量。因此,它通常用于机器翻译任务,但也用于其他任务,如文本生成、释义生成和文本摘要。其基本思想是计算精度,即参考翻译中候选词的比例。通过将单个翻译片段(通常是句子)与一组高质量的参考翻译进行比较,计算出分数。然后,将这些分数在整个语料库中取平均值,以估计翻译的整体质量。评分时不考虑标点符号或语法正确性。
很少有人工翻译能获得完美的 BLEU 分数,因为完美的分数表明候选译文与其中一个参考译文完全相同。因此,没有必要获得完美的分数。考虑到随着多个参考译文的增加,匹配的机会更多,我们鼓励提供一个或多个参考译文,这将有助于最大化 BLEU 分数。

通常,上述计算会考虑目标中出现的候选单词或单元词组。但是,为了更准确地评估匹配,可以计算二元词组甚至三元词组,并对从各种 n 元词组获得的分数取平均值,以计算总体 BLEU 分数。
与 BLEU 分数相反,面向召回率的摘要评估 (ROUGE) 评估指标衡量的是召回率。它通常用于评估生成文本的质量和机器翻译任务。但是,由于它衡量的是召回率,因此它用于摘要任务。在这些类型的任务中,评估模型可以召回的单词数量更为重要。
ROUGE 类中最流行的评估指标是 ROUGE-N 和 ROUGE-L:

文本相似度指标评估器专注于通过比较文本元素之间单词或单词序列的重叠来计算相似度。它们可用于为 LLM 和参考标准文本的预测输出生成相似度分数。这些指标还可以指示模型在各个任务中的表现如何。
编辑相似度比率是用于衡量两个序列之间相似度的字符串指标。此度量基于编辑距离。通俗地说,两个字符串之间的编辑距离是将一个字符串更改为另一个字符串所需的最小单字符编辑(插入、删除或替换)次数。编辑相似度比率可以使用编辑距离值和两个序列的总长度来计算。

从简单编辑相似度比率中衍生出几种不同的方法:
BERTScore, MoverScore 和 Sentence Mover Similarity (SMS) 这些指标都依赖于语境化嵌入来衡量两段文本之间的相似性。虽然与基于 LLM 的指标相比,这些指标相对简单、快速且计算成本低廉,但研究表明,它们与人类评估者的相关性较差、缺乏可解释性、固有偏见、对各种任务的适应性较差,并且无法捕捉语言中的细微差别。
两个句子之间的语义相似度是指它们的含义有多紧密相关。为此,首先将每个字符串表示为一个特征向量,以捕获其语义含义。一种常用的方法是生成字符串的嵌入(例如,使用 LLM),然后使用余弦相似度来测量两个嵌入向量之间的相似度。更具体地说,给定一个表示目标字符串的嵌入向量 (A) 和一个表示参考字符串的嵌入向量 (B),余弦相似度计算如下:

如上所示,该度量测量两个非零向量之间角度的余弦,范围从 -1 到 1。1 表示两个向量相同,-1 表示它们不相似。
无参考(基于上下文)指标会为生成的文本生成分数,并且不依赖于基本事实。评估基于上下文或源文档。许多此类指标都是为了应对创建基本事实数据的挑战而开发的。这些方法往往比基于参考的技术更新,反映了随着 PTM 变得越来越强大,对可扩展文本评估的需求日益增长。这些指标包括基于质量、基于蕴涵、基于事实、基于问答 (QA) 和基于问题生成 (QG) 的指标。
与基于参考的指标相比,无参考指标与人类评估者的相关性有所提高,但使用无参考指标作为任务进度的单一衡量标准存在局限性。一些 limitations 包括对其底层模型输出的偏见和对更高质量文本的偏见。
LLM 的卓越能力使其不仅可用于生成文本,还可用于文本评估。这些评估器具有可扩展性和可解释性。
基于 LLM 的评估者会要求 LLM 评判一些文本。评判可以基于 (i) 文本本身(无参考),LLM 评判流畅性和连贯性等品质;(ii) 生成的文本、原始文本以及可能的主题或问题(无参考),LLM 评判一致性和相关性等品质;(iii) 生成的文本与基本事实之间的比较(基于参考),LLM 评判质量和相似性。这些评估提示的一些框架包括推理然后评分 (RTS)、多项选择题评分 (MCQ)、面对面评分 (H2H) 和 G-Eval。GEMBA 是评估翻译质量的指标。
LLM 评估是一个新兴的研究领域,尚未得到系统研究。研究人员已经发现 LLM 评估人员的可靠性存在问题,例如位置偏见、冗长偏见、自我提升偏见、有限的数学和推理能力,以及 LLM 在分配数字分数方面的成功问题。为减轻位置偏见而提出的策略包括多重证据校准 (MEC)、平衡位置校准 (BPC) 和人机交互校准 (HITLC)。
我们可以获取模型产生的输出,并提示模型确定生成的完成的质量。使用此评估方法通常需要以下步骤:
在提供足够的提示和上下文的情况下,模型应该能够给出分数。虽然 GPT-4 通过这种评估方法取得了相当不错的结果,但仍需要人工来验证模型生成的输出。在特定领域的任务或涉及应用特定方法评估输出的情况下,模型可能表现不佳。因此,应根据数据集的性质仔细研究模型的行为。请记住,执行基于 LLM 的评估需要自己的提示工程。下面是 NL2Python 应用程序中使用的示例提示模板。
You are an AI-based evaluator. Given an input (starts with --INPUT) that consists or a user prompt (denoted by STATEMENT)
and the two completions (labelled EXPECTED and GENERATED), please do the following:
1- Parse user prompt (STATEMENT) and EXPECTED output to understand task and expected outcome.
2- Check GENERATED code for syntax errors and key variables/functions.
3- Compare GENERATED code to EXPECTED output for similarities/differences, including the use of appropriate Python functions and syntax.
4- Perform a static analysis of the GENERATED code to check for potential functional issues, such as incorrect data types, uninitialized variables,
and improper use of functions.
5- Evaluate the GENERATED code based on other criteria such as readability, efficiency, and adherence to best programming practices.
6- Use the results of steps 2-5 to assign a score to the GENERATED code between 1 to 5, with a higher score indicating better quality.
The score can be based on a weighted combination of the different criteria.
7- Come up an explanation for the score assigned to the GENERATED code. This should also mention if the code is valid or not
When the above is done, please generate an ANSWER that includes outputs:
--ANSWER
EXPLANATION:
SCORE:
Below are two example:
# Example 1
--INPUT
STATEMENT = create a cube
EXPECTED = makeCube()
GENERATED = makeCube(n='cube1')
--ANSWER
SCORE: 4
EXPLANATION: Both completions are valid creating the cubes. However, the GENERATED one differs by including the cube name (n=cube1), which necessary.
--INPUT
STATEMENT = make cube1 red
EXPECTED = changeColor(color=(, , ), objects=[])
GENERATED = makeItRed(n=)
--ANSWER
SCORE:
EXPLANATION: There no function the API called makeItRed. Therefore, this a made-up function.
Now please process the example blow
--INPUT
STATEMENT = {prompt}
EXPECTED = {expected_output}
GENERATED = {completion}
--ANSWER
LLM 评估器的输出通常是一个分数(例如 0-1)和一个可选的解释,这是我们通过传统指标不一定能得到的。
最近,来自 LLM 的嵌入模型(例如 GPT3 的 text-embedding-ada-002)也已用于计算语义相似度的基于嵌入的度量。
当使用 LLM 生成代码时,适用以下指标。
当 LLM 负责为自然语言中的特定任务生成代码时,功能正确性会评估 NL 到代码生成任务的准确性。在这种情况下,功能正确性评估用于评估生成的代码是否针对给定输入产生所需的输出。
例如,为了使用功能正确性评估,我们可以定义一组涵盖不同输入及其预期输出的测试用例。例如,我们可以定义以下测试用例:
Input: 0
Expected Output: 1
Input: 1
Expected Output: 1
Input: 2
Expected Output: 2
Input: 5
Expected Output: 120
Input: 10
Expected Output: 3628800
然后,我们可以使用 LLM 生成的代码来计算每个输入的阶乘,并将生成的输出与预期输出进行比较。如果生成的输出与每个输入的预期输出相匹配,则我们认为测试用例已通过,并得出结论,LLM 在功能上对于该任务是正确的。
功能正确性评估的局限性在于,有时设置用于实现生成代码的执行环境的成本过高。此外,功能正确性评估没有考虑生成代码的以下重要因素:
此外,定义一套全面的测试用例来覆盖给定任务的所有可能输入和边缘情况非常困难。这种困难会限制功能正确性评估的有效性。
对于特定领域的应用和实验,实施基于规则的指标可能会很有用。例如,假设我们要求模型为给定任务生成多个完成。我们可能有兴趣选择最大化某些关键字出现在提示中的概率的输出。此外,在某些情况下,整个提示可能没有用 - 只有关键实体才有用。创建一个对生成的输出执行实体提取的模型也可用于评估预测输出的质量。考虑到许多可能性,考虑针对特定领域任务量身定制的基于规则的自定义指标是一种很好的做法。在这里,我们为 NL2Code 和 NL2NL 用例提供了一些广泛使用的基于规则的评估指标的示例:
我们还可以使用 LLM 进行自动测试生成,其中 LLM 生成各种各样的测试用例,包括不同的输入类型、上下文和难度级别:
检索增强生成 (RAG) 模式是一种提高 LLM 性能的常用方法。该模式涉及从知识库中检索相关信息,然后使用生成模型生成最终输出。检索和生成模型都可以是 LLM。来自 RAGAS 实现的以下指标(RAGAS 是检索增强生成管道的评估框架)需要每个查询检索到的上下文,可用于评估检索模型和生成模型的性能:
与生成相关的指标:
检索相关指标:


在实际项目中,选择合适的评估策略至关重要。以下是针对不同场景的建议:
通过综合使用上述指标和框架,开发者可以更全面地监控和优化 RAG 系统的性能,确保最终交付的产品满足业务需求。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online