跳到主要内容
LangSmith 让构建高质量评估变得容易。本指南解释了 LangSmith 评估框架的关键概念。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-as-judge 评估器使用 LLM 来评分应用程序的输出。要使用它们,您通常在 LLM 提示中编码评分规则/标准。它们可以是无参考的(例如,检查系统输出是否包含冒犯性内容或是否符合特定标准)。或者,它们可以将任务输出与参考输出进行比较(例如,检查输出相对于参考是否事实准确)。 对于 LLM-as-judge 评估器,仔细审查结果分数并在需要时调整评分提示非常重要。通常,将它们编写为少样本评估器会很有帮助,即您在评分提示中提供输入、输出和预期分数的示例。 了解如何定义 LLM-as-judge 评估器

成对

成对评估器允许您比较应用程序两个版本的输出。想想LMSYS 聊天机器人竞技场——这与此概念相同,但更广泛地应用于 AI 应用程序,而不仅仅是模型!这可以使用启发式方法(“哪个响应更长”)、LLM(带有特定的成对提示)或人类(要求他们手动标注示例)。 何时应使用成对评估? 当难以直接评分 LLM 输出,但更容易比较两个输出时,成对评估会很有帮助。对于摘要等任务,情况可能如此——给摘要一个绝对分数可能很难,但选择两个摘要中哪个信息量更大却很容易。 了解如何运行成对评估

实验

每次我们在数据集上评估一个应用程序时,我们都在进行一个实验。一个实验包含在数据集上运行特定版本的应用程序的结果。要了解如何使用 LangSmith 实验视图,请参阅如何分析实验结果 Experiment view 通常,我们会在给定数据集上运行多个实验,测试应用程序的不同配置(例如,不同的提示或 LLM)。在 LangSmith 中,您可以轻松查看与数据集关联的所有实验。此外,您还可以在比较视图中比较多个实验 Comparison view

实验配置

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

重复次数

多次运行实验会很有帮助,因为 LLM 输出是非确定性的,并且每次重复都可能不同。通过多次重复运行,您可以更准确地估计系统性能。 可以通过将 num_repetitions 参数传递给 evaluate / aevaluatePythonTypeScript)来配置重复次数。重复实验包括重新运行目标函数以生成输出和重新运行评估器。 要了解有关实验重复运行的更多信息,请阅读操作指南

并发

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

评估

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

异步评估

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

缓存

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

标注队列

人类反馈通常是您可以收集到的关于应用程序最有价值的反馈。通过标注队列,您可以标记应用程序的运行以进行标注。然后,人类标注者可以以简化的视图查看队列中的运行并提供反馈。通常,这些(部分)标注的运行会被传输到数据集中,以用于未来的评估。虽然您可以随时内联标注运行,但标注队列提供了另一种选项来对运行进行分组、指定标注标准并配置权限。 了解有关标注队列和人类反馈的更多信息。

离线评估

在数据集上评估应用程序就是我们所说的“离线”评估。之所以是离线,是因为我们正在对预编译的数据集进行评估。另一方面,在线评估是我们实时(或接近实时)评估已部署应用程序在真实流量上的输出。离线评估用于在部署前测试应用程序的一个或多个版本。 您可以使用 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 SDKs 集成了 pytestVitest/Jest。这使得以下操作变得容易:
  • 在 LangSmith 中跟踪测试结果
  • 将评估作为测试编写
在 LangSmith 中跟踪测试结果可以轻松共享结果、比较系统和调试失败的测试。 当您想要评估的每个示例都需要自定义逻辑来运行应用程序和/或评估器时,将评估作为测试编写会很有用。标准的评估流程假设您可以在数据集中的每个示例上以相同的方式运行应用程序和评估器。但对于更复杂的系统或全面的评估,您可能希望使用特定类型的输入和指标来评估系统的特定子集。这些异构评估类型更容易编写为一组不同的测试用例,所有这些用例都一起跟踪,而不是使用标准的评估流程。 当您希望同时评估系统输出断言其基本情况时,使用测试工具也很有帮助。
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。
© . This site is unofficial and not affiliated with LangChain, Inc.