qwen-max 开 response_format 为 json_object,提示词里只写了「输出结构化结果」,返回 200 但内容是「好的 以下是结果」加一段散文,json.loads 直接失败,同一 prompt 给 gpt-4o-mini 却能返回 JSON。

真正麻烦的地方在于,几个原因的现象几乎一样。部分模型要求提示词里明确出现 json 这个词;json_object 只保证语法,不保证字段结构;中文提示词用了结构化这类同义表述;没有一个 few-shot 示例说明目标形状。

上来先看返回内容的前 200 字符判断是散文还是 JSON

python -c "print(open('out.txt',encoding='utf-8').read()[:200])"

然后在 system 里显式写 json 与字段说明

python -c "import json;d=json.load(open('req.json'));d['messages'][0]['content']+=' 只输出 json 对象';json.dump(d,open('req2.json','w'),ensure_ascii=False)"

接着加一个最小示例固定字段名

python -c "print({'title':'示例','amount':0})"

解析失败时先剥代码围栏再 loads

python -c "import json,re;s=open('out.txt',encoding='utf-8').read();print(json.loads(re.sub(r'^```(json)?|```$','',s.strip())))"

这类改动我都写进变更记录,过两周再出问题时能对上号。

恢复的判定其实很直接。连续 50 条请求都能被 json.loads 解析,字段名与示例一致,不再出现散文前缀。

json_object 是语法开关不是结构约束,要把字段名和示例写进提示词,否则换一个模型就失效。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189