Gemini 結構化輸出(Structured Output)怎麼用:JSON Schema、Pydantic 與 Zod 示例

想讓 Gemini API 穩定返回可解析的 JSON,就用結構化輸出。本文給出 Pydantic 和 Zod 的官方寫法、枚舉與可空字段、流式、和工具組合、支持的 Schema 範圍與限制,以及新舊接口的參數差別。

NNathaniel bigo··原創首發·AI 輔助撰寫
11 分鐘讀完
資料核對於 2026-10-10 · 依據官方文檔與公開資料整理 其他 帳號
本文根據 Gemini API 官方文檔(Structured outputs 的 Interactions 版與 generateContent 版、Quickstart、OpenAI compatibility、Troubleshooting guide)、官方 SDK 倉庫和 Google 官方網誌整理,資料核對於 2026-10-10。

適用於誰

  • 想讓 Gemini 返回固定字段的 JSON,再存數據庫或傳給下游程序的開發者;
  • 搜「gemini structured output」「gemini api json schema」「json mode」「pydantic」的人;
  • 以前靠在提示詞裏寫「請只輸出 JSON」,但總是遇到多餘文字或字段缺失的人。

基礎調用方法見本站《Gemini API Python 調用教學:安裝 google-genai SDK、流式輸出、多輪對話與傳圖片》。

結論先說

  1. 結構化輸出就是在請求裏附一份 JSON Schema,模型生成的文本會是符合這份 Schema 的 JSON 字符串。
  2. 新版 Interactions API 的寫法:response_format={"type": "text", "mime_type": "application/json", "schema": 你的Schema}。
  3. Python 用 Pydantic、JavaScript 用 Zod 最省事:用它們定義結構、導出 Schema,再用同一個定義校驗返回結果。
  4. 語法正確不等於內容正確:官方提醒輸出保證是合法 JSON,但字段的值仍要在程序裏校驗。
  5. 只支持 JSON Schema 的一個子集,過大或嵌套過深的 Schema 可能被拒絕。

一、什麼時候用結構化輸出

官方列的三類典型用途:

  • 數據提取:從一段文字裏抽出姓名、日期、金額等字段;
  • 結構化分類:把文本歸入預先定義好的類別;
  • 智能體流程:為工具或下游接口生成結構化的輸入。

它和函數調用(function calling)都用到 JSON Schema,但目的不同。官方的區分是:結構化輸出用來規定最終回答的格式;函數調用用於對話過程中讓模型請你執行某個動作,拿到結果後它再繼續回答。

二、Python:用 Pydantic 定義結構

python
from typing import List, Literal, Optional

from google import genai
from pydantic import BaseModel, Field


class Item(BaseModel):
    name: str = Field(description="商品名稱")
    quantity: int = Field(description="購買數量")


class Order(BaseModel):
    customer: str = Field(description="下單人姓名")
    items: List[Item]
    urgency: Literal["普通", "加急"] = Field(description="是否加急")
    note: Optional[str] = Field(description="備註,原文沒有提到就為空")


client = genai.Client()

text = "王芳要訂 3 箱礦泉水和 2 包 A4 紙,明天上午必須送到,送貨前先打個電話。"

interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input=f"請從下面這段話裏提取訂單資料:\n{text}",
    response_format={
        "type": "text",
        "mime_type": "application/json",
        "schema": Order.model_json_schema(),   # Pydantic 導出 JSON Schema
    },
)

order = Order.model_validate_json(interaction.output_text)   # 解析並校驗
print(order.customer, order.urgency, [i.name for i in order.items])

幾個寫法要點:

  • Field(description=...) 裏的說明會進入 Schema,官方建議用 description 告訴模型每個字段要什麼;
  • Literal[...] 會變成 Schema 裏的 enum,適合做分類;
  • Optional[...] 表示這個字段可以是 null;
  • interaction.output_text 是 JSON 字符串,用 model_validate_json 一步完成解析和類型校驗。

三、JavaScript:JSON Schema 加 Zod 校驗

官方 Interactions 版文檔的寫法是:先寫一份 JSON Schema 傳給 API,再用 Zod 從同一份 Schema 生成校驗器。

