生活分享

結構化輸出(Structured Outputs)是什麼:讓 AI 照固定格式交資料

結構化輸出讓模型依 JSON Schema 產生固定欄位的資料,程式才能直接讀取。內容區分提示詞要求 JSON、JSON 模式與 schema 限制三種做法,用虛構報名信示範缺值與拒答的處理,整理三家官方文件列出的限制,並說明格式合法不等於內容正確。

閱讀時間約 6 分鐘

一疊雜亂的文字紙頁穿過大括號形狀的框架,變成整齊對齊的欄位卡片
圖片:Mokaair (© Mokaair)

結構化輸出(Structured Outputs)是讓模型依事先定好的欄位結構回答,產出程式能直接讀取的資料。它管的是形狀:欄位名稱、型別與可選值落在你寫的 JSON Schema 之內,欄位裡的值對不對是另一件事。

這不是有單一標準定義的名詞:三家官方文件都用它,但實作各自不同,本文以 OpenAI、Anthropic 與 Google 在 2026 年 10 月 3 日的文件為準,文中的 schema 與輸出都是未實測的示例。

三種做法:要求、JSON 模式、schema 限制

第一種是在提示詞裡寫「請輸出 JSON」,完全靠模型照做。第二種是 JSON 模式,OpenAI 的文件說它保證輸出可解析,但不保證符合任何特定 schema。第三種是依 JSON Schema 限制輸出,Anthropic 的文件說明做法是把 schema 編譯成文法來約束輸出,稱為約束式解碼(constrained decoding)。

三種做法的保證範圍;依 OpenAI、Anthropic 官方文件整理,2026 年 10 月 3 日查證。
做法文件能保證的仍然沒保證的
提示詞要求 JSON沒有 API 層的保證,靠模型照指示語法錯誤、缺必填欄位、型別不一致
JSON 模式輸出可解析為 JSON,少數邊緣情況要自行偵測欄位與型別;OpenAI 文件明說不保證符合 schema
schema 限制輸出符合你提供的 schema,限於支援的子集欄位值是否正確、拒答與截斷時的輸出;Anthropic 另說 enum 大小寫不保證

保證可分三層:第一層合法 JSON,第二層符合 schema,第三層內容正確。前兩層是供應商功能的範圍,OpenAI 與 Anthropic 的文件仍寫了例外;第三層永遠要靠你自己驗證。

三層由外到內:合法 JSON、符合 schema、內容正確,並標出三個示例輸出各落在哪一層;拒答或截斷要先看停止原因再解析
每一層都比外一層更窄;只有最內層需要靠你自己的驗證。 · 圖片:Mokaair (© Mokaair)

JSON Schema:只需要認得這幾個關鍵字

JSON Schema 是用 JSON 寫成的結構描述,規範說它用來定義 JSON 資料的結構,驗證程式拿它比對實際資料。json-schema.org 標示的現行版本 2020-12 以 Internet-Draft 形式發布,不是 RFC;什麼算合法 JSON 另由 RFC 8259 規定,只管語法。示例主要用下面五個關鍵字,另有 items(陣列元素的規則)與 description(欄位說明)。

  • type:指定型別,可寫成陣列表示「字串或 null」。
  • properties:列出每個欄位的規則。
  • required:列出一定要出現的欄位。
  • enum:限定值只能取自清單。
  • additionalProperties:決定清單以外的欄位能否存在。

規範有三個預設容易誤會:required 省略等於沒有必填欄位,additionalProperties 省略時多出來的欄位照樣通過;format(如 date)預設只是註解,驗證程式不一定檢查。

示例:從報名信擷取姓名、日期、人數

虛構情境:社區手作課收到一封信,「你好,我是王小美,想幫社團報名下週六的手作課,大概六個人。」要擷取姓名、日期與人數。信裡只有「下週六」,模型不一定知道信哪天寄的,日期最容易出事。

示例 schema:三個欄位加一份缺漏清單 · json
{
  "type": "object",
  "properties": {
    "name": { "type": ["string", "null"], "description": "報名者姓名;信裡沒寫就填 null" },
    "event_date": { "type": ["string", "null"], "description": "活動日期,格式 YYYY-MM-DD;信裡沒有明確年月日就填 null" },
    "headcount": { "type": ["integer", "null"], "description": "報名人數;信裡沒寫就填 null" },
    "missing": { "type": "array", "items": { "type": "string", "enum": ["name", "event_date", "headcount"] } }
  },
  "required": ["name", "event_date", "headcount", "missing"],
  "additionalProperties": false
}

設計有三處刻意:欄位都允許 null,讓「信裡沒寫」有合法出口;missing 用 enum 記下缺了什麼;欄位全列進 required(OpenAI 的要求),並關閉 additionalProperties(OpenAI 與 Anthropic 都要求)。schema 只對照文件檢查過,沒有送進任何 API。預期輸出如下。

示例預期輸出(說明用,非實測) · json
{
  "name": "王小美",
  "event_date": null,
  "headcount": 6,
  "missing": ["event_date"]
}

