AI Structured Output 是什麼?為什麼 GPT、Gemini、Claude 都開始支援結構化 JSON 輸出?

截至 2026 年 9 月 8 日:Structured Output 是什麼、為什麼 GPT / Gemini / Claude 都用 JSON Schema 約束最終答覆,以及它和 JSON Mode、Tool Calling 的差別。

先給結論: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。

  1. 下游是程式,不是讀者。聊天可以散文;流水線要物件。一次缺逗號、一次欄位改名,整晚的重試佇列就滿了。廠商與其讓每個客戶自己寫修復器,不如在解碼器裡把非法路徑剪掉。
  2. Agent 把「形狀穩定」變成剛需。多步迴圈裡,上一輪的 JSON 是下一輪的輸入。形狀漂一次,後面全錯。Tool Calling 解決「怎麼伸手」;Structured Output 解決「怎麼把結論交回去」。兩層都要 Schema,見《JSON Schema 會不會成為 Agent 的標準 Contract》。
  3. 提示詞證明了自己不夠。「只輸出 JSON、不要 markdown」在評測集上好看,在長上下文、工具回灌、多語言混排裡仍會漏欄位、加圍欄、把列舉寫成近義詞。約束解碼把失敗從「偶發」收成「API 400 或可重試的 Schema 錯」。
  4. JSON Schema 已經是跨廠商最小公約數。OpenAPI、MCP inputSchema、Pydantic / Zod 匯出的都是它。模型側再用另一套私有 IDL,Host 就要翻譯兩次。三家把最終答覆也接到同一份 Schema,遷移成本才掉得下來。
  5. 競爭變成「能不能進生產」,不再是「會不會聊天」。 一家先做成硬約束,閘道器、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.formattype: json_schema + strict: truestrict 下每個 object 要 additionalProperties: false,屬性通常都進 required;可選寫成可空
Google(Gemini 3.7 Flash 等)生成配置裡的 MIME + SchemaresponseMimeType: application/json + responseJsonSchema(SDK 常見 response_schema)沒有同名 strict 開關;舊 responseSchema 曾用 OpenAPI 大寫型別,新通道用 JSON Schema 小寫
Anthropic(Claude 4.6 / 4.8 等)Messages API 的 output_config.formattype: 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 上下文視窗》。

現在該怎麼用

  1. 先寫 Schema,再選模型。欄位名、必填、列舉是產品契約。GPT / Gemini / Claude 是可替換的後端。契約寫在倉庫裡,不要寫在提示詞裡。
  2. 抽取、分類、填表走 Structured Output;辦事走 Tool Calling。不要用 Structured Output 假裝已經調過庫存 API。要跨行程複用工具,再加 MCP。
  3. 跨廠商取 Schema 交集:扁 object、additionalProperties: false、少用深 $ref 和根級 anyOf。OpenAI strict 把「可選」做成可空,不要三家各寫一份互相漂移的欄位表。
  4. API 過了仍要本機再驗。把 Schema 和 2~3 組正 / 反例存成 JSON,用本站校驗和 Diff。資料不上傳。約束解碼之後,這是第二道閘。
  5. 失敗要結構化迴流:解析失敗或二次校驗失敗,把錯誤寫成物件(缺哪個欄位、期望型別),不要把堆疊原文灌回下一輪。

常見問題 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、怎麼和工具層分工,本站已經寫過;這篇只把「是什麼、為什麼」說清楚。