AI工程——评估方法论

177 阅读1小时+

随着人工智能的使用越来越广泛,其发生灾难性故障的机会也随之增加。在基础模型问世的短短时间里,我们已经看到许多失败。有人在聊天机器人鼓励下自杀;律师提交了由人工智能虚构的虚假证据;加拿大航空被判支付赔偿金,因为其人工智能聊天机器人向乘客提供了错误的信息。如果没有有效的质量控制方法来监控人工智能的输出,人工智能的风险可能会超过其在许多应用中的好处。

随着团队急于采用人工智能,许多人很快意识到,将人工智能应用转化为现实的最大障碍是评估。对于某些应用,评估问题可能占据开发工作的大部分精力。

由于评估的重要性和复杂性,本书有两章专门讲述评估方法。本章将介绍用于评估开放性模型的不同评估方法,这些方法的工作原理以及它们的局限性。下一章将重点讨论如何利用这些方法为您的应用选择模型,并构建评估管道来评估您的应用。

尽管我在本书中专门讨论了评估问题,但评估必须在整个系统的背景下进行考虑,而不是孤立进行。评估旨在减少风险并发现机会。为了减少风险,您首先需要识别系统可能失败的地方,并围绕这些问题设计评估。通常,这可能需要重新设计系统,以增强对其失败的可见性。没有明确了解系统失败的地方,任何评估指标或工具都无法使系统变得稳健。

在深入探讨评估方法之前,必须承认评估基础模型的挑战。由于评估困难,许多人选择听信口碑(例如,有人说模型X不错)或通过肉眼观察结果。这会带来更多的风险,并拖慢应用的迭代进程。相反,我们需要投资于系统化评估,以使结果更加可靠。

由于许多基础模型都包含语言模型组件,本章将简要概述用于评估语言模型的指标,包括交叉熵和困惑度。这些指标对于指导语言模型的训练和微调至关重要,并且在许多评估方法中被广泛使用。

评估基础模型尤其具有挑战性,因为它们是开放性的,我将在本章中介绍如何应对这些挑战的最佳实践。使用人工评估者仍然是许多应用的必要选项。然而,鉴于人工标注的速度慢且成本高,目标是实现过程的自动化。本书重点讨论自动评估,包括精确评估和主观评估。

主观评估的明星方法是人工智能作为评判者——即使用人工智能来评估人工智能的回答。这是主观的,因为评分取决于人工智能评判者使用的模型和提示。尽管这种方法在业内获得了快速的关注,但也引发了激烈的反对,反对者认为人工智能还不足以承担这一重要任务。我特别期待深入讨论这个话题,希望你也能感兴趣。

评估基础模型的挑战

评估机器学习模型一直是一个困难的任务。随着基础模型的引入,评估变得更加复杂。评估基础模型比评估传统机器学习模型更具挑战性,原因有多个。

首先,人工智能模型越智能,评估它们就越困难。大多数人能判断一个小学生的数学解答是否错误,但很少有人能做出同样的判断对于博士级别的数学解答。如果一本书的总结是胡言乱语,很容易判断它不好,但如果总结是连贯的,就很难做出判断。为了验证总结的质量,可能需要先阅读这本书。这引出了一个推论:对于复杂任务,评估可能会耗费更多时间。你不再仅仅基于某个回答的表面感受来评估它。你还需要进行事实核查、推理,甚至融入领域专业知识。

其次,基础模型的开放性特征削弱了传统的基于真实标准评估模型的方法。对于传统的机器学习,绝大多数任务是封闭的。例如,分类模型只能在预期类别中输出。评估分类模型时,可以将其输出与预期输出进行对比。如果预期输出是类别X,但模型输出的是类别Y,那么模型就是错误的。然而,对于开放性任务来说,给定一个输入,可能有许多正确的回答。无法列出一个全面的正确输出列表进行对比。

第三,大多数基础模型被视为黑箱,要么是因为模型提供者选择不公开模型的细节,要么是因为应用开发者缺乏理解这些细节的专业知识。模型架构、训练数据和训练过程等细节可以揭示模型的优势和劣势。没有这些细节,你只能通过观察模型的输出进行评估。

与此同时,公开的评估基准已被证明不足以评估基础模型。理想的评估基准应当能够捕捉模型能力的全貌。随着人工智能的发展,基准需要不断进化以跟上其步伐。当一个模型取得完美成绩时,基准就会饱和。对于基础模型来说,基准已经迅速饱和。GLUE(通用语言理解评估)基准于2018年发布,并在短短一年内达到饱和,迫使2019年推出SuperGLUE。同样,NaturalInstructions(2021)被Super-NaturalInstructions(2022)取代。MMLU(2020),许多早期基础模型依赖的强基准,已经大部分被MMLU-Pro(2024)取代。

最后但同样重要的是,评估的范围已经扩展到通用模型。对于特定任务的模型,评估仅涉及衡量模型在其训练任务上的表现。然而,对于通用模型,评估不仅仅是评估模型在已知任务上的表现,还包括发现模型可以执行的新任务,这些任务可能超越人类的能力。评估承担了探索人工智能潜力和局限性的额外责任。

好消息是,评估的新挑战促使了许多新的方法和基准的出现。如图3-1所示,2023年上半年关于大语言模型(LLM)评估的论文数量呈指数增长,从每月2篇增长到接近35篇。

image.png

在我对GitHub上排名前1,000的与人工智能相关的仓库进行分析时(按星标数量排序),我发现有超过50个仓库专注于评估(截至2024年5月)。当将这些评估仓库按创建日期绘制成图时,其增长曲线呈指数型,如图3-2所示。

坏消息是,尽管对评估的关注有所增加,但在人工智能工程管道的其他部分,评估的关注度仍然滞后。DeepMind的Balduzzi等人在他们的论文中指出,“与开发算法相比,评估的开发几乎没有受到系统性的关注。”根据论文,实验结果几乎专门用于改进算法,而很少用于改进评估。鉴于评估领域缺乏投资,Anthropic呼吁政策制定者增加政府资金和资助,以支持开发新的评估方法和分析现有评估的稳健性。

image.png

为了进一步展示评估领域的投资如何滞后于人工智能其他领域,评估工具的数量相较于建模、训练和人工智能协调工具的数量较少,如图3-3所示。

投资不足导致基础设施不完善,使得人们难以进行系统化的评估。当我询问他们如何评估人工智能应用时,许多人告诉我,他们只是凭肉眼判断结果。许多人有一小套常用的提示语,用于评估模型。收集这些提示语的过程是临时的,通常基于策划者的个人经验,而不是基于应用的需求。当你刚开始做一个项目时,采用这种临时的方法或许能应付过去,但它不足以支持应用的迭代。本书专注于一种系统化的评估方法。

image.png

理解语言建模指标

基础模型是从语言模型演变而来的。许多基础模型仍然以语言模型作为其主要组件。对于这些模型,语言模型组件的表现往往与基础模型在下游应用中的表现高度相关(Liu 等,2023)。因此,对语言建模指标的基本理解对于理解下游性能非常有帮助。

如第一章所述,语言建模已经有几十年的历史,克劳德·香农在1951年的论文《Printed English的预测与熵》中使其广为人知。自那时以来,用于指导语言模型开发的指标变化不大。大多数自回归语言模型是使用交叉熵或其相对指标——困惑度进行训练的。在阅读论文和模型报告时,你也可能遇到“每字符比特数”(BPC)和“每字节比特数”(BPB);这两者都是交叉熵的变体。

这四个指标——交叉熵、困惑度、BPC和BPB——是密切相关的。如果你知道其中一个的值,凭借必要的信息,你可以计算出其他三个指标。虽然我将它们称为语言建模指标,但它们也可以用于任何生成标记序列的模型,包括非文本标记。

回想一下,语言模型对语言的统计信息(即给定上下文中某个标记出现的可能性)进行编码。从统计学上讲,给定上下文“I like drinking __”,下一个词更可能是“tea”而不是“charcoal”。模型能够捕捉到的统计信息越多,它对下一个标记的预测就越准确。

在机器学习术语中,语言模型学习的是其训练数据的分布。这个模型学习得越好,它就越能够预测训练数据中的下一个内容,训练交叉熵也就越低。与任何机器学习模型一样,你关心的不仅仅是模型在训练数据上的表现,更重要的是它在生产数据上的表现。一般来说,你的数据越接近模型的训练数据,模型在你数据上的表现就越好。

与本书其他部分相比,本节内容涉及较多的数学。如果你觉得这些数学公式有些混乱,可以跳过数学部分,专注于如何解读这些指标的讨论。即使你不进行语言模型的训练或微调,理解这些指标也能帮助你评估哪些模型适合你的应用。这些指标有时也可以用于某些评估和数据去重技术,这些内容将在本书中不断讨论。

熵衡量的是一个标记平均携带多少信息。熵越高,每个标记携带的信息就越多,表示一个标记所需的比特数也就越多。

让我们用一个简单的例子来说明这一点。假设你想创造一种语言来描述方形区域内的位置,如图3-4所示。如果你的语言只有两个标记,如图3-4中的(a),每个标记可以告诉你该位置是上半部分还是下半部分。由于只有两个标记,一个比特就足以表示它们。因此,这种语言的熵是1。

