大模型 (LLM) 技术的飞速发展,使得我们能够快速实现过去需要数天甚至数月才能完成的任务。然而,LLM 的本质决定了,即使面对相同的提示,也极有可能生成略有不同的答案。因此,传统的测试方法已不再适用,我们需要针对 LLM 评估进行调整,不能再期望获得完全一致的特定输出。本文将深入探讨当下最流行的 LLM 评估 方法,并对其进行比较分析,包括基于N-gram的度量、基于对齐的度量、基于嵌入/语义相似性的度量,以及使用LLM作为裁判。
N-gram:语言建模的基础
N-gram 是文本或语音中连续的 n 个项目(在 NLP 上下文中通常是词语)的序列。“n”代表序列中项目的数量。N-gram 用于捕捉文本中局部的词语模式和上下文信息。常见的类型包括:
- Unigrams (1-grams):单个词语。 例如,从 “我喜欢披萨” 中提取的 Unigrams 是 [“我”, “喜欢”, “披萨”]。
- Bigrams (2-grams):两个连续的词语。 例如,从 “我喜欢披萨” 中提取的 Bigrams 是 [“我喜欢”, “喜欢披萨”]。
- Trigrams (3-grams):三个连续的词语。 例如,从 “我喜欢吃披萨” 中提取的 Trigrams 是 [“我喜欢吃”, “喜欢吃披萨”]。
- 4-grams:四个连续的词语。 例如,从 “我喜欢每天吃披萨” 中提取的 4-grams 是 [“我喜欢每天吃”, “喜欢每天吃披萨”]。
N-gram 在 LLM评估 中扮演着重要的角色,可以用于计算如BLEU和ROUGE等指标,从而量化生成文本与参考文本之间的重叠程度。
BLEU:机器翻译的黄金标准
BLEU (Bilingual Evaluation Understudy) 是一种用于自动评估机器翻译质量的方法,由 Papineni 等人在 2002 年提出。它通过测量生成文本和参考译文之间的 n-gram 精确度来评估翻译质量。BLEU 计算 1-gram 到 4-gram 的精确度,并应用一个简洁惩罚,以防止非常短的翻译产生虚高分数。
具体步骤如下:
-
计算 n-gram 精确度:
- 例如,对于参考文本 “The quick brown fox jumps over the lazy dog” 和系统生成文本 “The brown fox jumps over lazy dog”,可以分别计算 1-gram, 2-gram, 3-gram 和 4-gram 的精确度。
-
应用简洁惩罚:
- 如果系统生成文本比参考文本短,则应用简洁惩罚以降低分数。
-
计算 BLEU 分数:
- BLEU 分数是 n-gram 精确度的加权几何平均值,并乘以简洁惩罚。
BLEU 的重要性体现在以下几个方面:
- 多重 n-gram:捕捉词语选择和短语结构。
- 简洁惩罚:防止通过极短的输出“欺骗”系统。
- 广泛应用:是机器翻译研究中的标准指标。
- 与人类判断的相关性:通常与人类对翻译质量的评估相符。
BLEU 分数范围从 0 到 1,分数越高表示输出质量越好。
案例分析:
from evaluate import load
# 加载 BLEU 指标
bleu = load('bleu')
# 定义预测和参考
ref = "The quick brown fox jumps over the lazy dog"
pred = "The brown fox jumps over lazy dog"
# 计算 BLEU 分数
bleu_score = bleu.compute(predictions=[pred], references=[[ref]])
print(bleu_score)
# {'bleu': 0.3818502221061359,
# 'precisions': [1.0, 0.6666666666666666, 0.4, 0.25],
# 'brevity_penalty': 0.751477293075286,
# 'length_ratio': 0.7777777777777778,
# 'translation_length': 7, 'reference_length': 9}
ROUGE:文本摘要的利器
ROUGE (Recall-Oriented Understudy for Gisting Evaluation) 是由 Chin-Yew Lin 提出的用于自动评估文本摘要质量的指标。ROUGE 侧重于召回率而不是精确度,通常用于文本摘要。它测量生成文本中出现了多少参考文本中的 n-gram。特别是,ROUGE-L 测量参考文本和系统生成文本之间的最长公共子序列 (LCS)。与 ROUGE-1 和 ROUGE-2 寻找精确的 n-gram 匹配不同,ROUGE-L 捕捉词语顺序和句子结构,同时允许存在间隔。
寻找 LCS 的例子:
参考:[The, quick, brown, fox, jumps, over, the, lazy, dog]
系统:[The, brown, fox, jumps, over, lazy, dog]
LCS 是:[The, brown, fox, jumps, over, lazy, dog] = 长度 7
ROUGE-L 的计算:
- 召回率:LCS_length / Reference_length = 7/9 = 0.78
- 精确度:LCS_length / System_length = 7/7 = 1.0
- F1-Score:2 × (0.78 × 1.0)/(0.78 + 1.0) = 0.88
ROUGE-L 的优点:
- 捕捉词语顺序:与 ROUGE-1 不同,它考虑序列。
- 灵活匹配:允许匹配词语之间存在间隔。
- 句子级结构:更擅长评估流畅性和连贯性。
- 单一指标:无需选择 n-gram 大小。
ROUGE-L 特别适用于评估需要保持信息的逻辑流程和结构的摘要,而不仅仅是关键词覆盖。ROUGE 分数范围从 0 到 1,分数越高表示输出质量越好。
案例分析:
from evaluate import load
rouge = load('rouge')
pred = "The quick brown fox jumps over the lazy dog"
ref = "The brown fox jumps over lazy dog"
rouge_score = rouge.compute(predictions=[pred], references=[ref])
print(rouge_score)
# {'rouge1': 0.8750000000000001,
# 'rouge2': 0.5714285714285715,
# 'rougeL': 0.8750000000000001,
# 'rougeLsum': 0.8750000000000001}
METEOR:对齐的智慧
METEOR (Metric for Evaluation of Translation with Explicit ORdering) 是一种文本评估指标,它改编自机器翻译评估,用于评估 LLM 生成文本的质量。它由 Satanjeev Banerjee 和 Alon Lavie 在论文“METEOR: An Automatic Metric for MT Evaluation with Improved Correlation with Human Judgments”中提出。
核心机制:
METEOR 通过计算候选文本(LLM 输出)和参考文本之间的对齐来评估文本,基于:
- 精确匹配:直接的词对词对应。
- 词干匹配:具有相同词根的词语(例如,“running” 匹配 “run”)。
- 同义词匹配:使用 WordNet 或类似资源来识别语义等价词。
- 释义匹配:识别传达相同含义的短语。
评分过程:
该指标计算三个组成部分:
- 精确度:候选文本中匹配参考文本的词语的比例。
- 召回率:参考文本中在候选文本中匹配的词语的比例。
- 惩罚:基于词语顺序差异(碎片惩罚)的降低。
最终的 METEOR 分数结合了精确度和召回率的调和平均值,然后应用碎片惩罚。
案例分析:
from evaluate import load
# 加载 METEOR 指标
meteor = load('meteor')
# 定义预测和参考
ref = "The quick brown fox jumps over the lazy dog"
pred = "The brown fox jumps over lazy dog"
# 计算 METEOR 分数
meteor_score = meteor.compute(predictions=[pred], references=[ref])
print(meteor_score)
# {'meteor': 0.795138888888889}
编辑距离:量化差异的艺术
编辑距离,最常见的是指 Levenshtein 距离,是一种字符串度量,它测量将一个字符串转换为另一个字符串所需的最小单字符编辑次数(插入、删除或替换)。它由 Vladimir Levenshtein 在论文“Binary codes capable of correcting deletions, insertions, and reversals”中提出。给定两个字符串,编辑距离通过计算使它们相同所需的最小操作数来计算“成本”:
- 插入:添加一个字符
- 删除:删除一个字符
- 替换:用另一个字符替换一个字符
在 NLP 评估中,编辑距离通常应用于词语级别而不是字符级别。
案例分析:
from nltk.metrics import edit_distance
# 定义预测和参考
ref = "The quick brown fox jumps over the lazy dog"
pred = "The brown fox jumps over lazy dog"
# 1. 字符级编辑距离
char_distance = edit_distance(ref, pred)
print(f"Character-level edit distance: {char_distance}") # Character-level edit distance: 6
# 2. 词语级编辑距离
ref_words = ref.split()
pred_words = pred.split()
word_distance = edit_distance(ref_words, pred_words)
print(f"Word-level edit distance: {word_distance}") # Word-level edit distance: 2
Cosine Similarity:向量空间的语义捕捉
Cosine Similarity 是一种基于向量的相似性度量,它测量高维空间中两个向量之间夹角的余弦。在 NLP 评估中,它通常与文本嵌入(word2vec、GloVe、句子转换器等)一起使用,以评估文本之间的语义相似性。与标记级度量不同,Cosine Similarity 在文档级表示上运行,将整个文本视为单个向量并测量它们的方向相似性,而不管幅度如何。
Cosine Similarity 的关键特征:
- 向量空间表示:文本使用预训练嵌入或平均词向量转换为密集的数值向量
- 基于角度的测量:测量向量之间的角度,而不是它们的距离,使其对向量幅度不变
- 尺度不变性:关注方向而不是幅度,因此不会惩罚较长的文本
- 范围归一化:始终产生 -1 和 1 之间的分数(或对于正嵌入,则为 0 和 1)
- 文档级粒度:评估整体语义相似性而不是细粒度的标记对齐
- 嵌入灵活性:可以使用各种嵌入方法:平均词向量、句子转换器或文档嵌入
该指标擅长捕捉高级语义相似性和主题重叠,使其特别适用于文档相似性、主题建模和语义搜索应用。
案例分析:
from sentence_transformers import SentenceTransformer, util
# 加载预训练模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 定义预测和参考
ref = "The quick brown fox jumps over the lazy dog"
pred = "The brown fox jumps over lazy dog"
# 为余弦相似度编码文本
gt_embedding = model.encode(ref, convert_to_tensor=True)
pred_embedding = model.encode(pred, convert_to_tensor=True)
cosine = util.cos_sim(gt_embedding, pred_embedding).item()
print(f"Cosine Similarity: {cosine}")
# Cosine Similarity: 0.9311688542366028
BERTScore:语境感知的语义评估
BERTScore 是一种语义相似性度量,它利用预训练的 BERT 嵌入来评估文本质量。与传统的词汇度量(BLEU、ROUGE)或基于对齐的度量(METEOR、编辑距离)不同,BERTScore 在嵌入空间中运行,测量语义相似性而不是表面级别的词语重叠。核心创新是使用上下文嵌入,其中每个词语的表示取决于其周围的上下文,从而使该度量能够捕捉语义等价性,即使精确的词语不同。
BERTScore 的关键特征:
- 上下文嵌入:每个标记由其 BERT 嵌入表示,该嵌入捕捉语境中的含义,而不仅仅是词汇形式
- 语义匹配:可以识别“汽车”和“机动车”是相似的,或者“大”和“大”传达等效含义
- 标记级对齐:基于嵌入空间中的余弦相似性,在标记之间创建软对齐
- 三组成部分评分:基于嵌入相似性计算精确度、召回率和 F1 分数
- 模型灵活性:可以使用不同的预训练模型(BERT、RoBERTa 等),具体取决于领域要求
- 基于参考的评估:仍然需要参考文本,但对释义和风格变化更具鲁棒性
BERTScore 解决了传统度量的一个根本局限性:它们无法识别语义等价性。虽然“汽车是红色的”和“机动车是深红色的”在 BLEU 或精确匹配度量上得分很差,但 BERTScore 通过嵌入空间识别它们的语义相似性。该度量对于评估语义保真度比精确措辞更重要的 LLM 输出特别有价值,例如摘要、问答和对话生成任务。
案例分析:
import evaluate
# 加载评估指标
bertscore = evaluate.load("bertscore")
# 定义预测和参考
ref = "The quick brown fox jumps over the lazy dog"
pred = "The brown fox jumps over lazy dog"
bert = bertscore.compute(predictions=[pred], references=[ref], lang="en")
BERTScore_P = bert["precision"][0]
BERTScore_R = bert["recall"][0]
BERTScore_F1 = bert["f1"][0]
print(f"BERTScore Precision: {BERTScore_P}, Recall: {BERTScore_R}, F1: {BERTScore_F1}")
# BERTScore Precision: 0.9756591320037842, Recall: 0.9793416857719421, F1: 0.977496325969696
LLM 作为裁判:智能评估的新范式
LLM-as-a-Judge 是一种基于模型的评估方法,它使用大型语言模型(如 GPT-4、Claude 或其他有能力的 LLM)来评估生成文本的质量。与依赖数学公式或参考比较不同,这种方法利用 LLM 的推理能力来提供类似人类的对各种质量维度的判断。核心原则是,能力足够强的 LLM 可以理解传统指标无法理解的上下文、细微差别和质量标准,使其成为人类评估的有效代理。
案例分析:
以下是一个提示示例,可以用于评估 LLM 生成的文本:
请评估以下文本生成:
任务:准确地重现给定的句子
参考:"The quick brown fox jumps over the lazy dog"
生成:"The brown fox jumps over lazy dog"
根据以下因素,在 1-10 的范围内进行评估:
1. 准确性:与参考的匹配程度如何?
2. 完整性:是否保留了所有重要的元素?
3. 流畅性:生成的文本是否自然且符合语法?
提供每个维度的分数,以及包含推理的总体分数。
这个提示引导 LLM 从多个维度评估文本,最终给出一个带有推理的综合评分。
总结与展望
本文对 LLM评估 的各种方法进行了全面的概述,从基于 n-gram 的传统指标,到基于语义相似性的现代方法,再到创新的 LLM 作为裁判。每种方法都有其优缺点,适用于不同的场景和需求。
通常情况下,LLM-as-a-judge 技术能够捕捉到传统指标遗漏的细微之处,并且对于迭代开发来说仍然是实用的。选择哪种 LLM 评估 方法,或者组合使用多种方法,取决于你的特定应用。