问题出现得很突然,日志倒是留得挺全。离线评测把 temperature 设成 0 追求可复现,线上实际用 0.7,同一版模型离线 87 分,线上人工抽检只有 74 分,团队一度怀疑是模型被换了。
刚开始盯着「线上还有系统提示与历史上下文,评测里没有」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。评测和线上的解码参数不一致。少数情况下是评测用单次采样,线上是多次生成后择优。
不容易想到的是,停止条件不同,评测截断位置比线上早。
第一件事是对齐两边的解码参数并记录
python -c "print({'temperature':0.7,'top_p':0.95,'seed':42})"
再往下用线上参数重跑同一批评测
python eval_run.py --set golden_500 --temp 0.7 --top-p 0.95
每个样本生成三次取人工评分均值
python eval_multi.py --set golden_500 --n 3 --temp 0.7
末了把线上真实上下文一并带入评测
python eval_run.py --set golden_500 --with-context prod_ctx.jsonl
别只看报错消失,验证要多做一步。用线上参数重跑后离线分数落到 75 分,与人工抽检差 1 分以内,评测波动范围也能给出上下界。
补一句。评测环境要和线上同参同上下文,否则分数只是自娱自乐;temperature 大于 0 时单次采样没有代表性,至少跑三次取均值。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
