跳到主要内容

评估概念

AI 应用程序的质量和开发速度通常受限于高质量的评估数据集和指标,而这些能够帮助您优化和测试应用程序。

LangSmith 使构建高质量评估变得容易。本指南更广泛地解释了 LangSmith 评估框架和 AI 评估技术。LangSmith 框架的构建模块包括

数据集

数据集是用于评估应用程序的示例集合。一个示例是一个测试输入、参考输出对。

Dataset

示例

每个示例包含

  • 输入:一个包含要传递给应用程序的输入变量的字典。
  • 参考输出(可选):一个包含参考输出的字典。这些不会传递给您的应用程序,仅在评估器中使用。
  • 元数据(可选):一个包含额外信息的字典,可用于创建数据集的过滤视图。

Example

数据集整理

有多种方法可以构建用于评估的数据集,包括

手动整理的示例

这是我们通常建议人们开始创建数据集的方式。在构建应用程序时,您可能对应用程序应该能够处理的输入类型以及“良好”响应可能是什么样子有一些想法。您可能希望涵盖一些常见的边缘情况或您可以想象的场景。即使是 10-20 个高质量的手动整理示例也能发挥很大作用。

历史跟踪

一旦您的应用程序投入生产,您就会开始获得有价值的信息:用户实际上是如何使用它的?这些真实世界的运行是极好的示例,因为它们最真实!

如果您的流量很大,如何确定哪些运行值得添加到数据集中?您可以使用以下几种技术

  • 用户反馈:如果可能,尝试收集最终用户反馈。然后您可以查看哪些数据点收到了负面反馈。这非常有价值!这些是您的应用程序表现不佳的地方。您应该将它们添加到数据集中,以便将来进行测试。
  • 启发式方法:您还可以使用其他启发式方法来识别“有趣”的数据点。例如,完成时间很长的运行可能值得查看并添加到数据集中。
  • LLM 反馈:您可以使用另一个 LLM 来检测值得注意的运行。例如,您可以使用 LLM 来标记用户不得不重新措辞问题或以某种方式纠正模型的聊天机器人对话,这表明聊天机器人最初没有正确响应。

合成数据

一旦您有了一些示例,就可以尝试人工生成更多。通常建议在此之前先准备一些精心制作的示例,因为这些合成数据通常会在某种程度上与它们相似。这是一种快速获取大量数据点的有用方法。

拆分

设置评估时,您可能希望将数据集划分为不同的拆分。例如,您可以使用较小的拆分进行多次快速且廉价的迭代,并使用较大的拆分进行最终评估。此外,拆分对于实验的可解释性也很重要。例如,如果您有一个 RAG 应用程序,您可能希望数据集拆分侧重于不同类型的问题(例如,事实性、观点性等),并单独评估应用程序在每个拆分上的表现。

了解如何创建和管理数据集拆分

版本

数据集会进行版本控制,这样每次您在数据集中添加、更新或删除示例时,都会创建数据集的新版本。这使得您可以轻松检查和恢复对数据集的更改,以防出错。您还可以标记数据集版本,为其提供更具可读性的名称。这对于标记数据集历史中的重要里程碑很有用。

您可以对数据集的特定版本运行评估。这在 CI 中运行评估时很有用,以确保数据集更新不会意外破坏您的 CI 管道。

评估器

评估器是用于评估应用程序在特定示例上表现如何的函数。

评估器输入

评估器接收以下输入

  • 示例:来自您的数据集的示例。包含输入、(参考)输出和元数据。
  • 运行:将示例输入传递给应用程序后产生的实际输出和中间步骤(子运行)。

评估器输出

评估器返回一个或多个指标。这些应以字典或字典列表的形式返回,形式如下:

  • key:指标名称。
  • score | value:指标值。如果是数值指标,请使用score;如果是分类指标,请使用value
  • comment(可选):解释分数的原因或附加字符串信息。

定义评估器

