结构化输出并非已解决的问题:生产环境中的 JSON 模式失效模式
你开启了 JSON 模式,你的 LLM 开始返回有效的 JSON,然后你发布了它。三周后,生产环境悄无声息地挂了。JSON 在语法上是有效的。Schema 在技术上也是满足的。但某个字段包含了一个虚构的实体,finish_reason 为 "length" 导致数据负载在 95% 处被静默截断,或者模型对任何人类读起来都感到刺耳的文本分类为 "positive" 情感——而你的下游流水线毫无怨言地吞下了它。
JSON 模式被解决的方式,就像“使用互斥锁(mutex)”解决并发问题一样。原语(primitive)是存在的。但故障模式并不在于你把锁放在哪里。
这是一份针对生产环境中结构化 LLM 输出的全面故障分类,以及在用户发现之前捕获损坏的验证模式。
结构化 LLM 输出的三个时代(以及每个时代的失败之处)
了解故障模式需要了解你的集成方案处于哪个时代。
提示词工程时代 (2020–2023): 你在系统提示词中加入了“输出有效的 JSON”并提供了一个 few-shot 示例。失败率在 5–20% 之间,具体取决于 Schema 的复杂程度。最常见的失败是前导词污染(preamble contamination)——模型输出“当然!这是你要求的 JSON:”然后才是 JSON,导致生成的负载无法被任何解析器干净地处理。
JSON 模式时代 (2023–2024): OpenAI 的 response_format: { type: "json_object" } 保证了语法上有效的 JSON——任何有效的 JSON,而不一定是你要的结构。原始解析的失败率降至 2–5%。但模型现在可以随意返回 {"data": "whatever"},即便你想要的是一个包含十几个必填字段的精心结构化的对象。你用解析失败换取了静默的 Schema 不匹配。
严格结构化输出时代 (2024–至今): OpenAI 在 2024 年 8 月引入了严格的 Schema 强制执行。Google Gemini 增加了 response_schema。Anthropic 在 2025 年底发布了原生结构化输出。所有主要供应商对于语法和结构无效的 JSON 故障率降至 0.3% 以下。这就是大多数团队放松警惕的地方,也是大多数生产问题的潜伏之处。