javascript
// 先安裝:npm install @google/genai zod
import { GoogleGenAI } from "@google/genai";
import * as z from "zod";

const ticketJsonSchema = {
  type: "object",
  properties: {
    category: {
      type: "string",
      enum: ["帳單問題", "技術故障", "功能建議", "其他"],
      description: "工單類別",
    },
    summary: { type: "string", description: "一句話概括用戶的問題" },
    need_reply: { type: "boolean", description: "是否需要人工回覆" },
  },
  required: ["category", "summary", "need_reply"],
};

const ticketSchema = z.fromJSONSchema(ticketJsonSchema);   // 由同一份 Schema 生成校驗器

const ai = new GoogleGenAI({});

const interaction = await ai.interactions.create({
  model: "gemini-3.8-flash",
  input: "請給這條用戶反饋分類:『上個月被重複扣了兩次費,麻煩盡快處理。』",
  response_format: {
    type: "text",
    mime_type: "application/json",
    schema: ticketJsonSchema,
  },
});

const ticket = ticketSchema.parse(JSON.parse(interaction.output_text));
console.log(ticket);

四、支持哪些 Schema 寫法

官方文檔說明,結構化輸出支持 JSON Schema 規範的一個子集:

類別支持的內容
typestring、number、integer、boolean、object、array、null(可空寫成 {"type": ["string", "null"]})
說明性字段title、description
對象properties、required、additionalProperties
字符串enum、format(如 date-time、date、time)
數字enum、minimum、maximum
數組items、prefixItems、minItems、maxItems

官方示例還演示了 anyOf(讓輸出結構隨內容變化,例如「垃圾資訊」和「正常內容」返回不同字段)和遞歸結構(例如組織架構裏員工下面還有員工)。Google 官方網誌在介紹這項能力時提到,遞歸結構靠 $ref 實現,輸出裏字段的順序會和 Schema 裏鍵的順序保持一致。

五、流式輸出

結構化輸出可以和流式一起用。官方說明,流裏的文本片段是合法的 JSON 局部字符串,把它們按順序拼起來就是完整的 JSON:

python
stream = client.interactions.create(
    model="gemini-3.8-flash",
    input="……",
    response_format={
        "type": "text",
        "mime_type": "application/json",
        "schema": Order.model_json_schema(),
    },
    stream=True,
)

chunks = []
for event in stream:
    if event.event_type == "step.delta" and event.delta.type == "text":
        chunks.append(event.delta.text)

order = Order.model_validate_json("".join(chunks))

注意單個片段不是完整 JSON,要等流結束、拼接完成後再解析。

六、和搜尋等工具一起用

官方文檔有一節「Structured outputs with tools」,標註為預覽功能,僅 Gemini 3 系列支持:可以把結構化輸出和 Google 搜尋接地、URL 上下文、代碼執行、文件搜尋以及函數調用組合,例如讓模型先聯網查資料,再按你的 Schema 返回結果。寫法是在同一個請求裏同時傳 tools 和 response_format:

python
interaction = client.interactions.create(
    model="gemini-3.1-pro-preview",
    input="……",
    tools=[{"type": "google_search"}, {"type": "url_context"}],
    response_format={
        "type": "text",
        "mime_type": "application/json",
        "schema": MatchResult.model_json_schema(),   # MatchResult 是你自己定義的 Pydantic 類
    },
)

七、限制與官方建議

限制(官方原話的意思):

  • 只是子集:不是所有 JSON Schema 特性都支持;舊版文檔補充說,不支持的屬性會被模型忽略。
  • 複雜度:非常大或嵌套很深的 Schema 可能被 API 拒絕。遇到報錯時,官方建議縮短屬性名、減少嵌套、減少約束條件。

最佳實踐:

  • 用 description 把每個字段說清楚;
  • 用具體的類型(integer、string、enum),不要什麼都用字符串;
  • 提示詞裏仍然要說明任務本身;
  • 校驗值:輸出是語法正確的 JSON,但內容是否合理要自己檢查,並為「符合 Schema 但語義不對」的情況準備處理邏輯。

官方 SDK 倉庫的 README 還有一條提醒:不管用哪種方式定義了 Schema,不要在提示詞裏再重複一遍(包括給出期望 JSON 的示例),否則輸出質素可能下降。