有多种方法可以定义和运行评估器

  • 自定义代码:将自定义评估器定义为 Python 或 TypeScript 函数,并使用 SDK 在客户端运行或通过 UI 在服务器端运行。
  • 内置评估器:LangSmith 有许多内置评估器,您可以通过 UI 进行配置和运行。

您可以使用 LangSmith SDK(PythonTypeScript)、通过提示词演练场,或通过配置规则在特定的跟踪项目或数据集上自动运行评估器。

评估技术

LLM 评估有几种高级方法

人工

人工评估通常是评估的一个很好的起点。LangSmith 使您能够轻松审查 LLM 应用程序输出以及跟踪(所有中间步骤)。

LangSmith 的标注队列使您可以轻松获取对应用程序输出的人工反馈。

启发式

启发式评估器是确定性的、基于规则的函数。它们适用于简单检查,例如确保聊天机器人的响应不为空,生成的代码片段可以编译,或者分类完全正确。

LLM 作为评判者

LLM 作为评判者的评估器使用 LLM 来评分应用程序的输出。要使用它们,您通常将评分规则/标准编码在 LLM 提示中。它们可以是无参考的(例如,检查系统输出是否包含冒犯性内容或是否符合特定标准)。或者,它们可以将任务输出与参考输出进行比较(例如,检查输出相对于参考是否事实准确)。

对于 LLM 作为评判者的评估器,仔细审查结果分数并在需要时调整评分器提示很重要。通常,将其编写为少量样本评估器会很有帮助,您可以在评分器提示中提供输入、输出和预期分数的示例。

了解如何定义 LLM 作为评判者的评估器

成对评估

成对评估器允许您比较应用程序两个版本的输出。想想LMSYS Chatbot Arena——这是相同的概念,但更广泛地应用于 AI 应用程序,而不仅仅是模型!这可以使用启发式方法(“哪个响应更长”)、LLM(使用特定的成对提示)或人工(要求他们手动标注示例)。

何时应该使用成对评估?

当难以直接为 LLM 输出评分但更容易比较两个输出时,成对评估会很有帮助。对于摘要等任务就是如此——可能很难给摘要一个绝对分数,但很容易选择两个摘要中哪个信息量更大。

了解如何运行成对评估

实验

每次我们在数据集上评估应用程序时,我们都在进行一项实验。实验包含在数据集上运行特定版本应用程序的结果。要了解如何使用 LangSmith 实验视图,请参阅如何分析实验结果

Experiment view

通常,我们会在给定数据集上运行多个实验,测试应用程序的不同配置(例如,不同的提示词或 LLM)。在 LangSmith 中,您可以轻松查看与数据集关联的所有实验。此外,您还可以在比较视图中比较多个实验

Comparison view

标注队列

人工反馈通常是您可以收集到的最有价值的应用程序反馈。通过标注队列,您可以标记应用程序的运行以进行标注。人工标注者随后会有一个简化的视图,可以审查队列中的运行并提供反馈。通常,这些已标注的运行(的某些子集)会随后转移到数据集中以进行未来的评估。虽然您总是可以内联标注运行,但标注队列提供了另一种选项,可以将运行分组在一起,指定标注标准并配置权限。

了解更多关于标注队列和人工反馈的信息。

离线评估

在(大约)实时评估已部署应用程序的输出就是我们所说的“在线”评估。在这种情况下,不涉及数据集,也不可能存在参考输出——我们正在对实际输入和实际输出进行评估。这对于监控您的应用程序和标记意外行为非常有用。在线评估也可以与离线评估协同工作:例如,在线评估器可用于将输入问题分类到一组类别中,这些类别以后可用于整理用于离线评估的数据集。

您可以使用 LangSmith SDK(PythonTypeScript)在客户端运行离线评估。您也可以通过提示词演练场在服务器端运行,或者通过配置自动化在针对特定数据集的每个新实验上运行特定的评估器。

Offline

基准测试

