数据集
数据集是用于评估应用程序的一组示例。示例是一个测试输入和参考输出对的组合。示例
每个示例包括:- 输入:传递给应用程序的输入变量字典。
- 参考输出(可选):参考输出字典。这些输出不会传递给应用程序,仅用于评估器中。
- 元数据(可选):可以用于创建数据集过滤视图的附加信息字典。
数据集整理
有多种方法可以构建用于评估的数据集,包括:手动精选示例
以下是通常推荐人们开始创建数据集的方法。从构建您的应用程序开始,您可能已经对期望应用程序能够处理哪些类型的输入以及可能出现的“良好”响应有所了解。您可能希望涵盖一些您能想象到的不同常见边缘情况或情况。即使是10-20个高质量、人工精选的示例也能起到很大作用。历史痕迹
一旦您的应用程序投入生产,您就开始获得有价值的信息:用户实际上是如何使用它的?这些现实世界的运行实例是绝佳的例子,因为它们非常真实! 如果您正在处理大量流量,如何确定哪些运行有价值添加到数据集中呢?您可以使用以下几种技术:- 用户反馈:如果可能的话,尝试收集最终用户的反馈。这样您就可以看到哪些数据点收到了负面反馈。这非常有价值!这些都是您的应用程序表现不佳的地方。您应该将这些添加到您的数据集中,以便在未来进行测试。
- 启发式方法:您还可以使用其他启发式方法来识别“有趣的”数据点。例如,耗时较长的运行可能值得查看并添加到数据集中。
- LLM反馈:您可以使用另一个LLM来检测值得注意的运行。例如,您可以使用LLM对聊天机器人对话进行标记,其中用户不得不重新措辞他们的问题或以某种方式纠正模型,这表明聊天机器人最初没有正确响应。
合成数据
一旦您有几个示例,您可以尝试人工生成更多。通常建议在这样做之前先有一些好的手工制作的示例,因为这种合成数据通常会以某种方式与它们相似。这可以是一种快速获取大量数据点的方法。分割
在设置评估时,您可能希望将数据集划分为不同的部分。例如,您可能使用较小的部分进行许多快速且成本低的迭代,而使用较大的部分进行最终评估。此外,划分对于实验的可解释性也很重要。例如,如果您有一个RAG应用,您可能希望数据集划分专注于不同类型的问题(例如,事实性、观点等),并分别在每个划分上评估您的应用。 学习如何 创建和管理数据集拆分。版本
数据集是版本化的,这意味着每次您在数据集中添加、更新或删除示例时,都会创建一个新的数据集版本。这使得在您犯错时检查和撤销数据集更改变得容易。您还可以标记版本,为它们赋予更易于阅读的名称。这有助于标记数据集历史中的重要里程碑。 您可以对数据集的特定版本进行评估。这在CI环境中运行评估时非常有用,以确保数据集更新不会意外地破坏您的CI管道。评估器
评估器是用于评估您的应用程序在特定示例上表现好坏的函数。评估器输入
评估者接收以下输入:评估器输出
一个评估器返回一个或多个指标。这些指标应以字典或字典列表的形式返回:key:指标名称。score|value:指标值。如果是数值型指标,使用score;如果是分类型指标,使用value。comment(可选):证明分数的理由或额外的字符串信息。
定义评估器
有几种方法可以定义和运行评估器:- 自定义代码:定义自定义评估器为Python或TypeScript函数,并使用SDK在客户端运行或在UI中通过服务器端运行。
- 内置评估器:LangSmith提供了一些内置评估器,您可以通过UI进行配置和运行。
评估技术
有几种高级方法用于评估大型语言模型:人类
人工评估通常是评估的绝佳起点。LangSmith使您轻松审查您的LLM应用程序输出以及痕迹(所有中间步骤)。 LangSmith的标注队列可以让您轻松获取对应用程序输出的人类反馈。 启发式 启发式评估器是确定性、基于规则的函数。这些评估器适用于简单的检查,例如确保聊天机器人的回复不为空,生成的代码片段可以编译,或者分类结果完全正确。大型语言模型作为裁判
LLM-as-judge评估器使用LLM对应用程序的输出进行评分。要使用它们,通常需要在LLM提示中编码评分规则/标准。它们可以是无参考的(例如,检查系统输出是否包含冒犯性内容或符合特定标准)。或者,它们可以将任务输出与参考输出进行比较(例如,检查输出相对于参考是否在事实上准确)。 使用LLM作为评判者的评估器时,仔细审查生成的分数并在必要时调整评分提示非常重要。通常,将这些评估器编写为少样本评估器很有帮助,您可以在评分提示中提供输入示例、输出示例和预期评分。 了解如何定义一个LLM-as-a-judge评估器(/langsmith/llm-as-judge)。成对
成对评估器允许您比较应用程序两个版本的输出。想想LMSYS Chatbot Arena——这是同样的概念,但更广泛地应用于AI应用程序,而不仅仅是模型!这可以使用启发式方法(“哪个响应更长”)、LLM(使用特定的成对提示)或人工(要求他们手动标注示例)。 何时应使用成对评估? 成对评估在难以直接评分LLM输出,但比较两个输出更容易时很有帮助。这在像摘要这样的任务中可能是这种情况——可能很难给摘要一个绝对评分,但很容易选择两个摘要中哪一个更有信息量。 学习如何运行成对评估。实验
每次我们在数据集上评估一个应用程序,我们都在进行一个实验。一个实验包含在数据集上运行您应用程序特定版本的结果。要了解如何使用LangSmith实验视图,请参阅如何分析实验结果。实验配置
LangSmith 支持多种实验配置,使您能够以期望的方式运行评估。重复
多次运行实验可能很有帮助,因为大型语言模型(LLM)的输出是非确定性的,并且可能在不同重复之间有所不同。通过运行多次重复,您可以更准确地估计您系统的性能。 重复可以通过向evaluate / aevaluate (Python, [TypeScript](https://docs.smith.langchain.com/reference/js/interfaces/evaluation.EvaluateOptions#numrepetitions))传递 num_repetitions 参数来配置。重复实验涉及重新运行目标函数以生成输出以及重新运行评估器。
要了解更多关于在实验中运行重复操作的信息,请阅读操作指南。
并发
通过将 max_concurrency 参数传递给 evaluate / aevaluate,您可以指定实验的并发性。max_concurrency 参数的语义根据您是否使用 evaluate 或 aevaluate 而略有不同。
evaluate
max_concurrency 参数用于指定在运行实验时使用的最大并发线程数。这既适用于运行您的目标函数,也适用于运行评估器。
aevaluate
max_concurrency 参数与 aevaluate 相当相似,但使用信号量来限制一次可以运行的并发任务数量。aevaluate 通过为数据集中的每个示例创建一个任务来工作。每个任务包括运行目标函数以及在该特定示例上的所有评估器。max_concurrency 参数指定了最大并发任务数,或者说一次可以运行的最大示例数。
缓存
最后,您还可以通过将LANGSMITH_TEST_CACHE 设置为您的设备上具有写入权限的有效文件夹来缓存实验中进行的API调用。这将导致实验中进行的API调用被缓存在磁盘上,这意味着未来进行相同API调用的实验将大大加快速度。
标注队列
人类反馈通常是您可以从应用程序中收集到的最有价值的反馈。通过标注队列,您可以标记应用程序的运行以进行标注。然后,人工标注员可以以简化的视图来审查和提供对队列中运行的反馈。通常(某些子集的)这些标注运行随后会被转移到数据集中进行未来的评估。虽然您始终可以在线标注运行,但标注队列提供了另一种将运行分组、指定标注标准和配置权限的选项。 了解有关标注队列和人工反馈的更多信息。离线评估
在数据集上评估应用程序,我们称之为“离线”评估。之所以称为离线,是因为我们在预先编译的数据集上进行评估。相反,在线评估是指在接近实时的情况下,评估已部署应用程序的输出在真实流量中的表现。离线评估用于测试应用程序的版本(或多个版本)在部署前的性能。 您可以使用LangSmith SDK在客户端离线评估(Python 和 TypeScript)。您也可以通过Prompt Playground或配置自动化,在针对特定数据集的每个新实验上运行某些评估器来在服务器端运行它们。基准测试
可能最常见的离线评估类型是我们精心挑选一组具有代表性的输入数据集,定义关键性能指标,并对我们应用程序的多个版本进行基准测试,以找到最佳版本。基准测试可能比较耗时,因为对于许多用例,您必须创建一个包含黄金标准参考输出的数据集,并设计良好的指标来比较实验输出与它们。对于一个RAG问答机器人,这可能看起来像一组问题和参考答案的数据集,以及一个作为评判者的LLM评估器,该评估器确定实际答案是否在语义上与参考答案等效。对于一个ReACT智能体,这可能看起来像一组用户请求的数据集以及模型应调用所有工具的参考集,以及一个启发式评估器,该评估器检查是否调用了所有参考工具调用。单元测试
单元测试用于软件开发中验证单个系统组件的正确性。在LLM的上下文中,单元测试通常是针对LLM输入或输出的基于规则的断言,例如,检查LLM生成的代码是否可编译、JSON是否可加载等,以验证基本功能。 单元测试通常被编写为期望它们始终通过。这些类型的测试作为持续集成(CI)的一部分运行是很好的。请注意,在这样做时,设置一个缓存以最小化大型语言模型(LLM)的调用是有用的(因为那些可以迅速累积!)回归测试
回归测试用于衡量您应用程序随时间跨版本的性能。它们至少用于确保新版本的应用程序不会在当前版本正确处理的示例上出现回退,理想情况下用于衡量新版本相对于当前版本改进了多少。通常,当您进行预期会影响用户体验的应用程序更新(例如更新模型或架构)时,会触发这些测试。 LangSmith的比较视图原生支持回归测试,让您能够快速查看相对于基线发生变化的示例。回归用红色突出显示,改进用绿色显示。回测
回测是一种结合数据集创建(如上所述)与评估的方法。如果您有一组生产日志,您可以将其转换为数据集。然后,您可以使用更新的应用程序版本重新运行这些生产示例。这使您能够评估过去和现实用户输入的性能。 这通常用于评估新的模型版本。Anthropic发布了一个新的模型?没问题!抓取您应用中最近的1000次运行并通过新的模型进行处理。然后比较这些结果与实际生产中的情况。成对评估
对于某些任务,对于人类或LLM评分员来说 判断“版本A是否优于B”比给A或B分配一个绝对分数要容易。成对评估就是这样——将两个版本的输出相互评分,而不是与某个参考输出或绝对标准相比。当使用LLM作为评判员的评估器进行更通用任务时,成对评估通常很有用。例如,如果您有一个摘要应用程序,对于LLM作为评判员判断“这两个摘要哪个更清晰、更简洁?”可能比给出“从清晰度和简洁度方面给这个摘要打1-10分”这样的绝对分数要容易。 学习如何进行成对评估。在线评估
评估已部署应用程序的输出(大致)实时性,我们称之为“在线”评估。在这种情况下,不涉及数据集,也没有参考输出的可能性——我们正在对实际输入和实际输出进行评估,正如它们产生时那样。这有助于监控您的应用程序并标记出意外的行为。在线评估还可以与离线评估协同工作:例如,可以使用在线评估器将输入问题分类到一组类别中,这些类别可以后来用于离线评估的数据集整理。 在线评估器通常旨在在服务器端运行。LangSmith 内置了 LLM-as-judge 评估器,您可以进行配置,或者您也可以定义自定义代码评估器,这些评估器同样在 LangSmith 中运行。测试
评估与测试
测试和评估是非常相似且相互重叠的概念,常常被混淆。 **评估是根据指标来衡量性能的。**评估指标可能是模糊的或主观的,在相对意义上比绝对意义上更有用。也就是说,它们通常用于比较两个系统之间的差异,而不是断言关于某个个体系统的信息。 测试确保正确性。 系统只有通过所有测试后才能部署。 评估指标可以被转换为测试。例如,您可以编写回归测试来断言任何新版本的系统必须在相关的评估指标上优于系统的某个基线版本。 如果您的系统运行成本高昂,并且测试和评估数据集存在重叠,同时运行测试和评估可能更加节省资源。 您还可以出于方便,选择使用标准软件测试工具如pytest 或 vitest/jest 来编写评估。
使用 pytest 和 Vitest/Jest
LangSmith SDKs 内置了对 pytest 和 Vitest/Jest 的集成。这使得以下操作变得简单:
- 在LangSmith中跟踪测试结果
- 将评估作为测试编写