问题出现得很突然,日志倒是留得挺全。inspect-ai 0.3 里自定义 scorer,函数返回 {'accuracy': 0.8},跑 eval 时报返回值类型错误,一条样本都没跑完,改成返回 float 就正常。
刚开始盯着「异步 scorer 返回了协程但没有 await」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。scorer 需要返回 Score 对象而不是裸 dict。少数情况下是旧版示例里的 value 字段在新版已经改了语义。
少数情况下是多指标时键名与注册的 metric 名不一致。
第一件事是打印返回值的实际类型
python -c "print(type(0.8), type({'accuracy':0.8}))"
然后改用 Score 对象返回
python -c "from inspect_ai.scorer import Score;print(Score(value=0.8))"
注册指标名后重跑单条样本
python -m inspect_ai eval task.py --limit 1
异步 scorer 补上 await 再验证
python -m inspect_ai eval task.py --limit 5
这类改动我都写进变更记录,过两周再出问题时能对上号。
别只看报错消失,验证要多做一步。eval 正常结束,指标名出现在结果表里,分数与手工计算一致。
补一句。评测框架对返回值类型卡得严,升级后先跑 limit 1,比整批跑完再排错快得多。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
