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 两条路,效果以各家文档为准。
一份通用的兜底流程
即便用了官方机制,工程上仍建议保留三层保险:
- 请求后先做 JSON 解析,解析失败进入重试。
- 解析成功后用 Schema 校验(字段、类型、枚举),不合规进修复重试。
- 重试有上限,超限降级到兜底路径并告警,而不是无限烧钱。
代码要点
resp = client.create(...temperature=0) data = parse_json(resp) # 失败→重试 validate(data, MY_SCHEMA) # 失败→带错误信息重试 save(data) # 落库前再校验一次
写 Schema 的三个细节
一是字段名用英文小写,模型遵循得更稳;二是枚举值显式列出,别指望模型「理解你的意图」;三是日期、金额这类敏感字段约定格式(如 ISO 日期、字符串金额),避免科学计数法之类的惊喜。
把结构化输出、缓存和批量接口组合起来用,是当前 API 应用里性价比最高的一组搭配,具体价差可以看站内 模型库 的价格表。