LLM 输出是非确定性的,这使得响应质量难以评估。评估(evals)是一种分解"良好"标准并对其进行衡量的方法。LangSmith 评估提供了一个框架,用于在整个应用生命周期中测量质量,从部署前测试到生产监控。
评估内容
在构建评估之前,请确定对您的应用而言重要的内容。将系统分解为其关键组件——LLM 调用、检索步骤、工具调用、输出格式——并为每个组件确定质量标准。
从手动策划的示例开始。 为每个关键组件创建 5-10 个"良好"示例。这些示例作为您的基本事实,并决定使用哪些评估方法。例如: - **RAG 系统**:良好检索(相关文档)和良好回答(准确、完整)的示例。 - **Agent**:正确工具选择和正确参数格式或 Agent 所执行轨迹的示例。 - **Chatbot**:有帮助、符合品牌调性且能解决用户意图的回答示例。
通过示例定义"良好"后,您就可以衡量系统产出类似质量输出的频率。
离线评估和在线评估
LangSmith 支持两种类型的评估,服务于开发生命周期中的不同目的:
离线评估
使用离线评估进行 **部署前测试**: - **基准测试**:比较多个版本以找到最佳表现者。 - **回归测试**:确保新版本不会降低质量。 - **单元测试**:验证单个组件的正确性。 - **回溯测试**:使用历史数据测试新版本。
离线评估针对 示例 来自 数据集:包含定义"良好"标准的参考输出的策划测试用例。
在线评估
使用在线评估进行 **生产监控**: - **实时监控**:在实时流量上持续跟踪质量。 - **异常检测**:标记异常模式或边缘情况。 - **生产反馈**:识别需要添加到离线数据集中的问题。
在线评估针对 运行 和 线程 来自 追踪:没有参考输出的真实生产追踪。
目标的差异决定了您可以评估的内容:离线评估可以对照预期答案检查正确性,而在线评估则侧重于质量模式、安全性和真实世界行为。
评估生命周期
在您开发和 部署您的应用时,您的评估策略会从部署前的测试演变为生产监控。在开发和测试期间,离线评估会对照精选数据集验证功能。部署后,在线评估会监控实时流量上的生产行为。随着应用成熟,两种评估类型在迭代反馈循环中协同工作,持续改进质量。
graph LR
A[Development] --> B[Testing]
B --> C[Deployment]
C --> D[Monitoring]
D --> E[Iteration]
A -.-> F[Offline]
B -.-> F
C -.-> G[Online]
D -.-> G
E -.-> H[Both]
classDef process fill:#E5F4FF,stroke:#006DDD,stroke-width:2px,color:#030710
class A,B,C,D,E process
style F fill:#EBD0F0,stroke:#885270,color:#441E33
style G fill:#EBD0F0,stroke:#885270,color:#441E33
style H fill:#EBD0F0,stroke:#885270,color:#441E33
1. 使用离线评估进行开发
在生产部署之前,使用离线评估来验证功能、基准测试不同方法并建立信心。
请按照 快速入门 来运行您的第一个离线评估。
2. 使用在线评估进行初始部署
部署后,使用在线评估来监控生产质量、检测意外问题并收集真实世界数据。
了解如何 配置在线评估 以进行生产监控。
3. 持续改进
将两种评估类型结合使用,形成迭代反馈循环。在线评估发现的问题会成为离线测试用例,离线评估验证修复效果,在线评估确认生产改进。
核心评估目标
评估会根据是离线还是在线而在不同目标上运行。
离线评估的目标
离线评估在数据集和示例上运行。参考输出的存在使得预期结果与实际结果之间可以进行对比。
数据集
数据集是用于 _评估应用的一组示例_ 的集合。示例是测试输入和参考输出的配对。
示例
每个示例包含:
- 输入:传递给应用的输入变量字典。
- 参考输出 (可选):参考输出的字典。这些不会传递给应用,仅在评估器中使用。
- 元数据 (可选):可用于创建数据集筛选视图的附加信息字典。
了解更多关于 管理数据集.
实验
An _实验_ 表示在数据集上评估特定应用程序版本的结果。每个实验都会捕获数据集中每个示例的输出、评估器分数和执行跟踪。
!实验视图
通常会在给定数据集上运行多个实验,以测试不同的应用程序配置(例如不同的提示词或 LLM)。LangSmith 显示与数据集关联的所有实验,并支持 比较多个实验 side-by-side.
了解 如何分析实验结果.
在线评估目标
在线评估针对生产流量中的运行和线程进行。由于没有参考输出,评估器专注于实时检测问题、异常情况和质量下降。
运行
A _运行_ 是来自您的 已部署应用程序的单次执行跟踪。每个运行包含: - **输入**:应用程序接收到的实际用户输入。 - **输出**:应用程序实际返回的内容。 - **中间步骤**:所有子运行(工具调用、LLM 调用等)。 - **元数据**:标签、用户反馈、延迟指标等。
与数据集中的示例不同,运行不包括参考输出。在线评估器必须在不知道"正确答案"的情况下评估质量,而是依靠质量启发式方法、安全检查和无参考评估技术。
了解更多关于 可观测性概念中的运行和跟踪.
线程
_线程_ 是表示多轮对话的相关运行集合。在线评估器可以在线程级别运行,以评估整个对话而不是单个回合。这使得能够评估对话级别的属性,如跨轮次的连贯性、主题保持和交互过程中的用户满意度。
评估器
_评估器_ 是用于对应用程序性能进行评分的工作区级资源。它们为离线和在线评估提供测量层,根据可用的数据调整其输入。由于评估器的作用域是工作区,您可以将单个评估器附加到多个跟踪项目和数据集,而无需每次重新创建。
使用以下任一方式运行评估器:
- - 使用 评估器 页面将它们附加到跟踪项目或数据集
- - 使用 Playground
- - LangSmith SDK(Python 和 TypeScript)
- - 规则,用于在追踪项目或数据集上自动运行它们
评估器输入
评估器输入因评估类型而异:
离线评估器 receive: - 示例:来自您的 数据集的示例,包含输入、参考输出和元数据。 - 运行:使用示例输入运行应用程序后产生的实际输出和中间步骤。
在线评估器 receive: - 运行:包含输入、输出和中间步骤的生产追踪(无参考输出)。
评估器输出
评估器返回 **反馈**,即评估的分数。反馈是一个字典或字典列表。每个字典包含:
- -
key:指标名称。 - -
score|value:指标值(score用于数值指标,value用于分类指标)。 - -
comment(可选):对分数的额外推理或解释。
评估技术
LangSmith 支持多种评估方法:
- - 人工
- - 代码
- - LLM-as-judge
- - 配对
人工
_人工评估_ 涉及对应用程序输出和执行追踪的手动审查。这种方法 通常是评估的有效起点。LangSmith 提供工具来审查应用程序输出和追踪(所有中间步骤)。
标注队列
标注队列 简化了对运行结果进行结构化人工反馈收集的流程。它们通过提供有预设评分标准的组织化工作流程、团队协作功能和进度追踪来补充 内联标注 。
LangSmith 支持两种队列类型:
- 单运行队列:根据自定义评分标准逐个审查运行结果。适用于从生产追踪中分类问题或构建数据集。单运行队列还支持 断言,即离线评估器可用于对后续运行进行评分的自由形式验收标准。
- 配对队列: Compare two runs side-by-side to judge which is better. Designed for fast A/B comparisons between experiments.
主要功能包括配置每个运行的多位审查员、启用预留以防止冲突,以及将标注后的运行直接导出到数据集以供后续评估。
代码
_代码评估器_ 是确定性的、基于规则的函数。它们适用于检查,例如验证聊天机器人的响应结构不为空、生成的代码能编译,或分类结果完全匹配。
LLM-as-judge
_LLM 即评判者评估器_ 使用 LLMs 对应用输出进行评分。评分规则和标准通常编码在 LLM 提示词中。这些评估器可以是:
- Reference-free:检查输出是否包含冒犯性内容或符合特定标准。
- Reference-based:将输出与参考进行对比(例如,检查与参考相关的事实准确性)。
LLM 即评判评估器需要仔细审查评分结果和调整提示词。包含输入、输出和预期评分示例的小样本评估器通常能提高性能。
了解 如何定义 LLM 即评判评估器.
成对评估
_成对评估器_ 使用启发式方法(例如哪个响应更长)、LLMs(使用成对提示词)或人工评审员比较两个应用版本的输出。
当直接评分困难但对比两个输出更容易时,成对评估效果最佳。例如,在摘要任务中,从两个摘要中选择信息量更大的往往比给单个摘要打绝对分数更容易。
学习 如何运行成对评估.
无参考与基于参考的评估器
理解评估器是否需要参考输出对于确定其使用时机至关重要。
无参考评估器 在不与预期输出对比的情况下评估质量。这些适用于离线评估和在线评估: - **安全检查**:毒性检测、PII 检测、内容策略违规 - **格式验证**:JSON 结构、必需字段、模式符合性 - **质量启发式**:响应长度、延迟、特定关键词 - **无参考 LLM 即评判**:清晰度、连贯性、实用性、语调
基于参考的评估器 需要参考输出,仅适用于离线评估: - **正确性**:与参考答案的语义相似性 - **事实准确性**:对照真实标签进行事实核查 - **精确匹配**:具有已知标签的分类任务 - **基于参考的 LLM 即评判**:将输出质量与参考进行比较
设计评估策略时,无参考评估器在离线测试和在线监控中提供一致性,而基于参考的评估器在开发过程中实现更精确的正确性检查。
评估类型
LangSmith 支持不同的评估方法,适用于开发和部署的不同阶段。了解何时使用每种类型有助于构建全面的评估策略。
离线和在线评估有不同的用途: - **离线评估类型** 在带有参考输出的精选数据集上进行部署前测试 - **在线评估类型** 在无参考输出的情况下监控生产环境行为
了解更多关于 评估类型以及何时使用每种类型.
最佳实践
构建数据集
构建数据集有多种策略:
手动策划的示例
这是推荐的起点。创建10-20个高质量的示例,涵盖常见场景和边缘情况。这些示例定义了您的应用程序中"好"的标准。
历史追踪记录
一旦投入生产,将真实追踪记录转换为示例。对于高流量应用程序: - **用户反馈**:将收到负面反馈的运行添加到测试中。 - **启发式方法**:识别有趣的运行(例如,长延迟、错误)。 - **LLM反馈**:使用LLM检测值得注意的对话。
合成数据
从现有示例生成额外示例。在以几个高质量的手动制作示例作为模板时效果最佳。
数据集组织
划分
划分是数据集的命名子集,用于将示例分组到不同的集合中。常见模式包括:
- 机器学习式划分:将示例分为训练集、验证集和测试集,以避免过拟合,即模型在训练数据上表现良好但在未见数据上表现不佳。
- 基于类别的划分:当数据集跨越多个任务类别时,分别评估不同的输入类型。
- 分阶段推出:将探索性示例隔离,直到您准备好将它们包含在主评估集中。
划分与元数据不同:使用划分进行高级组织分组以用于评估,元数据用于每个示例的信息,如标签和来源。
在机器学习中,最佳实践是每个示例只属于一个划分。LangSmith允许示例属于多个划分,这在示例符合多个评估类别时非常有用。
了解如何 创建和管理数据集划分.
版本
LangSmith会在示例更改时自动创建数据集 版本 。 标记版本 以标记重要里程碑。在CI管道中针对特定版本,确保数据集更新不会破坏工作流程。
人工反馈收集
人工反馈通常提供最有价值的评估,特别是对于主观质量维度。
标注队列
标注队列 支持结构化收集人工反馈。标记特定运行以供审核,在流线型界面中收集标注,并将已标注的运行转移到数据集以供未来评估。
标注队列是对 内联标注 的补充,提供额外功能:分组运行、指定标准和配置审核者权限。
评估与测试
测试和评估是相似但不同的概念。
评估根据指标衡量性能。 指标可以是模糊或主观的,在相对条件下更有用。它们通常比较系统之间的表现。
测试用于断言正确性。 系统只有通过所有测试才能部署。
评估指标可以转换为测试。例如,回归测试可以断言新版本必须在相关指标上优于基线版本。当系统运行成本较高时,一起运行测试和评估以提高效率。
可以使用标准测试工具编写评估,例如 pytest or Vitest/Jest.
快速参考:离线评估与在线评估
下表总结了离线评估和在线评估之间的关键区别:
| **离线评估** | **在线评估** | |
|---|---|---|
| **运行于** | Dataset (Examples) | Tracing Project (Runs/Threads) |
| **数据访问** | 输入、输出、参考输出 | 输入、输出 |
| **使用场景** | 部署前,开发期间 | 生产环境,部署后 |
| **主要用例** | 基准测试、单元测试、回归测试、回测 | 实时监控、生产反馈、异常检测 |
| **评估时间** | 在精选测试集上进行批处理 | 在实时流量上进行实时或近实时评估 |
| **设置位置** | 评估标签页(SDK、UI、Playground) | 可观测性标签页 (自动化规则) |
| **数据需求** | 需要数据集整理 | 无需数据集,评估实时追踪 |