bug: mismatch between evaluator filter preview and actual executed traces

该问题发生在 Langfuse 自托管环境中配置 LLM-as-a-Judge 评估器时,预览过滤器与后台 worker 执行逻辑不一致。优先排查 InMemoryFilterService.ts 中对缺失 metadata 键的处理逻辑。

快速结论:该问题发生在 Langfuse 自托管环境中配置 LLM-as-a-Judge 评估器时,预览过滤器与后台 worker 执行逻辑不一致。优先排查 InMemoryFilterService.ts 中对缺失 metadata 键的处理逻辑。

适用环境:Langfuse 4.10.0 自托管版本,使用 OTel 端点摄取 traces,涉及 LLM-as-a-Judge 评估器配置。

最快修复方案:暂无确认的一步修复方案。Issue 中给出的修复建议需修改 InMemoryFilterService.ts 源码并在 worker/src/__tests__/evalService.filtering.test.ts 中补充测试。

注意事项:该修复涉及核心过滤逻辑,修改后需重新构建 worker 并验证评估器行为;社区提出但尚未合入主分支,正式使用前建议先在测试环境验证。

问题场景

在 Langfuse 自托管实例中,用户通过 OTel 端点摄取 traces,部分 traces 带有 metadata.turn 属性,部分不带。配置 LLM-as-a-Judge 评估器时,使用过滤器规则 metadata → key turn → operator contains → value “”(空字符串)。配置向导的预览显示只有带 turn 键的 traces 匹配,但评估器激活后,worker 也会对不带 turn 键的 traces 执行评估,导致评估范围与预览不一致。

报错原文

bug: mismatch between evaluator filter preview and actual executed traces

原因分析

可能原因是内存过滤路径与 ClickHouse SQL 过滤路径对缺失 metadata 键的处理语义不同:

1. 内存过滤路径(worker 使用):当 metadata 中没有 turn 键时,key 查询返回 undefined,通过 objectValue?.toString() || "" 被转换为空字符串,随后 "".includes("") 返回 true,导致无键 traces 被匹配。

2. ClickHouse SQL 路径(preview 使用):生成 position(metadata[{key}], {value}) > 0 查询,ClickHouse 对 Map 列缺失键返回 '',但 position('', '') 结果为 0(false),正确拒绝无键 traces。

worker 在 trace 有缓存且过滤器不需要数据库查询时使用内存路径,而 preview 总是通过 ClickHouse 查询,因此两者结果不一致。

环境排查

  • 确认 Langfuse 版本为 4.10.0 或更高
  • 检查 packages/shared/src/server/services/InMemoryFilterService.tsevaluateStringObjectFilter 方法的实现
  • 确认 ClickHouse 查询路径文件 packages/shared/src/server/queries/clickhouse-sql/clickhouse-filter.ts 是否正确生成 map 查询
  • 检查 worker 配置是否启用缓存,以及过滤器在何种条件下会走内存路径

解决步骤

  1. 定位 InMemoryFilterService.ts 第 312-325 行的 evaluateStringObjectFilter 方法
  2. 在方法开头添加对缺失键的判断:如果 fieldValue 是对象但 key 不在对象中,直接返回 false,使其与 ClickHouse 的 Map 查询行为一致
  3. worker/src/__tests__/evalService.filtering.test.ts 中添加缺失键场景的测试用例
  4. 考虑增加专门的”键存在”过滤器操作符,避免用 contains "" 作为”键存在”的替代方案
  5. 修复后重新构建 worker 服务并部署

验证方法

部署修复后,使用包含和缺少 turn 键的 traces 创建评估器并设置 contains "" 过滤器,确认预览结果与实际执行的 job_executions 一致,即无键 traces 不会触发评估。

参考来源

langfuse/langfuse #16059

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18339

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注