LLM评估指南:设置和重要的指标
LLM评估指南:设置和关键指标的重要性

如何构建和运行LLM评估-为什么在对LLM模板进行基准测试时应使用精确度和召回率
本文由Ilya Reznik共同撰写。
大型语言模型(LLMs)是开发人员和商业领导者为消费者创造新价值的不可思议工具。它们可以进行个性化推荐、在非结构化和结构化数据之间进行翻译、对大量信息进行总结等等。
随着应用逐渐增多,对基于LLM的应用性能进行评估的重要性也在增加。这是一个非常复杂的问题,原因如下:用户反馈或任何其他“真实来源”非常有限,通常甚至不存在;即使有可能,进行人工标记仍然非常昂贵;而且很容易使这些应用变得复杂。
这种复杂性通常被代码的抽象层所隐藏,只有当出现问题时才变得明显。一行代码可以触发一系列调用(扩展)。因此,针对每个扩展都需要进行不同的评估,这样会增加你的问题。例如,下面的简单代码片段触发了多个子LLM调用。

幸运的是,我们可以利用LLMs的能力来自动化评估。在本文中,我们将深入探讨如何设置以及如何确保其可靠性。
LLM评估的核心是人工智能评估人工智能。
虽然这听起来循环,但我们总是让人工智能评估人类智能(例如,在工作面试或大学期末考试中)。现在AI系统终于可以对其他AI系统进行评估。
这里的过程是LLMs生成可以用于评估另一个系统的合成参考答案。这引发一个问题:为什么不直接使用人类反馈?简而言之,因为您永远无法获得足够的反馈。
即使在您的输入/输出对中获得一成不变的人类反馈,也是一项巨大的成就。大多数团队甚至都无法做到这一点。但为了使该过程真正有用,重要的是对每个LLM子调用进行评估,我们已经看到这样的调用可能会非常多。
让我们探索如何做到这一点。
LLM模型评估与LLM系统评估
LLM_model_evals!=LLM_System_evals
LLM模型评估
您可能听说过LLM评估。这个术语很常用,虽然听起来都很相似,但实际上是非常不同的。其中一种更常见的用法是我们称之为LLM模型评估。 LLM模型评估关注的是基础模型的整体性能。发布原始面向客户的LLM的公司需要一种方法来量化它们在各种不同任务中的有效性。

其中一个流行的库,具有LLM模型评估功能,是OpenAI Eval库,最初专注于模型评估用例。存在许多指标,如HellaSwag(评估LLM完成句子的能力),TruthfulQA(衡量模型回应的真实性)和MMLU(衡量LLM的多任务能力)。甚至还有一个排行榜,用于比较开源LLM之间的性能。
LLM系统评估
到目前为止,我们已经讨论了LLM模型评估。相比之下,LLM系统评估是对你们系统可控制的各组件的完整评估。其中最重要的组件是提示(或提示模板)和上下文。LLM系统评估评估你们的输入如何确定输出的能力。
LLM系统评估可能会保持LLM不变,但改变提示模板。由于提示是系统中更具动态性的部分,因此在项目的整个生命周期中进行此评估是有意义的。例如,LLM可以评估你们聊天机器人的回应是否有用或礼貌,同样的评估也可以提供有关在实际应用中随时间变化的性能变化的信息。

