我使用Dalle-3在Bing聊天中生成的图片
如何构建和运行LLM评估任务 — 以及为什么应该在评估LLM提示模板时使用准确率和召回率这篇文章由Ilya Reznik合著
大型语言模型(LLM)是开发人员和企业领导者为消费者创造新的价值的非凡工具。它们能够提供个性化的推荐,将无结构数据转化为结构化数据,并从中提取信息,还能做很多事情。
随着应用程序的增加,衡量基于LLM的应用程序性能的重要性愈发显著。这确实是个不小的挑战,原因有几方面:用户反馈或其他任何“真实反馈来源”极为有限,甚至经常缺失;即便可能,人工标注的成本依然很高;而且很容易使这些应用程序变得更加复杂。
这种复杂性通常被代码的抽象层所隐藏,只有在出现问题时才会变得明显。一行代码可能会触发一系列连锁反应的调用(跨度)。每个跨度都需要进行不同的评估,从而导致你的问题变得更加复杂。例如,下面这个简单的代码片段会触发多个LLM调用。
本人绘制的图
幸运的是,我们能够利用大型语言模型的力量来自动化评估。本文将探讨如何设置这个系统,并确保其可靠性。
LLM评测的核心在于AI自我评估。
尽管这听起来有些循环,但我们一直依靠人类智能来评估其他人类智能(比如在求职面试或大学期末考试中)。现在,AI 系统终于能够像人类一样,通过自我评估来判断其他 AI 系统的表现了。
这里的流程是让大型语言模型生成合成的基准数据,以评估另一个系统。这就引出了一个问题:为什么不直接使用人类的反馈呢?简单来说,是因为你永远得不到足够的反馈。
即使是检查输入输出对中的哪怕百分之一,也是一项巨大的成就。大多数团队甚至无法做到这一点。但要想让这个过程真正发挥作用,对每个语言模型的子调用进行评估是非常重要的,我们已经知道这样的子调用可能很多。
让我们来看看怎么做。
LLM模型的评估 vs. LLM系统的评估LLM_model_evals ≠ LLM_System_evals
LLM 模型评测
你可能听说过LLM评估。这个词在许多不同的上下文中被使用,听起来相似但实际上却有很大差异。其中一种比较常见的用法是我们称之为LLM模型评估。LLM模型评估主要关注这些基础模型的整体性能。发布原始面向客户的LLM的公司需要一种方法来量化这些模型在一系列不同任务上的表现。
图表由作者绘制:我们正在评估两个不同的开源基础模型。我们使用同一个数据集对这两个模型进行测试,看看它们的性能指标如HELLASWAG或MMLU等如何比较。
一个流行的库是 OpenAI 评估库,最初专注于模型评估。有许多评估指标,例如 HellaSwag(评估 LLM 完成句子的能力),TruthfulQA(衡量模型回复的真实度),和 MMLU(评估 LLM 的多任务处理能力)。还有 LLM 排行榜,比较不同开源 LLM 的表现。
LLM系统评测(LLM系统评估)到目前为止,我们讨论了LLM模型的评估。相比之下,LLM系统评估是对你系统中可控组件进行全面评估。其中最重要的组件是提示(或prompt模板)和上下文。LLM系统评估会评估你的输入如何影响输出。
例如,LLM系统的评估可能会保持LLM不变而改变提示模板。因为提示是你系统中相对更动态的部分,这种评估在整个项目的生命周期中很有用。例如,LLM可以评估你聊天机器人的回复是否有帮助或是否礼貌,并且相同的评估也可以告诉你,你的系统在实际运行中性能如何随时间变化。
作者绘制的图 | 在此情况下,我们正在单个基础模型上评估两个不同的提示模板。我们使用同一个数据集在两个模板上进行测试,并比较它们的指标,如精确度和召回率。
选哪一种?取决于你的角色有几种不同的人会使用LLM评估。一种是模型开发者或负责微调LLM的核心的工程师,另一种是系统集成者,他们负责组装面向用户的系统的人。
很少有大型语言模型(LLM)开发者,他们通常在如OpenAI、Anthropic、谷歌、Meta等公司工作。模型开发人员非常关注LLM的评估, 因为他们的工作是交付一个能满足各种应用场景需求的模型。
对于机器学习从业者而言,任务也从模型评估开始。开发大型语言模型系统的第一步是选择一个模型(例如,GPT 3.5、4版本或Palm等模型)。然而,对于这一群体来说,大型语言模型的模型评估通常是一次性完成的步骤。一旦确定了哪种模型在你的应用场景中表现最佳,应用的其余生命周期的大部分时间将由系统评估定义。因此,机器学习从业者既关心大型语言模型的模型评估,也关心大型语言模型的系统评估,但可能更花时间在后者上。
LLM系统的评估标准根据不同应用场景而有所不同。之前与其他ML系统合作过,你可能会问:“结果指标应该是什么比较好?”答案取决于你想要评估的目标是什么。
- 提取结构化信息:我们可以查看LLM提取信息的效果。例如,我们可以查看完整性(输入中的信息是否都在输出中)。
- 问答:系统如何回答用户的问题?我们可以查看答案的准确性、礼貌和简洁,或者上述所有方面。
- 检索增强生成(RAG):RAG的效果如何?检索到的文档和最终答案是否相关?
- 检索增强生成(RAG):RAG的效果如何?检索到的文档和最终答案是否相关?
作为一名系统设计师,你最终要对系统性能负责,因此你需要明白哪些具体系统方面需要评估。例如,如果你有一个大型语言模型在与儿童互动,比如一个辅导应用程序,你希望确保回复是适合年龄的且无毒性。
一些常用的评估方法包括相关性、生成的不准确性、问答准确性等。每种评估都有相应的模板。关于相关性的一个例子如下:
这个示例使用开源Phoenix工具以简化起见(公开说明:我是一个参与开发Phoenix的一员)。在Phoenix工具中,存在大多数常见用例的默认模板。下面是我们为这个示例要使用的模板:
你在比较参考文本和一个问题,看看参考文本里是否有回答该问题的信息。以下是数据:
[BEGIN DATA]
************
[问题]:{query}
************
[参考文本]:{reference}
[END DATA]
比较问题和参考文本。判断参考文本是否包含能够回答该问题的信息。请专注于具体的问题是否可以在参考文本中找到答案。
你的回答只能是“相关”或“不相关”,不能有其他任何文字。
“不相关”意味着参考文本无法回答问题。
“相关”意味着参考文本中有问题的答案。
我们将使用OpenAI的GPT-4模型和scikitlearn的精确度和召回率指标。
首先,我们将导入所有必需的依赖包。
从 phoenix.experimental.evals 引入 (
RAG_RELEVANCY_PROMPT_TEMPLATE_STR,
RAG_RELEVANCY_PROMPT_RAILS_MAP,
OpenAIModel,
download_benchmark_dataset,
llm_eval_binary,
)
从 sklearn.metrics 引入 precision_recall_fscore_support,
现在,我们来用数据集:
# 下载内置在Phoenix中的“基准数据集”
benchmark_dataset = download_benchmark_dataset(
task="binary-relevance-classification", dataset_name="wiki_qa-train"
)
# 为了更快,我们以可重复的方式只取100个样本
benchmark_dataset = benchmark_dataset.sample(100, random_state=2023)
benchmark_dataset = benchmark_dataset.rename(
columns={
"query_text": "query",
"document_text": "reference",
},
)
# 将列名更改为更容易理解的名称
benchmark_dataset = benchmark_dataset.rename(
columns={
"query_text": "query",
"document_text": "reference",
},
)
# 将标签调整为与评估一致的标签
y_true = benchmark_dataset["relevant"].map({True: "relevant", False: "irrelevant"})
那么我们现在来评估一下。
# 这里可以使用任何通用的大规模语言模型,但最好将温度值设置为0
model = OpenAIModel(
model_name="gpt-4",
temperature=0.0,
)
# Rails 会定义我们的输出类
rails = list(RAG_RELEVANCY_PROMPT_RAILS_MAP.values())
benchmark_dataset["eval_relevance"] = \
llm_eval_binary(benchmark_dataset,
model,
RAG_RELEVANCY_PROMPT_TEMPLATE_STR,
rails)
y_pred = benchmark_dataset["eval_relevance"]
# 计算精确率、召回率、F1 分数和支持度
precision, recall, f1, support = precision_recall_fscore_support(y_true, y_pred)
使用大模型来评价基于大模型的系统
评估您的基于LLM的系统涉及两个不同的步骤。首先,为您的LLM评估指标建立基准。为此,您需要构建一个专门的基于LLM的评估工具,其唯一任务是像人类一样准确地标记数据。然后,用这个评估工具来校准您的指标。最后,使用这个评估指标来衡量您的LLM应用的结果(更多细节请参见下文)。
如何构建一个LLM评测正如我们之前提到的,第一步是为你的评价设定一个参照标准。
要做到这一点,你必须从一个最适合你需求的度量标准开始。然后,你需要一个黄金数据集。这个数据集应该代表你期望LLM评估看到的那种类型的数据。黄金数据集应该包含“真实标注”,这样我们才能评估LLM模板的性能。通常这些标注来自人工反馈。构建这样一个数据集相当费时,但你通常可以找到一个针对常见场景的标准化数据集(就像我们在上面的代码中所做的那样)。
作者的图
然后你需要决定你想要用于评估的哪个大型语言模型(LLM)。这可能与你在应用程序中使用的模型不同。例如,你可能在应用程序中使用Llama,而在评估中使用GPT-4。通常,这个选择会受到成本和准确性的考量。
作者绘制的图
现在到了我们要评估并改进的核心部分:评估模板。如果你使用的是比如OpenAI或Phoenix这样的库,可以从现有的模板开始试试,看看这个提示的表现怎么样。
如果你想融入特定的感觉或语气,可以相应地调整模板,或者完全从头开始构建自己的版本。
记住,模板需要有清晰的结构,就像我们在前面提到的那样。比如说,明确说明以下几点:
- 输入的内容是什么? 在我们的例子中,它是检索到的文档/上下文和用户的查询。
- 我们正在问什么? 在我们的例子中,我们要求大型语言模型判断这个文档是否与查询相关。
- 可能的输出格式有哪些? 在我们的例子中,输出格式是二元相关或不相关,也可能是多重分类(例如,完全相关、部分相关、不相关)。
作者画的图
你现在需要在你的基准数据集上运行评估。然后你可以计算指标(总体准确率、精确率、召回率、F1等)来确定基准。需要注意的是,除了总体准确率之外,还有其他重要的指标需要关注。我们下面会更详细地讨论这一点。
如果你对你的大语言模型评估模板的表现不满意的话,你需要修改提示以使它表现更好。这是一个由硬性指标驱动的迭代调整过程。和往常一样,避免将模板过度适应黄金数据集,确保模板的泛化能力。确保你有一个具有代表性的保留集,或运行 k 折交叉验证。
作者的图
最后,你达到了基准。在金标准数据集上的优化性能反映了你对LLM评估的信心。虽然它不如真实基准那么准确,但已经足够准确,并且成本低得多,无需在每个样本中都需要人工标注。
准备好并自定义您的提示模版,这样您可以设置测试用例了。
基于精准度和召回率来评估你的LLM提示模板为什么你应该用这么做有什么好处 (Precision and Recall 精准度和召回率)
该行业尚未完全统一最佳的LLM评估实践的标准。团队通常不清楚如何设定合适的基准标准。
虽然总体准确性经常用到,但这还不够。
这是数据科学实际应用中常见问题之一:非常严重的类别不平衡使得准确性不再是一个实用的衡量标准。
从相关性的角度来思考这个问题确实很有帮助。假设你费尽心思和财力,打造出了最相关的聊天机器人,这绝对是一项艰巨的任务。你选择了适合用例的大型语言模型和模板。这样一来,大多数测试案例都会被标记为“相关”。让我们用一个极端的数字来说明这一点:99.99% 的所有查询都能返回相关结果,哎呀!简直太棒了!
现在从LLM评估模板的角度来看的话,如果输出在所有情况下都被认为是“相关”的,即使不查看数据内容,它几乎在所有情况下(99.99%的时间)都是正确的。但同时,它会错过所有可以说是最为关键的情况——即模型返回不相关结果,而这正是我们必须要捕捉的。
在这个例子中,准确性将会非常高,但是精确率和召回率(或者它们的组合,如F1分数)会非常低。相比之下,精确率和召回率在这里表现得非常低,更能反映模型的实际效果。
另一个有用的可视化工具是混淆矩阵,它能让你直观地看到正确和错误预测的相关和不相关样本的比例。
图表由作者绘制 | 在此示例中,我们看到正确预测的比例最高,这个比例达到88%:标准数据集中相关示例有88%的概率被正确标记。然而,我们发现评估在处理“不相关”示例时,表现不如处理“相关”示例时好,误标记的比例超过27%,即有超过27%的“不相关”示例被误标记为“相关”。
如何在应用上运行LLM评测到这时,你应该已经有了自己的模型和测试过的LLM评估。你已经证明了评估是有效的,并且对它的性能有了可量化的理解。是时候增加更多信任了!
现在我们可以真正对我们应用进行评估了。这将帮助我们评估我们的LLM应用表现如何,并找出改进的地方。
图由作者绘制
LLM系统评估会运行你的整个系统,只需多加一步。例如
- 找到你的输入文档,并将其放入你的提示模板中,同时并加入一些用户样本输入。
- 你将该提示提供给LLM并得到答案。
- 你将提示和答案提供给评估系统,看看答案是否与提示相关。
最佳的做法是不要用临时编写的代码来评估LLM,而是使用带有内置提示模板的库。这样可以提高可重复性,并允许更灵活的评估方式,你可以方便地替换不同的部分。
这些评价需要在三个不同的环境中生效。
预制作你在做测试的时候。
前期准备当你在测试应用程序时,这与传统机器学习中的离线评估概念类似。目的是在将系统发布给客户之前了解其性能。
制作当部署之后,生活变得复杂。数据、用户和模型都会发生变化,这种变化都是不可预测的。系统之前运行良好并不代表它在周二晚上7点也能正常运作。评估能帮你持续了解系统部署后的情况。
作者绘制的图
要思考的问题 你得取多少行数据?LLM评估大型语言模型的模式并不是魔术。你无法评估你遇到过的每一个例子——那样做成本会非常高。然而,在人工标注过程中你已经需要采样数据了,更多的自动化只会让这个过程变得更加简单和经济。因此,你可以采样比人工标注更多的数据行,这样做更加方便且经济。
你应该用哪些评价标准?这主要取决于你的应用场景。对于搜索和检索,相关性评估最有效。毒性和幻觉有特定的评估方式(详见上文提到的内容)。
其中一些评估在故障排除流程中非常重要。问答准确性可能是一个总体指标,但如果深入探究为什么这个系统的指标表现不佳,你可能会发现是由于检索效果不佳等原因。通常有很多可能的原因,你可能需要多个指标来查明问题的根本原因。
你应该用哪种模型?不能说有一种模型适合所有情况。相反,你应该运行模型评估测试来了解哪个模型适合你的应用。你也可能需要考虑召回率和精确度之间的权衡,这取决于你的应用场景。换句话说,做一些数据分析来更好地理解这一点,针对你的具体场景。
作者所绘图表
结束语能够评估您应用程序的性能在生产代码中非常重要。在大型语言模型(LLM)的时代,问题变得更加棘手,但幸运的是,我们可以使用大型语言模型技术来帮助我们进行评估。LLM 评估 应该测试整个系统而不仅仅是底层的 LLM 模型——想想提示模板对用户体验有多重要。最佳实践、标准化工具和精选数据集简化了开发 LLM 系统的工作。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章