官方排錯頁裏和結構化輸出有關的兩條:

  • 輸出裏反覆出現重複文本:可能是提示詞裏指定的字段順序和 Schema 不一致。建議不要在提示詞裏規定字段順序,並把所有輸出字段設為必填。
  • 輸出裏出現大量重複的換行符:通常是輸入裏帶了 \u、\t 這類轉義序列。建議把它們換成 UTF-8 字符,並在系統指令裏說明允許的轉義只有 \\、\n 和 \"。

另外,從 Gemini 3.6 Flash、3.5 Flash-Lite 起,「預填回覆開頭」(讓請求以一段模型角色的內容結尾,比如預先寫一個左花括號來逼模型輸出 JSON)已不被支持,會返回 400。官方給的替代方案正是系統指令和結構化輸出。

八、舊版接口和 OpenAI 兼容寫法

舊版 generateContent:官方文檔頁現在的寫法是把 response_format 放進 config,結構多一層 text:

python
response = client.models.generate_content(
    model="gemini-3.8-flash",
    contents="……",
    config={
        "response_format": {
            "text": {"mime_type": "application/json", "schema": Order.model_json_schema()}
        },
    },
)
order = Order.model_validate_json(response.text)

你在較早的官方資料(SDK 倉庫 README、2025 年 11 月的官方網誌)裏還會看到另一種寫法:config 裏寫 response_mime_type: "application/json" 加 response_json_schema。讀舊代碼時知道兩者是一回事即可,新代碼照當前文檔頁寫。

舊版文檔列出的支持模型包括 Gemini 3.8 Flash、3.6 Flash、3.5 Flash-Lite、3.1 Flash-Lite、3.1 Pro Preview 和 2.5 系列。

OpenAI 兼容接口:用 OpenAI SDK 調 Gemini 時,官方示例用的是 client.beta.chat.completions.parse(..., response_format=你的Pydantic類),結果在 completion.choices[0].message.parsed。接入方法見本站《Gemini API 接口地址(Base URL)是什麼:原生端點與 OpenAI 兼容調用寫法》。

常見問題

Q:結構化輸出和「JSON 模式」是一回事嗎?

官方文檔現在統一叫 Structured outputs(結構化輸出),做法就是把 mime_type 設為 application/json 並在 schema 裏給出結構。

Q:返回的 JSON 一定能解析嗎?

官方的表述是輸出為語法合法、符合 Schema 的 JSON 字符串。但有一種情況要防:如果設了很小的最大輸出 token,回答可能被截斷,官方說明這個上限包含思考 token。

Q:字段的值不對怎麼辦?

按官方的最佳實踐,先把 description 寫清楚、類型收緊(能用 enum 就不用自由文本)、在提示詞裏把任務說明白;程序裏保留校驗和兜底邏輯。

Q:圖片、PDF 也能提取成 JSON 嗎?

可以。把文件和提示一起放進 input,再加 response_format,傳文件的方法見 Python 調用教學。舊版文檔還連結了官方示例庫裏「從 PDF 發票和表單提取結構化數據」的例子。

參考資料

  • Structured outputs(Interactions API 版,官方):https://ai.google.dev/gemini-api/docs/structured-output
  • Structured outputs(generateContent 版,官方):https://ai.google.dev/gemini-api/docs/generate-content/structured-output
  • Gemini API quickstart(官方):https://ai.google.dev/gemini-api/docs/quickstart
  • OpenAI compatibility(官方):https://ai.google.dev/gemini-api/docs/openai
  • Troubleshooting guide(官方):https://ai.google.dev/gemini-api/docs/troubleshooting
  • What's new in Gemini 3.6 Flash and 3.5 Flash-Lite(官方):https://ai.google.dev/gemini-api/docs/whats-new-gemini-3.6
  • Improving Structured Outputs in the Gemini API(Google 官方網誌):https://blog.google/innovation-and-ai/technology/developers-tools/gemini-api-structured-outputs/
  • googleapis/python-genai(官方 SDK 倉庫):https://github.com/googleapis/python-genai
需要開通或續費?谷歌帳號 →