也许最常见的离线评估类型是,我们整理一个具有代表性输入的真实数据集,定义关键性能指标,并对应用程序的多个版本进行基准测试,以找到最佳版本。基准测试可能很费力,因为对于许多用例,您必须整理一个包含金标准参考输出的数据集,并设计良好的指标来比较实验输出与它们。对于 RAG 问答机器人,这可能看起来像一个问题和参考答案的数据集,以及一个 LLM 作为评判者的评估器,用于确定实际答案是否与参考答案语义等效。对于 ReACT 代理,这可能看起来像一个用户请求数据集和模型应该进行的所有工具调用的参考集,以及一个启发式评估器,用于检查是否进行了所有参考工具调用。

单元测试

单元测试在软件开发中用于验证单个系统组件的正确性。在 LLM 环境中的单元测试通常是对 LLM 输入或输出的基于规则的断言(例如,检查 LLM 生成的代码是否可以编译,JSON 是否可以加载等),用于验证基本功能。

单元测试通常在编写时就期望它们总是通过。这类测试很适合作为 CI 的一部分运行。请注意,这样做时最好设置缓存以最大程度地减少 LLM 调用(因为这些调用可能会迅速累积!)。

回归测试

回归测试用于衡量应用程序不同版本随时间变化的性能。它们至少用于确保新应用程序版本不会在当前版本正确处理的示例上出现退步,理想情况下,还可以衡量新版本相对于当前版本的改进程度。这些测试通常在您进行预期会影响用户体验的应用程序更新(例如更新模型或架构)时触发。

LangSmith 的比较视图原生支持回归测试,让您可以快速查看相对于基线已更改的示例。回归以红色突出显示,改进以绿色突出显示。

Comparison view

回溯测试

回溯测试是一种将数据集创建(如上所述)与评估相结合的方法。如果您有一组生产日志,可以将其转换为数据集。然后,您可以使用较新的应用程序版本重新运行这些生产示例。这使您能够评估过去和真实用户输入上的性能。

这通常用于评估新的模型版本。Anthropic 发布了新模型?没问题!获取通过您的应用程序最近的 1000 次运行,并将其通过新模型。然后将这些结果与实际生产中发生的情况进行比较。

成对评估

对于某些任务,人类或 LLM 评分器更容易判断“版本 A 是否优于 B”,而不是为 A 或 B 分配一个绝对分数。成对评估就是这样——将两个版本的输出相互评分,而不是针对某个参考输出或绝对标准进行评分。当在更一般的任务中使用 LLM 作为评判者的评估器时,成对评估通常很有用。例如,如果您有一个摘要应用程序,LLM 作为评判者可能更容易判断“这两个摘要中哪个更清晰简洁?”,而不是给出“根据清晰度和简洁度,给这个摘要打 1-10 分”这样的绝对分数。

了解如何运行成对评估

在线评估

在(大约)实时评估已部署应用程序的输出就是我们所说的“在线”评估。在这种情况下,不涉及数据集,也不可能存在参考输出——我们正在对实际输入和实际输出进行评估。这对于监控您的应用程序和标记意外行为非常有用。在线评估也可以与离线评估协同工作:例如,在线评估器可用于将输入问题分类到一组类别中,这些类别以后可用于整理用于离线评估的数据集。

在线评估器通常旨在在服务器端运行。LangSmith 内置了LLM 作为评判者的评估器,您可以进行配置,或者您可以定义自定义代码评估器,这些评估器也可以在 LangSmith 中运行。

Online

测试

评估与测试

测试和评估是非常相似且相互重叠的概念,常常被混淆。

评估根据一个或多个指标衡量性能。评估指标可以是模糊或主观的,并且相对而言比绝对指标更有用。也就是说,它们通常用于比较两个系统而不是断言单个系统的某些内容。

测试断言正确性。一个系统只有通过所有测试才能部署。

评估指标可以转化为测试。例如,您可以编写回归测试来断言,任何新版本的系统都必须在相关评估指标上优于系统的某个基线版本。

如果您的系统运行成本高昂,并且您的测试和评估数据集有重叠,那么同时运行测试和评估也可以提高资源效率。

