在 CI 中运行可复现评测
执行 JSONL 数据集、隔离 Candidate、设置绝对与回归门槛、衡量方差、分片、恢复并合并。
CLI 契约
runifold-eval 让应用级进程执行与 CI 策略不进入 Runtime Library 依赖。run 为每个 Case
执行 Candidate;compare 对已有 Report 应用门槛;experiment 衡量重复 Sample;
merge 重建分片证据。
Exit Status 稳定:0 表示通过,1 表示配置或 Artifact 无效,2 表示评测完成但质量
门禁失败。
数据集与 Candidate
每行 JSONL 包含 Case ID、Input、Expected Value 与 Tag。Dataset Name 与 Version 组成 Identity。空数据集、重复 ID、无效 Tag 或混合身份会在执行前失败。
Candidate 不经 Shell 直接启动,接收 Case ID、Input 与 Tag,但永远不接收参考答案。它 必须输出一个有界 JSON Object。Timeout、非零退出、过大输出、无效 JSON、未知字段或无效 Metric 都成为隔离的 Target Failure。
质量门槛
Absolute Gate 要求每个 Scorer 与 Case 达到 Threshold。Relative Gate 与匹配 Baseline 比较 Mean Score、Pass Rate 与 Execution Success。缺少 Score 或 Target Failure 会关闭式 失败。
Report 排除原始 Prompt、Input、Reference、Candidate Output 与 stderr。JSON 是规范 Artifact;JUnit 与 Markdown 供 CI 和人工审阅使用。
实验
单次运行无法区分真实改进与采样噪声。Experiment 用稳定 Sample Index 和派生 Seed 重复 Case,再计算 Mean、Standard Deviation、95% Student's t Confidence Interval 与 Flaky-Case Rate。
Cache Identity 包括 Dataset Content、Candidate Version 与参数、Scorer、Seed、Shard、 Timeout 与 Limit。损坏或矛盾 Cache 会明确失败。稳定 Case Hash 支持独立 Shard 和保留 证据的 Merge。
CI 设计
固定 Dataset 与 Candidate Version,评测前构建 Candidate,用 Absolute Gate 保证最低质量, 再用 Baseline Gate 阻止回归;即使门禁失败也上传规范 Report。模型方差显著时,用 Experiment 支撑 Release 决策。
不要把不稳定外部 Provider 当作 Pull Request 的唯一信号。分开快速确定性契约测试、离线 质量门禁、Cassette Integration 与可选 Live Canary。
运行发布质量门
先安装 CLI、构建 Candidate,并在门禁失败时仍保留报告。-- 后的命令会被
直接执行,不经过 shell,因此每个参数都应单独传入,不要依赖通配符展开。
cargo install runifold-eval-cli --version 0.9.0 --locked
cargo build --release --bin my-eval-candidate
runifold-eval run \
--dataset evals/support.jsonl \
--dataset-name support \
--dataset-version 2026-08-06 \
--candidate-version prompt-v2 \
--output artifacts/evaluation.json \
--junit artifacts/evaluation.xml \
--markdown artifacts/evaluation.md \
-- ./target/release/my-eval-candidateCI 中要区分退出码 1 和 2:前者表示证据本身无效,后者表示评测已完成,
但没有通过策略。两种情况都上传 JSON、JUnit 和 Markdown。修改阈值前,先用
完全相同的数据集版本与 Candidate 二进制在本地复现。