image.png

如果你的语言有四个标记,如图3-4中的(b),每个标记可以给你一个更具体的位置:上左、上右、下左或下右。然而,由于现在有四个标记,你需要两个比特来表示它们。这种语言的熵是2。这个语言的熵更高,因为每个标记携带更多的信息,但每个标记需要更多的比特来表示。

直观地说,熵衡量的是在语言中预测下一个标记的难度。语言的熵越低(标记携带的信息越少),该语言就越可预测。在我们之前的例子中,只有两个标记的语言比四个标记的语言更容易预测(你只需要从两个可能的标记中进行预测,而不是四个)。这类似于,如果你能完全预测我接下来会说什么,那么我说的话就不再包含新的信息。

交叉熵

当你在一个数据集上训练语言模型时,你的目标是让模型学习该训练数据的分布。换句话说,你的目标是让模型预测训练数据中接下来会发生什么。语言模型在一个数据集上的交叉熵衡量的是模型预测该数据集中接下来内容的难度。

一个模型在训练数据上的交叉熵取决于两个因素:

  1. 训练数据的可预测性,通过训练数据的熵来衡量;
  2. 语言模型捕捉到的分布与训练数据真实分布的偏离程度。

熵和交叉熵使用相同的数学符号H。设P为训练数据的真实分布,Q为语言模型学习到的分布。因此,以下关系成立:

  • 训练数据的熵是H(P)。
  • Q相对于P的偏离程度可以通过Kullback-Leibler(KL)散度来衡量,数学上表示为D_KL(P || Q)。

因此,模型在训练数据上的交叉熵是: H(P, Q) = H(P) + D_KL(P || Q)。

交叉熵不是对称的。Q相对于P的交叉熵H(P, Q)与P相对于Q的交叉熵H(Q, P)是不同的。

语言模型的训练目标是最小化其相对于训练数据的交叉熵。如果语言模型从训练数据中完美学习,那么模型的交叉熵将与训练数据的熵完全相同。此时,Q相对于P的KL散度将为0。你可以将模型的交叉熵视为其对训练数据熵的近似。

每字符比特数和每字节比特数

熵和交叉熵的单位是比特。如果一个语言模型的交叉熵是6比特,那么该语言模型需要6比特来表示每个标记。

由于不同的模型有不同的标记化方法——例如,一个模型使用单词作为标记,而另一个模型使用字符作为标记——因此每个标记所需的比特数在不同模型之间不可直接比较。为了解决这个问题,一些模型使用每字符比特数(BPC)。例如,如果每个标记所需的比特数是6,并且每个标记平均由2个字符组成,那么BPC就是6/2 = 3。

BPC的一个问题在于字符编码方案的不同。例如,在ASCII编码中,每个字符使用7个比特进行编码,而在UTF-8中,一个字符可以使用8到32个比特之间的任意值进行编码。一个更标准的度量是每字节比特数(BPB),即一个语言模型表示原始训练数据中一个字节所需的比特数。如果BPC是3,并且每个字符是7比特,或者说是⅞个字节,那么BPB就是3 / (⅞) = 3.43。

交叉熵告诉我们一个语言模型在压缩文本时的效率。如果一个语言模型的BPB是3.43,这意味着它可以使用3.43比特表示原始的每个字节(8比特),那么该语言模型可以将原始训练文本压缩到原文本大小的一半以下。

困惑度

困惑度是熵和交叉熵的指数。困惑度通常缩写为PPL。给定一个数据集,假设其真实分布为P,则其困惑度定义为: PPL(P)=2H(P)\text{PPL}(P) = 2^{H(P)}PPL(P)=2H(P)

如果一个语言模型(学习到的分布为Q)在该数据集上的交叉熵为 H(P,Q)H(P, Q)H(P,Q),则其困惑度定义为: PPL(P,Q)=2H(P,Q)\text{PPL}(P, Q) = 2^{H(P, Q)}PPL(P,Q)=2H(P,Q)

如果交叉熵衡量的是模型预测下一个标记的难度,困惑度衡量的是模型在预测下一个标记时的不确定性。较高的不确定性意味着下一个标记有更多的可能选项。

考虑一个完美训练的语言模型,用来编码图3-4(b)中的4个位置标记。这个语言模型的交叉熵是2比特。如果该语言模型尝试预测方块中的一个位置,它必须在4个可能选项中做出选择。因此,这个语言模型的困惑度是4。

到目前为止,我一直使用比特作为熵和交叉熵的单位。每个比特可以表示2个唯一的值,因此在上述困惑度方程中使用了2为底。

包括TensorFlow和PyTorch在内的流行机器学习框架使用nat(自然对数)作为熵和交叉熵的单位。Nat使用的是e为底的自然对数。如果使用nat作为单位,则困惑度是e的指数: PPL(P,Q)=eH(P,Q)\text{PPL}(P, Q) = e^{H(P, Q)}PPL(P,Q)=eH(P,Q)

由于比特和nat之间的混淆,许多人在报告语言模型的性能时报告困惑度,而不是交叉熵。

困惑度的解释与应用场景

如前所述,交叉熵、困惑度、每字符比特数(BPC)和每字节比特数(BPB)是衡量语言模型预测准确度的变体。模型能够越准确地预测文本,这些指标就越低。在本书中,我将使用困惑度作为默认的语言建模指标。请记住,模型在预测给定数据集接下来会发生什么时,模型的不确定性越大,困惑度就越高。

什么样的困惑度值被认为是好的,取决于数据本身以及困惑度计算的具体方式,例如模型可以访问多少个前置标记。以下是一些通用规则:

  • 更有结构的数据,预期的困惑度更低
    更有结构的数据更容易预测。例如,HTML代码比日常文本更易预测。如果你看到一个HTML标签如 <head>,你可以预测附近应该有一个闭合标签 </head>。因此,在HTML代码上训练的模型的预期困惑度应低于在日常文本上的预期困惑度。
  • 词汇量越大,困惑度越高
    直观地讲,可能的标记越多,模型预测下一个标记就越难。例如,模型在儿童书籍上的困惑度可能低于同一个模型在《战争与和平》上的困惑度。对于同一个数据集(例如英语),基于字符的困惑度(预测下一个字符)通常会低于基于单词的困惑度(预测下一个单词),因为可能的字符数量比可能的单词数量要少。
  • 上下文长度越长,困惑度越低
    模型拥有的上下文越多,它预测下一个标记时的不确定性就越低。1951年,克劳德·香农通过使用最多10个前置标记来预测下一个标记,从而评估了他模型的交叉熵。到目前为止,模型的困惑度通常可以基于500到10,000个前置标记来计算,甚至更多,上限由模型的最大上下文长度决定。

作为参考,困惑度值低至3或更低并不罕见。如果一个假设语言中的所有标记发生的概率相等,那么困惑度为3意味着该模型有三分之一的机会正确预测下一个标记。考虑到模型的词汇量通常在10,000到100,000之间,这个概率是相当惊人的。

除了指导语言模型的训练,困惑度在人工智能工程工作流的许多部分也非常有用。首先,困惑度是模型能力的良好代理。如果一个模型在预测下一个标记方面表现不佳,那么它在下游任务中的表现也很可能不好。OpenAI的GPT-2报告显示,更大的模型,也就是更强大的模型,在一系列数据集上始终能给出更低的困惑度,如表3-1所示。遗憾的是,随着公司对其模型越来越保密,许多公司已经停止报告其模型的困惑度。

表3-1. 更大的GPT-2模型在不同数据集上的困惑度始终较低。来源:OpenAI,2018。

模型LAMBADA (PPL)LAMBADA (ACC)CBT-CN (ACC)CBT-NE (ACC)WikiText2 (PPL)PTB (PPL)enwiki8 (BPB)text8 (BPC)WikiText103 (PBL)IBW (PPL)
SOTA99.859.2385.782.339.1446.540.991.0818.321.8
117M35.1345.9987.6583.429.4165.851.161.1737.5075.20
345M15.6055.4892.3587.122.7647.331.011.0626.3755.72
762M10.8760.1293.4588.019.9340.310.971.0222.0544.575
1542M8.6363.2493.3089.0518.3435.760.930.9817.4842.16

警告
困惑度可能不是评估经过后期训练(如SFT和RLHF)模型的最佳代理。后期训练的目的是教模型如何完成任务。随着模型在完成任务方面变得更好,它在预测下一个标记方面的表现可能会变差。经过后期训练后,语言模型的困惑度通常会增加。有人认为后期训练会“压缩”熵。同样,量化技术——一种减少模型数值精度并因此减少内存占用的技术——也可能会以意想不到的方式改变模型的困惑度。

回想一下,模型相对于文本的困惑度衡量的是该模型预测该文本的难度。对于给定的模型,困惑度在模型在训练中看到并记住的文本上是最低的。因此,困惑度可以用来检测文本是否在模型的训练数据中。这对于检测数据污染非常有用——如果模型在基准数据上的困惑度很低,那么这个基准很可能包含在模型的训练数据中,从而使得模型在该基准上的表现不那么可信。这也可以用于训练数据去重:例如,只有当新数据的困惑度较高时,才将其添加到现有的训练数据集中。

