评估质量并阻止回归
版本化数据集、度量可观察行为、与基线比较,并在不保存输出的前提下设置发布门禁。
评估什么
单元测试验证确定性契约;Evaluation 度量会随着 Prompt、模型、服务商、检索索引或 Tool 集合变化的产品行为。
从可观察要求开始:
- 分类与结构化字段正确性;
- 回答是否有依据、引用是否准确;
- 拒答与升级行为;
- Tool 选择与参数质量;
- 检索召回率与无关上下文比例;
- 延迟、Token 与成本。
“感觉不错”不能成为发布标准。把它转换成 Case、Scorer 与 Threshold。
构建版本化数据集
把 Testkit 加入开发依赖:
cargo add --dev runifold-testkit
cargo add --dev serde_jsonuse runifold_testkit::{EvaluationCase, EvaluationDataset};
use serde_json::json;
let dataset = EvaluationDataset::new(
"support-triage",
"2026-07-30",
vec![
EvaluationCase::new("payment-urgent", json!("charged twice"))?
.with_expected(json!({
"category": "payment",
"urgent": true
})),
],
)?;Case ID 保持稳定;Case 或 Label 变化时更新 Dataset Version。输入应该有代表性、经过 授权、最小化,并且不包含线上 Secret。
选择 Scorer
契约允许时优先确定性 Scorer:
- 精确结构化结果使用
JsonExactMatchScorer; - 必需字段与范围使用 JSON Rule Scorer;
- 有界词法相似度使用 Token Overlap;
- 召回与排序使用 Retrieval Scorer。
只有无法确定表达的质量才使用 Model Judge。固定 Rubric 与 Judge Model 版本,要求 输出 Rationale,并用人工 Label 校准。
一个总分远远不够。查看逐 Case 失败,并按低基数 Tag 检查 Pass Rate。
与基线比较
在同一 Dataset 上运行固定 Baseline 与 Candidate。Regression Policy 可以限制平均分 下降、Pass Rate 下降和执行失败。
绝对门禁回答“是否足够好”;相对门禁回答“这次修改是否变差”。生产发布通常两者都要。
Candidate 身份应记录所有影响行为的组合:应用 Revision、Prompt Version、Model ID、 Provider 配置与 Retrieval Index Version。
CI 与数据安全
Evaluation Report 只保存 Score、安全错误、Metric 与 Run 关联,不保存模型输出。敏感 Case 数据应单独存放,并使用更严格的访问与保留策略。
CI 中:
- 每次修改运行确定性离线评估;
- 大型 Dataset 确定性分片;
- 限制并发、成本与总时长;
- 只重试基础设施故障,不能静默丢弃坏 Case;
- 与已批准 Baseline 比较并发布 Report;
- 替换 Baseline 前必须审核。
在线评估需要受保护凭证与显式预算。服务商故障应记录为执行失败,不能伪装成模型质量 为零。