你是否曾经尝试过创建自动文摘系统,但却不知道如何准确评估其质量?本文将为您提供关于如何评估抽象文摘质量的详细指南。我们将介绍传统的评估方法,如ROUGE和BERTScore,以及一种创新的方法,利用大型语言模型(LLM)作为评估器。
1. 开篇故事
在探讨自动文摘质量评估之前,让我们来看一个生动有趣的故事。假设你是一名AI研究员,正在开发一款自动文摘系统,这个系统可以将长篇文章精炼成简短的摘要。你花费了数月时间不断改进算法,优化性能,但你开始面临一个棘手的问题:如何准确地评估你的文摘质量?这个问题在自然语言处理领域一直备受关注,因为它涉及到了如何衡量文本的准确性、连贯性和相关性。
在这个教程中,我们将为你揭示评估自动文摘质量的关键方法,让你的工作更具实际应用性和可衡量性。
2. 引言
自动文摘质量评估是一个耗时的过程,因为它涉及到不同的质量指标,如连贯性、简洁性、可读性和内容。传统的自动评估指标,如ROUGE和BERTScore等,虽然具体可靠,但可能与实际文摘质量的相关性不高。特别是对于开放性生成任务,它们与人类评价的相关性相对较低。因此,在评估文摘质量时,越来越需要依赖人类评估、用户反馈或基于模型的指标,同时需要警惕潜在的偏见。虽然人类判断提供了宝贵的见解,但通常不具备可扩展性,并且成本较高。
除了传统的评估指标,我们还展示了一种使用大型语言模型(LLM)的方法(G-Eval),用作评估抽象性摘要的新型、无参考度量。在这种情况下,我们使用gpt-4来评分候选输出。gpt-4已经有效地学习了语言质量的内部模型,使其能够区分流畅、连贯的文本和低质量的文本。利用这种内部评分机制,可以自动评估LLM生成的新候选输出。
3. 安装必要的软件包
在进行评估之前,我们需要安装一些必要的软件包,以便进行评估。这些包包括ROUGE、BERTScore和OpenAI的API。
!pip install rouge --quiet
!pip install bert_score --quiet
!pip install openai --quiet
import openai
import os
import re
import pandas as pd
# 这里放置Python实现ROUGE指标的代码
from rouge import Rouge
# BERTScore利用BERT的上下文嵌入并通过余弦相似度匹配候选和参考句子中的单词。
from bert_score import BERTScorer
openai.api_key = os.environ.get("OPENAI_API_KEY")
4. 示例任务
为了本教程的目的,我们将使用以下示例文摘任务。请注意,我们提供了两个生成的摘要供比较,以及一个参考的人工撰写摘要,这是ROUGE和BERTScore等评估指标所需的。
摘录 (excerpt):
OpenAI的使命是确保人工通用智能(AGI)造福全人类。OpenAI将直接构建安全和有益的AGI,但如果其工作有助于其他人实现这一目标,它也将认为使命已达成。OpenAI遵循几个关键原则。首先,广泛分布的利益 - 对AGI部署的任何影响都将用于全人类的利益,以避免有害的使用或权力过度集中。其次,长期安全 - OpenAI致力于进行研究,使AGI安全,并促进这些研究在AI社区中的采纳。第三,技术领导 - OpenAI旨在处于AI能力的前沿。第四,合作导向 - OpenAI积极与其他研究和政策机构合作,并寻求创建一个共同工作的全球社区,共同解决AGI的全球挑战。
摘要 (Summaries):
-
参考摘要 /ref_summary(人工生成):
OpenAI的目标是确保人工通用智能(AGI)造福所有人,避免有害用途或权力过度集中。它致力于研究AGI的安全性,并在AI社区中促进这些研究。OpenAI旨在领导AI能力的发展,与全球研究和政策机构合作,解决AGI的挑战。 -
评估摘要1 / eval_summary_1(系统生成):
OpenAI旨在使AGI造福全人类,避免有
害用途和权力集中。它引领安全和有益的AGI研究,并在全球促进采用。OpenAI在AI领域保持技术领导地位,与全球机构合作,解决AGI的挑战。它力求领导一个协作的全球努力,为集体利益开发AGI。
- 评估摘要2 / eval_summary_2(系统生成):
OpenAI旨在确保AGI供所有人使用,完全避免有害内容或权力过度集中。致力于研究AGI的安全性,并在AI社区中促进这些研究。OpenAI希望在AI领域处于领先地位,并与全球研究和政策团体合作,探讨AGI的相关问题。
5. 使用ROUGE进行评估
ROUGE是Recall-Oriented Understudy for Gisting Evaluation的缩写,主要用于衡量生成的输出与参考文本之间的词语重叠。这是评估自动文摘任务的一种流行指标。在其各种变体中,ROUGE-L提供了系统生成和参考摘要之间最长连续匹配的信息,衡量系统保留原始摘要要点的程度。
# 计算ROUGE分数的函数
def get_rouge_scores(text1, text2):
rouge = Rouge()
return rouge.get_scores(text1, text2)
# 计算两个摘要与参考摘要之间的ROUGE分数
eval_1_rouge = get_rouge_scores(eval_summary_1, ref_summary)
eval_2_rouge = get_rouge_scores(eval_summary_2, ref_summary)
rouge_scores_out = []
for metric in ["rouge-1", "rouge-2", "rouge-l"]:
for label in ["F-Score"]:
eval_1_score = eval_1_rouge[0][metric][label[0].lower()]
eval_2_score = eval_2_rouge[0][metric][label[0].lower()]
row = {
"Metric": f"{metric} ({label})",
"Summary 1": eval_1_score,
"Summary 2": eval_2_score,
}
rouge_scores_out.append(row)
# 展示ROUGE分数
rouge_scores_out_df = (
pd.DataFrame(rouge_scores_out)
.set_index("Metric")
)
rouge_scores_out_df
上述代码计算了两个不同摘要与参考文本之间的ROUGE分数。在rouge-1方面,摘要2优于摘要1,表示单词重叠较多。而在rouge-l方面,摘要2得分较高,意味着最长公共子序列匹配较好,因此可能更好地捕捉了原始文本的主要内容和顺序。由于摘要2直接提取了摘录中的许多词汇和短语,因此与参考摘要的重叠可能较高,从而导致较高的ROUGE分数。
然而,需要注意的是,尽管ROUGE和类似的指标(如BLEU和METEOR)提供了定量的度量,但它们通常无法捕捉良好生成摘要的真正本质。它们与人类评分的相关性也较差。鉴于LLM的进展,它们擅长生成流畅和连贯的摘要,传统的指标如ROUGE可能会误判这些模型,特别是如果摘要的表达方式不同但仍然准确地包括核心信息。
6. 使用BERTScore进行评估
ROUGE依赖于候选文本和参考文本中单词的精确匹配,无法解释底层语义。这就是BERTScore的作用,它利用BERT模型的上下文嵌入,旨在评估在机器生成的文本背景下,预测文本和参考句子之间的相似性。通过比较两者的嵌入,BERTScore捕获了传统n-gram指标可能忽略的语义相似性。
# 实例化英语语言的BERTScorer对象
scorer = BERTScorer(lang="en")
# 计算摘要1与摘录的BERTScore
P1, R1, F1_1 = scorer.score([eval_summary_1], [ref_summary])
# 计算摘要2与摘录的BERTScore
P2, R2, F2_2 = scorer.score([eval_summary_2], [ref_summary])
print("摘要1 F1分数:", F1_1.tolist()[0])
print("摘要2 F1分数:", F2_2.tolist()[0])
上述代码计算了两个摘要与摘录之间的BERTScore分数。F1分数接近表明它们在捕获关键信息方面表现相似。然而,这种小差异应谨慎解释。由于BERTScore可能无法完全理解人类评估员可能理解的微妙和高级概念,仅依赖于这一指标可能会导致对摘要的实际质量和细微差别进行错误解读。将BERTScore与人工评估和其他指标结合使用可以提供更可靠的评估。
7. 使用GPT-4进行评估
在这里,我们实现了一个使用gpt-4的示例无参考文本评估器,受到G-Eval框架的启发,该框架使用大型语言模型评估生成文本的质量。与ROUGE或BERTScore等依赖于与
参考摘要的比较的指标不同,基于gpt-4的评估器仅基于输入提示和文本评估生成内容的质量,而无需任何基准参考。这使其适用于新数据集和任务,其中人类参考文献稀缺或不可用。
以下是此方法的概述:
-
我们定义了四个不同的标准:
- 相关性:评估摘要是否仅包含重要信息并排除多余信息。
- 连贯性:评估摘要的逻辑流程和组织结构。
- 一致性:检查摘要是否与源文档中的事实一致。
- 流畅性:评估摘要的语法、拼写、标点、词汇选择和句子结构。
-
我们为每个标准创建提示,以原始文档和摘要作为输入,并利用思维链生成和引导模型以输出每个标准的1-5之间的数值评分。
-
我们使用定义的提示从gpt-4生成分数,然后比较它们在不同摘要之间。
# 评估提示模板基于G-Eval
EVALUATION_PROMPT_TEMPLATE = """
您将获得一份为一篇文章写的摘要。您的任务是根据一个度量标准对摘要进行评分。
请确保您非常仔细地阅读和理解这些说明。
请在审阅时保持这个文档打开,并根据需要参考它。
评估标准:
{criteria}
评估步骤:
{steps}
示例:
源文本:
{document}
摘要:
{summary}
评估表单(仅分数):
- {metric_name}
"""
# 标准1:相关性
RELEVANCY_SCORE_CRITERIA = """
相关性(1-5) - 从源文本中选择重要内容。 \
摘要应仅包含源文档中的重要信息。 \
评估员被要求惩罚包含冗余和多余信息的摘要。
"""
RELEVANCY_SCORE_STEPS = """
1. 仔细阅读摘要和源文档。
2. 比较摘要与源文档,并确定文章的主要要点。
3. 评估摘要多好地涵盖了文章的主要要点,以及它包含了多少无关或多余的信息。
4. 指定一个从1到5的相关性评分。
"""
# 标准2:连贯性
COHERENCE_SCORE_CRITERIA = """
连贯性(1-5) - 所有句子的综合质量。 \
我们将此维度与DUC质量问题中的结构和连贯性一致,即“摘要应该具有良好的结构和组织。 \
摘要不应仅仅是一堆相关信息,而应该从句子到一\
个关于一个主题的连贯信息体中逐渐构建起来。”
"""
COHERENCE_SCORE_STEPS = """
1. 仔细阅读文章,确定主要主题和要点。
2. 仔细阅读摘要,并将其与文章进行比较。检查摘要是否涵盖了文章的主要主题和要点,
并且是否以清晰且逻辑的顺序呈现它们。
3. 根据评估标准,为连贯性评分,评分范围从1到5,其中1是最低的,5是最高的。
"""
# 标准3:一致性
CONSISTENCY_SCORE_CRITERIA = """
一致性(1-5) - 摘要与被总结源文之间的事实一致性。 \
一个事实一致的摘要仅包含源文档支持的陈述。 \
评估员还被要求惩罚包含虚构事实的摘要。
"""
CONSISTENCY_SCORE_STEPS = """
1. 仔细阅读文章,确定它呈现的主要事实和细节。
2. 仔细阅读摘要,并将其与文章进行比较。检查摘要是否包含文章不支持的任何事实错误。
3. 根据评估标准,为一致性评分。
"""
# 标准4:流畅性
FLUENCY_SCORE_CRITERIA = """
流畅性(1-3): 摘要的质量,涉及语法、拼写、标点、词汇选择和句子结构。
1: 差。摘要有许多错误,使其难以理解或听起来不自然。
2: 一般。摘要有一些错误,影响了文本的清晰度或流畅性,但主要要点仍然可以理解。
3: 良好。摘要几乎没有错误,阅读和理解起来很容易。
"""
FLUENCY_SCORE_STEPS = """
阅读摘要并根据给定的标准评估其流畅性。指定一个从1到3的流畅性评分。
"""
# 为不同标准准备数据
evaluation_metrics = {
"相关性": (RELEVANCY_SCORE_CRITERIA, RELEVANCY_SCORE_STEPS),
"连贯性": (COHERENCE_SCORE_CRITERIA, COHERENCE_SCORE_STEPS),
"一致性": (CONSISTENCY_SCORE_CRITERIA, CONSISTENCY_SCORE_STEPS),
"流畅性": (FLUENCY_SCORE_CRITERIA, FLUENCY_SCORE_STEPS),
}
summaries = {"摘要1": eval_summary_1, "摘要2": eval_summary_2}
data = {"评估
标准": [], "摘要": [], "评分": []}
for metric, (criteria, steps) in evaluation_metrics.items():
for summary_name, summary_text in summaries.items():
prompt = EVALUATION_PROMPT_TEMPLATE.format(
criteria=criteria, steps=steps, document=excerpt, summary=summary_text, metric_name=metric
)
response = openai.Completion.create(
engine="text-davinci-003", prompt=prompt, max_tokens=100
)
rating = int(re.search(r"\d", response.choices[0].text).group())
data["评估标准"].append(metric)
data["摘要"].append(summary_name)
data["评分"].append(rating)
# 将数据转换为DataFrame以进行比较
evaluation_df = pd.DataFrame(data)
# 输出评估结果
evaluation_df
上述代码使用gpt-4基于定义的四个标准为两个摘要生成了1-5之间的分数。这些标准包括相关性、连贯性、一致性和流畅性。根据每个标准的提示,gpt-4生成了评分,然后将这些评分与不同摘要进行比较。根据评估结果,您可以看到每个摘要在不同标准下的表现如何。
8. 总结
自动文摘质量评估是一个复杂的任务,涉及多个方面,包括文本的相关性、连贯性、一致性和流畅性。传统的评估指标如ROUGE和BERTScore提供了一种方式来量化自动生成的文本与参考文本之间的相似性,但它们不能全面捕捉文本质量的各个方面。因此,将它们与基于大型语言模型的评估器结合使用可能会更全面地评估文本质量。
在这个教程中,我们展示了如何使用ROUGE、BERTScore和基于gpt-4的评估器来评估自动生成的文本的质量。请记住,这些指标和方法只是评估文本质量的一部分,最终的评估可能需要人工评估和用户反馈来全面评估文本生成系统的性能。希望这个指南能帮助您更好地了解如何评估自动文摘质量,从而改进和优化您的自动生成文本的系统。