困惑度对于不可预测的文本(如表达异常思想的文本,例如“我的狗在空闲时间教授量子物理学”或胡言乱语的文本,例如“home cat go eye”)是最高的。因此,困惑度可以用来检测异常文本。

困惑度及其相关指标帮助我们理解基础语言模型的表现,而这又是理解模型在下游任务中表现的一个代理。本章的其余部分将直接讨论如何衡量模型在下游任务中的表现。

如何使用语言模型计算文本的困惑度

一个模型相对于文本的困惑度衡量的是模型预测该文本的难度。给定一个语言模型X和一系列标记 [x1,x2,…,xn][x_1, x_2, \dots, x_n][x1​,x2​,…,xn​],X在该序列上的困惑度为:

P(x1,x2,…,xn)−1/n=(1P(x1,x2,…,xn))1/n=(∏i=1n1P(xi∣x1,…,xi−1))1/nP(x_1, x_2, \dots, x_n)^{-1/n} = \left( \frac{1}{P(x_1, x_2, \dots, x_n)} \right)^{1/n} = \left( \prod_{i=1}^{n} \frac{1}{P(x_i | x_1, \dots, x_{i-1})} \right)^{1/n}P(x1​,x2​,…,xn​)−1/n=(P(x1​,x2​,…,xn​)1​)1/n=(i=1∏n​P(xi​∣x1​,…,xi−1​)1​)1/n

其中,P(xi∣x1,…,xi−1)P(x_i | x_1, \dots, x_{i-1})P(xi​∣x1​,…,xi−1​) 表示在给定前面标记 x1,…,xi−1x_1, \dots, x_{i-1}x1​,…,xi−1​ 的情况下,模型X为标记 xix_ixi​ 分配的概率。

要计算困惑度,您需要访问语言模型为每个下一个标记分配的概率(或对数概率)。不幸的是,并非所有商业模型都会公开它们模型的对数概率,正如第二章所讨论的那样。

精确评估

在评估模型性能时,区分精确评估和主观评估非常重要。精确评估能够产生明确无歧义的判断。例如,如果多项选择题的答案是A,而你选择了B,那么你的答案是错误的。这一点没有任何歧义。另一方面,作文评分是主观的。一篇文章的得分取决于谁来评分。同一个人如果被要求在不同时刻评分,同一篇文章可能会得到不同的分数。通过明确的评分标准,作文评分可以变得更加精确。正如你将在下一节看到的,人工智能作为评判者是主观的。评估结果会根据评判模型和提示的不同而有所变化。

我将介绍两种可以产生精确分数的评估方法:功能正确性和与参考数据的相似度度量。请注意,本节重点讨论的是评估开放性回答(任意文本生成),而不是封闭性回答(如分类)。这并不是因为基础模型不用于封闭性任务。实际上,许多基础模型系统至少具有一个分类组件,通常用于意图分类或评分。本节重点讨论开放性评估,因为封闭性评估已经被很好地理解。

功能正确性

功能正确性评估是根据系统是否执行预期功能来评估其表现。例如,如果你要求一个模型创建一个网站,那么生成的网站是否符合你的要求?如果你要求模型在某个餐厅进行预定,模型是否成功?

功能正确性是评估任何应用程序性能的终极指标,因为它衡量的是你的应用程序是否实现了预定目标。然而,功能正确性并不总是容易衡量的,而且其测量通常不能轻松自动化。

代码生成是一个可以自动化功能正确性测量的任务例子。在编程中,功能正确性有时表现为执行准确性。例如,如果你要求模型编写一个Python函数gcd(num1, num2),用于计算两个数字num1num2的最大公约数。生成的代码可以输入到Python解释器中,检查代码是否有效,并且如果有效,是否能输出给定的(num1, num2)对的正确结果。例如,给定(num1=15, num2=20),如果gcd(15, 20)没有返回5(正确答案),那么可以确定该函数是错误的。

在人工智能用于编写代码之前,自动验证代码的功能正确性在软件工程中已经是标准做法。代码通常通过单元测试进行验证,代码会在不同场景下执行,以确保生成预期的输出。功能正确性评估就是像LeetCode和HackerRank这样的编程平台验证提交解决方案的方式。

用于评估AI代码生成能力的流行基准,如OpenAI的HumanEval和Google的MBPP(主要是基础Python问题数据集),也使用功能正确性作为其评估标准。文本到SQL(从自然语言生成SQL查询)的基准,如Spider(Yu等,2018)、BIRD-SQL(大规模数据库基础文本到SQL评估基准)(Li等,2023)和WikiSQL(Zhong等,2017)也依赖于功能正确性。

一个基准问题通常带有一组测试用例。每个测试用例包括一个代码应运行的场景和该场景的预期输出。以下是HumanEval中的问题及其测试用例示例:

问题

from typing import List

def has_close_elements(numbers: List[float], threshold: float) -> bool:
      """检查给定数字列表中是否有任何两个数字彼此接近于给定的阈值。"""
      >>> has_close_elements([1.0, 2.0, 3.0], 0.5) 
      False
      >>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3) 
      True

测试用例(每个assert语句代表一个测试用例)

def check(candidate):
      assert candidate([1.0, 2.0, 3.9, 4.0, 5.0, 2.2], 0.3) == True
      assert candidate([1.0, 2.0, 3.9, 4.0, 5.0, 2.2], 0.05) == False
      assert candidate([1.0, 2.0, 5.9, 4.0, 5.0], 0.95) == True
      assert candidate([1.0, 2.0, 5.9, 4.0, 5.0], 0.8) == False
      assert candidate([1.0, 2.0, 3.0, 4.0, 5.0, 2.0], 0.1) == True
      assert candidate([1.1, 2.2, 3.1, 4.1, 5.1], 1.0) == True
      assert candidate([1.1, 2.2, 3.1, 4.1, 5.1], 0.5) == False

在评估模型时,对于每个问题,会生成若干个代码样本,记作k。如果任何一个生成的代码样本通过了该问题的所有测试用例,那么模型就解决了这个问题。最终得分,称为pass@k,是已解决问题数与所有问题数的比值。如果有10个问题,模型解决了其中5个,并且k=3,那么该模型的pass@3得分是50%。生成的代码样本越多,模型解决每个问题的机会就越大,因此最终得分也越高。这意味着,通常pass@1得分应低于pass@3,而pass@3得分又应低于pass@10。

另一类任务,其功能正确性可以自动评估的是游戏机器人。如果你创建一个机器人来玩俄罗斯方块,你可以通过它得到的分数来判断机器人有多好。具有可衡量目标的任务通常可以通过功能正确性来评估。例如,如果你要求AI安排工作负载以优化能源消耗,AI的表现可以通过它节省的能源量来衡量。

与参考数据的相似度测量

如果你关心的任务不能通过功能正确性自动评估,一个常见的方法是将AI的输出与参考数据进行比较。例如,如果你要求一个模型将一句话从法语翻译成英语,你可以将生成的英语翻译与正确的英语翻译进行比较。

参考数据中的每个示例都遵循(输入,参考回答)的格式。一个输入可能有多个参考回答,例如一个法语句子的多个可能英语翻译。参考回答也称为真实答案或标准答案。需要参考数据的评估指标是基于参考的,而不需要参考数据的评估指标则是无参考的。

由于这种评估方法需要参考数据,它的瓶颈在于参考数据的生成速度和数量。参考数据通常由人类生成,越来越多的是由AI生成。使用人工生成的数据作为参考意味着我们将人工表现作为金标准,AI的表现是与人工表现进行比较的。人工生成数据可能昂贵且耗时,这导致许多人转而使用AI生成参考数据。AI生成的数据可能仍然需要人工审核,但审核所需的劳动量远少于从零开始生成参考数据的劳动量。

生成的回答与参考回答越相似,被认为越好。有四种方法可以衡量两个开放性文本之间的相似度:

  1. 要求评估者判断两个文本是否相同
  2. 精确匹配:生成的回答是否与参考回答中的一个完全匹配
  3. 词汇相似度:生成的回答与参考回答在词汇上的相似度
  4. 语义相似度:生成的回答与参考回答在意义(语义)上的接近程度

这两种回答可以通过人工评估者或AI评估者进行比较。AI评估者越来越普遍,并将在下一节中成为重点。

本节重点讨论手工设计的度量:精确匹配、词汇相似度和语义相似度。精确匹配的得分是二元的(匹配或不匹配),而其他两个得分则是一个滑动尺度(例如介于0和1之间或介于-1和1之间)。尽管AI作为评判者的方法在使用上方便灵活,但手工设计的相似度测量仍因其精确性而在行业中广泛使用。

注意
本节讨论了如何使用相似度测量来评估生成输出的质量。然而,相似度测量也可以用于许多其他应用场景,包括但不限于以下内容:

  • 检索与搜索:查找与查询相似的项目
  • 排序:根据与查询的相似度对项目进行排序
  • 聚类:根据项目之间的相似度对项目进行聚类
  • 异常检测:检测与其他项目最不相似的项目
  • 数据去重:删除与其他项目过于相似的项目

