如何衡量基于RAG的LLM系统的成功

评估以RAG为基础的LLM系统的成功指标

使用机器评估机器

包括一种新颖的方法,用定性分数和详细解释来评判答案。

由稳定扩散XL生成的图像

研究辅助生成(Research Augmented Generation,简称RAG)是今年最常见的大型语言模型(LLMs)应用场景。虽然个体用户通常关注文本摘要和生成,但企业已经意识到他们需要利用自己的数据来发挥这项技术的优势。回顾我自己使用LLMs的情况,文本生成是最重要的用途。我想向Bard提问,并让它搜索网页;我想让Claude改写电子邮件或博客文章,提升我的内容。但我遇到的最令人兴奋的用途是将自己的数据导入LLM中。我想搜索我的笔记、电子邮件、日历和Slack信息,并让Llama像我的另一个自己一样运行(一个能记住今天之前事情细节的自己)。

这不是一篇关于如何构建RAG的文章(已经有很多这样的文章了…我会在另一天发布那篇文章)。今天我们要探讨的是如何评估RAG系统。

我们如何从RAG中获取数据?

在我们深入讨论之前,让我们先进行一些基本的了解。当我们谈论RAG时,我们指的是系统的两个部分。

知识源

知识源可以是矢量数据库、搜索引擎、几个加载到内存中的文本文件、SQL数据,或者任何存储我们数据的地方。

LLM

一旦我们拥有了数据,我们将其导入LLM中。这是通过上下文窗口完成的。因此,我们搜索、获取一些文本,将找到的文本放入提示中,并将问题传递给LLM。模型然后接收来自上下文窗口的所有内容并提供答案。

这为什么重要?

当我们谈论评估RAG系统时,我们必须知道我们将评估什么,然后再定义如何评估。现在我们可以看到需要检查两个部分。最关键的是初始数据检索。总体而言,LLMs在使用上下文提供的数据进行摘要/问答方面表现出色。可能欠缺的是搜索功能本身。

这些知识源有一些内建限制。例如,使用矢量数据库存储大型文本文件时,必须将数据进行’分块’。这是什么意思呢?假设你有一个100页的文档,但数据库一次只能保存1页。一旦你加载了你的文档并进行搜索,数据库只能逐页查看(好吧,这有点简化,但请容许我这么说,差不多就行了)。当我们找到符合搜索条件的数据时,真实可能是整个问题的答案并不完全位于单独的一页上。太糟糕了!我们只能得到单个页面的内容!这很好地说明了为什么需要在担心LLM的输出之前检查系统的这一部分。

我们需要评估什么?

这可能不是大多数技术人员想听到的答案。需要进行某种程度的人工评估以评估知识源的结果。为什么呢?如果企业使用自己的数据并且数据是私密的,很难自动化测试以验证搜索结果是否完全准确。不用担心,它不必完全手动;我们可以自动化其中的一部分。让我们深入一点。

在这个初始验证和评估中,我看到有两种实施方式。

第一种选择是针对数据集准备一组常见且预期的问题,并由人工 QA 团队验证搜索结果。例如,如果你的团队的任务是为一家银行构建一个客服问答机器人,一些常见问题可能是:“我需要在账户中保留的最低金额是多少?”,“如何对贷款进行还款?”,“我的分行营业时间是多少?”。如果质量保证团队能够提供问题和预期答案,最好将它们以 CSV 文件的形式供程序读取;然后,我们可以使用一些自动化测试,稍后在本帖的后面部分会介绍一些。

如果时间或资源不足以进行此项工作,第二种方法是让 QA团队实时搜索和审核。这对于早期的 POCs(概念验证)和原型是可行的选择,但要注意,这在实际生产工作量下不会扩展。

评估 LLM 响应

一旦我们对来自知识源的数据具有一定的信心,我们必须确保最终的答案是准确的。RAG系统对于减少幻觉的可能性非常有用,可以通过调整基础提示来进一步扩展。然而,它可能会遗漏信息,误解输入的数据,或者试图引入其训练时的先验知识。

评估此步骤类似于评估之前的搜索。如果 QA团队可以提供问题和预期答案,我们可以尝试通过程序来评估答案。

现在让我们来看一些选项。

评估框架

需要记住的是,LLM和RAG在其成熟周期中仍处于非常早期的阶段。ChatGPT才发布了一年,每天都会带来更多的进展、模型、框架和研究成果。话虽如此,一些度量指标正在成为衡量这些系统性能的标准方式。

我们不会涵盖如何评估基础LLM,有一些像 ARC、MMLU、HellaSwag 等的度量标准都是针对底层语言模型的。你没有必要自己运行这些度量标准;你可以查看像https://llm-leaderboard.streamlit.app/https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard这样的网站,看不同模型的表现如何。我们只关注从 RAG 系统获取的结果。

这导致我们需要查看 ROUGE、BLEU、BLUERT 和 METEOR 等算法。让我们仔细看看每个算法。我还将包含一个小代码片段,展示如何调用每个度量标准以及输出分数的样式。我导入评估框架来开始,并包含我想要评分的参考及答案。