您也可以为了方便,选择使用标准的软件测试工具,如 pytestvitest/jest 来编写评估。

使用 pytestVitest/Jest

LangSmith SDK 提供了与 pytestVitest/Jest 的集成。这些集成使得以下操作变得容易:

  • 在 LangSmith 中跟踪测试结果
  • 将评估编写为测试

在 LangSmith 中跟踪测试结果可以轻松共享结果、比较系统以及调试失败的测试。

当您希望评估的每个示例都需要自定义逻辑来运行应用程序和/或评估器时,将评估编写为测试会很有用。标准评估流程假定您可以在数据集中的每个示例上以相同的方式运行您的应用程序和评估器。但对于更复杂的系统或全面的评估,您可能希望使用特定类型的输入和指标来评估系统的特定子集。这些异构评估类型更容易编写为一系列不同的测试用例,所有这些用例都一起跟踪,而不是使用标准评估流程。

当您既想评估系统输出又想断言其一些基本功能时,使用测试工具也会很有帮助。

应用程序特定技术

下面,我们将讨论一些特定且流行的 LLM 应用程序的评估。

代理

LLM 驱动的自主代理结合了三个组件:(1) 工具调用,(2) 记忆,和 (3) 规划。代理使用工具调用结合规划(例如,通常通过提示)和记忆(例如,通常是短期消息历史)来生成响应。工具调用允许模型通过生成两项内容来响应给定提示:(1) 要调用的工具和 (2) 所需的输入参数。

Tool use

下面是 LangGraph 中的一个工具调用代理。assistant node 是一个 LLM,它根据输入决定是否调用工具。tool condition 检查 assistant node 是否选择了工具,如果是,则路由到 tool nodetool node 执行工具并将输出作为工具消息返回给 assistant node。只要 assistant node 选择工具,此循环就会继续。如果没有选择工具,则代理直接返回 LLM 响应。

Agent

这设置了用户通常感兴趣的三种通用代理评估类型:

  • 最终响应:评估代理的最终响应。
  • 单步:独立评估代理的任何步骤(例如,它是否选择了适当的工具)。
  • 轨迹:评估代理是否采取了预期路径(例如,工具调用)以获得最终答案。

Agent-eval

下面我们将介绍这些评估类型是什么、每种类型所需的组件(输入、输出、评估器),以及何时应该考虑使用它们。请注意,您可能希望执行这些评估类型中的多种(如果不是全部!),它们不是相互排斥的!

评估代理的最终响应

评估代理的一种方法是评估它在任务中的整体表现。这基本上涉及将代理视为一个黑盒,简单评估它是否完成了任务。

输入应为用户输入和(可选的)工具列表。在某些情况下,工具作为代理的一部分硬编码,无需传入。在其他情况下,代理更通用,这意味着它没有固定的工具集,工具需要在运行时传入。

输出应为代理的最终响应。

评估器根据您要求代理执行的任务而异。许多代理执行一系列相对复杂的步骤并输出最终文本响应。与 RAG 类似,LLM 作为评判者的评估器在这些情况下通常对评估很有效,因为它们可以直接从文本响应中评估代理是否完成了任务。

然而,这种评估类型有几个缺点。首先,它通常需要一段时间才能运行。其次,您没有评估代理内部发生的任何事情,因此当出现故障时可能很难调试。第三,有时很难定义合适的评估指标。

评估代理的单个步骤

代理通常执行多个动作。虽然对它们进行端到端评估很有用,但评估这些单个动作也很有用。这通常涉及评估代理的单个步骤——LLM 调用,它在此决定下一步要做什么。

输入应该是单个步骤的输入。根据您正在测试的内容,这可能只是原始用户输入(例如,提示和/或一组工具),或者它也可以包括以前完成的步骤。

输出就是该步骤的输出,通常是 LLM 响应。LLM 响应通常包含工具调用,指示代理下一步应该采取什么行动。

此评估器通常是一个二元分数,用于判断是否选择了正确的工具调用,以及一个启发式方法,用于判断工具的输入是否正确。参考工具可以简单地指定为字符串。