本节讨论的技术将在本书的后续部分再次出现。

精确匹配

如果生成的回答与参考回答完全匹配,则认为是精确匹配。精确匹配适用于那些期望短小、精确回答的任务,如简单的数学问题、常识查询和类似问答的问题。以下是一些具有短小、精确回答的输入示例:

  • “2 + 3 等于多少?”
  • “谁是第一位获得诺贝尔奖的女性?”
  • “我当前的账户余额是多少?”
  • “填空:巴黎对法国就像 ___ 对英国。”

有一些匹配的变体考虑了格式问题。一个变体是接受任何包含参考回答的输出作为匹配。例如,考虑问题“2 + 3 等于多少?”参考回答是“5”。这个变体接受所有包含“5”的输出,包括“答案是5”和“2 + 3 等于5”。

然而,这个变体有时会导致错误的答案被接受。例如,考虑问题“安妮·弗兰克是哪年出生的?”安妮·弗兰克出生于1929年6月12日,所以正确答案是1929年。如果模型输出“1929年9月12日”,虽然输出中包含正确的年份,但事实是错误的。

除了简单任务,精确匹配很少能有效工作。考虑原始法语句子“Comment ça va?”,有多个可能的英语翻译,如“How are you?”, “How is everything?”, “How are you doing?” 如果参考数据仅包含这三种翻译,而模型生成了“How is it going?”,那么模型的回答将被标记为错误。原始文本越长越复杂,可能的翻译就越多。对于复杂任务,词汇相似度和语义相似度效果更好。

词汇相似度

词汇相似度衡量的是两个文本的重叠程度。你可以通过首先将每个文本分解成更小的标记来衡量词汇相似度。

在最简单的形式下,词汇相似度可以通过计算两个文本共享多少标记来衡量。例如,考虑参考回答“My cats scare the mice”和两个生成的回答:

  • “My cats eat the mice”
  • “Cats and mice fight all the time”

假设每个标记是一个单词。如果只计算单词的重叠,回答A包含参考回答中的4个单词(相似度得分为80%),而回答B仅包含3个单词(相似度得分为60%)。因此,回答A被认为更接近参考回答。

衡量词汇相似度的一种方法是近似字符串匹配,俗称模糊匹配。它通过计算将一个文本转换成另一个文本所需的编辑次数来衡量两个文本之间的相似度,这个数字称为编辑距离。常见的三种编辑操作是:

  • 删除:“brad” -> “bad”
  • 插入:“bad” -> “bard”
  • 替换:“bad” -> “bed”

一些模糊匹配方法还将交换两个字母(例如,“mats” -> “mast”)视为一次编辑。然而,有些模糊匹配方法将每次交换视为两个编辑操作:一次删除和一次插入。

例如,“bad”到“bard”需要一次编辑,“bad”到“cash”则需要三次编辑,因此“bad”被认为与“bard”比与“cash”更相似。

另一种衡量词汇相似度的方法是n-gram相似度,它基于标记序列(n-gram)的重叠而不是单一标记来测量。1-gram(单字)是一个标记,2-gram(双字)是由两个标记组成的集合。比如,“My cats scare the mice”包含四个双字:“my cats”、“cats scare”、“scare the”和“the mice”。你可以衡量参考回答中的n-gram与生成回答中的n-gram的重叠百分比。

常见的词汇相似度度量包括BLEU、ROUGE、METEOR++、TER和CIDEr。这些度量在计算重叠时有所不同。在基础模型出现之前,BLEU、ROUGE及其相关度量在翻译任务中很常见。随着基础模型的崛起,使用词汇相似度的基准逐渐减少。使用这些度量的基准包括WMT、COCO Captions和GEMv2。

这种方法的一个缺点是它需要策划一个全面的参考回答集。如果参考集不包含任何看似正确的答案,那么一个好的回答可能会得到较低的相似度得分。在一些基准例子中,Adept发现它的模型Fuyu表现不佳,不是因为模型的输出错误,而是因为参考数据中缺少了一些正确答案。图3-5展示了一个图像描述任务的例子,Fuyu生成了正确的描述,但得分较低。

不仅如此,参考数据有时也会出错。例如,WMT 2023 Metrics共享任务的组织者报告说,他们在数据中发现了许多不良的参考翻译。低质量的参考数据是无参考度量在与基于参考的度量的相关性方面成为强有力竞争者的原因之一(Freitag等,2023)。

这种度量的另一个缺点是,较高的词汇相似度得分并不总是意味着更好的回答。例如,在HumanEval代码生成基准上,OpenAI发现错误和正确解决方案的BLEU得分相似。这表明,优化BLEU得分并不等于优化功能正确性(Chen等,2021)。

image.png

Fuyu's caption: "A nighttime view of Big Ben and the Houses of Parliament."
Reference
"A fast moving image of cars on a busy street with a tower clock in the background."
captions:
"Lit up night traffic is zooming by a clock tower."
"A city building is brightly lit and a lot of vehicles are driving by."
"A large clock tower and traffic moving near."
"there is a large tower with a clock on it."
CIDEr Score:
0.4 (No reference caption mentions Big Ben or Parliament)

语义相似度

词汇相似度衡量的是两个文本是否在外观上相似,而不是它们是否具有相同的意义。考虑以下两个句子:“What’s up?” 和 “How are you?” 从词汇上看,它们是不同的——它们使用的词汇和字母几乎没有重叠。然而,从语义上讲,它们非常接近。相反,看起来相似的文本可能意味着完全不同的事情。例如,“Let’s eat, grandma”和“Let’s eat grandma”有着完全不同的含义。

语义相似度旨在计算文本语义上的相似性。首先需要将文本转换为数值表示,这叫做嵌入(embedding)。例如,句子“the cat sits on a mat”可以用一个嵌入来表示,可能是:[0.11, 0.02, 0.54]。因此,语义相似度也被称为嵌入相似度。

《嵌入导论》讨论了嵌入是如何工作的。现在,假设你已经有了将文本转换为嵌入的方法。两个嵌入之间的相似度可以通过如余弦相似度等度量来计算。两个完全相同的嵌入的相似度得分为1。两个完全相反的嵌入的相似度得分为-1。

虽然我用文本示例来讲解,语义相似度也可以用于计算任何数据模式的嵌入之间的相似度,包括图像和音频。文本的语义相似度有时被称为语义文本相似度(semantic textual similarity)。

警告
虽然我将语义相似度归类为精确评估,但它可以被视为主观的,因为不同的嵌入算法可能会产生不同的嵌入。然而,给定两个嵌入,它们之间的相似度得分是精确计算的。

数学上,设A为生成回答的嵌入,B为参考回答的嵌入。A和B之间的余弦相似度计算公式为:

cosine similarity(A,B)=A⋅B∥A∥∥B∥\text{cosine similarity}(A, B) = \frac{A \cdot B}{|A| |B|}cosine similarity(A,B)=∥A∥∥B∥A⋅B​

其中:

  • A⋅BA \cdot BA⋅B 是A和B的点积
  • ∥A∥|A|∥A∥ 是A的欧几里得范数(也称为L2范数)

如果A是[0.11, 0.02, 0.54],则

∥A∥=0.112+0.022+0.542|A| = \sqrt{0.11^2 + 0.02^2 + 0.54^2}∥A∥=0.112+0.022+0.542​

语义文本相似度的度量包括BERTScore(嵌入由BERT生成)和MoverScore(嵌入由多种算法混合生成)。

与词汇相似度需要策划一个全面的参考回答集不同,语义文本相似度不需要这么广泛的参考集。然而,语义相似度的可靠性取决于底层嵌入算法的质量。如果两个文本的含义相同,但它们的嵌入质量差,那么它们仍然可能有较低的语义相似度得分。另一个缺点是,底层的嵌入算法可能需要较高的计算资源和时间。

在我们继续讨论AI作为评判者之前,让我们快速介绍一下嵌入。嵌入的概念是语义相似度的核心,也是本书中许多话题的基础,包括第6章中的向量搜索和第8章中的数据去重。

嵌入导论

由于计算机处理的是数字,因此模型需要将其输入转换为计算机可以处理的数字表示。嵌入是旨在捕捉原始数据意义的数值表示。

嵌入是一个向量。例如,句子“the cat sits on a mat”可能通过一个嵌入向量表示,如:[0.11, 0.02, 0.54]。这里,我使用了一个小型向量作为示例。实际上,嵌入向量的大小(嵌入向量中的元素数量)通常在100到10,000之间。

专门训练以生成嵌入的模型包括开源模型BERT、CLIP(对比语言-图像预训练)和Sentence Transformers。也有提供为API的专有嵌入模型。表3-2显示了一些常用模型的嵌入大小。

表3-2. 常见模型的嵌入大小。

模型嵌入大小
Google的BERTBERT base: 768
BERT large: 1024
OpenAI的CLIP图像:512
文本:512
OpenAI Embeddings APItext-embedding-3-small: 1536
text-embedding-3-large: 3072
Cohere的Embed v3embed-english-v3.0: 1024
embed-english-light-3.0: 384