預期結果是姓名王小美、人數 6、日期 null、missing 只列 event_date。「大概六個人」變成整數 6,格式允許,卻丟掉了「大概」,要不要追問由報名規則決定。

若輸出出現完整年月日,JSON 合法、schema 也通過,但日期是模型推出來的,信裡沒寫,要靠第三層擋下:比對收信日期、確認是週六。OpenAI 的文件也提醒,輸入與 schema 完全無關時,模型仍會盡力符合 schema,可能編出內容,建議提示詞寫明這時回傳空參數或固定句子。

缺值、拒答與截斷怎麼接

收到回應後的順序:先看停止原因,再解析,再驗證,最後才寫入。

  1. 停止原因:模型可能因安全理由拒答,或寫到長度上限被截斷。OpenAI 與 Anthropic 都會在回應裡標出這類情況,Anthropic 拒答時還照樣回 200 成功狀態碼,所以不能只看請求有沒有成功。帶著這類訊號的輸出不該直接解析。
  2. 解析:失敗就停下並保留原文,不要補括號硬修。
  3. 驗證:先依 schema 檢查,再套業務規則:日期是否晚於收信日、人數是否在名額內、姓名是否出現在原信;欄位為 null 或 missing 非空,就轉人工追問,不要替它補值。

缺值是設計好的正常路徑;拒答時,官方文件提醒輸出可能不符合 schema,要分開處理。重試要設上限,缺漏的資訊不會因為重送就變有資料。

三家文件列出的限制

以下是 2026 年 10 月 3 日讀到的頁面,更動快,請以當天文件為準。三家都只支援 JSON Schema 的子集;規範讓不認得的關鍵字通過,OpenAI 與 Anthropic 則說用到不支援的寫法會報錯。

  • OpenAI:所有欄位都要列進 required,選填用含 null 的型別模擬;每個物件都要關閉 additionalProperties;allOf、not、if 等組合寫法不支援。
  • Anthropic:API 不支援遞迴 schema,也不支援 minimum、maximum、minLength、maxLength 這類數值與長度限制。
  • Google:列出支援的型別與關鍵字,過大或巢狀過深的 schema 可能被拒絕,並建議一律驗證值;這一頁沒寫拒答或截斷的訊號。

同一個 minimum(數值下限),Google 列為支援,Anthropic 的 API 不支援。想讓 schema 跨供應商通用只能取交集,數值範圍留給自己的驗證程式。

和工具呼叫、提示詞串接的分工

工具呼叫和回答格式差在用途,三家文件都這樣切:工具呼叫是模型請你的程式做事,回答格式管模型最後回答的形狀。不過 OpenAI 與 Anthropic 的「結構化輸出」兩邊都涵蓋:開啟 strict 後,工具參數同樣依 schema 限制。參數形狀合法仍要驗證內容,詳見。

把工作拆成連續的模型呼叫,結構化輸出是步驟間的交接契約:上一步輸出符合 schema,驗證通過才交給下一步。實作看,來源是 PDF 時看。

相鄰的詞可以從找到。

  • 生活分享

    世界模型(World Model)是什麼:讓 AI 預測「接下來會怎樣」

    世界模型指 AI 內部用來預測「這樣做之後會怎樣」的模型,但這個詞至少有三種用法:強化學習代理在想像中練習用的環境模型、LeCun 主張預測抽象表示的架構路線,以及能隨操作即時生成畫面的互動環境。內容用示例說明怎麼在想像中規劃,並列出大型語言模型有沒有世界模型的正反研究,附讀新聞時的檢查問題。

  • 生活分享

    視覺語言模型(VLM)是什麼:讓 AI 讀圖片、再用文字回答

    視覺語言模型(VLM)能同時接收圖片與文字,再用文字回答。內容拆解視覺編碼器、連接層與語言模型三段結構,說明 CLIP、Flamingo、LLaVA 三篇論文各補上哪一塊,並和多模態 AI、文字生圖分清楚;也整理它常犯的錯:數錯數量、搞混位置、說出圖裡沒有的東西,附上讀收據時逐行核對的步驟。

  • 生活分享

    溫度(Temperature)是什麼:AI 回答變化程度的取樣參數

    溫度(temperature)是文字生成時調整取樣的參數,讓模型從下一個 token 的機率分布裡抽得更集中或更分散。用假想的台南早餐示例算出低溫與高溫的差別,說明 top-p 的來源和它與 top-k 的差別,並依官方文件與論文指出:調低溫度不代表更準,設成 0 也不保證每次相同,部分模型還不開放調整。

  • 生活分享

    合成資料(Synthetic Data)是什麼:兩種用途、品質控管與模型崩潰

    合成資料是由演算法或模型產生、模仿真實資料特徵的資料,常見用途有兩種:訓練模型,以及在隱私需求下替代真資料。內容依 Self-Instruct、模型崩潰研究(替換與累積資料的差別)與 NIST、ICO 的隱私文件,說明做法、抽查流程,以及它不能保證的事。

最新旅遊情報攻略

資料來源

生活分享