这种评估类型有几个优点。它允许您评估单个操作,从而帮助您找出应用程序可能失败的地方。它们运行速度也相对较快(因为它们只涉及一次 LLM 调用),并且评估通常使用所选工具相对于参考工具的简单启发式评估。一个缺点是它们无法捕捉到完整的代理——仅捕捉一个特定步骤。另一个缺点是数据集创建可能具有挑战性,特别是如果您想在代理输入中包含历史记录。为代理轨迹早期的步骤(例如,这可能只包括输入提示)生成数据集非常容易,但为轨迹后期的步骤(例如,包括许多先前的代理动作和响应)生成数据集可能很困难。

评估代理的轨迹

评估代理的轨迹涉及评估代理所采取的所有步骤。

输入再次是整体代理的输入(用户输入,以及可选的工具列表)。

输出是工具调用列表,可以表示为“精确”轨迹(例如,预期的工具调用序列)或仅是预期的一组工具调用(按任意顺序)。

这里的评估器是关于所采取步骤的某个函数。评估“精确”轨迹可以使用一个单一的二元分数,确认序列中每个工具名称的精确匹配。这很简单,但有一些缺陷。有时可能存在多条正确的路径。这种评估也无法捕捉到轨迹只偏离一步与完全错误之间的区别。

为了解决这些缺陷,评估指标可以侧重于“不正确”步骤的数量,这能更好地区分接近正确轨迹和显著偏离的轨迹。评估指标还可以关注是否按任意顺序调用了所有预期工具。

然而,这些方法都没有评估工具的输入;它们只关注所选的工具。为了解决这个问题,另一种评估技术是将完整的代理轨迹(以及参考轨迹)作为一组消息(例如,所有 LLM 响应和工具调用)传递给 LLM 作为评判者。这可以评估代理的完整行为,但它是最难编译的参考(幸运的是,使用像 LangGraph 这样的框架可以帮助解决这个问题!)。另一个缺点是评估指标可能有点难以想出。

检索增强生成 (RAG)

检索增强生成(RAG)是一种强大的技术,它涉及根据用户的输入检索相关文档,并将其传递给语言模型进行处理。RAG 通过利用外部知识,使 AI 应用程序能够生成更具信息性和上下文感知能力的响应。

信息

有关 RAG 概念的全面回顾,请参阅我们的RAG From Scratch 系列

数据集

在评估 RAG 应用程序时,一个关键考虑因素是您是否拥有(或可以轻松获取)每个输入问题的参考答案。参考答案作为评估生成响应正确性的真实依据。然而,即使没有参考答案,仍然可以使用无参考 RAG 评估提示(下面提供了示例)执行各种评估。

评估器

LLM 作为评判者是 RAG 中常用的评估器,因为它是评估文本事实准确性或一致性的有效方法。

rag-types.png

在评估 RAG 应用程序时,您可以拥有需要参考输出的评估器和不需要参考输出的评估器

  1. 需要参考输出:将 RAG 链生成的答案或检索结果与参考答案(或检索结果)进行比较,以评估其正确性。
  2. 不需要参考输出:使用不需要参考答案的提示词执行自洽性检查(在上图中以橙色、绿色和红色表示)。

应用 RAG 评估

应用 RAG 评估时,请考虑以下方法:

  1. 离线评估:对任何依赖参考答案的提示使用离线评估。这最常用于 RAG 答案正确性评估,其中参考是真实(正确)答案。

  2. 在线评估:对任何无参考提示使用在线评估。这使您能够评估 RAG 应用程序在实时场景中的性能。

  3. 成对评估:利用成对评估比较不同 RAG 链生成的答案。此评估侧重于用户指定的标准(例如,答案格式或风格),而不是正确性,正确性可以使用自洽性或真实参考进行评估。

RAG 评估摘要

