
evaluate() 评估流程相比,Vitest 或 Jest 测试框架在以下情况下非常有用:
- 每个示例需要不同的评估逻辑:标准评估流程假设所有数据集示例都采用一致的应用程序和评估器执行。对于更复杂的系统或全面的评估,特定的系统子集可能需要使用特定的输入类型和指标进行评估。将这些异构评估编写为一起跟踪的不同测试用例套件会更简单。
- 您想要断言二进制期望:在 LangSmith 中跟踪断言并在本地(例如在 CI 流水线中)引发断言错误。测试工具在评估系统输出并断言其基本属性时很有帮助。
- 您希望利用模拟、监视模式、本地结果或 Vitest/Jest 生态系统的其他功能。
需要 JS/TS SDK 版本
langsmith>=0.3.1。Python SDK 有一个类似的 pytest 集成。
设置
按以下方式设置集成。请注意,虽然您可以使用现有的测试配置文件将 LangSmith 评估与您的其他单元测试(作为标准的*.test.ts 文件)一起添加,但以下示例还将设置一个单独的测试配置文件和命令来运行您的评估。它将假设您的测试文件以 .eval.ts 结尾。
这确保了自定义测试报告器和其他 LangSmith 接触点不会修改您现有的测试输出。
Vitest
如果尚未安装,请安装所需的开发依赖项:openai(和 langsmith)作为依赖项:
ls.vitest.config.ts 文件,使用以下基础配置:
include确保只运行项目中以eval.ts的某种变体结尾的文件reporters负责将您的输出格式化为如上所示的漂亮格式setupFiles在运行评估之前运行dotenv以加载环境变量testTimeout为每个测试设置全局默认超时时间。由于 LLM 调用可能较慢,我们将其从 Vitest 默认值增加
package.json 的 scripts 字段中,以使用您刚刚创建的配置运行 Vitest:
Jest
如果尚未安装,请安装所需的开发依赖项:openai(和 langsmith)作为依赖项:
以下设置说明适用于基本的 JS 文件和 CJS。要添加对 TypeScript 和 ESM 的支持,请参阅 Jest 的官方文档或使用 Vitest。
ls.jest.config.cjs:
testMatch确保只运行项目中以eval.js的某种变体结尾的文件reporters负责将您的输出格式化为如上所示的漂亮格式setupFiles在运行评估之前运行dotenv以加载环境变量testTimeout为每个测试设置全局默认超时时间。由于 LLM 调用可能较慢,我们将其从 Jest 默认值增加
package.json 的 scripts 字段中,以使用您刚刚创建的配置运行 Jest:
定义和运行评估
您现在可以使用熟悉的 Vitest/Jest 语法将评估定义为测试,但有一些注意事项:- 您应该从
langsmith/jest或langsmith/vitest入口点导入describe和test。 - 您必须将测试用例包装在
describe块中。 - 声明测试时,签名略有不同——有一个额外的参数包含示例输入和预期输出。
sql.eval.ts 的文件(如果您使用 Jest 而不使用 TypeScript,则为 sql.eval.js),并将此代码粘贴到其中:
ls.describe() 则定义了一个 LangSmith 数据集。如果您在运行测试套件时设置了 LangSmith 追踪环境变量,SDK 将执行以下操作:
- 如果不存在,则在 LangSmith 中创建一个与传递给
ls.describe()的名称相同的数据集。 - 如果尚不存在匹配项,则为传递给测试用例的每个输入和预期输出在数据集中创建一个示例。
- 创建一个新的实验,每个测试用例对应一个结果。
- 在每个测试用例的
pass反馈键下收集通过/失败率。
pass 布尔反馈键。它还将跟踪您使用 ls.logOutputs() 记录的任何输出或从测试函数返回的任何输出,作为实验中应用程序的“实际”结果值。
创建一个包含您的 OPENAI_API_KEY 和 LangSmith 凭据的 .env 文件(如果尚未拥有):
eval 脚本来运行测试:

追踪反馈
默认情况下,LangSmith 在每个测试用例的pass 反馈键下收集通过/失败率。您可以使用 ls.logFeedback() 或 ls.wrapEvaluator() 添加额外的反馈。为此,请尝试将以下内容作为您的 sql.eval.ts 文件(如果您使用 Jest 而不使用 TypeScript,则为 sql.eval.js):
myEvaluator 函数周围使用了 ls.wrapEvaluator()。这使得 LLM 作为评判者的调用与测试用例的其余部分分开追踪,以避免混乱,并且如果包装函数的返回值匹配 { key: string; score: number | boolean },则会方便地创建反馈。在这种情况下,评估器追踪将不会出现在主要的测试用例运行中,而是出现在与 correctness 反馈键关联的追踪中。
您可以通过在 UI 中点击其对应的反馈芯片来查看 LangSmith 中的评估器运行情况。
针对一个测试用例运行多个示例
您可以使用ls.test.each() 在多个示例上运行相同的测试用例并参数化您的测试。当您希望以相同的方式针对不同输入评估您的应用程序时,这非常有用:
使用现有数据集(仅限 Vitest)
您可以在 LangSmith 中针对现有数据集运行测试,而不是内联定义示例:- 使用
client.listExamples()从 LangSmith 中已存在的数据集中获取示例。 - 通过迭代异步生成器将示例收集到数组中(例如
testExamples)。 - 将数组传递给
ls.test.each(),以针对数据集中的每个示例运行您的测试逻辑。
记录输出
每次我们运行测试时,都会将其同步到数据集示例并将其作为运行进行追踪。要追踪运行的最终输出,您可以像这样使用ls.logOutputs():
追踪中间调用
LangSmith 将自动追踪测试用例执行过程中发生的任何可追踪的中间调用。聚焦或跳过测试
您可以在ls.test() 和 ls.describe() 上链式调用 Vitest/Jest 的 .skip 和 .only 方法:
配置测试套件
您可以通过向ls.describe() 传递一个额外参数来为整个套件配置测试套件,或者通过向 ls.test() 传递一个 config 字段来为单个测试配置测试套件:
process.env.ENVIRONMENT、process.env.NODE_ENV 和 process.env.LANGSMITH_ENVIRONMENT 中提取环境变量,并将其设置为所创建实验的元数据。然后,您可以在 LangSmith 的 UI 中按元数据过滤实验。
有关配置选项的完整列表,请参阅 API 参考。
空运行模式
如果您希望在不将结果同步到 LangSmith 的情况下运行测试,可以省略 LangSmith 追踪环境变量或在环境中设置LANGSMITH_TEST_TRACKING=false。
测试将正常运行,但实验日志不会发送到 LangSmith。
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

