同类问题我见过几次,现场表现一样但根因不同,所以第一步是把范围缩小。 只设了 response_format={‘type’:’json_object’},提示词里没有任何格式说明,接口返回 400,提示 ‘messages’ must contain the word ‘json’ in some form。
拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
先分清是哪一类原因
- json_object 模式要求提示词里出现 json 这个单词
- 只给了格式类型,没有给出期望的字段结构
- 部分老模型根本不支持该模式,报错信息却相似
- 提示词被模板引擎转义,json 变成了别的字符
按顺序处理
1. 在 system 里明确写出要返回 json 及其字段
messages=[{'role':'system','content':'只输出 json,字段为 name 和 score'},{'role':'user','content':'评价这台相机'}]
2. 用 curl 验证最小可用报文
curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY" -d '{"model":"gpt-4o-mini","response_format":{"type":"json_object"},"messages":[{"role":"user","content":"返回 json 格式结果"}]}'
3. 解析前做一次容错并保留原始文本
data = json.loads(resp.choices[0].message.content)
4. 对缺失字段补默认值,避免下游崩
data.setdefault('score', 0)
怎么确认已经恢复
返回 200 且 content 能被 json.loads 直接解析,字段与提示里声明的一致,下游入库不再报 KeyError。
容易忽略的地方
json_object 只保证语法合法,不保证字段齐全,真正要约束结构得用 json_schema 并给出完整 schema,否则模型可能只回一个空对象。 处理过程中建议每改一项就验证一次,避免多个变量同时变化导致判断失真。