!pip install evaluate --quiet!pip install rouge_score --quiet!pip install importlib-metadata --quiet!pip install datasets==2.10.1 --quiet !pip install git+https://github.com/google-research/bleurt.git --quiet!pip install sacrebleu --quiet!pip --no-cache-dir install bert_score==0.3.9 --quiet!pip install sacremoses --quiet!pip install jiwer==2.5.1 --quiet!pip install Cython import evaluate# If you have a translation and reference corpus:predictions = ["在龙与地下城游戏中,金属龙有黄铜、青铜、铜、金和银五种品种。每种品种的鳞片都和其名称相匹配 - 黄铜龙有被认为是黄铜色的鳞片,青铜龙有青铜色的鳞片,等等。金属龙通常比岩浆龙在 D&D 的背景故事中更加温和。"]references =["""基本的五种色龙(红、蓝、绿、黑、白)和金属龙(铜、黄铜、银、金、青铜)都出现在第五版怪物手册(2014年)中,包括幼龙、幼年龙、成年龙和古龙。宝石龙和其他新的第五版龙出现在费兹班的龙宝库(2021年)中。"""]

ROUGE(回忆着重的要领评估)

ROUGE(易读积分)是用于评估自动摘要和机器翻译输出的一组指标。它基于系统输出和参考摘要之间重叠n-gram的计数。

#predictions(列表):要评分的预测列表。每个预测应该是一个由空格分隔的字符串。#references(列表或列表[列表]):每个预测的参考列表或每个预测的多个参考的列表。每个参考应该是一个由空格分隔的字符串。#rouge_types(列表):要计算的rouge类型列表。默认为['rouge1','rouge2','rougeL','rougeLsum']。#有效的rouge类型:##“rouge1”:基于unigram(1-gram)的得分##“rouge2”:基于bigram(2-gram)的得分##“rougeL”:基于最长公共子序列的得分。##“rougeLSum”:使用“\ n”分割文本#use_aggregator(布尔值):如果为True,则返回聚合结果。默认为True。#use_stemmer(布尔值):如果为True,则使用Porter词干剥离词后缀。默认为False。rouge = evaluate.load('rouge')results = rouge.compute(predictions=predictions, references=references, use_aggregator=False)print(results)

{'rouge1': [0.3636363636363636], 'rouge2': [0.06185567010309278], 'rougeL': [0.22222222222222224], 'rougeLsum': [0.22222222222222224]}

BLEU(双语评估助手)

BLEU是用于自动评估机器翻译输出的度量标准。它基于候选翻译与一组参考翻译之间的n-gram精确度。

#predictions(str列表):要评分的翻译列表。#references(str列表的列表):每个翻译的参考列表。#max_order(整数):计算BLEU分数时要使用的最大n-gram顺序。默认为4。#smooth(布尔值):是否应用Lin等人。2004年的平滑处理。默认为False。#bleu(浮点数):BLEU分数#precisions(浮点数列表):n-gram精确度的几何平均值,#brevity_penalty(浮点数):简洁惩罚,#length_ratio(浮点数):长度比率,#translation_length(整数):翻译长度,#reference_length(整数):参考长度bleu = evaluate.load(“bleu”)results = bleu.compute(predictions=predictions,references=references,max_order=4)print(results)

{'bleu': 0.07342349837092484, 'precisions': [0.4262295081967213, 0.11666666666666667, 0.03389830508474576, 0.017241379310344827], 'brevity_penalty': 1.0, 'length_ratio': 20.333333333333332, 'translation_length': 61, 'reference_length': 3}

BLEURT(基于Transformers的BLEU回归)

BLEURT是用于自然语言生成(NLG)的评估度量。它基于BERT,使BLEURT能够学习单词和短语之间的统计关系,并识别NLG输出中的模式。

在机器翻译,摘要和问答等各种任务上,BLEURT已被证明优于其他NLG评估度量,如BLEU和ROUGE。

#output始终是介于0到(大约1)之间的数字。#此值表示生成的文本与参考文本的相似程度,越接近1表示文本越相似。bleurt = evaluate.load(“bleurt”,module_type=“metric”)results = bleurt.compute(predictions=predictions,references=references)print(results)

{'scores': [0.6028875708580017]}

METEOR(翻译显式排序的评估度量)

METEOR是用于机器翻译输出的自动评估度量。它还具有其他度量标准中没有的功能,如词干提取、同义词匹配和标准精确单词匹配。该度量标准旨在解决BLEU度量标准中遇到的一些问题,并在句子或段落级别上与人类判断产生良好的相关性。

#预测: 用于评分的预测列表。每个预测应该是一个由空格分隔的字符串。#参考: 参考文本的列表(每个预测一个参考文本),或者参考文本列表的列表(每个预测多个参考文本)。每个参考文本应该是一个由空格分隔的字符串。#alpha: 用于控制精确率和召回率之间相对权重的参数。默认值为0.9。#beta: 用于控制片段化惩罚函数形状的参数。默认值为3。#gamma: 分段惩罚的相对权重。默认值为0.5。#输出 0-1 - .317 是可接受的分数meteor = evaluate.load('meteor')results = meteor.compute(predictions=predictions, references=references)print(results)

