报错是这么冒出来的。用 response_format 的 json_schema 约束评分 1 到 5,schema 里写了 minimum 1 和 maximum 5,strict 已开,模型仍返回 -3 和 9,接口本身不报错。
中间走过弯路,把「模型把评分当自由文本生成 未受枚举约束」当成主因,改完现象没变。
这类报错背后常见的原因有几处,逐个排除就行。strict 只保证结构 不保证数值落在区间。另一种情况是minimum 写在了错误的层级 没生效。
另外,解析后直接入库 缺一层业务校验。
动手时先打印实际生效的 schema 确认层级
python -c "import json;s=json.load(open('schema.json'));print(json.dumps(s['properties'],ensure_ascii=False)[:400])"
接着把评分改成枚举 用固定取值列表
python patch_schema.py --field score --enum 1,2,3,4,5
解析后用 pydantic 加范围约束
python -c "from pydantic import BaseModel,Field;print(Field(ge=1,le=5))"
越界样本带错误信息重试一次
python retry_bad.py --input bad.jsonl --rounds 1
我习惯把每一步的执行时间和结果记在一边,后面复盘省事。
怎么算真的好了,看的是同一批现象。五百条样本里越界值为零,重试率低于 2%,下游统计的均值与人工标注一致。
这里还有个坑。schema 是软约束,落库前必须有一次硬校验,两个环节缺一都会漏。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
