先看现象。开 stream 拿结构化输出,每个 chunk 的 delta.content 是一段不完整的 JSON,前端每收到一块就 json.loads,十次有八次抛 JSONDecodeError,等全部拼完再解析又失去了流式的意义。
这类报错背后常见的原因有几处,逐个排除就行。JSON 被按 token 切开,单块本身不是合法文档。另一种情况是增量解析库没有打开部分解析模式。
另外,chunk 里混了空字符串和 null,拼接时产生空洞。
少数情况下是字符串值里含转义引号,简单的括号计数会算错。
第一件事是打印前十个 chunk 看切分形态
python dump_chunks.py --limit 10
随后改用支持增量解析的库
python partial_parse.py --stream --schema schema.json
过滤空块后再拼接
buf = ''.join(c for c in chunks if c)
结束时做一次完整校验兜底
python final_check.py --schema schema.json --input out.json
这次没动代码,只在配置和运行环境上找原因。
恢复的判定其实很直接。增量解析能实时拿到已生成的字段,结束时完整 JSON 通过 schema 校验,异常率为零。
流式结构化输出只能做部分解析,任何情况下都要保留一次收尾的完整校验。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