由于模型通常要求其输入首先转换为向量表示,因此许多机器学习模型,包括GPT和Llama,也涉及生成嵌入的步骤。“Transformer架构”展示了transformer模型中的嵌入层。如果你可以访问这些模型的中间层,就可以使用它们提取嵌入。然而,这些嵌入的质量可能不如专门的嵌入模型生成的嵌入。

嵌入算法的目标是生成能够捕捉原始数据精髓的嵌入。那么我们如何验证这一点呢?嵌入向量[0.11, 0.02, 0.54]看起来与原始文本“the cat sits on a mat”完全不同。

从高层次来看,如果一个嵌入算法生成的文本更相似,它们的嵌入应该更接近,可以通过余弦相似度或相关度量来衡量。句子“the cat sits on a mat”的嵌入应该比“AI research is super fun”的嵌入更接近“the dog plays on the grass”的嵌入。

你还可以根据嵌入在任务中的实用性来评估它们的质量。嵌入在许多任务中都被使用,包括分类、主题建模、推荐系统和RAG等。一个衡量嵌入质量的基准是MTEB(Massive Text Embedding Benchmark,Muennighoff等,2023),它在多个任务上评估嵌入的质量。

我使用文本作为示例,但任何数据都可以有嵌入表示。例如,像Criteo和Coveo这样的电子商务解决方案就有产品的嵌入。Pinterest则为图像、图表、查询甚至用户提供嵌入。

一个新的前沿是为不同模式的数据创建联合嵌入。CLIP(Radford等,2021)是首批能够将不同模式的数据(文本和图像)映射到联合嵌入空间的主要模型之一。ULIP(语言、图像和点云的统一表示)(Xue等,2022)旨在创建文本、图像和3D点云的统一表示。ImageBind(Girdhar等,2023)学习跨六种不同模式的联合嵌入,包括文本、图像和音频。

图3-6展示了CLIP的架构。CLIP使用(图像,文本)对进行训练。与图像对应的文本可以是该图像的标题或与图像关联的评论。对于每一对(图像,文本),CLIP使用文本编码器将文本转换为文本嵌入,使用图像编码器将图像转换为图像嵌入。然后,它将这两个嵌入投影到一个联合嵌入空间中。训练目标是将图像的嵌入与对应文本的嵌入在这个联合空间中尽可能靠近。

image.png

能够表示不同模式数据的联合嵌入空间是一个多模态嵌入空间。在一个文本-图像联合嵌入空间中,一张钓鱼的男人的图像的嵌入应该更接近文本“a fisherman”的嵌入,而不是文本“fashion show”的嵌入。这个联合嵌入空间使得不同模式的嵌入能够进行比较和组合。例如,这使得基于文本的图像搜索成为可能。给定一个文本,它帮助你找到最接近该文本的图像。

AI作为评判者

评估开放性回答的挑战使得许多团队重新依赖于人工评估。随着人工智能成功地自动化了许多具有挑战性的任务,AI是否也能自动化评估?使用AI来评估AI的方法被称为AI作为评判者或LLM作为评判者。用于评估其他AI模型的AI模型称为AI评判者。

尽管使用AI自动化评估的想法由来已久,但它只有在AI模型能够做到这一点时才变得切实可行,大约是在2020年GPT-3发布时。直到目前为止,AI作为评判者已成为评估生产环境中AI模型的最常见方法之一。如果不是最常见的话。在2023年和2024年,我所见到的大多数AI评估初创公司的演示都以某种方式利用了AI作为评判者。LangChain的2023年《AI状态报告》指出,平台上58%的评估是由AI评判者完成的。AI作为评判者也是一个活跃的研究领域。

为什么选择AI作为评判者?

与人工评估者相比,AI评判者速度快、易于使用且相对便宜。它们还可以在没有参考数据的情况下工作,这意味着它们可以用于没有参考数据的生产环境中。

你可以要求AI模型根据任何标准评判输出:正确性、重复性、有害性、健康性、幻觉等。这类似于你可以要求一个人对任何事情发表意见。你可能会想:“但你不能总是相信人们的意见。”这是真的,且你也不能总是相信AI的判断。然而,由于每个AI模型都是群体的集合,AI模型有可能做出代表群体的判断。通过为合适的模型提供合适的提示,你可以获得在广泛主题上的合理判断。

研究表明,某些AI评判者与人工评估者之间存在很强的相关性。在2023年,Zheng等人发现,在他们的评估基准MT-Bench上,GPT-4与人工评估者之间的一致性达到了85%,甚至高于人类之间的一致性(81%)。AlpacaEval的作者(Dubois等,2023)也发现,他们的AI评判者与LMSYS的Chat Arena排行榜(由人工评估)之间的相关性接近完美(0.98)。

AI不仅可以评估一个回答,它还可以解释其决策,这在你想审计评估结果时尤其有用。图3-7展示了GPT-4解释其判断的一个例子。

其灵活性使得AI作为评判者在广泛的应用场景中都很有用,对于某些应用,它是唯一的自动评估选项。即使AI的判断不如人工判断准确,它们仍然足够好,可以指导应用程序的开发,并为项目的启动提供足够的信心。

image.png

如何使用AI作为评判者

你可以通过多种方式使用AI进行判断。例如,你可以使用AI单独评估回答的质量,将该回答与参考数据进行比较,或将该回答与另一个回答进行比较。以下是这三种方法的简单示例提示:

  1. 单独评估回答的质量,给定原始问题:
    “根据以下问题和回答,评估该回答对问题的适用性。使用1到5的分数。

    • 1表示非常差。
    • 5表示非常好。
      问题:[QUESTION]
      回答:[ANSWER]
      分数:”
  2. 将生成的回答与参考回答进行比较,以评估生成的回答是否与参考回答相同。这可以作为一种替代人工设计的相似度测量方法:
    “给定以下问题、参考回答和生成的回答,评估生成的回答是否与参考回答相同。
    输出True或False。
    问题:[QUESTION]
    参考回答:[REFERENCE ANSWER]
    生成的回答:[GENERATED ANSWER]”

  3. 比较两个生成的回答,判断哪个更好,或预测哪个更可能被用户喜欢。这对于生成后训练对齐的数据(第二章讨论)、测试时计算(第二章讨论)和使用比较评估进行模型排名(下一节讨论)很有帮助:
    “给定以下问题和两个答案,评估哪个答案更好。输出A或B。
    问题:[QUESTION]
    A:[FIRST ANSWER]
    B:[SECOND ANSWER]
    更好的答案是:”

一个通用的AI评判者可以根据任何标准评估回答。如果你在构建一个角色扮演聊天机器人,你可能想评估聊天机器人的回答是否符合用户希望它扮演的角色,例如“这个回答听起来像甘道夫会说的话吗?”如果你在构建一个生成促销产品照片的应用程序,你可能想问“从1到5,你会如何评价这张图片中的产品可信度?”表3-3显示了一些AI工具提供的内置AI评判标准。

表3-3. 2024年9月一些AI工具提供的内置AI评判标准示例

AI工具内置标准
Azure AI Studio基础性、相关性、一致性、流畅性、相似性
MLflow.metrics忠实性、相关性
LangChain Criteria Evaluation简洁性、相关性、正确性、一致性、有害性、恶意性、帮助性、争议性、性别歧视、无感性、犯罪性
Ragas忠实性、答案相关性

必须记住,AI作为评判者的标准并不是标准化的。Azure AI Studio的相关性评分可能与MLflow的相关性评分差异很大。这些评分依赖于评判者的底层模型和提示。

如何提示AI评判者与如何提示任何AI应用程序类似。一般来说,评判者的提示应该清楚地解释以下内容:

  • 模型需要执行的任务,例如评估生成的回答与问题之间的相关性。

  • 模型应遵循的评估标准,例如“你的主要关注点应是确定生成的回答是否包含足够的信息来根据真实答案解决给定问题”。指示越详细越好。

  • 评分系统,可以是以下之一:

    • 分类,如好/差或相关/无关/中立。
    • 离散数值,例如1到5。离散数值可以视为分类的特殊情况,其中每个类别有一个数值解释,而不是语义解释。
    • 连续数值,如0到1之间,当你想评估相似度的程度时。

提示
语言模型通常在处理文本时比在处理数字时更有效。已报道AI评判者在分类任务中的表现优于数值评分系统。

对于数值评分系统,离散评分似乎比连续评分效果更好。从经验上看,离散评分的范围越宽,模型的表现越差。典型的离散评分系统是1到5之间。

带有示例的提示已被证明效果更好。如果你使用1到5之间的评分系统,提供1、2、3、4、5分的回答示例,并尽可能解释为什么某个回答得到特定分数。提示的最佳实践将在第五章讨论。

以下是Azure AI Studio用于评估相关性的部分提示。它解释了任务、标准、评分系统、低分的输入示例及其低分的理由。为了简洁,部分提示被省略。