Nathaniel 的更多內容

  1. 01

    AI 學習路線:零基礎從哪開始,6 個階段、每階段該讀哪幾篇教學(2026)

    AI 學習路線怎麼走?給零基礎的人一條循序漸進的路徑:先選一個助手用順,再學提問,再用進日常工作,按需學做圖做影片,守住私隱與版權,最後進階自動化和編程。每個階段都配了本站對應的教學。

    其他 AI 工具0
  2. 02

    AI 瀏覽器有哪些:Perplexity Comet、Opera Neon、Dia、Brave Leo 與 Edge Copilot 的官方說法對照

    AI 瀏覽器有哪些?按官方頁面整理 Perplexity Comet、Opera Neon、Dia、Brave Leo 和 Edge 裏的 Copilot:官方自述的定位、支持的平台、免費還是訂閱,以及 Gemini、Claude 的 Chrome 方案和已停用的 ChatGPT Atlas。

    其他 AI 工具0
  3. 03

    即夢國際版 Dreamina 是什麼:官方站入口、能生成什麼、免費積分和模型(2026)

    即夢國際版 Dreamina 是什麼?官方站是 dreamina.capcut.com,是一個圖片、影片和數字人一體的 AI 創作平台。按官方首頁和 FAQ 講:能生成什麼、免費用戶每天 120 積分、列出的 Seedance 與 Seedream 模型,以及和國內即夢怎麼區分。

    其他 AI 工具0
  4. 04

    Kimi K3 Coding Plan 是什麼、怎麼用:Kimi Code 會員、模型 ID、套餐價格和額度規則

    Kimi K3 Coding Plan 是什麼?按 Kimi 官方文檔核對:官方現在叫 Kimi Code,是 Kimi 會員權益裏的編程服務,Plus 及以上才有;講 K3 等模型 ID、國內新套餐價格、三種客戶端、第三方工具接入和額度規則。

    Kimi0
  5. 05

    DeepSeek V4 Pro 和 Flash 的區別與 API 價格:官方價格頁逐項對照(高峰與空閒時段)

    DeepSeek V4 Pro 和 Flash 有什麼區別、API 怎麼收費?按 DeepSeek 官方價格頁(2026-10-19 查詢)列出兩個模型的版本、上下文、圖像理解、並發和每百萬 token 價格,說明高峰與空閒時段的計費差別和舊模型名怎麼處理。

    其他 AI 工具0
  6. 06

    GPT-6 Pro(Astra)怎麼用、哪些套餐有:怎麼選到 Pro 檔、用量限制和 Pro 三檔價格

    GPT-6 Pro(Astra)怎麼用、哪些套餐有?按 OpenAI 幫助中心核對:聊天裏 Pro 檔給 Pro 100、Pro 200、Business 和 Enterprise;Plus 在 Work 和 Codex 裏含 Astra。講怎麼選到、用量上限和官方 Pro 價格。

    ChatGPT0

