跳到主要内容

指南

对另一个工具的分数给出第二意见

你的评测分数上升了。这是真的吗?你能信任度量它的评判模型吗?如果你已经在用另一个工具做评测,就把它在一次改动前后按用例给出的结果导出来,Oloproof 会基于这些结果回答这两个问题,而无需再运行任何东西。

它读取什么

每个系统版本一个文件,格式为 CSV 或 JSON Lines,每个用例和判据各占一行:

列内容
case_id用例的 id。两个文件只在双方都包含的 id 上配对
criterion指标的名称,它会成为规则所指定的指标
score指标量表上的一个数值;如果该工具没有给该用例打分,则留空
passed用 true 或 false 代替分数,或留空
score_min, score_max分数所在的量表(大多数工具为 0 和 1),有分数时必填
judge, judge_version做出评判的模型(如果由模型评判)。可选

除此之外不读取任何内容,任何含有其他列的文件都会被拒绝:文件只包含用例 id 和分数,绝不包含问题、答案或任何其他内容。下面的转换脚本会把每个工具的结果转成这种文件。

运行它

oloproof init --example second-opinion second-opinion
cd second-opinion

示例包含一个客服助手在 150 个问题上的忠实度(faithfulness)的两份导出,分别在一次提示词改动之前和之后,由另一个工具的评判模型打分:一个 0 到 1 之间的分数,以及以 0.7 为界的通过或失败。make_exports.py 是写出它们的模拟程序。平均分上升了约 0.02。

oloproof scores import before.csv after.csv --policy release.yaml
faithfulness: +0.023 [-0.024, +0.068] · 150 paired · 0 missing · 0 excluded
faithfulness_passed: +5.3 points [-6.9, +18.0] · 150 paired · 0 missing · 0 excluded
Decisions
  score-went-up  faithfulness  superiority  INSUFFICIENT_EVIDENCE  evaluator_not_validated
  more-answers-pass  faithfulness_passed  superiority  INSUFFICIENT_EVIDENCE  evaluator_not_validated
Gate: BLOCK (exit 3)
score-went-up, more-answers-pass: the judge (or model or custom evaluator) behind these rules has not been measured against people yet, so it may not decide.

每个文件都成为一次运行,两次运行按用例逐一比较。答案分为两半。

  • 这是真的吗?还不能确定。分数上升了 0.023,但区间从低 0.024 到高 0.068:只有 150 个问题时,这么小的变化无法与噪声区分开来。评判模型判为通过的答案所占比例上升了 5.3 个百分点,区间从低 6.9 个百分点到高 18.0 个百分点。
  • 你能信任这个评判模型吗?还没有人检查过它。release.yaml 只有在人工标签度量过某个评判模型之后才允许它决定发布(require_validated_evaluators: true),因此两条规则都在到达区间之前就停在了 evaluator_not_validated。

若要单独查看前一半,就像评判模型已经检查过一样:

oloproof scores import before.csv after.csv --policy statistics-only.yaml
  score-went-up  faithfulness  superiority  INSUFFICIENT_EVIDENCE  interval_overlaps_zero
  more-answers-pass  faithfulness_passed  superiority  INSUFFICIENT_EVIDENCE  interval_overlaps_zero

在 CI 中加上 --summary markdown >> "$GITHUB_STEP_SUMMARY":拉取请求随后以“Is it real?”和每条规则一行开头,写明“not established”及其原因,退出码不变。导入本身的输出写到标准错误,因此摘要只收到答案(CI)。

不带 --policy 时,该命令报告比较结果,不作任何决定。只给一个文件时,它报告那次运行,--policy 依据策略中的运行规则对它做门禁。

检验评判模型

由人对一次导入运行的用例随机抽样打标签,打标签时看不到评判模型的结论,Oloproof 再用这些标签来度量评判模型:

oloproof labels export RUN_ID --criterion faithfulness_passed --sample 60 --out sample.csv
oloproof labels import sample.csv
oloproof evaluators validate EVALUATOR_ID --by NAME

样本显示每个用例的 id,不显示评判模型结论的任何信息。打标签的人在保存该用例的工具中按 id 查看该用例,并在 passed 中写入 pass 或 fail。oloproof evaluators list 会给出评估器的 id。一旦通过验证,读取该评判模型的规则就只依据证据作出决定。

标签是通过或失败,因此它们检验的是评判模型的通过或失败结论,而不是它的分数。请把结论与分数一同导入,就像示例中的 faithfulness_passed 那样:这才是人可以验证的判据。

从你的工具导出

示例的 recipes/ 文件夹为每个工具提供一个简短的脚本。每个脚本读取该工具的结果并写出上述文件,只保留 id 和分数。每个版本运行一次,然后导入这两个文件。

工具转换脚本在两次运行之间标识一个用例的是什么说明
DeepEvaldeepeval_results.py RESULTS_JSON OUT测试用例的 name用 DisplayConfig(results_folder=...) 保存结果,并为每个 LLMTestCase 命名。每个指标给出其分数,并以 <metric>_passed 给出其通过或失败,同时附带评判模型
Braintrustbraintrust_experiment.py PROJECT EXPERIMENT OUT实验所运行的数据集记录(origin.id)分数在 0 到 1 之间;如果所有分数都由同一个模型评判,用 --judge 指定该模型
LangSmithlangsmith_experiment.py EXPERIMENT OUT --scale LOW HIGH数据集示例(reference_example_id)true 或 false 的分数会变成通过或失败;数值分数需要给出其量表
Langfuselangfuse_experiment.py EXPERIMENT SINCE OUT数据集条目(experiment_item_id)Langfuse 5 的实验;数值分数采用其分数配置的范围,或用 --scale 指定

这些转换脚本遵循各工具在 2026 年 10 月 16 日发布的 SDK(DeepEval 4.3.1、braintrust 0.46.1、langsmith 0.14.11、langfuse 5.0.2),并在该结构的结果上测试过,而不是针对真实账户。某个工具重命名了字段,坏掉的是它的转换脚本,而不是导入:脚本写出的文件才是契约。

文件必须做对的事

  • 只出现在一个文件中的用例,在另一侧计为缺失,会被计数并按最坏情况界定;它绝不会与另一个用例配对。
  • 同一用例和判据的第二行、超出 score_min 和 score_max 的分数、同时带有分数和通过或失败的行,以及在一个文件中是分数、在另一个文件中是通过或失败的判据,都会被拒绝,并指出是哪一行。
  • 被比较的文件必须在每个判据的量表和评判模型上一致:来自两个评判模型的分数是两件测量仪器,它们的差异有一部分会来自仪器本身。
  • 每个文件都是一个由其内容标识的系统版本。再次导入同一个文件会复用已存储的内容;从不执行任何东西,因此任何重新运行都无法重现或改变一个导入的分数。
  • --tool 记录分数的来源,--name 为每个文件的系统命名;两者都随运行一起保存。

尚未构建的功能

  • 直接读取某个工具自身的导出格式:转换脚本会把它转成上面的文件。
  • 无需安装任何东西即可把文件上传到托管站点。
  • 验证评判模型的分数,而不是它的通过或失败结论。

下一步