示例:
“你的任务是根据真实答案评分生成的回答与问题之间的相关性,评分范围为1到5,并请提供评分理由。
你的主要关注点应是确定生成的回答是否包含足够的信息来根据真实答案解决给定问题。
如果生成的回答与真实答案相矛盾,则会得到1到2的低分。
例如,问题是‘天空是蓝的吗?’,真实答案是‘是的,天空是蓝的。’生成的回答是‘不,天空不是蓝的。’
在这个例子中,生成的回答通过声明天空不是蓝色的而与真实答案相矛盾,实际上天空是蓝色的。
这个不一致将导致1到2的低分,低分的理由将反映出生成回答与真实答案之间的矛盾。”

图3-8展示了一个AI评判者如何评估给定问题时回答质量的示例。

image.png

AI评判者不仅仅是一个模型——它是一个包含模型和提示的系统。更改模型、提示或模型的采样参数都会导致不同的评判者。

AI作为评判者的局限性

尽管AI作为评判者有许多优点,但许多团队仍然对采用这种方法持谨慎态度。使用AI评估AI似乎是自我循环的。AI的概率性质使得它看起来不够可靠,无法充当评判者。AI评判者可能会给应用程序带来不小的成本和延迟。鉴于这些局限性,一些团队将AI作为评判者视为在没有其他评估方法时的应急选择,特别是在生产环境中。

不一致性

为了让评估方法值得信赖,其结果应该是连贯一致的。然而,像所有AI应用程序一样,AI评判者是概率性的。同一个评判者,在相同的输入下,如果提示不同,可能会给出不同的评分。即使是相同的评判者,如果按照相同的指令进行两次评估,输出的分数也可能不同。这种不一致性使得结果难以复现或信任。

可以通过一些方法使AI评判者更加一致。第二章讨论了如何通过采样变量来实现这一点。Zheng等人(2023)显示,在他们的评估基准MT-Bench上,包含评估示例的提示可以将GPT-4的一致性从65%提高到77.5%。然而,他们也承认,高一致性可能并不意味着高准确性——评判者可能会 consistently犯相同的错误。更重要的是,增加更多的示例会使提示变长,长提示意味着更高的推理成本。在Zheng等人的实验中,增加更多示例导致他们的GPT-4使用成本四倍增加。

标准模糊性

与许多人为设计的度量标准不同,AI作为评判者的标准并没有统一化,这使得它们容易被误解和滥用。截至目前,开源工具MLflow、Ragas和LlamaIndex都有内置的“忠实性”标准,用于衡量生成的输出与给定上下文的一致性,但它们的指令和评分系统完全不同。如表3-4所示,MLflow使用1到5的评分系统,Ragas使用0和1,而LlamaIndex的提示要求评判者输出YES和NO。

表3-4. 不同工具对相同标准的默认提示可能非常不同。

工具提示评分系统
MLflow忠实性仅根据提供的输出和上下文进行评估,请在评分时完全忽略提供的输入。忠实性评估输出中有多少内容与提供的上下文事实一致。…1-5
Ragas你的任务是根据给定上下文判断一系列陈述的忠实性。对于每个陈述,你必须返回1(如果可以根据上下文验证该陈述)或0(如果无法根据上下文验证该陈述)。0和1
LlamaIndex请告诉我给定的信息是否得到上下文的支持。你需要回答YES或NO。如果上下文中的任何部分支持该信息,即使大部分上下文无关也可以回答YES。YES和NO

这三种工具输出的忠实性得分无法直接比较。如果给定一个(上下文,回答)对,MLflow给出3分,Ragas给出1分,而LlamaIndex输出NO,你会使用哪个得分?

应用程序随着时间的推移而发展,但理想情况下,它的评估方法应该是固定的。这样,评估标准就可以用来监控应用程序的变化。然而,AI评判者也是AI应用程序,这意味着它们也可能随时间变化。

想象一下,上个月你应用程序的一致性得分是90%,这个月,这个得分变为92%。这是否意味着你的应用程序的一致性有所提高?除非你确切知道这两次使用的AI评判者完全相同,否则很难回答这个问题。如果本月的评判者提示与上个月不同怎么办?也许你切换到了一个表现稍好的提示,或者同事修正了上个月提示中的一个拼写错误,本月的评判者可能变得更加宽容。

如果应用程序和AI评判者由不同的团队管理,这种情况会变得尤为混乱。AI评判者团队可能在没有通知应用程序团队的情况下更改了评判者。因此,应用程序团队可能错误地将评估结果的变化归因于应用程序的变化,而不是评判者的变化。

提示
如果你看不到用于评判的模型和提示,不要信任任何AI评判者。

评估方法需要时间来标准化。随着这一领域的发展并引入更多的控制措施,我希望未来的AI评判者能够变得更加标准化和可靠。

成本和延迟增加

你可以在实验和生产过程中使用AI评判者来评估应用程序。许多团队使用AI评判者作为生产中的控制措施,以减少风险,仅向用户展示被AI评判者认为好的生成响应。

使用强大的模型来评估响应可能会非常昂贵。如果你使用GPT-4来生成和评估响应,你将进行两次GPT-4调用,API成本大约翻倍。如果你有三个评估提示,因为你想评估三个标准——比如整体响应质量、事实一致性和有害性——你将增加四倍的API调用次数。

你可以通过使用较弱的模型作为评判者来降低成本(见“哪些模型可以作为评判者?”)。你也可以通过抽查来降低成本:只评估部分响应。抽查意味着你可能错过一些失败。评估的样本比例越大,你对评估结果的信心就越高,但成本也越高。找到成本与信心之间的平衡可能需要反复试验。这个过程将在第四章中进一步讨论。总体而言,AI评判者比人工评估者便宜得多。

在生产管道中实现AI评判者可能会增加延迟。如果你在返回给用户之前评估响应,你面临着一个权衡:降低风险但增加延迟。增加的延迟可能使得这个选项对于具有严格延迟要求的应用程序来说不可行。

AI作为评判者的偏见

人类评估者有偏见,AI评判者也不例外。不同的AI评判者有不同的偏见。本节将讨论一些常见的偏见。了解AI评判者的偏见有助于你正确解读它们的评分,甚至可以减轻这些偏见的影响。

AI评判者倾向于存在自我偏见,即模型倾向于偏好自己的回答,而不是其他模型生成的回答。帮助模型计算最可能生成的回答的机制也会给该回答一个较高的评分。在Zheng等人(2023)的实验中,GPT-4偏爱自己,胜率比其他模型高出10%,而Claude-v1则偏爱自己,胜率高出25%。

许多AI模型具有首位偏见。AI评判者可能偏向对比中的第一个答案或选项列表中的第一个。这可以通过多次测试并改变顺序,或者使用精心设计的提示来减轻。AI的位次偏见与人类的相反。人类倾向于偏好他们最后看到的答案,这被称为近期偏见。

一些AI评判者存在冗长偏见,偏好更长的答案,无论其质量如何。Wu和Aji(2023)发现,GPT-4和Claude-1都倾向于更长的答案(大约100个词),即使这些答案包含事实错误,也优于较短的正确答案(大约50个词)。Saito等人(2023)研究了这种偏见对创造性任务的影响,发现当长度差异足够大时(例如,一个回答的长度是另一个的两倍),评判者几乎总是偏好较长的回答。然而,Zheng等人(2023)和Saito等人(2023)发现,GPT-4相比GPT-3.5不太容易受到这种偏见的影响,这表明随着模型的增强,这种偏见可能会消失。

除了这些偏见,AI评判者还具有所有AI应用程序的局限性,包括隐私和知识产权。如果你使用专有模型作为评判者,你需要将数据发送给该模型。如果模型提供商没有公开他们的训练数据,你就无法确定这个评判者是否在商业使用上是安全的。

尽管AI作为评判者的方法有局限性,但它的诸多优点使我相信它的采用将继续增长。然而,AI评判者应当与精确评估方法和/或人工评估相结合。

哪些模型可以作为评判者?

评判者可以比被评估的模型更强、更弱或相同。每种情况都有其优缺点。

乍一看,选择更强的评判者似乎很有道理。考试评分员不应该比考生更有知识吗?更强的模型不仅可以做出更好的判断,还可以通过引导更弱的模型生成更好的回答,从而帮助改善它们。

你可能会想:如果你已经有了更强的模型,为什么还要使用较弱的模型来生成回答呢?答案是成本和延迟。你可能没有足够的预算使用更强的模型生成所有回答,所以你只用它来评估一部分回答。例如,你可能使用一个便宜的内部模型来生成回答,并使用GPT-4评估1%的回答。

更强的模型也可能太慢,无法满足你的应用需求。你可以使用快速的模型生成回答,同时让较慢但更强的模型在后台进行评估。如果强模型认为弱模型的回答不好,可能会采取补救措施,例如用强模型的回答替换弱模型的回答。请注意,反向模式也很常见。你使用强模型生成回答,同时在后台运行弱模型进行评估。

将强模型作为评判者带来了两个挑战。首先,最强的模型将没有合适的评判者。其次,我们需要另一种评估方法来确定哪个模型是最强的。

使用模型自我评判,即自我评估或自我批评,听起来像是作弊,尤其是因为存在自我偏见。然而,自我评估对于检查是否合理非常有用。如果一个模型认为自己的回答是错误的,那么这个模型可能不太可靠。除了进行合理性检查外,要求模型评估自己可以促使模型修改和改进它的回答(Press等,2022;Gou等,2023;Valmeekamet等,2023)。以下是一个自我评估的示例:

提示 [来自用户] :10+3是多少?
第一个回答 [来自AI] :30
自我批评 [来自AI] :这个回答正确吗?
最终回答 [来自AI] :不对,正确答案是13。

一个悬而未决的问题是,评判者是否可以比被评估的模型更弱。一些人认为,判断比生成更容易。任何人都可以对一首歌是否好发表意见,但并不是每个人都能写一首歌。较弱的模型应该能够判断较强模型的输出。

Zheng等人(2023)发现,较强的模型与人类偏好的相关性更强,这使得人们倾向于选择他们能负担得起的最强模型。然而,这个实验仅限于通用评判者。我非常兴奋的一个研究方向是小型的、专门的评判者。专门的评判者经过训练,能够根据特定标准做出判断,并遵循特定的评分系统。对于特定的判断,较小、专门的评判者比大型的通用评判者更可靠。

由于有许多可能的方式使用AI评判者,因此也有许多可能的专门AI评判者。这里,我将介绍三种专门评判者的示例:奖励模型、基于参考的评判者和偏好模型:

奖励模型

奖励模型接受一个(提示,回答)对,并根据给定的提示为回答打分,评估回答的好坏。奖励模型在强化学习与人类反馈(RLHF)中已经成功使用多年。Cappy是Google(2023)开发的一个奖励模型的示例。给定一对(提示,回答),Cappy会生成一个介于0和1之间的得分,表示回答的正确性。Cappy是一个轻量级的评分模型,具有360百万个参数,比通用基础模型小得多。

基于参考的评判者

基于参考的评判者根据一个或多个参考回答来评估生成的回答。这个评判者可以输出一个相似度得分或质量得分(生成的回答与参考回答相比的质量)。例如,BLEURT(Sellam等,2020)接受一对(候选回答,参考回答),并输出候选回答与参考回答之间的相似度得分。Prometheus(Kim等,2023)接受(提示,生成的回答,参考回答,评分标准),并输出一个1到5之间的质量得分,假设参考回答的得分为5。

偏好模型

偏好模型接受(提示,回答1,回答2)作为输入,输出哪个回答更好(用户更喜欢的回答)。这可能是专门评判者中最令人兴奋的方向之一。能够预测人类偏好开辟了许多可能性。如第二章所讨论的,偏好数据对将AI模型与人类偏好对齐至关重要,而获取这些数据既具有挑战性又昂贵。拥有一个良好的人类偏好预测器通常可以使评估变得更容易,也使得模型更安全使用。许多偏好模型的建设项目已经启动,包括PandaLM(Wang等,2023)和JudgeLM(Zhu等,2023)。图3-9展示了PandaLM的工作原理。它不仅输出哪个回答更好,还解释了它的推理过程。

image.png

尽管AI作为评判者的方法有局限性,但它具有广泛的适用性和强大的功能。使用更便宜的模型作为评判者使它变得更加实用。许多最初持怀疑态度的同事,已经开始在生产中更多地依赖这种方法。

AI作为评判者非常令人兴奋,而我们接下来要讨论的方法同样引人入胜。它受到了游戏设计的启发,这是一个非常有趣的领域。

通过比较评估对模型进行排名

通常,你评估模型并不是因为在乎它们的得分,而是因为你想知道哪个模型最适合你。你真正需要的是这些模型的排名。你可以使用逐点评估或比较评估来对模型进行排名。

在逐点评估中,你独立评估每个模型,然后根据它们的得分进行排名。例如,如果你想找出哪个舞者是最好的,你分别评估每个舞者,给他们打分,然后选出得分最高的舞者。

在比较评估中,你将模型进行相互比较,并根据比较结果计算排名。对于同一个舞蹈比赛,你可以让所有参赛者并排跳舞,并让评审们选择他们最喜欢哪个参赛者的舞蹈,然后选出大多数评审偏好的舞者。

对于质量具有主观性的回答,比较评估通常比逐点评估更容易进行。例如,比起给每首歌打一个具体分数,判断两首歌哪个更好要容易得多。

在AI领域,比较评估首次由Anthropic在2021年使用,用于对不同模型进行排名。它也为流行的LMSYS的Chatbot Arena排行榜提供支持,通过社区的模型对比计算得分来对模型进行排名。

许多模型提供商在生产环境中使用比较评估来评估它们的模型。图3-10展示了ChatGPT让用户并排比较两个输出的示例。这些输出可能是由不同的模型生成的,或者是由相同的模型使用不同的采样变量生成的。

image.png

每个请求时,选择两个或更多模型进行响应。评审者,可以是人类或AI,选出获胜者。许多开发者允许平局,以避免在草稿质量相同或相差无几时随机选出一个获胜者。

一个非常重要的事情是并非所有问题都应该通过偏好来回答。许多问题应该通过正确性来回答。例如,假设你问模型:“手机辐射和脑肿瘤之间是否有联系?”然后模型给出了两个选项:“是”和“否”供你选择。基于偏好的投票可能会导致错误的信号,如果用来训练模型,可能会导致不一致的行为。

让用户选择也可能会引起用户的挫败感。假设你因为不知道答案而问模型一个数学问题,模型给出了两个不同的答案并要求你选择你更喜欢的。如果你知道正确答案,你根本就不会问模型。

在收集用户的比较反馈时,一个挑战是确定哪些问题可以通过偏好投票来判断,哪些不应如此。基于偏好的投票只有在投票者对该主题有足够知识时才有效。这种方法通常适用于AI作为实习生或助手的应用,帮助用户加快他们已知的任务,而不适用于用户要求AI执行他们自己不知道如何做的任务。

比较评估不应与A/B测试混淆。在A/B测试中,用户一次只看到一个候选模型的输出。而在比较评估中,用户同时看到多个模型的输出。

每次比较称为一场比赛。这个过程会产生一系列比较,如表3-5所示。

表3-5. 一历史上的模型对比示例。

比赛 #模型A模型B获胜者
1模型1模型2模型1
2模型3模型10模型10
3模型7模型4模型4

模型A相对于模型B的偏好概率是A击败B的胜率。我们可以通过查看A和B之间所有比赛的结果,计算A胜出的百分比来得出这一胜率。

如果只有两个模型,排名很简单。获胜次数更多的模型排名更高。模型数量越多,排名的难度越大。假设我们有五个模型,并且我们有模型对之间的经验胜率,如表3-6所示。从数据中很难看出这五个模型应该如何排名。

表3-6. 五个模型的胜率示例。A >> B列表示A更受偏好的事件。

模型对 #模型A模型B比赛数A >> B
1模型1模型2100090%
2模型1模型3100040%
3模型1模型4100015%
4模型1模型5100010%
5模型2模型3100060%
6模型2模型4100080%
7模型2模型5100080%
8模型3模型4100070%
9模型3模型5100010%
10模型4模型5100020%

根据比较信号,我们使用评分算法来计算模型的排名。通常,这个算法首先根据比较信号为每个模型计算一个得分,然后根据得分对模型进行排名。

比较评估在AI中是新的,但在其他行业已经存在近一个世纪,尤其在体育和视频游戏中非常流行。许多为这些领域开发的评分算法可以适用于评估AI模型,例如Elo、Bradley-Terry和TrueSkill。LMSYS的Chatbot Arena最初使用Elo算法来计算模型排名,但后来由于Elo对评审和提示的顺序敏感,转而使用Bradley-Terry算法。

排名是正确的,如果对于任何一对模型,排名较高的模型更有可能在比赛中击败排名较低的模型。如果模型A排名高于模型B,用户应该更倾向于选择模型A而非模型B。

从这个角度看,模型排名是一个预测问题。我们通过历史比赛结果计算排名,并利用它预测未来的比赛结果。不同的排名算法可以产生不同的排名,并且没有标准答案来确定正确的排名。排名的质量由它在预测未来比赛结果中的表现来衡量。我对Chatbot Arena排名的分析表明,所产生的排名很好,至少对于有足够比赛的模型对来说是这样。具体分析可以在本书的GitHub仓库中查看。

比较评估的挑战

在逐点评估中,过程中的重担在于设计基准和度量标准,以收集正确的信号。计算分数以对模型进行排名是容易的。而在比较评估中,信号收集和模型排名都很具有挑战性。本节将讨论比较评估的三个常见挑战。

可扩展性瓶颈

比较评估是数据密集型的。要比较的模型对的数量随着模型数量的增加而成平方增长。2024年1月,LMSYS使用244,000次比较评估了57个模型。尽管听起来比较次数很多,但这平均每对模型仅有153次比较(57个模型对应1,596对模型)。考虑到我们希望基础模型能够执行的广泛任务,这个数字相对较小。

幸运的是,我们并不总是需要直接比较两个模型以确定哪个更好。排名算法通常假设传递性。如果模型A排名高于B,并且B排名高于C,那么通过传递性,你可以推断出A排名高于C。这意味着如果算法确信A比B更好,B比C更好,那么它不需要再比较A与C,就能知道A更好。