使用哪种取决于您的角色
存在不同的角色使用LLM评估。一个是模型开发者或负责优化核心LLM的工程师,另一个是构建面向用户系统的从业人员。
LLM模型开发者非常少,他们往往在OpenAI、Anthropic、Google、Meta等公司工作。由于他们的任务是提供适用于各种用例的模型,模型开发者关注LLM模型评估。
对于机器学习从业者来说,任务也始于模型评估。在开发LLM系统的第一步之一是选择一个模型(例如GPT 3.5 vs 4 vs Palm等)。然而,对于此组而言,LLM模型评估通常是一次性步骤。一旦您确定了在您的用例中哪个模型表现最佳,大部分应用程序生命周期中的工作将由LLM系统评估来定义。因此,机器学习从业者关注LLM模型评估和LLM系统评估,但后者可能需要更多时间。
LLM系统评估指标因用例而异
如果您曾经使用其他机器学习系统,您的第一个问题可能是:“结果指标应该是什么?”答案取决于您要评估的内容。
- 提取结构化信息:您可以观察LLM提取信息的程度。例如,您可以观察完整性(输入中是否存在输出中没有的信息)。
- 问答:系统对用户的问题回答得如何?您可以观察回答的准确性、礼貌性或简洁性,或者以上所有。
- 检索增强生成(RAG):检索到的文档和最终答案是否相关?
作为系统设计者,您最终需要为系统性能负责,因此您需要了解需要评估系统的哪些方面。例如,如果您需要LLM与儿童进行交互,如辅导应用,您希望确保回应内容适合他们的年龄,并且没有自带毒性。
今天使用的一些常見評估方法包括相關性、幻覺、問答準確性和毒性。每種評估都會根據您試圖評估的內容而有不同的模板。以下是相關性的示例:
此示例使用開源的Phoenix工具以保持簡潔(完全透明:我是開發Phoenix的團隊成員之一)。在Phoenix工具中,存在著大多數常見用例的默認模板。以下是我們在此示例中將使用的模板:
您正在將參考文本與問題進行比較,並試圖確定參考文本中是否包含與回答問題相關的信息。以下是數據:
[BEGIN DATA]
************
[問題]:{query}
************
[參考文本]:{reference}
[END DATA]
將上面的問題與參考文本進行比較。您必須確定參考文本是否包含可以回答問題的信息。請專注於參考文本中是否可以回答非常具體的問題。您的回答必須是一個單詞,即“relevant”或“irrelevant”,除此詞外,不應包含任何文本或字符。
“irrelevant”表示參考文本不包含對問題的答案。“relevant”表示參考文本包含對問題的答案。
我們還將使用OpenAI的GPT-4模型和scikitlearn的精度/召回率指標。
首先,我們將導入所有必要的依賴項:
from phoenix.experimental.evals import ( RAG_RELEVANCY_PROMPT_TEMPLATE_STR, RAG_RELEVANCY_PROMPT_RAILS_MAP, OpenAIModel, download_benchmark_dataset, llm_eval_binary,)from sklearn.metrics import 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", },)# 將我們的數據集和評估生成的標籤相符
y_true = benchmark_dataset["relevant"].map({True: "relevant", False: "irrelevant"})
現在讓我們進行評估:
# 這裡可以使用任何通用LLM,但最佳實踐是將溫度設置為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"]# 計算評估指標
precision, recall, f1, support = precision_recall_fscore_support(y_true, y_pred)
使用LLM評估基於LLM的系統
使用LLM評估基於LLM的系統有兩個明確的步驟。首先,為LLM評估指標建立基準。為此,您需要構建一個專門的基於LLM的評估,其唯一任務是以人類對您的“黃金數據集”的效果標註數據。然後,與該評估對比評估指標。然後,根據LLM應用程序的結果運行該LLM評估指標(詳情見下文)。
如何構建LLM評估
如上所述,第一步是構建評估的基準。
為此,您必須從適合您用例的評估指標開始。然後,您需要一個黃金數據集。這應該代表您預計LLM評估將看到的數據類型。黃金數據集應該具有“地面真相”標籤,以便我們可以測量LLM評估模板的性能。通常,此類標籤來自人類反饋。構建這樣的數據集是費時的,但通常可以找到最常見用例的標准化數據集(如上面的代碼中所做的那樣)。

那么,您需要决定要使用哪个LLM进行评估。这可能与您用于申请的LLM不同。例如,您可能在申请中使用Llama,但在评估中使用GPT-4。通常,这个选择会受到成本和准确性的影响。

现在,我们要进行基准测试和改进的核心组件出现了:评估模板eval template。如果您正在使用像OpenAI或Phoenix这样的现有库,您应该从现有模板开始,看看该提示的表现如何。
如果您想要加入特定的细微差别,请相应地调整模板,或者从头开始构建您自己的模板。
请记住,模板应该有明确的结构,就像我们在前一节中使用的那样。以下内容应明确说明:
- 输入是什么?在我们的例子中,输入是被检索到的文档/内容以及用户的查询。
- 我们在问什么?在我们的例子中,我们要求LLM告诉我们文档是否与查询相关。
- 可能的输出格式是什么?在我们的例子中,这是二进制相关/不相关,但也可以是多类别(例如,完全相关、部分相关、不相关)。

现在,您需要在您的黄金数据集上运行评估。然后,您可以生成指标(整体准确率、精确率、召回率、F1等),以确定基准。重要的是要查看不仅仅是整体准确率。我们将在下面更详细地讨论这个问题。
如果您对LLM评估模板的表现不满意,您需要更改提示,使其表现更好。这是一个由硬指标指导的迭代过程。与往常一样,重要的是要避免将模板过度拟合到黄金数据集。确保有一个代表性的保留集或运行k折交叉验证。