评估器详情需要参考输出LLM 作为评判者?成对相关
文档相关性文档与问题相关吗?是 - 提示词
答案忠实性答案是否基于文档?是 - 提示词
答案有用性答案有助于解决问题吗?是 - 提示词
答案正确性答案与参考答案一致吗?是 - 提示词
成对比较多个答案版本如何比较?是 - 提示词

摘要

摘要是自由写作的一种特定类型。评估目标通常是根据一组标准检查写作(摘要)。

开发者整理的要摘要的文本示例通常用于评估(在此处查看数据集示例:这里)。然而,生产(摘要)应用程序的用户日志可用于在线评估,并结合下面任何无参考评估提示。

LLM 作为评判者通常用于摘要(以及其他类型的写作)的评估,使用遵循所提供标准的无参考提示来评分摘要。提供特定的参考摘要不太常见,因为摘要是一项创造性任务,有许多可能的正确答案。

由于使用了无参考提示,因此在线离线评估是可行的。成对评估也是比较不同摘要链(例如,不同摘要提示或 LLM)的强大方法。

用例详情需要参考输出LLM 作为评判者?成对相关
事实准确性摘要相对于源文档准确吗?是 - 提示词
忠实性摘要是否基于源文档(例如,没有幻觉)?是 - 提示词
有用性摘要对用户需求有用吗?是 - 提示词

分类和标记

分类和标记为给定输入应用标签(例如,用于毒性检测、情感分析等)。分类/标记评估通常采用以下组件,我们将在下面详细审查:

分类/标记评估的一个核心考虑是您是否拥有带有参考标签的数据集。如果没有,用户通常希望定义一个评估器,该评估器使用标准将标签(例如,毒性等)应用于输入(例如,文本、用户问题等)。但是,如果提供了真实类别标签,则评估目标侧重于相对于真实类别标签评分分类/标记链(例如,使用精确度、召回率等指标)。

如果提供了真实参考标签,通常可以简单地定义一个自定义启发式评估器,将真实标签与链输出进行比较。然而,随着 LLM 的出现,越来越常见的是直接使用LLM 作为评判者根据指定标准(无需真实参考)对输入执行分类/标记。

当使用LLM 作为评判者无参考提示时,在线离线评估是可行的。特别是,当用户希望标记/分类应用程序输入(例如,毒性等)时,这非常适合在线评估。

用例详情需要参考输出LLM 作为评判者?成对相关
准确率标准定义
精确率标准定义
召回率标准定义

实验配置

LangSmith 支持多种实验配置,使您能够以所需方式更轻松地运行评估。

重复次数

多次运行实验会很有帮助,因为 LLM 输出不是确定性的,并且每次重复可能会有所不同。通过运行多次重复,您可以更准确地估计系统性能。

可以通过将 num_repetitions 参数传递给 evaluate / aevaluate (Python, TypeScript)。重复实验涉及重新运行目标函数以生成输出,以及重新运行评估器。

要了解更多关于实验重复运行的信息,请阅读操作指南

并发性

通过将 max_concurrency 参数传递给 evaluate / aevaluate,您可以指定实验的并发性。max_concurrency 参数的语义根据您使用的是 evaluate 还是 aevaluate 而略有不同。

evaluate

evaluatemax_concurrency 参数指定了运行实验时要使用的最大并发线程数。这包括运行目标函数和评估器。

aevaluate

aevaluatemax_concurrency 参数与 evaluate 类似,但它使用信号量来限制可以同时运行的并发任务数量。aevaluate 的工作方式是为数据集中的每个示例创建一个任务。每个任务都包括在该特定示例上运行目标函数以及所有评估器。max_concurrency 参数指定了最大并发任务数量,或者换句话说,是同时运行的示例数量。

缓存

最后,您还可以通过将 LANGSMITH_TEST_CACHE 设置为设备上具有写入权限的有效文件夹来缓存实验中进行的 API 调用。这将导致实验中进行的 API 调用被缓存到磁盘,这意味着未来进行相同 API 调用的实验将大大加快速度。


此页面有帮助吗?


您可以留下详细反馈 在 GitHub 上.