然而,尚不清楚这一传递性假设是否适用于AI模型。许多分析Elo在AI评估中应用的论文指出,传递性假设是一个局限性(Boubdir等;Balduzzi等;Munos等)。他们认为,人类偏好不一定是传递的。此外,非传递性可能发生,因为不同的模型对是由不同的评审员和不同的提示进行评估的。

评估新模型也是一个挑战。在独立评估中,只需要评估新模型。而在比较评估中,新的模型必须与现有模型进行比较,这可能会改变现有模型的排名。

这也使得评估私有模型变得困难。假设你为公司构建了一个使用内部数据的模型,你想将这个模型与公共模型进行比较,以决定是否使用公共模型。如果你想对你的模型进行比较评估,你可能需要收集自己的比较信号并创建自己的排行榜,或者支付使用一个公共排行榜来为你进行私有评估。

可扩展性瓶颈可以通过更好的匹配算法来缓解。到目前为止,我们假设每次比赛中模型是随机选择的,因此所有模型对出现的次数大致相同。然而,并非所有模型对都需要进行平等比较。一旦我们确信某对模型的结果,可以停止对它们的比较。一个高效的匹配算法应该抽取那些能最大程度减少整体排名不确定性的比赛。

缺乏标准化和质量控制

收集比较信号的一种方式是通过像LMSYS Chatbot Arena那样将比较众包给社区。任何人都可以访问网站,输入一个提示,从两个匿名模型那里获取两个回答,然后投票选择更好的一个。只有在投票完成后,模型名称才会被揭示。

这种方法的好处是能够捕获广泛的信号,且相对较难被操控。然而,缺点是很难实施标准化和质量控制。

首先,任何有互联网访问的人都可以使用任何提示来评估这些模型,并且没有标准来定义什么是更好的回答。可能会对志愿者要求核实回答的事实性提出较高期望,但他们可能会不自觉地偏爱听起来更好的回答,尽管它们在事实上的错误。

有些人可能偏好礼貌和温和的回答,而其他人则可能更喜欢没有过滤的回答。这既有好处也有坏处。好处是它有助于捕捉到人类在自然环境中的偏好。坏处是人类在自然环境中的偏好可能并不适合所有使用场景。例如,如果一个用户要求模型讲一个不合适的笑话,而模型拒绝了,用户可能会降低评分。然而,作为应用程序开发者,你可能更希望模型拒绝。而有些用户甚至可能故意选择有毒的回答作为偏好,污染排行榜。

其次,众包比较要求用户在工作环境之外评估模型。没有现实世界的基础,测试提示可能无法反映这些模型在现实世界中的使用情况。人们可能只会使用最先想到的提示,并且不太可能使用复杂的提示技术。

在LMSYS Chatbot Arena发布的33,000个提示中,有180个是“hello”和“hi”,占数据的0.55%,这还不包括诸如“hello!”,“hello.”,“hola”,“hey”等变体。还有很多脑筋急转弯问题。比如“X有3个姐妹,每个姐妹都有一个兄弟。X有多少个兄弟?”这个问题被问了44次。

简单提示容易回答,难以区分模型的表现。使用太多简单提示评估模型可能会污染排名。

如果公共排行榜不支持复杂的上下文构建,比如通过从你内部数据库中检索相关文档来增强上下文,那么它的排名将无法反映一个模型在你的RAG系统中可能的表现。生成好回答的能力不同于检索最相关文档的能力。

一种可能的标准化方式是限制用户使用一组预定的提示。然而,这可能会影响排行榜捕捉多样化使用场景的能力。LMSYS采取了另一种方法,让用户使用任何提示,但然后使用内部模型过滤掉困难提示,并仅通过这些困难提示来对模型进行排名。

另一种方法是只使用我们可以信任的评估者。我们可以训练评估者使用标准来比较两个回答,或者训练他们使用实际的提示和复杂的提示技术。这是Scale在其私有比较排行榜中使用的方法。这种方法的缺点是成本较高,且可能大大减少我们可以获取的比较次数。

另一种选择是将比较评估融入到你的产品中,让用户在工作流程中评估模型。例如,对于代码生成任务,你可以在用户的代码编辑器中建议两个代码片段,并让用户选择更好的一个。许多聊天应用程序已经在这样做。然而,如前所述,用户可能并不知道哪个代码片段更好,因为他们不是专家。

此外,用户可能不会阅读两个选项,而是随机点击其中一个。这可能会给结果引入很多噪音。然而,来自少部分正确投票用户的信号有时足以帮助确定哪个模型更好。

一些团队更倾向于使用AI评估者,而不是人工评估者。AI可能不如训练有素的人工专家,但它可能比随机的互联网用户更可靠。

从比较表现到绝对表现

对于许多应用场景,我们并不一定需要最好的模型。我们需要一个足够好的模型。比较评估告诉我们哪个模型更好,但它并不能告诉我们一个模型有多好,或者这个模型是否足够满足我们的使用需求。假设我们得出结论,模型B优于模型A。以下任意一种情况都可能成立:

  • 模型B很好,而模型A很差。
  • 模型A和模型B都很差。
  • 模型A和模型B都很好。

你需要其他形式的评估来确定哪种情况是正确的。

假设我们在使用模型A进行客户支持,模型A可以解决70%的所有工单。考虑模型B,它比模型A更胜一筹,胜率为51%。但是,我们并不清楚这个51%的胜率如何转化为模型B能解决的请求数量。许多人告诉我,根据他们的经验,胜率的1%变化在某些应用中可以带来巨大的性能提升,而在其他应用中则只会带来微小的提升。

在决定用B替换A时,人类偏好并不是唯一的考虑因素。我们还关心其他因素,如成本。我们不知道能期待什么样的性能提升,这使得进行成本效益分析变得困难。如果模型B的成本是A的两倍,比较评估就不足以帮助我们确定B的性能提升是否值得增加的成本。

比较评估的未来

鉴于比较评估存在许多局限性,你可能会想它是否有未来。然而,比较评估有很多优点。首先,正如在“后训练”中讨论的那样,人们发现比较两个输出比为每个输出打分更容易。随着模型变得更强,超越人类表现,人工评估者可能无法为模型的回答提供具体分数。然而,人工评估者可能仍然能够察觉到差异,比较评估可能仍然是唯一的选择。例如,Llama 2的论文中提到,当模型的写作超出了最优秀人工注释员的能力时,人类仍然可以通过比较两个答案提供有价值的反馈(Touvron等,2023)。

其次,比较评估旨在捕捉我们关心的质量:人类偏好。它减少了我们必须不断创建更多基准以跟上AI不断扩展能力的压力。与在模型性能达到完美分数后就变得无用的基准不同,只要引入了更新、更强大的模型,比较评估就永远不会饱和。

比较评估相对难以被操控,因为没有像训练模型以使用参考数据那样简单的作弊方法。正因如此,许多人比任何其他公共排行榜更信任公共比较排行榜的结果。

比较评估可以提供我们无法通过其他方式获得的关于模型的判别信号。对于离线评估,它可以成为评估基准的一个很好的补充。对于在线评估,它可以与A/B测试互为补充。

总结

随着AI模型的变得越来越强大,潜在的灾难性失败风险也随之增加,这使得评估变得更加重要。同时,评估开放式、强大的模型具有挑战性。这些挑战使得许多团队转向人工评估。在许多情况下,人工评估对于进行合理性检查总是非常有帮助的,甚至是必不可少的。然而,本章主要关注不同的自动评估方法。

本章首先讨论了为什么基础模型比传统的机器学习模型更难评估。尽管许多新的评估技术正在开发中,但对评估的投资仍然落后于对模型和应用开发的投资。

由于许多基础模型具有语言模型组件,我们重点介绍了语言建模度量,包括困惑度和交叉熵。我与许多人交谈时发现这些度量很让人困惑,因此我包括了如何解读这些度量并在评估和数据处理过程中加以利用的部分。

接着,本章将焦点转向了评估开放式响应的不同方法,包括功能正确性、相似度评分和AI作为评判者。前两种评估方法是精确的,而AI作为评判者的评估则是主观的。

与精确评估不同,主观指标高度依赖于评判者。它们的得分需要在所使用的评判者的背景下进行解读。不同的AI评判者为衡量同一质量而给出的得分可能不可比。像所有AI应用程序一样,AI评判者应当经过迭代,这意味着它们的判断会发生变化。这使得它们作为基准来追踪应用变化的可靠性降低。虽然AI评判者有潜力,但应当辅以精确评估、人工评估或两者兼备。

在评估模型时,你可以独立评估每个模型,然后根据得分对它们进行排名。另一种方式是使用比较信号进行排名:哪两个模型中哪个更好?比较评估在体育中很常见,尤其是国际象棋,并且在AI评估中越来越受到关注。比较评估和后训练对齐过程都需要偏好信号,这些信号的收集成本很高。这促使了偏好模型的开发:专门的AI评判者,预测用户更喜欢哪个响应。

虽然语言建模度量和手工设计的相似度测量方法已经存在了一段时间,但AI作为评判者和比较评估方法在基础模型出现后才开始被广泛采用。许多团队正在探索如何将它们纳入到评估流程中。如何构建一个可靠的评估管道来评估开放式应用程序将是下一章的主题。