一、评估闭环:Agent从Demo走向生产的核心门槛
很多LLM Agent在Demo阶段表现亮眼,但落地到生产环境后往往效果不可控、问题难定位,本质是缺少完整的评估-观测-迭代闭环。没有量化的评估体系,Agent的优化就只能依赖主观感受,无法稳定迭代;缺少全链路观测,就无法捕捉生产环境的边缘场景。因此,掌握成熟的评估观测框架,是Agent开发者的必备能力。
本文以Langfuse为例,系统梳理LLM应用的评估体系、核心方法与底层数据模型,帮助开发者搭建从离线实验到在线监控的完整迭代闭环。
二、两类评估范式:离线验证 + 在线监控
LLM应用的评估通常分为离线评估与在线评估,二者配合形成完整的迭代循环。
1. 离线评估(Offline Evaluation)
在版本部署前,基于固定测试数据集对应用进行批量测试。开发者可以通过更换提示词、模型版本、检索策略等变量,运行实验并对比评分,持续迭代直到效果达标后再上线。
- 核心价值:提前验证版本效果,降低上线风险
- 适用场景:提示词优化、模型选型、策略迭代
2. 在线评估(Online Evaluation)
在生产环境中对真实用户请求进行实时追踪与评分,捕捉离线数据集未覆盖的边界问题。当发现新的bad case时,可以将其回流补充到离线数据集中,让后续的离线评估覆盖更多场景。
- 核心价值:监控生产效果,持续扩充测试边界
- 适用场景:生产效果监控、边缘场景发现、数据集沉淀
3. 完整迭代工作流:以客户支持聊天机器人为例
我们可以通过一个典型场景理解闭环的运作方式:
- 需求迭代:更新提示词,让机器人回复风格更口语化
- 离线验证:运行实验,在客户问题数据集上测试新提示词,查看评分与输出效果;发现回复偏长、部分关键链接丢失的问题
- 二次迭代:优化提示词后再次运行实验,确认效果达标
- 上线部署:将新提示词发布到生产环境
- 在线监控:通过在线评估持续监控,发现法语提问被英文回复的边界case
- 数据集回流:将法语查询加入离线数据集,同步更新提示词的多语言支持逻辑,再次运行实验验证
随着迭代推进,数据集会从少量初始用例,逐步沉淀为覆盖真实场景的高价值测试集。
三、核心评估方法与适用场景
Langfuse提供了多种评估方式,覆盖从自动化批量评估到人工精细化标注的全场景,开发者可以根据需求组合使用。
1. 评估方法总览
| 评估方法 | 实现方式 | 核心适用场景 |
|---|---|---|
| LLM-as-a-Judge | 用大模型按自定义标准自动评估输出 | 大规模主观评估(语气、准确性、有用性等) |
| UI手动评分 | 在Langfuse界面直接为追踪打标 | 快速质量抽查、单条追踪复盘 |
| 标注队列 | 结构化人工标注工作流,支持队列分配 | 基准数据构建、系统性标注、团队协作 |
| SDK/API编程评分 | 通过代码程序化批量添加评分 | 自定义评估管道、确定性规则检查、自动化工作流 |
2. 核心方案:LLM-as-a-Judge详解
LLM-as-a-Judge是目前规模化评估的主流方案,即用一个能力较强的大模型作为“裁判”,按照预设标准对被测应用的输出进行打分并给出推理过程。
工作原理
将评估四要素输入裁判模型,由模型输出结构化的评分与推理:
- 评估标准:定义“优质输出”的判定规则
- 输入上下文:原始用户查询与提示词
- 待评估输出:被测应用(Task)的生成结果
- 参考基准:可选,用于对比的预期输出/事实答案
裁判模型返回的评分支持三种类型:
- 数值型:0-1连续评分,适合衡量有用性、相关性等程度类指标
- 类别型:如“正确/部分正确/错误”,适合明确的分类判定
- 布尔型:如“是否通过安全校验”,适合二元判断
核心优势
- 可扩展性强:无需大量人工标注,可快速评估上万条输出
- 类人判断:在规则引导下,能捕捉相关性、语气、毒性等规则难以量化的维度
- 结果可复现:固定评估规则与模型版本,可得到稳定一致的评分结果
评估载体的三种粒度
LLM-as-a-Judge可作用于三种不同粒度的数据,适配不同阶段的需求:
- 观测(Observation):针对单步操作(如单次LLM调用、单次检索)评估,精度最高
- 追踪(Trace):针对单次完整交互链路评估,最常用
- 实验(Experiment):针对整批数据集运行结果评估,用于离线对比
基于观测的评估:生产级监控的最优解
针对观测级别的评估是生产环境的首选方案,具备以下特点:
- 低延迟高吞吐:异步架构可实现秒级评估,支持每分钟数千条处理量
- 操作级精度:可筛选仅评估最终回复、检索步骤等特定环节,降低评估成本
- 组合式评估:同一条追踪的不同步骤可运行不同评估器,如同时评估回复毒性与检索相关性
- 灵活过滤:可结合观测类型、元数据、用户ID、标签等维度筛选评估范围
其数据流为:数据摄入时,匹配筛选规则的观测会进入评估队列,异步处理后将评分挂载到对应观测上;同一条追踪可能包含多个匹配的观测,因此会产生多个评分。
3. 人工兜底:标注队列
标注队列是面向领域专家的人工评估方案,作为自动化评估的补充与校准:
- 可对Trace、Observation、Session手动添加评分与评论
- 支持添加修正结果,记录模型应输出的标准答案
- 可用于校准LLM-as-a-Judge的评估标准,让自动评估与人工判断对齐
4. 评分分析:验证评估可信度
评分分析是Langfuse内置的零配置分析能力,用于验证评估体系的可靠性:
- 可对比不同裁判模型、人工与自动评估的一致性,输出皮尔逊相关系数、Cohen's Kappa、F1等统计指标
- 支持可视化评分分布、趋势变化,快速发现评估异常
- 无需额外配置,摄入评分后即可直接使用
四、Langfuse评估体系的核心数据模型
理解Langfuse的底层对象模型,是灵活用好评估能力的基础。整个体系围绕“数据集-实验运行-评分”三层结构展开。
1. 数据集层:Dataset 与 DatasetItem
数据集是离线评估的基础,用于沉淀标准化测试用例。
Dataset(数据集)
测试用例的集合,是运行实验的载体。
| 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 是 | 数据集唯一标识符 |
| name | string | 是 | 数据集名称 |
| description | string | 否 | 数据集描述 |
| metadata | object | 否 | 附加元数据 |
DatasetItem(数据集项)
数据集中的单条测试用例。
| 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 是 | 数据集项唯一ID,项目内全局唯一,用于幂等更新 |
| datasetId | string | 是 | 所属数据集ID |
| input | object | 否 | 测试输入数据 |
| expectedOutput | object | 否 | 预期输出(基准答案) |
| metadata | object | 否 | 附加元数据 |
| sourceTraceId | string | 否 | 关联的源追踪ID,用于从生产case回流 |
| status | string | 否 | 状态:ACTIVE(生效)/ ARCHIVED(归档) |
2. 实验运行层:DatasetRun 与 DatasetRunItem
一次完整的数据集测试称为一次实验运行(DatasetRun / Experiment Run)。
DatasetRun(数据集运行/实验运行)
针对数据集执行的一次完整测试任务。
| 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 是 | 运行唯一标识符 |
| name | string | 是 | 运行名称 |
| datasetId | string | 是 | 关联的数据集ID |
| description | string | 否 | 运行描述 |
| metadata | object | 否 | 附加元数据 |
DatasetRunItem(数据集运行项)
单条测试用例的运行记录,关联对应的追踪链路。
| 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 是 | 运行项唯一ID |
| datasetRunId | string | 是 | 所属运行ID |
| datasetItemId | string | 是 | 关联的数据集项ID |
| traceId | string | 是 | 关联的追踪ID |
| observationId | string | 否 | 关联的观测ID(兼容旧版SDK) |
最佳实践:优先通过traceId关联完整链路,observationId仅用于旧版本兼容。
3. 评分层:Score 与 ScoreConfig
评分是所有评估结果的最终载体,可挂载到追踪、观测、会话、数据集运行等不同层级。
Score(评分对象)
| 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 是 | 评分唯一ID,可作为幂等键用于更新评分 |
| name | string | 是 | 评分名称,如accuracy、user_feedback |
| value | number | 否 | 数值评分值,数值/布尔类型必传 |
| stringValue | string | 否 | 字符串值,用于类别/布尔型评分 |
| dataType | string | 否 | 数据类型:NUMERIC / CATEGORICAL / BOOLEAN |
| source | string | 是 | 评分来源:API / EVAL / ANNOTATION |
| comment | string | 否 | 评分说明、推理过程或备注 |
| traceId / observationId / sessionId / datasetRunId | string | 否 | 挂载的目标对象ID,四选一 |
| configId | string | 否 | 关联的评分配置ID,用于约束评分规范 |
ScoreConfig(评分配置)
用于标准化评分Schema,确保团队内同一项评分的口径一致,配置不可修改但可归档。
- 包含评分名称、数据类型、取值范围(数值型)、可选类别(类别型)等约束
- 关联了configId的评分会自动校验格式,避免口径混乱
4. 端到端数据关联关系
完整的实验链路对象关系如下:
- 一个Dataset包含多个DatasetItem
- 运行一次实验生成一个DatasetRun,对应生成一批DatasetRunItem
- 每个DatasetRunItem对应一条Trace
- 每条Trace下可挂载多个Score,也可挂载到Trace内的单个Observation上
五、SDK实验的核心函数规范
通过Python SDK运行实验时,核心是定义任务函数与评估函数,二者分别对应“被测逻辑”与“评分逻辑”。
1. Task(任务函数)
任务函数是被测应用的核心逻辑,接收一个数据集项作为输入,返回执行输出。SDK会自动为每个数据集项调用该函数,并生成追踪链路。
- 入参:通过关键字参数接收
item(数据集项) - 返回值:任意类型的输出结果,会传递给评估函数
- 支持同步与异步写法
2. Evaluator(条目级评估函数)
评估函数对单条任务输出进行打分,接收输入、输出、预期输出、元数据等参数,返回一个或多个Evaluation对象。
- 入参:关键字参数
input、output、expected_output、metadata - 返回值:单个Evaluation对象,或Evaluation对象列表
- 支持同步与异步写法
Evaluation对象是评分的结构化载体,核心字段包括:
name:评分指标名称,需保持一致用于聚合value:评分值,支持数值、字符串、布尔类型comment:评分说明与推理过程metadata:评估相关的元数据,如裁判模型版本、置信度data_type:评分数据类型,默认为NUMERICconfig_id:关联的评分配置ID
3. Run Evaluator(运行级聚合评估函数)
运行级评估函数对整次实验的全部结果进行聚合分析,计算整体指标,生成的评分会挂载到数据集运行上。
- 入参:关键字参数
item_results(全部条目结果列表) - 返回值:聚合后的Evaluation对象列表
- 适用于计算整体准确率、平均分、分布统计等全量指标
六、总结
从Demo玩具到生产级Agent,核心差距在于是否建立了可量化、可闭环的评估迭代体系。离线评估保障版本上线质量,在线评估捕捉生产边界问题,再通过数据集回流实现持续进化,三者共同构成了Agent自迭代的基础。
Langfuse作为一体化的观测与评估平台,覆盖了从数据管理、实验对比到在线监控、人工标注的全链路能力;理解其底层模型与函数规范,能够帮助开发者更灵活地搭建适配自身业务的评估体系,让Agent的优化有迹可循、迭代有据可依。