同模型

  1. 01

    Nano Banana 官網入口在哪、免費能用嗎:Google 官方入口、Nano Banana 2 與 2.1 的免費和付費區別

    Nano Banana 官網地址是什麼、免費能用多少?Nano Banana 是 Google Gemini 的圖像模型,官方入口是 gemini.google.com 和官方介紹頁。按官方頁面核對:免費版用 Nano Banana 2,2.1 需要 Google AI 套餐,API 沒有免費層。

    Gemini0
  2. 02

    Gemini 3.5 Pro 是什麼、發佈了嗎、怎麼用:官方說法梳理,以及現在 Gemini 裏該選哪個模型

    Gemini 3.5 Pro 發佈了嗎?按 Google 官方網誌、Gemini 更新記錄和 API 模型列表核對:截至 2026-10-19 官方沒有宣佈 3.5 Pro 已發佈,最新的是 Gemini 4 Argon。講清官方說過什麼,以及 Gemini 應用裏各套餐現在能選哪些模型。

    Gemini0
  3. 03

    Gemini 打不開、無法登入、無法使用怎麼辦:帳號類型、年齡、瀏覽器和官方兩條登入提示

    Gemini 怎麼打不開?無法登入、無法使用怎麼辦?按官方「Sign in to Gemini Apps」頁排查:帳號類型、年齡、支持的瀏覽器、國家和語言名單,以及「Can't access this service」「Something went wrong」兩條提示的官方解釋。

    Gemini0
  4. 04

    Gemini 無法生成圖片怎麼辦:入口、年齡與地區、提示詞、模型和額度逐項排查

    Gemini 無法生成圖片怎麼辦?按官方幫助中心逐項排查:有沒有登入、年齡和地區是否滿足、生圖入口在哪、提示詞怎麼寫才會出圖、Flash-Lite 的 Nano Banana 2 Lite 有什麼限制、圖片被移除和額度用完時怎麼辦。

    Gemini0
  5. 05

    Gemini 分享對話怎麼操作:生成公開連結、對方能看到什麼、怎麼刪除分享連結

    Gemini 的「分享對話」會生成一個任何人都能打開的公開連結。本文按官方幫助中心講清:分享步驟、連結裏包含哪些內容(整段對話、上載的圖片、Canvas 作品)、別人能做什麼、連結什麼時候會自動失效、怎麼查看和刪除自己所有的公開連結。

    Gemini0
  6. 06

    Gemini API Python 調用教學:安裝 google-genai SDK、流式輸出、多輪對話與傳圖片

    用官方 google-genai SDK 調 Gemini API:安裝配置、第一個請求、系統指令與思考等級、流式輸出、多輪對話、傳圖片和查看 token 用量,按 2026 年 10 月官方預設的 Interactions API 寫法。

    Gemini0

同產品的其他教學

  1. 01

    AI圖片放大與高清修復:Midjourney、ChatGPT、Gemini 怎麼出高解像度圖

    AI 生成的圖不夠清晰,想打印或做大圖怎麼辦?本文按官方文檔講清 Midjourney 的 Subtle / Creative 放大和 HD 直出、Gemini 與 ChatGPT 的解像度選項、Flow 的影片放大,以及「AI 放大會編造細節」的注意事項。

    Gemini其他 AI 工具0
  2. 02

    AI影片運鏡提示詞大全:推拉搖移跟升降、環繞、甩鏡怎麼寫(中英對照)

    AI 影片的運鏡提示詞怎麼寫?本文按 Google 官方影片提示指南整理鏡頭運動、機位角度、鏡頭光學效果三張中英對照表,每個術語配效果說明和例句,並給出組合運鏡的寫法和常見翻車原因,適用於 Veo、即夢、可靈等工具。

    Gemini其他 AI 工具0
  3. 03

    Gemini API Key 怎麼獲取:在 AI Studio 創建密鑰、設定環境變量與安全限制

    調用 Gemini API 先要在 Google AI Studio 創建 API Key。本文講清創建入口、密鑰與項目的關係、2026 年新的授權密鑰規則、環境變量怎麼設、怎麼測試,以及密鑰被封或泄露後的處理。

    Gemini0
  4. 04

    NotebookLM 學習卡是什麼:抽認卡(閃卡)與測驗的生成、複習和下載

    NotebookLM(現名 Gemini Notebook)的學習卡是什麼、怎麼用?本文按官方幫助講清抽認卡和測驗的生成步驟、難度與數量設定、「答對了 / 沒答對」進度記錄、只練錯題、下載 CSV,以及手機上怎麼刷卡。

    Gemini0
  5. 05

    ChatGPT 和 Gemini 哪個好用:按官方頁面對比套餐、額度、上下文和功能,怎麼選

    ChatGPT 和 Gemini 哪個好用?本文只整理兩家官方頁面能查到的差異:套餐名稱、免費版額度、付費檔用量倍數、額度多久刷新、上下文窗口數字,以及各自的特色功能入口。不給「誰更強」的結論,文末附一份用自己任務測試的清單。

    ChatGPTGemini0
  6. 06

    Gemini 臨時對話怎麼用:能儲存嗎、關掉後能找回嗎、數據保留多久

    Gemini 的臨時對話不進聊天記錄、不用於訓練模型,但離開後就再也打不開。本文按官方幫助中心講:怎麼開啟、誰能用、臨時對話裏不能做什麼、想儲存內容該怎麼辦、Google 實際保留 72 小時是怎麼回事,以及它和關閉活動記錄的區別。

    Gemini0

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~