本节摘要:回归集是一份"输入 + 人工标注的正确答案"清单,100~500 条起步,来源首选第 8 章影子日志的真实流量(含对账阶段发现的分歧样本与错误流里的 hard case)。它是 Jev 开发的单元测试:改一句 instructions、动一个选项、换一版模型,都必须重跑回归集——绿灯才许上线。评测读法分类型:Noul/Choice 看混淆矩阵与分桶准确率,Choice 额外盯 other 的滥用,Score 看分桶内的均值偏差。本节给出回归集的最小数据结构与一份可直接用的评测脚本骨架。
阅读完本节,你应当能够:
| 来源 | 价值 | 占比建议 |
|---|---|---|
| 影子日志随机抽样 | 代表真实分布 | ~60% |
| 对账分歧样本(第 8.2 节) | 边界与难点 | ~25% |
| 错误流 hard case(第 8.3 节) | 最难判断的输入 | ~10% |
| 人工构造的对抗/极端例 | 覆盖长尾 | ~5% |
量:100~500 条起步。低于 50 条时分桶统计全是噪声;高于 500 条的边际收益递减(除非做多阈值精调)。
最小数据结构(一份 JSONL,随仓库走版本控制):
{"id": "t-0042", "state": {"ticket": "..."}, "labels": {"is_urgent": 1, "route": "billing"}, "note": "对账分歧样本:含退款+故障混合诉求"}
labels 的 key 对齐问题 ID——回归集与 questions 定义一一映射,问题 ID 稳定(第 8.1 节)在这里兑现价值。
Noul:按预测概率分桶看准确率(第 9.2 节的可靠性曲线就是它的完整形态)。
Choice:混淆矩阵(第 6.1 节已示例)+ 三个专项检查:
Score:每级桶内看 |预测均值 − 真实等级|,偏差大且系统性的等级回去改描述(第 3.3 节准则一)。
评测脚本骨架(与第 6.1 节混淆矩阵衔接):
def evaluate_choice(dataset: list[dict], questions: dict) -> dict: matrix = {} # (预测, 真实) -> 计数 for case in dataset: pred = jev_call(case["state"], questions)["route"]["choice"] truth = case["labels"]["route"] matrix[(pred, truth)] = matrix.get((pred, truth), 0) + 1 acc = sum(v for (p, t), v in matrix.items() if p == t) / len(dataset) return {"accuracy": acc, "matrix": matrix, "other_rate": sum(v for (p, _), v in matrix.items() if p == "other") / len(dataset)}
第 8.2 节变更表的执行细则:
改 instructions / criteria / 模型版本 │ ▼ 跑回归集 ──准确率/混淆不劣化──▶ 允许发布(进影子或灰度) │ └─劣化──▶ 定位:哪类样本翻车?→ 修 schema / 回滚 → 再跑
三个实践要点:
💡 为什么 100 条就够:回归集的目标不是统计显著性(那是 9.2 校准的事),而是变更检测——schema 改动通常造成整类样本翻转,100 条足以暴露整类变化;配 25% 的分歧样本构成,敏感度更高。
回归集管"判断对不对",下一节管"概率诚不诚实"——可靠性曲线与 ECE,30 行代码给 Jev 做体检。