先给结论:Structured Output 不是「请输出 JSON」这句提示词,而是 API 在解码阶段用 JSON Schema 挡住非法 token,让最终答复可以直接被程序解析。GPT、Gemini、Claude 先后做成一等公民,不是因为营销喜欢这个词,而是 Agent、抽取、填表都要把模型从聊天框接到流水线里——散文过不了 JSON.parse,更过不了下游 Schema。
这篇按 2026 年 9 月 8 日写。三家现在都能约束给用户 / 下游的最终 JSON:OpenAI 用 response_format.json_schema(strict),Gemini 用 responseMimeType + responseJsonSchema,Claude 已 GA 的是 output_config.format(旧 beta 的 output_format 仍过渡可用)。字段怎么写、子集差在哪,本站 8 月已经拆过;本文只回答两句:它是什么,以及为什么三家都不得不做。落地步骤见《从 Prompt 到 Structured Output》,OpenAI / Gemini 对照见《Structured Output API 对比》。
Structured Output 是什么
Structured Output(结构化输出)是:你先给一份 JSON Schema,模型的最终答复必须是符合这份 Schema 的 JSON。保证发生在生成每一个 token 的时候,而不是生成完再「尽量像 JSON」。常见名字:OpenAI 叫 Structured Outputs,Google 叫 Structured Output,Anthropic 文档写 structured outputs / JSON outputs。差一个 s,指的是同一件事。
可以记成编译器和类型检查。提示词是代码注释——模型可能听。Schema 是类型系统——非法字段名、缺 required、字符串当成数字,解码器根本不让这些 token 出来。程序拿到的是对象,不是「```json」围栏里夹着一段散文。
| 说法 | 实际含义 | 常见误读 |
|---|---|---|
| Structured Output | 最终答复按 JSON Schema 约束解码 | 模型变聪明了,或「会写 JSON」 |
| JSON Schema | 字段、类型、必填、枚举的契约 | 等于一篇更长的提示词 |
| 约束解码 | 生成时过滤不合法 token | 生成后再用正则修补 |
| strict / 硬约束 | API 按更严的 Schema 子集保证形状 | 保证事实正确、数字没编 |
一份给三家都能看的 Schema,形状通常很扁:根是 object,写清 properties / required,additionalProperties: false。可选字段在 OpenAI strict 里往往要写成可空,而不是从 required 里拿掉——三家子集不完全一样,跨厂商先取交集。
{
"type": "object",
"additionalProperties": false,
"properties": {
"task": { "type": "string", "enum": ["extract", "classify", "summarize"] },
"ok": { "type": "boolean" },
"fields": {
"type": "object",
"additionalProperties": false,
"properties": {
"orderId": { "type": "string" },
"total": { "type": "number" },
"note": { "type": ["string", "null"] }
},
"required": ["orderId", "total", "note"]
}
},
"required": ["task", "ok", "fields"]
}
它不是 JSON Mode,也不是 Tool Calling
三个名字经常被写成一回事。数据流上它们不在同一层:
| 能力 | 保证什么 | 不保证什么 |
|---|---|---|
| 提示词「请输出 JSON」 | 提高概率 | 语法、字段名、必填 |
| JSON Mode | 输出是合法 JSON 文本 | 形状、类型、枚举 |
| Structured Output | 最终答复符合 Schema | 语义真实、工具已执行 |
| Tool Calling | 工具参数符合 Schema,且由宿主执行 | 给用户的最终答复形状 |
JSON Mode 只保证括号能配上、能 JSON.parse。模型仍可发明 order_id 而你要的是 orderId,或把金额写成字符串。生产里「能 parse」不等于「能入库」。
Tool Calling / Function Calling 约束的是伸向工具的那只手,不是对用户说的最后一句话。查库存、写文件、走 MCP 的 tools/call,用工具层 Schema。抽取邮件、分类工单、吐一张给下游 API 的 JSON,用 Structured Output。完整 Agent 常常两层都开——参数走 tools,最终答复再套一层输出 Schema。分层见《MCP 是什么》和《Agent JSON 数据流》。
为什么三家都开始支持
2023 年还能靠提示词撞运气。2026 年的 Agent 把模型嵌进循环:输出要进数据库、进下一个工具、进另一家模型。三家不是约好一起发新闻稿,是同一条产品压力线撞上了同一份契约——JSON Schema。
- 下游是程序,不是读者。聊天可以散文;流水线要对象。一次缺逗号、一次字段改名,整晚的重试队列就满了。厂商与其让每个客户自己写修复器,不如在解码器里把非法路径剪掉。
- Agent 把「形状稳定」变成刚需。多步循环里,上一轮的 JSON 是下一轮的输入。形状漂一次,后面全错。Tool Calling 解决「怎么伸手」;Structured Output 解决「怎么把结论交回去」。两层都要 Schema,见《JSON Schema 会不会成为 Agent 的标准 Contract》。
- 提示词证明了自己不够。「只输出 JSON、不要 markdown」在评测集上好看,在长上下文、工具回灌、多语言混排里仍会漏字段、加围栏、把枚举写成近义词。约束解码把失败从「偶发」收成「API 400 或可重试的 Schema 错」。
- JSON Schema 已经是跨厂商最小公约数。OpenAPI、MCP
inputSchema、Pydantic / Zod 导出的都是它。模型侧再用另一套私有 IDL,Host 就要翻译两次。三家把最终答复也接到同一份 Schema,迁移成本才掉得下来。 - 竞争变成「能不能进生产」,不再是「会不会聊天」。 一家先做成硬约束,网关、Agent 框架、企业采购清单就会写进必选项。另外两家不跟,就接不进同一条编排。2026 年 9 月,旗舰 API 缺 Structured Output 已经很难卖给要入库的客户。
所以你会看到时间线挤在一起:OpenAI 2024 年 8 月把 Structured Outputs 做成 GA;Gemini 把 MIME + Schema 收进生成配置;Claude 2025 年底还在 beta 头,2026 年已把 output_config.format 做成正式字段。名字不统一,压力是同一股。
GPT、Gemini、Claude 各自怎么开
概念对齐,字段不要交叉粘贴。下表是 2026 年 9 月 8 日能写进文档的入口,不是完整 SDK 教程。
| 厂商 | 入口 | Schema 怎么挂 | 2026 年要注意的 |
|---|---|---|---|
| OpenAI(GPT-5.5 等) | Chat Completions 的 response_format;Responses API 的 text.format | type: json_schema + strict: true | strict 下每个 object 要 additionalProperties: false,属性通常都进 required;可选写成可空 |
| Google(Gemini 3.7 Flash 等) | 生成配置里的 MIME + Schema | responseMimeType: application/json + responseJsonSchema(SDK 常见 response_schema) | 没有同名 strict 开关;旧 responseSchema 曾用 OpenAPI 大写类型,新通道用 JSON Schema 小写 |
| Anthropic(Claude 4.6 / 4.8 等) | Messages API 的 output_config.format | type: json_schema + schema | 已 GA,不必再带 structured-outputs-2025-11-13;旧 output_format 仍过渡。另有工具侧 strict: true,那是 Tool Calling,不是最终答复 |
三家请求包装不同,Schema 本体尽量同一份。换模型改的是外层字段,不是 orderId 和 required。Claude 示例(规范字段,业务 Schema 可换成你自己的):
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "从订单文本抽出 orderId 与 total"}
],
"output_config": {
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"orderId": { "type": "string" },
"total": { "type": "number" }
},
"required": ["orderId", "total"]
}
}
}
}
OpenAI 把同一份 schema 放进 response_format.json_schema 并打开 strict;Gemini 放进 responseJsonSchema 并声明 JSON MIME。完整 Python 对照仍看《OpenAI vs Gemini》。产品面(ChatGPT / claude.ai / Gemini 网页)不一定暴露同一套硬约束,写 SLA 以你调用的那个 API 为准。
约束解码在挡什么
没有 Structured Output 时,模型在整个词表上采样,再靠提示词「表现得像 JSON」。有 Structured Output 时,解码器根据 Schema 维护一份合法前缀:下一步只能是 "、orderId、true 或 } 这类还合法的 token,非法路径的概率被直接置零。
它挡的是形状:尾逗号、markdown 围栏、缺必填、类型漂、多余字段(在 additionalProperties: false 时)。它不挡胡说:total 类型是 number,值可以是编出来的;enum 里的合法值也可以选错。所以生产仍要用同一份 Schema 再跑一遍校验器,失败则重试、降级或人工——约束解码降的是解析事故,不是幻觉。
窗口再大也一样:1M token 只增加看得见的材料,不约束输出形状。把整份 dump 塞进去,仍要 Schema,见《1M Token 上下文窗口》。
现在该怎么用
- 先写 Schema,再选模型。字段名、必填、枚举是产品契约。GPT / Gemini / Claude 是可替换的后端。契约写在仓库里,不要写在提示词里。
- 抽取、分类、填表走 Structured Output;办事走 Tool Calling。不要用 Structured Output 假装已经调过库存 API。要跨进程复用工具,再加 MCP。
- 跨厂商取 Schema 交集:扁 object、
additionalProperties: false、少用深$ref和根级anyOf。OpenAI strict 把「可选」做成可空,不要三家各写一份互相漂移的字段表。 - API 过了仍要本地再验。把 Schema 和 2~3 组正 / 反例存成 JSON,用本站校验和 Diff。数据不上传。约束解码之后,这是第二道闸。
- 失败要结构化回流:解析失败或二次校验失败,把错误写成对象(缺哪个字段、期望类型),不要把堆栈原文灌回下一轮。
常见问题 FAQ
Structured Output 就是让模型输出 JSON 吗?
不只是。提示词或 JSON Mode 也能吐出 JSON 文本。Structured Output 的要点是解码阶段按 JSON Schema 过滤 token,字段名、类型和必填被 API 挡住,而不是靠模型自觉。
为什么 GPT、Gemini、Claude 都要做,不能只做一家?
客户要多模型容灾和比价。网关和 Agent 框架已经按「Schema 进、JSON 出」接线。哪家没有硬约束,哪家就进不了这条流水线。竞争压力和工程需求是同一件事。
Claude 现在还要靠 Tool Calling 假装 Structured Output 吗?
不必作为主路径。2026 年 Messages API 已用 output_config.format 做正式 JSON Schema 输出。工具上的 strict 仍只保证工具参数。旧 beta 头和 output_format 还在过渡期,新代码走 output_config。
开了 Structured Output 还要自己校验吗?
要。它保证形状和类型,不保证值真实、业务合法。同一份 Schema 在应用层再跑一遍,失败则重试或人工。浏览器里可以用 JSON 工具箱先对样例。
和 MCP、Tool Calling 怎么选?
最终答复给程序:Structured Output。要执行外部动作:Tool Calling。工具在别的进程、要跨 Host 复用:MCP。三层可以叠,不要用其中一层冒充另外一层。
同一份 JSON Schema 能直接打给三家吗?
本体可以共用,请求包装不行。写成扁 object、禁额外字段、可选改可空,成功率最高。OpenAI strict 子集最严,先过它再给 Gemini / Claude,比三家各维护一份漂移的 Schema 便宜。
总结
Structured Output 是 2026 年旗舰 API 的默认插座:最终答复按 JSON Schema 约束解码,程序不再靠提示词赌括号。GPT、Gemini、Claude 都做,是因为 Agent 和抽取已经把「形状稳定」写成验收项;JSON Schema 又是三家都认的契约。它不是 JSON Mode,也不替代 Tool Calling 或 MCP。
换模型只换包装字段。字段名和 required 写进仓库,落地前用同一份 Schema 在本地校验样例。怎么配各家 API、怎么和工具层分工,本站已经写过;这篇只把「是什么、为什么」说清楚。