AI 知识

让大模型稳定输出 JSON:结构化输出实践笔记

让模型「输出个 JSON」经常翻车:多余逗号、夹带解释、字段漂移。本文对比各家结构化输出的机制差异,并给出可直接套用的兜底流程。

发布时间
阅读时长
3 分钟
来源
—

「请以 JSON 格式返回」是提示词里最常见的翻车现场:模型在 JSON 前后加解释文字、字段名随机漂移、枚举值自创、深层嵌套里藏一个多余逗号。这些问题大多不该靠提示词解决。

先分清两代方案

老做法是提示词约束 + 事后解析,本质上在「劝」模型。新做法是结构化输出:把 Schema 声明交给 API,由推理侧保证输出合法。前者永远有失败率,后者把失败率压到工程可忽略的水平。

各家的机制差异

  • OpenAI:Structured Outputs 支持严格按 JSON Schema 输出,配合 JSON Mode 使用最省心。
  • Anthropic(Claude):通过 tool_use 实现同等效果——把目标结构定义成一个工具,模型「调用工具」时给出的参数就是结构化结果。
  • Google(Gemini):原生 responseSchema 参数,直接在请求里声明结构。
  • 国产模型:多数提供 JSON Mode 或 Function Calling 两条路,效果以各家文档为准。

一份通用的兜底流程

即便用了官方机制,工程上仍建议保留三层保险:

  1. 请求后先做 JSON 解析,解析失败进入重试。
  2. 解析成功后用 Schema 校验(字段、类型、枚举),不合规进修复重试。
  3. 重试有上限,超限降级到兜底路径并告警,而不是无限烧钱。

代码要点

resp = client.create(...temperature=0)
data = parse_json(resp)          # 失败→重试
validate(data, MY_SCHEMA)        # 失败→带错误信息重试
save(data)                       # 落库前再校验一次

写 Schema 的三个细节

一是字段名用英文小写,模型遵循得更稳;二是枚举值显式列出,别指望模型「理解你的意图」;三是日期、金额这类敏感字段约定格式(如 ISO 日期、字符串金额),避免科学计数法之类的惊喜。

把结构化输出、缓存和批量接口组合起来用,是当前 API 应用里性价比最高的一组搭配,具体价差可以看站内 模型库 的价格表。