亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

大型語言模型評估指南:如何構建和評估你的模型評估體系

我使用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 系统的工作。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消