最后,您会得到您的基准。黄金数据集上的优化性能代表您对LLM评估的信心。它的准确性不会像您的真实数据一样高,但足够准确,并且成本比使用人工标记者在每个示例中更低。
准备并定制您的提示模板,可以帮助您建立测试案例。
为什么在对LLM提示模板进行基准测试时应使用精确率和召回率
行业尚未完全制定LLM评估的最佳实践。团队通常不知道如何建立正确的基准指标。
虽然整体准确率经常被使用,但这还不够。
这是数据科学行动中最常见的问题之一:非常明显的类别不平衡使得准确率成为一种不切实际的度量标准。
从相关性指标的角度来考虑是有帮助的。假设您经过了所有的麻烦和花费,打造出了您能想到的最相关的聊天机器人。您选择了一个适合用例的LLM和模板。这意味着更多的示例应该被评估为“相关”。我们选择一个极端的数字来说明这一点:99.99%的查询返回相关结果。太好了!
现在从LLM评估模板的角度来看。如果输出在所有情况下都是“相关”,甚至不用看数据,它的准确率就达到了99.99%。但它同时会错过所有(可以说最)重要的情况——模型返回了不相关的结果,而我们必须捕捉到这些情况。
在这个例子中,准确率可能很高,但是精确率和召回率(或者两者的组合,比如F1得分)可能非常低。在这里,精确率和召回率是衡量模型性能的更好指标。
另一个有用的可视化工具是混淆矩阵,它可以让您查看相关和不相关示例的正确和错误预测百分比。

如何在应用程序中运行LLM评估
在这一点上,您应该已经有了您的模型和经过测试的LLM评估。您已经向自己证明了评估的可行性,并对其与真实情况的表现有了可量化的理解。是时候建立更多的信任了!
现在我们可以在我们的应用程序上实际使用我们的评估。这将帮助我们衡量我们的LLM应用程序的效果,并找出如何改进它。

LLM系统评估在您的整个系统中多运行了一步。例如:
- 您检索输入文档,并将它们与示例用户输入一起添加到提示模板中。
- 您将该提示提供给LLM并接收答案。
- 您将提示和答案提供给您的评估,询问它答案是否与提示相关。
最好的做法是不要使用一次性代码进行LLM评估,而是使用具有内置提示模板的库。这增加了可重复性,并允许更灵活的评估,可以在其中更换不同的部分。
这些评估需要在三种不同的环境中工作:
预生产
当您进行基准测试时。
预生产
当您测试应用程序时。这在某种程度上类似于传统机器学习中的离线评估概念。目的是在向客户交付系统之前了解其性能。
生产
当系统部署后。生活是混乱的。数据漂移,用户漂移,模型漂移,全部以不可预测的方式进行。仅因为您的系统曾经工作良好,不意味着它在每周二晚上7点也会如此。评估能帮助您不断了解系统在部署后的性能。

需要考虑的问题
您应该抽取多少行数据?
LLM评估-LLM范式并不是魔法。您无法评估您曾经遇到的每个示例-这将成本过高。然而,在人工标注期间,您已经需要对数据进行抽样,并且自动化使此过程更加轻松和廉价。因此,您可以抽取比人工标注更多的行。
你应该使用哪些评估方法?
这主要取决于你的使用情况。对于搜索和检索,相关性类型的评估效果最佳。毒性和幻觉具有特定的评估模式(请参考上文)。
在故障排除流程中,某些评估是重要的。问答准确性可能是一个很好的整体指标,但是如果你深入研究为什么系统中的此指标表现不佳,你可能会发现是由于例如检索错误引起的。通常有许多可能的原因,你可能需要多个指标来找到问题的根本原因。
你应该使用哪个模型?
很难说哪个模型适用于所有情况。相反,你应该运行模型评估来了解哪个模型适合你的应用程序。你还可能需要考虑召回率和精确度之间的权衡,具体取决于你的应用情况。换句话说,需要进行一些数据科学工作,以了解你特定情况的最佳选择。

结论
在生产代码中,能够评估应用程序的性能非常重要。在LLM(大型语言模型)时代,问题变得更加复杂,但幸运的是,我们可以利用LLM技术来帮助我们进行评估。这样的评估应该测试整个系统,而不仅仅是底层的LLM模型 – 想想预设模板对用户体验有多重要。最佳实践、标准化的工具和精心策划的数据集简化了开发LLM系统的工作。