问题出现得很突然,日志倒是留得挺全。模型输出被 max_tokens 截断,停在数组中间,例如 items 里只写了 sku 和 qty 就结束,用 json_repair 0.30 解析后得到空数组,业务把空结果当成功写进了库。

刚开始盯着「解析后没有校验必填字段」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。截断位置落在数组中间。还有一种是repair 默认丢弃不完整的数组元素。

少数情况下是调用方没有检查 finish_reason 是不是 length。

第一件事是看 finish_reason 判断是不是被截断

python -c "import json;print(json.load(open('resp.json'))['choices'][0]['finish_reason'])"

截断时先重发或续写,不要直接修复

python retry_truncated.py --max-tokens 4096 --schema items.json

修复结果必须过一遍 Pydantic 校验

python validate_items.py --input repaired.json

剩下的就是把空数组当作失败而不是成功处理

python -c "print('raise when items is empty')"

怎么算真的好了,看的是同一批现象。修复结果能通过必填字段校验,空数组会被判为失败并进入重试,入库条数与原文一致。

json_repair 的目标是让解析不抛异常,不是保证语义正确,它修出来的结构可能合法但内容缺失,必须再加一层业务校验。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189