SuperAPI AI 工具集

langsmith evaluators

测试与质量

查看项目

更新于 10-16 17:20

技能介绍

用途

LangSmith Evaluators 用于为 LangSmith 构建评估流水线(evaluation pipelines)。技能覆盖三个核心组成部分:(1)创建评估器,包括 LLM-as-Judge 与自定义代码;(2)运行函数与轨迹捕获;(3)评估器的上传与运行。

核心准则:先检查再实现

技能明确要求:在编写任何评估器或抽取逻辑之前,必须先运行智能体并捕获实际输出,检查输出(打印、查询 LangSmith trace、理解确切结构),之后才编写处理该输出的代码。输出的结构会因框架、智能体类型和配置而有显著差异,绝不能假设其形状,务必先验证。当输出不含所需数据时,查询 LangSmith trace 来理解如何从执行中抽取。

评估器类型与格式

评估器分为两种:

  • 离线评估器(绑定数据集):函数签名为 (run, example),同时接收运行输出和数据集中样例,用于将智能体输出与数据集中的期望值对比,通过 --dataset "Dataset Name" 上传。
  • 在线评估器(绑定项目):函数签名为 (run),只接收运行输出,没有 example 参数,用于生产运行的实时质量检查(无参照数据),通过 --project "Project Name" 上传。

返回格式为 {"score": value, "comment": "..."},指标键名由函数名自动派生。每个评估器只返回一个指标,需要多个指标就创建多个评估器函数。不得返回 {"metric_name": value} 或指标列表。

Python 中需注意本地与上传的差异:本地 evaluate() 的 run 是 RunTree 对象,用 run.outputs;上传到 LangSmith 后 run 是 dict,用 run["outputs"]。二者兼容写法为 run.outputs if hasattr(run, "outputs") else run.get("outputs", {})。TypeScript 始终使用属性访问:run.outputs?.field。

评估器种类

LLM as Judge:用 LLM 给输出打分,适合主观质量评估(准确性、有用性、相关性)。

自定义代码评估器:确定性逻辑,适合客观检查(精确匹配、轨迹校验、格式合规)。

脚本目前仅支持代码评估器,LLM-as-Judge 上传暂不支持。针对数据集的评估,技能强烈建议先定义本地评估器并与 evaluate(evaluators=[...]) 配合使用。

运行函数与轨迹捕获

运行函数负责执行智能体并返回供评估的输出。技能要求在编写评估器前必须先测试运行函数并检查实际输出结构,调试流程为:在样例输入上运行智能体一次;查询 trace 查看执行结构;打印原始输出并与 trace 核对;按需调整运行函数;验证输出与数据集 schema 匹配。应尽量让运行函数输出匹配数据集 schema,便于写出简单、可复用的评估器。

轨迹评估要求运行函数在执行过程中捕获工具调用。LangGraph 智能体(LangChain OSS)使用 stream_mode="debug" 与 subgraphs=True 来捕获嵌套子智能体的工具调用。对于自定义/非 LangChain 智能体,先检查输出是否已包含轨迹数据(如 result.tool_calls、result.steps),若框架支持执行回调则注册钩子记录工具名,最后才考虑从结构化日志或 trace 数据中解析。关键是在执行时而非定义时捕获工具名。

使用方式

上传到数据集的评估器在运行实验时会自动执行,无需传给 evaluate()。上传的评估器出于安全原因只有非常有限的包访问权限,仅依赖标准 Python/JavaScript 功能(如内置包)时方可上传;数据集(离线)评估器优先本地用 evaluate(evaluators=[...]) 运行,以获得完整包访问权限。

命令行示例(Python):list 列出全部评估器;upload 上传离线或在线评估器,需指定 --dataset 或 --project 之一,全局评估器不支持;delete 删除。JavaScript 使用 npx tsx upload_evaluators.ts 执行相同操作。

脚本在破坏性操作前会提示确认,除非用户明确要求,绝不使用 --yes 标志。

运行评估

上传的评估器在运行实验时自动运行;本地评估器直接传入以用于开发测试。示例:from langsmith import evaluate; results = evaluate(run_agent, data="My Dataset", experiment_prefix="eval-v1")。

最佳实践与常见问题

  • LLM 评判使用结构化输出,比解析自由文本更可靠。
  • 按数据集类型匹配评估器:最终响应 → LLM as Judge 评质量;轨迹 → 自定义代码评序列。
  • LLM 评判使用 async 以支持并行评估。
  • 独立测试评估器,先用已知好/坏样例验证。
  • 语言选择:Python 用于 Python 智能体与 langchain 集成;JavaScript 用于 TypeScript/Node.js 智能体。

常见问题:输出不符合预期时查询 LangSmith trace 查看每步确切的输入/输出;每个评估器只返回一个指标;字段名不匹配时确保运行函数输出与数据集 schema 完全一致,先用 client.read_example(example_id) 检查数据集;Python 中本地与上传的 run 类型不同,需兼容处理。

依赖与配置

环境变量:LANGSMITH_API_KEY(必需)、LANGSMITH_WORKSPACE_ID(可选,用于组织级密钥)、OPENAI_API_KEY(LLM as Judge 所需)。Python 依赖:pip install langsmith langchain-openai python-dotenv。JavaScript 依赖:npm install langsmith commander chalk cli-table3 dotenv openai。

限制

脚本目前不支持 LLM-as-Judge 评估器的上传,仅支持代码评估器;上传评估器包访问权限受限;必须指定 --dataset 或 --project,不支持全局评估器。