同类问题我见过几次,现场表现一样但根因不同,所以第一步是把范围缩小。 只设了 response_format={‘type’:’json_object’},提示词里没有任何格式说明,接口返回 400,提示 ‘messages’ must contain the word ‘json’ in some form。

拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

先分清是哪一类原因

  1. json_object 模式要求提示词里出现 json 这个单词
  2. 只给了格式类型,没有给出期望的字段结构
  3. 部分老模型根本不支持该模式,报错信息却相似
  4. 提示词被模板引擎转义,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,否则模型可能只回一个空对象。 处理过程中建议每改一项就验证一次,避免多个变量同时变化导致判断失真。

作者 9823189