(本文转载,原文约 2.5 万字符,此处保留核心结论与四条路径的对比,原文链接见文末。)
先看一个真实场景:把用户提交的报修工单抽成结构化字段写进数据库,字段是 ticket_id、title、priority、summary、contact_email,外加几个可选项。照着官方文档把 response_format 设成 json_object,第一次跑就成功,解析通过、字段齐全、类型正确,于是上线。一周后问题开始零星出现:priority 返回中文「中」而不是约定的 medium,被枚举校验拦下取了默认值;tags 有时是数组、有时是逗号分隔的字符串,前端渲染出六个单字标签;content 偶尔是空串,被最外层兜底 try 吞掉,那条工单从此消失。
三条事故看起来是三件事,其实是同一件事的三个侧面:拿到的东西通过了语法检查,但没有通过合同检查。而 json_object 从设计上只负责前者。
一、官方原话:只保证是 JSON
官方 JSON Output 指南开篇写的是,确保模型输出合法的 JSON 字符串。Chat Completions 接口参考里对 response_format 的说明更直接:设成 json_object 后,保证模型生成的消息是合法 JSON。
合法 JSON 是一个语法判断:花括号配对、引号闭合、逗号合法。它没有提到字段名、字段类型、取值范围、必填可选中的任何一项。「{a: 1}」和「{ticketId: 中, slaHours: 尽快}」在它眼里都是合格产物,一个字段不错可能只是运气。
这一点不用推理,官方在 2024 年 5 月 17 日的更新日志里给过数:模型改进后,内部测试集的 JSON 解析率从 78% 升到 85%;应用侧再引入合适的正则,才进一步提到 97%。三个推论值得记下:97% 不是模型单独的成绩,是模型加你写的正则;97% 仍然不是 100%,每 1000 次调用就有 30 次解析失败,这些失败不会自己变成异常;这是 2024 年的数据,此后官方没有再公布过更新后的解析率。
二、四层保证,json_object 只管第一层
文章把「保证」拆成四层,才看得清 json_object 停在哪一层:
- 语法层:这串字符能不能被 JSON 解析器读进来。服务端管,这是它唯一的承诺。
- 结构层:字段名、类型、嵌套层级是否与约定一致。你的代码管。
- 取值层:枚举、单位、日期格式、空值怎么表示。你的代码管。
- 语义层:数字是不是真的、结论站不站得住。只能由人来核对。
结论很朴素:结构化输出的服务端保证停在第一层,剩下三层是你的工程活。
三、四条路,代价一条比一条贵
文章把 DeepSeek 现在能走的结构化输出路径全摊开,一共四条:
- 把字段说明写进提示词:最便宜,靠模型自觉。字段一多、嵌套一深,最先崩。
- response_format 设成 json_object:服务端保证语法合法,不保证你的 schema。
- text.format 用 json_schema:只是某些端点收 schema。文章的原话是同一个模型、三套协议、三个门。
- tools 加 strict:Beta,约束最强,代价也最大。
有个细节值得记住:官方那个 97%,把应用侧正则算成了方案的一部分,不是兜底。你写上正则,等于承认模型自己到不了 100%。
四、上 strict 之前,先把 schema 过一遍
文章拿一个看起来完全正常的业务 schema 去跑严格模式,改了 8 处才通过。这不是模型挑剔,是 strict 对可选字段、嵌套对象、枚举这些写法有硬要求,平时写惯了的 schema 直接搬过去,大概率报错。
成本也要算。把完整示例塞进提示词,常驻成本比重试一次还贵 2.78 倍:示例越长越稳,但每一轮都在为它付费。字段少的时候,多写两行校验代码,往往比多塞三百字示例划算。
开了思考模式之后还有四条硬约束,踩中任何一条都会退回普通 JSON 输出。文章建议上线前逐条对照,别等线上脏数据堆起来才发现。
五、怎么选
- 一次性脚本、内部工具:提示词加 json_object,配自己的校验,够用。
- 对外接口、要落库的数据:strict 或 json_schema,schema 先审计再上。
- 字段多、嵌套深:先砍字段。每多一个可选字段,就多一处可能对不上的地方。
结构化输出这件事,模型能保证的只有「能被解析」。字段对不对、值合不合理,从来是调用方的事。把这层预期摆正,比换哪个模型都管用。
本文转载自CSDN(作者:Rosanci) 《一文读懂 DeepSeek 的结构化输出:只保证「是 JSON」,不保证「是你要的 JSON」》,原文链接:https://blog.csdn.net/Rosanci/article/details/167375353。版权归原作者所有,如需删除请联系我们。