如何评估摘要任务
在本笔记本中,我们通过一个简单的例子深入探讨了抽象摘要任务的评估技术。我们探索了像 ROUGE 和 BERTScore 这样的传统评估方法,并展示了一种使用 LLM 作为评估器的新颖方法。
评估摘要的质量是一个耗时的过程,因为它涉及不同的质量指标,如连贯性、简洁性、可读性和内容。像 ROUGE
和 BERTScore
等传统的自动评估指标是具体且可靠的,但它们可能与摘要的实际质量不符。它们与人类判断的相关性相对较低,尤其是在开放式生成任务中(Liu 等人,2023)。越来越需要依靠人类评估、用户反馈或基于模型的指标,同时警惕潜在的偏差。虽然人类判断提供了宝贵的见解,但它通常无法扩展且成本高昂。
除了这些传统指标之外,我们还展示了一种 G-Eval 方法,该方法利用大型语言模型 (LLM) 作为一种新颖的、无参考的指标来评估抽象摘要。在这种情况下,我们使用 gpt-4
来对候选输进行评分。gpt-4
有效地学习了语言质量的内部模型,使其能够区分流畅、连贯的文本和低质量文本。利用这种内部评分机制可以自动评估由 LLM 生成的新候选输出。
设置
# 安装评估所需的必要包
# rouge:用于使用 ROUGE 指标进行评估
# bert_score:用于使用 BERTScore 进行评估
# openai:用于与 OpenAI 的 API 进行交互
!pip install rouge --quiet
!pip install bert_score --quiet
!pip install openai --quiet
from openai import OpenAI
import os
import re
import pandas as pd
# ROUGE 指标的 Python 实现
from rouge import Rouge
# BERTScore 利用 BERT 的预训练上下文嵌入,通过余弦相似度匹配候选句和参考句中的单词。
from bert_score import BERTScorer
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "<your OpenAI API key if not set as env var>"))
<IPython.core.display.Javascript object>
示例任务
在本笔记本中,我们将使用下面的摘要示例。请注意,我们提供了两个要比较的生成摘要和一个参考人工编写的摘要,这是 ROUGE
和 BERTScore
等评估指标所必需的。
摘录(excerpt
):
OpenAI 的使命是确保通用人工智能 (AGI) 惠及全人类。OpenAI 将直接构建安全且有益的 AGI,但如果其工作有助于他人实现这一目标,它也将认为其使命已完成。OpenAI 为此遵循几个关键原则。首先,广泛分布的利益——对 AGI 部署的任何影响都将用于全人类的利益,并避免有害用途或权力过度集中。其次,长期安全——OpenAI 致力于进行研究以确保 AGI 的安全,并促进 AI 社区对这类研究的采用。第三,技术领先——OpenAI 旨在处于 AI 能力的最前沿。第四,合作导向——OpenAI 与其他研究和政策机构积极合作,并寻求建立一个全球社区,共同应对 AGI 的全球挑战。
摘要:
| 参考摘要 /ref_summary
(人工生成) | 评估摘要 1 / eval_summary_1
(系统生成) | 评估摘要 2 / eval_summary_2
(系统生成) |
参考摘要 /ref_summary (人工生成) |
评估摘要 1 / eval_summary_1 (系统生成) |
评估摘要 2 / eval_summary_2 (系统生成) |
---|---|---|
OpenAI 旨在确保通用人工智能 (AGI) 用于每个人的利益,避免有害用途或权力过度集中。它致力于研究 AGI 安全,并在 AI 社区中推广此类研究。OpenAI 寻求在 AI 能力方面处于领先地位,并与全球研究和政策机构合作以应对 AGI 的挑战。 | OpenAI 旨在使 AGI 造福全人类,避免有害用途和权力集中。它开创了安全有益的 AGI 研究,并在全球推广应用。OpenAI 在人工智能领域保持技术领先地位,同时与全球机构合作应对人工智能挑战。它致力于引领全球协作努力,开发造福集体利益的 AGI。 | OpenAI 旨在确保 AGI 用于每个人的使用,完全避免有害的东西或权力过度集中。致力于研究 AGI 的安全方面,在 AI 人群中推广这些研究。OpenAI 希望在 AI 领域处于领先地位,并与全球研究、政策组织合作以解决 AGI 的问题。 |
花点时间想一想,您个人会更喜欢哪个摘要,哪个摘要能很好地捕捉 OpenAI 的使命。
excerpt = "OpenAI's mission is to ensure that artificial general intelligence (AGI) benefits all of humanity. OpenAI will build safe and beneficial AGI directly, but will also consider its mission fulfilled if its work aids others to achieve this outcome. OpenAI follows several key principles for this purpose. First, broadly distributed benefits - any influence over AGI's deployment will be used for the benefit of all, and to avoid harmful uses or undue concentration of power. Second, long-term safety - OpenAI is committed to doing the research to make AGI safe, and to promote the adoption of such research across the AI community. Third, technical leadership - OpenAI aims to be at the forefront of AI capabilities. Fourth, a cooperative orientation - OpenAI actively cooperates with other research and policy institutions, and seeks to create a global community working together to address AGI's global challenges."
ref_summary = "OpenAI aims to ensure artificial general intelligence (AGI) is used for everyone's benefit, avoiding harmful uses or undue power concentration. It is committed to researching AGI safety, promoting such studies among the AI community. OpenAI seeks to lead in AI capabilities and cooperates with global research and policy institutions to address AGI's challenges."
eval_summary_1 = "OpenAI aims to AGI benefits all humanity, avoiding harmful uses and power concentration. It pioneers research into safe and beneficial AGI and promotes adoption globally. OpenAI maintains technical leadership in AI while cooperating with global institutions to address AGI challenges. It seeks to lead a collaborative worldwide effort developing AGI for collective good."
eval_summary_2 = "OpenAI aims to ensure AGI is for everyone's use, totally avoiding harmful stuff or big power concentration. Committed to researching AGI's safe side, promoting these studies in AI folks. OpenAI wants to be top in AI things and works with worldwide research, policy groups to figure AGI's stuff."
<IPython.core.display.Javascript object>
使用 ROUGE 进行评估
ROUGE,代表“面向召回率的 the Gisting 评估的 the Understudy”,主要衡量生成输出和参考文本之间单词的重叠。它是评估自动摘要任务的流行指标。在其变体中,ROUGE-L
提供了系统生成摘要和参考摘要之间最长连续匹配的见解,衡量系统保留原始摘要精髓的程度。
# 计算 Rouge 分数的函数
def get_rouge_scores(text1, text2):
rouge = Rouge()
return rouge.get_scores(text1, text2)
rouge_scores_out = []
# 使用参考文本计算两个摘要的 ROUGE 分数
eval_1_rouge = get_rouge_scores(eval_summary_1, ref_summary)
eval_2_rouge = get_rouge_scores(eval_summary_2, ref_summary)
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)
def highlight_max(s):
is_max = s == s.max()
return [
"background-color: lightgreen" if v else "background-color: white"
for v in is_max
]
rouge_scores_out = (
pd.DataFrame(rouge_scores_out)
.set_index("Metric")
.style.apply(highlight_max, axis=1)
)
rouge_scores_out
Summary 1 | Summary 2 | |
---|---|---|
Metric | ||
rouge-1 (F-Score) | 0.488889 | 0.511628 |
rouge-2 (F-Score) | 0.230769 | 0.163265 |
rouge-l (F-Score) | 0.488889 | 0.511628 |
<IPython.core.display.Javascript object>
该表显示了针对参考文本评估两个不同摘要的 ROUGE
分数。在 rouge-1
的情况下,摘要 2 的表现优于摘要 1,表明单个单词的重叠更好;对于 rouge-l
,摘要 2 的分数更高,这意味着最长公共子序列的匹配程度更高,因此在捕捉原始文本的主要内容和顺序方面可能具有更好的整体摘要效果。由于摘要 2 包含许多直接摘自摘录的单词和短语,因此其与参考摘要的重叠可能更高,从而导致更高的 ROUGE
分数。
虽然 ROUGE
和类似的指标,如 BLEU 和 METEOR,提供了量化度量,但它们通常无法捕捉精心生成的摘要的真正本质。它们与人类分数的关联性也较差。鉴于 LLM 的进步,它们擅长生成流畅连贯的摘要,像 ROUGE
这样的传统指标可能会无意中惩罚这些模型。如果摘要的表述方式不同,但仍然准确地包含了核心信息,尤其如此。
使用 BERTScore 进行评估
ROUGE 依赖于预测文本和参考文本中单词的精确存在,未能解释底层语义。这就是 BERTScore 的用武之地,它利用 BERT 模型的上下文嵌入,旨在在机器生成文本的上下文中评估预测句和参考句之间的相似性。通过比较两个句子的嵌入,BERTScore
捕获了传统 n-gram 度量可能遗漏的语义相似性。
# 为英语实例化 BERTScorer 对象
scorer = BERTScorer(lang="en")
# 计算摘要 1 相对于摘录的 BERTScore
# P1、R1、F1_1 分别代表精确率、召回率和 F1 分数
P1, R1, F1_1 = scorer.score([eval_summary_1], [ref_summary])
# 计算摘要 2 相对于摘录的 BERTScore
# P2、R2、F2_2 分别代表精确率、召回率和 F1 分数
P2, R2, F2_2 = scorer.score([eval_summary_2], [ref_summary])
print("Summary 1 F1 Score:", F1_1.tolist()[0])
print("Summary 2 F1 Score:", F2_2.tolist()[0])
Some weights of the model checkpoint at roberta-large were not used when initializing RobertaModel: ['lm_head.dense.weight', 'lm_head.dense.bias', 'lm_head.layer_norm.bias', 'lm_head.layer_norm.weight', 'lm_head.decoder.weight', 'lm_head.bias']
- This IS expected if you are initializing RobertaModel from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
- This IS NOT expected if you are initializing RobertaModel from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
Summary 1 F1 Score: 0.9227314591407776
Summary 2 F1 Score: 0.9189572930335999
<IPython.core.display.Javascript object>
摘要之间的接近的 F1 分数表明它们在捕获关键信息方面可能表现相似。然而,这种微小的差异应谨慎解释。由于 BERTScore
可能无法完全理解人类评估者可能理解的细微差别和高级概念,因此仅依赖此指标可能会导致对摘要的实际质量和细微差别产生误解。结合 BERTScore
与人类判断和其他指标的综合方法可以提供更可靠的评估。
使用 GPT-4 进行评估
在这里,我们实现了一个示例 无参考 文本评估器,使用 gpt-4
,灵感来自 G-Eval 框架,该框架使用大型语言模型来评估生成文本的质量。与依赖与参考摘要进行比较的 ROUGE
或 BERTScore
等指标不同,基于 gpt-4
的评估器仅根据输入提示和文本评估生成内容的质量,没有任何真实参考。这使其适用于人类参考稀疏或不可用的新数据集和任务。
以下是此方法概述:
- 我们定义了四个不同的标准:
- 相关性:评估摘要是否仅包含重要信息并排除冗余。
- 连贯性:评估摘要的逻辑流程和组织。
- 一致性:检查摘要是否与源文档的事实一致。
- 流畅性:对摘要的语法和可读性进行评分。
- 我们为每个标准精心制作了提示,将原始文档和摘要作为输入,并利用链式思考生成并指导模型为每个标准输出 1-5 的数字分数。
- 我们使用定义的提示从
gpt-4
生成分数,并在摘要之间进行比较。
在此演示中,我们使用了一个直接评分函数,其中 gpt-4
为每个指标生成离散分数(1-5)。对分数进行归一化并取加权总和可以产生更稳健、更连续的分数,从而更好地反映摘要的质量和多样性。
# 基于 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 的流畅性分数。
"""
def get_geval_score(
criteria: str, steps: str, document: str, summary: str, metric_name: str
):
prompt = EVALUATION_PROMPT_TEMPLATE.format(
criteria=criteria,
steps=steps,
metric_name=metric_name,
document=document,
summary=summary,
)
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0,
max_tokens=5,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
)
return response.choices[0].message.content
evaluation_metrics = {
"Relevance": (RELEVANCY_SCORE_CRITERIA, RELEVANCY_SCORE_STEPS),
"Coherence": (COHERENCE_SCORE_CRITERIA, COHERENCE_SCORE_STEPS),
"Consistency": (CONSISTENCY_SCORE_CRITERIA, CONSISTENCY_SCORE_STEPS),
"Fluency": (FLUENCY_SCORE_CRITERIA, FLUENCY_SCORE_STEPS),
}
summaries = {"Summary 1": eval_summary_1, "Summary 2": eval_summary_2}
data = {"Evaluation Type": [], "Summary Type": [], "Score": []}
for eval_type, (criteria, steps) in evaluation_metrics.items():
for summ_type, summary in summaries.items():
data["Evaluation Type"].append(eval_type)
data["Summary Type"].append(summ_type)
result = get_geval_score(criteria, steps, excerpt, summary, eval_type)
score_num = int(result.strip())
data["Score"].append(score_num)
pivot_df = pd.DataFrame(data, index=None).pivot(
index="Evaluation Type", columns="Summary Type", values="Score"
)
styled_pivot_df = pivot_df.style.apply(highlight_max, axis=1)
display(styled_pivot_df)
Summary Type | Summary 1 | Summary 2 |
---|---|---|
Evaluation Type | ||
Coherence | 5 | 3 |
Consistency | 5 | 5 |
Fluency | 3 | 2 |
Relevance | 5 | 4 |
<IPython.core.display.Javascript object>
总的来说,摘要 1 在四个类别中的三个(连贯性、相关性和流畅性)方面优于摘要 2。两个摘要都被发现是一致的。结果可能表明,根据给定的评估标准,摘要 1 通常更可取。
局限性
请注意,基于 LLM 的指标可能存在偏向 LLM 生成文本而非人工编写文本的偏见。此外,基于 LLM 的指标对系统消息/提示很敏感。我们建议尝试其他技术,以帮助提高性能和/或获得一致的分数,在高质量的昂贵评估和自动化评估之间取得适当的平衡。还值得注意的是,这种评分方法目前受到 gpt-4
上下文窗口的限制。
结论
抽象摘要的评估仍然是一个有待进一步改进的开放领域。像 ROUGE
、BLEU
和 BERTScore
这样的传统指标提供了有用的自动评估,但在捕捉语义相似性和摘要质量的细微差别方面存在局限性。此外,它们需要昂贵的参考输出来收集/标记。基于 LLM 的指标有望成为评估连贯性、流畅性和相关性的无参考方法。然而,它们也可能存在偏向 LLM 生成文本的潜在偏见。最终,自动指标和人类评估的结合是可靠评估抽象摘要系统的理想选择。虽然人类评估对于全面了解摘要质量至关重要,但应辅以自动评估,以实现高效、大规模的测试。该领域将继续发展更强大的评估技术,平衡质量、可扩展性和公平性。推进评估方法对于推动生产应用程序的进步至关重要。
参考资料
- G-EVAL:使用具有更好人类对齐的 GPT-4 进行 NLG 评估 - Liu Y, Iter D, Xu Y, Wang S, Xu R, Zhu C。2023 年 5 月发布。
- BERTScore:使用 BERT 评估文本生成 - Zhang T, Kishore V, Wu F, Weinberger KQ, Artzi Y。2020 年 2 月在线发布。
- ROUGE:用于摘要自动评估的软件包 - Lin CY。2004 年 7 月发布。
- SummEval:重新评估摘要评估 - Fabbri 等人。2021 年 4 月发布。