CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
LLM Evaluation
什么是 LLM 评估 metrics
大模型评估比如答案正确性, 语义相似度, 幻觉等, metrics 就是你关心的任何大模型的系统输出以分数形式呈现,用于量化大模型性能
常见的评估维度
- 答案相关性
- 正确性
- 幻觉
- 上下文相关性
- 安全指标
- 特定任务指标
举例来说,如果你的LLM任务是总结页面 你的指标要依据
- 是否总结内容包含了足够的原文信息
- 是否包含了矛盾和幻觉信息
更进一步, 如果是基于 RAG 架构的,你需要对检索质量也要评估
好的评估标准如下
- 可量化
- 可靠
- 准确
评估标准的不同的计算方式
统计分数
统计分数在推理和LLM评估面前极其不准确
下面简单过一下
- BLEU(双语评估代理)评分器评估你的LLM应用程序的输出与注释真值(或预期输出)的匹配程度。它计算LLM输出和预期输出之间每个匹配的n-gram(连续的n个词)的精确度,以计算它们的几何平均值,并在需要时应用简洁性惩罚。
- ROUGE(用于摘要评估的召回导向代理)评分器主要用于评估来自NLP模型的文本摘要,并通过比较LLM输出和预期输出之间n-gram的重叠来计算召回率。它确定参考中存在于LLM输出中的n-gram的比例(0-1)。
- METEOR(显式排序的翻译评估指标)评分器更为全面,因为它通过评估LLM输出和预期输出之间的精确度(n-gram匹配)和召回率(n-gram重叠),并调整单词顺序差异来计算分数。它还利用WordNet等外部语言数据库来解释同义词。最终得分是精确度和召回率的谐波平均值,并对排序差异进行惩罚。
- Levenshtein距离(或编辑距离,你可能将其识别为LeetCode难题中的动态规划问题)评分器计算将一个单词或文本字符串更改为另一个所需的最少单字符编辑(插入、删除或替换)次数,这对于评估拼写更正或其他需要精确字符对齐的任务非常有用。
由于纯粹的统计得分手几乎没有考虑任何语义,并且具有极为有限的推理能力,因此它们不够准确,无法评估通常长而复杂的LLM输出。
基于模型的评估
这不应该是一个意外,但基于非LLM的评分器表现不如LLM-Evals,这也是由于前面提到的统计评分器相同的原因。非LLM评分器包括:
- NLI评分器,它使用自然语言推理模型(这是一种NLP分类模型)来分类LLM输出与给定参考文本在逻辑上是否一致(蕴含)、矛盾还是不相关(中性)。评分通常在蕴含(值为1)和矛盾(值为0)之间,提供逻辑连贯性的度量。
- BLEURT(使用来自Transformers的表示的双语评估代理)评分器,它使用像BERT这样的预训练模型来对LLM输出进行评分。
除了评分不一致之外,现实是这些方法存在几个缺点。例如,NLI评分器在处理长文本时也可能在准确性上遇到困难,而BLEURT则受到其训练数据质量和代表性的限制。
目前只讨论LLM的评估
G-Eval
G-Eval首先使用思维链(CoTs)生成一系列评估步骤,然后使用生成的步骤通过表单填充范式确定最终得分(这只是说G-Eval需要几个信息片段来工作的一种花哨说法)。例如,使用G-Eval评估LLM输出的一致性涉及构建一个包含评估标准和要评估的文本的提示,以生成评估步骤,然后使用LLM根据这些步骤输出一个1到5的分数。
让我们通过这个例子来运行G-Eval算法。首先,生成评估步骤:
- 向你选择的 LLM 引入一个评估任务(例如,根据一致性给这个输出打1-5分)
- 为你的标准下定义(例如,“一致性——实际输出中所有句子的集体质量”。)
(注意,在原始的 G-Eval 论文中,作者只使用了 GPT-3.5 和 GPT-4 进行实验,我个人尝试了不同的 LLM 进行 G-Eval,我强烈建议你使用这些模型。)
生成一系列评估步骤后:
- 通过将评估步骤与你评估步骤中列出的所有参数拼接在一起来创建一个提示(例如,如果你想评估LLM输出的连贯性,LLM输出将是一个必需的参数。)
- 在提示的最后,要求它生成一个1-5之间的分数,其中5比1好。
- (可选)取LLM输出令牌的概率来规范化分数,并将它们的加权求和作为最终结果。
第3步是可选的,因为要获取输出令牌的概率,您需要访问原始模型嵌入,而这并不是所有模型接口都保证可用的。然而,这一步骤在论文中被引入,因为它提供了更细粒度的分数,并最小化了LLM评分中的偏差(正如论文中所说,3在1-5的刻度上具有更高的令牌概率)。
以下是论文中的结果,展示了G-Eval如何胜过本文前面提到的所有传统、非LLM评估方法:
Prometheus
Prometheus是一个完全开源的LLM,当提供适当的参考资料(参考答案、评分标准)时,其评估能力可与GPT-4相媲美。它也像G-Eval一样,与具体用例无关。Prometheus是一个使用Llama-2-Chat作为基础模型并针对反馈收集中的100K反馈(由GPT-4生成)进行微调的语言模型。 以下是Prometheus研究论文的简要结果。
- 虽然G-Eval是一个使用GPT-3.5/4的框架,但Prometheus是一个为评估而微调的LLM。
- 虽然G-Eval通过CoTs生成评分标准/评估步骤,但Prometheus的评分标准是在提示中提供的。
- Prometheus需要参考/示例评估结果。
融合统计和模型分数
到目前为止,我们已经看到了统计方法虽然可靠但不够准确,以及非LLM模型基础方法虽然可靠性较低但更准确的情况。与上一节类似,还有一些非LLM评分器,例如:
- BERTScore评分器,它依赖于像BERT这样的预训练语言模型,并计算参考文本中的单词的上下文嵌入与生成文本中的单词的余弦相似性。然后这些相似性被汇总以产生一个最终分数。较高的BERTScore表明LLM输出与参考文本之间的语义重叠程度更大。
- MoverScore评分器,它首先使用嵌入模型,特别是像BERT这样的预训练语言模型,为参考文本和生成文本获取深度上下文化单词嵌入,然后使用所谓的地球移动者距离(EMD)来计算将LLM输出中的单词分布转换为参考文本中单词分布所需支付的最小成本。
BERTScore和MoverScore评分器都因为依赖于像BERT这样的预训练模型的上下文嵌入而容易受到上下文意识和偏差的影响。那么LLM-Evals呢?
GPTScore
与直接使用表单填充范式执行评估任务的G-Eval不同,GPTScore使用生成目标文本的条件概率作为评估指标。
SelfCheckGPT
SelfCheckGPT是一个独特的方法。它是一种简单基于采样的方法,用于事实核查LLM输出。它假设虚构的输出是不可复现的,而如果一个LLM具有某个给定概念的知识,那么样本响应很可能是相似的,并且包含一致的事实。
SelfCheckGPT是一个有趣的方法,因为它使检测虚构成为一个无需参考的过程,这在生产环境中非常有用。
只适用于幻觉检测
QAG Score
QAG(问答生成)分数是一个利用LLMs的高推理能力来可靠评估LLM输出的评分器。它使用答案(通常是一个“是”或“否”)来回答封闭式问题(可以生成或预设)来计算最终的指标分数。它是可靠的,因为它不使用LLMs直接生成分数。例如,如果您想计算忠实度(衡量LLM输出是否是虚构的)的分数,您会:
- 使用LLM提取LLM输出中提出的所有声明。
- 对于每个声明,询问真实情况是否同意(“是”)或不同意(“否”)该声明。 所以对于这个例子的LLM输出:
选择你的评估标准
取决于使用案例和模型应用架构
比如用 RAG
考虑
Faithfulness, Answer Relevancy, Contextual Precision
RAG Metrics
事实上, RAG 指标最初被设计为无参考的指标,这意味着它们不需要标注答案,即使在生产环境中也可用。
Faithfulness
忠实度是一个用来检查LLM生成的内容是否与原始信息一致的指标。QAG评分器是完成这个任务的最佳工具,因为它能很好地处理目标明确的评估工作。 使用QAG评分器来衡量忠实度的步骤如下:
- 用LLM找出输出中的所有声明(也就是它说的所有事情)。
- 对于每个声明,看看它是否与检索到的信息一致。这里的问题就像是:“这个声明和原文说的一样吗?”
- 把所有真实(或可能真实)的声明加起来,然后除以总数,得到一个百分比。这就是忠实度分数。 这种方法很准确,因为它利用了LLM的强大推理能力,而且不会因为LLM直接给出分数而产生误导。
Answer Relevancy
答案相关性是一个RAG指标,用于评估您的RAG生成器是否输出了精确的答案,可以通过确定LLM输出中与输入相关的句子比例来计算(即,将相关句子的数量除以总句子数量)。
构建一个健壮的答案相关性指标的关键是要考虑检索上下文,因为额外的上下文可能证明一个看似不相关的句子的相关性。以下是答案相关性指标的一个实现:
from deepeval.metrics import AnswerRelevancyMetric
from deepeval.test_case import LLMTestCase
test_case=LLMTestCase(
input="...",
actual_output="...",
retrieval_context=["..."]
)
metric = AnswerRelevancyMetric(threshold=0.5)
metric.measure(test_case)
print(metric.score)
print(metric.reason)
print(metric.is_successful())
我们用QAG评估所有 RAG 指标
Contextual Precision
上下文精确度是一个RAG指标,用于评估您的RAG管道检索器的质量。当我们谈论上下文指标时,我们主要关注的是检索上下文的相关性。较高的上下文精确度分数意味着在检索上下文中相关的节点排名高于不相关的节点。这很重要,因为LLMs会给予检索上下文中较早出现的节点中的信息更多的权重,这会影响最终输出的质量。
Contextual Recall
上下文召回率是评估检索增强生成器(RAG)的一个附加指标。它是通过确定检索上下文中的句子在预期输出或真实值中的比例来计算的。较高的分数表示检索到的信息与预期输出之间的一致性更高,这表明检索器有效地提供了相关且准确的内容,以帮助生成器产生上下文适当的响应。
Contextual Relevancy
字面意思,句子相关性
微调指标
幻觉
一些你们可能会认出这和忠实度指标是一样的。虽然相似,但在微调中的虚构更加复杂,因为很难确定给定输出的确切真实情况。为了解决这个问题,我们可以利用SelfCheckGPT的零样本方法来采样LLM输出中虚构句子的比例。
毒性
毒性指标评估文本包含令人反感,有害或不适当的语言的程度。使用BERT scorer 的排毒等现成的预训练模型可用于评分毒性。
但是,这种方法可能是不准确的,因为“与宣誓,侮辱或亵渎相关的词在评论中存在,无论作者的基调或意图如何,都可能被归类为有毒的词。幽默/自嘲”。
在这种情况下,您可能需要考虑使用G-eval而不是定义毒性的自定义标准。实际上,G-eval的用例不可知论我非常喜欢它的主要原因
bias
偏见度量评估了文本内容中的政治,性别和社会偏见等方面。这对于涉及决策过程的自定义LLM的应用程序尤为重要。例如,以公正的建议或招聘方面的帮助,协助银行贷款批准,在该贷款中,它可以协助确定是否应入围候选人进行面试。
与毒性类似,可以使用G-eval评估偏差。(但是不要误会我的意思,QAG也可能是毒性和偏见等指标的可行得分手。)
偏见是一种高度主观的物质,在不同的地理,地缘政治和地年代环境中有很大变化。例如,在一种文化中被认为是中性的语言或表达可能会在另一种文化中带有不同的含义。(这也是为什么很少有射击评估对偏见不利的原因。)
一个潜在的解决方案是调整自定义LLM以进行评估或为文化学习提供极为明确的专栏,因此,我认为偏见是所有人最难实施的指标。
特定用例指标
Summarization
所有好的摘要都应该:
与原文事实上一致。 包含原文的重要信息。