让 AI 模型把结果吐成 JSON,是开发者最常见的诉求之一:接程序、进数据库、喂给下游函数,都要求格式稳定。但模型天生是「接着话茬往下说」的,要它每次都输出合法 JSON,靠约束而不是靠运气。这条路上有两级工具加一道兜底:JSON mode 保证输出是合法 JSON,结构化输出更进一步用 schema 锁死字段,失败重试兜住剩下的漏网情况。这篇按机制拆开讲;提示词层面的 JSON 约束怎么写,见提示词 JSON mode一篇的对照。
为什么裸提示不稳:模型的默认行为
不加固约,直接在提示词里说「请输出 JSON」,多数时候能成,偶尔翻车:输出前后多了句解释、JSON 被代码块包裹、字段名换了个写法、某个字段干脆缺失。原因在模型的训练目标:它预测的是「接下来最像人话的 token」,而非「最符合你程序语法的 token」。轻微的格式漂移对聊天无所谓,对程序是致命的——解析一行报错,整条流水线就停。理解了这一点,就知道约束该往哪个方向使劲:把格式要求从提示词下沉到生成环节,让非法输出在产生的那一刻就出不来,而不是事后指望模型「自觉」。提示词约束仍有它的位置,两者的分工在提示词 JSON mode 一篇讲过,两级配合才稳。
两级约束:JSON mode 与结构化输出
第一级是 JSON mode:开关打开后,模型输出被约束为合法 JSON——语法层面保证能解析,但字段结构它做不了主,可能返回一个字段名随机的对象,甚至一个空对象。第二级是结构化输出:随请求提交一份 JSON schema,声明要哪些字段、什么类型、哪些必填、取值限定在哪几个枚举里,模型生成时被约束在 schema 允许的范围中,输出的字段名与类型逐项对得上。两级的差别一句话说清:前者保证「是 JSON」,后者保证「是你要的那个 JSON」。工程选择也由此而定:只要能解析,JSON mode 够用;字段要进数据库、要传给下游函数,直接上结构化输出,schema 写清楚,接口契约就定死了。
| 对照项 | JSON mode | 结构化输出 |
|---|---|---|
| 保证什么 | 输出是合法 JSON,语法层面能解析 | 字段名与类型逐项对得上 schema |
| 要不要交 schema | 不提交,字段结构做不了主 | 随请求提交,声明字段、类型、必填与枚举取值 |
| 可能返回什么 | 字段名随机的对象,甚至一个空对象 | 被约束在 schema 允许的范围里 |
| 什么时候够用 | 下游只要能解析 | 字段要进数据库、要传给下游函数 |
与 function calling 的关系:同一套底层
结构化输出与函数调用是近亲。函数调用的场景是:你声明一组工具,模型决定什么时候调用、调用时传什么参数,参数本身就要求符合你定义的 schema。两者的底层机制同源——都是把 schema 约束压进生成过程,让输出在结构层面无路可偏;区别在用途:函数调用管「要不要做、调哪个工具」,结构化输出管「回答长什么形状」。工程里两者经常配合:工具的参数定义用结构化约束保证合法,工具返回的结果再让模型按固定 schema 整理后交给下游。函数调用的完整循环——工具定义、模型选择调用、结果回填——见function calling一篇的拆解;提示词侧怎么把工具用法写清楚,见函数调用提示一篇,schema 的写法两边通用,学一次管两处。
失败与重试:兜底的三道防线
约束不是万无一失,工程上通常备三道防线。第一道是校验:拿到输出先跑 schema 校验与 JSON 解析,不合法的当场拦下,别让坏数据流进下游。第二道是带反馈的重试:校验失败后,把错误信息连同原请求再发一次,告诉模型上一轮错在哪、缺了哪个字段——带反馈的重试成功率远高于原样重发;重试要有次数上限,连续失败的归类与处置,按错误结构的分族判断走,见API 错误结构一篇。第三道是降级:重试仍失败就走兜底路径——记日志、发告警、转人工,别让单条数据卡死整批任务。三道防线配齐,结构化输出才敢放进生产环境。动手感受差别很直观:让豆包用裸提示词与带 schema 的请求各生成十次同一段数据,翻车率一统计就见高低;再让 DeepSeek 把你的业务字段写成一份规范的 JSON schema,约束的价值当场量化。
结构化输出速查
- 裸提示靠概率,约束下沉到生成环节才稳定
- JSON mode 保合法,结构化输出用 schema 保形状
- 与函数调用同源:一套 schema 约束,一个管调用一个管形状
- 三道防线:先校验、带反馈重试、重试不过走降级
- schema 学一次管两处:结构化输出与工具参数定义通用
结构化输出快问快答
- 有了 schema 约束,提示词里还要写格式要求吗?:结构归 schema 管,语义归提示词管。字段怎么填、内容怎么取舍仍要靠提示词说清,两层各司其职,缺一不可。
- 所有模型都支持 schema 约束吗?:支持程度随模型与版本不同(截至发稿版本,以官方更新日志为准),老模型可能只有 JSON mode,接之前先查所用模型的文档。
- 输出 JSON 的字段顺序需要在意吗?:程序按字段名取值,顺序不影响正确性;若下游有按序处理的特殊需求,在 schema 里把字段顺序声明清楚即可。