{'meteor': 0.19316493313521543}

我被承诺了新的东西!

虽然我吸引了你的注意,但我想介绍一个新的想法。尽管这四个算法可以给你一个可量化的分数,让你的质量保证团队能够快速确定一个答案/摘要是否相似,但仍然存在一些缺点。

首先,参考句子和结果可能足够相似以回答用户的问题,但仍然会得到较低的分数。重要的是运行一组已知的问题和答案来建立一个良好的基准,并将未来的答案与该基准进行比较。

其次,它并不能告诉你为什么分数低。是因为重复单词受到了惩罚吗?是因为有些单词丢失了吗?总的摘要是否完全省略了一个重要的答案部分?这是无法得知的。

最后,仅仅因为一个回答得到了较低的分数,并不一定意味着人类会认为答案不足或不正确。这里的基准可能有帮助,以建立什么样的分数是可接受的,但在使用这些来判断RAG答案时,保持一定的怀疑是很重要的。

LLMs评分LLMs

BLEURT给我们带来了一个想法,即我们可以以某种方式使用LLMs来评估RAG系统的答案。如果我们直接利用这一点呢?我们指示一个LLM给出我们的答案的定性分数,并提供分数分配的项目列表和叙述性解释。这样我们就可以兼顾两者:我们可以提取一个数值分数向用户和质量保证报告,并且我们还可以提供更多关于为什么答案得分低的细节。

下面是一个可以用于ClaudeV2的样本提示模板。我们传入关于我们希望模型对我们的答案评分的指示,传入参考数据,并传入从RAG系统接收到的答案。

prompt_data = """人类:您需要为给定文本的摘要评分,评分范围为0-10,0表示完全不正确,10表示完美的摘要。解释为什么给出该分数。给出主要差异的项目列表,这些差异是参考文本和摘要之间的主要差异。通过使用REF:指示参考文本,通过使用SUMMARY:指示进行比较的摘要。REF:五个基本的彩色龙(红色、蓝色、绿色、黑色和白色)和金属龙(铜色、黄铜、银色、黄金和青铜)出现在第五版怪物手册(2014)中,其包括幼龙、幼年、成年和古代龙。宝石龙和其他新的第五版龙出现在Fizban's Treasury of Dragons(2021)中SUMMARY:在龙与地下城中,金属龙有黄铜、青铜、铜、金和银等多种品种。每种品种的鳞片的色调与其名称相匹配,例如黄铜龙有黄铜色的鳞片,青铜龙有青铜色的鳞片等。金属龙比龙与地下城传说中的彩色龙更加温和.助手:"""

得分: 5/10解释:摘要涵盖了关于龙与地下城中金属龙的一些准确的高级信息,比如列出主要类型并指出它们与彩色龙相比更加温和的性质。然而,它遗漏了参考文本中许多关键细节:- 没有提到被描述的彩色龙(红色、蓝色、绿色、黑色、白色)。- 没有提到不同的年龄阶段(幼龙、幼年、成年、古代)。- 没有提到怪物手册或Fizban's Treasury of Dragons这两本参考书。- 只关注金属龙,而参考文本中有关金属龙和彩色龙的信息。主要差异:- 没有提到彩色龙- 没有提到龙的年龄阶段- 没有提到怪物手册或Fizban's Treasury of Dragons- 只讨论了金属龙,没有涵盖参考文本的全部范围- 没有传达龙在第五版书籍中的引入时间线

我们在这里。如果团队能提供预期的答案,我们可以将RAG答案反馈到一个LLM中进行评分。好处是,我们不必依赖LLM的先验知识,因为我们仍然将相关数据输入其中。我们可以使用不同的LLM来评分我们的输出,这意味着我们甚至可以要求多个模型对我们的输出进行评分,以确保我们有一个平衡的评估。

这种方法还可以给我们一个关于错在哪里的很好的解释。在这个例子中,我问了一个关于DND宇宙中存在哪些种类的龙的问题。判断LLM正确地指出它没有提到有色龙。然而,它还因为没有包括龙的年龄、DND怪物手册或扩展冒险而对答案进行了处理。这些遗漏对我提出的问题并不重要,但这让QA团队可以自行决定。

我们现在该怎么办?

以RAG为基础的系统和用于创建这些系统的框架每天都在进步。相应地,用于评分的新方法和机制也将不断进步。甚至有来自诸如LangChain之类的巨头提供的工具,比如LangSmith

在等待更多进展的同时,结合一些手动验证数据和HuggingFace度量库或LLM本身,可以为我们开始信任这些系统提供一个很好的方式。

记住,一旦你有了信心并准备将新的RAG投入生产使用,对答案的评估并不会停止!作为例行监测和审计工作的一部分,您必须继续存储问题和答案,并计划进行人为干预来对向最终用户提供的答案进行评分和标记。然而,这是另一个话题。