What is Structured Output(結構化輸出)?
語言模型以特定機器可解析格式(如 JSON)生成符合預定義模式回應的能力。
Definition
結構化輸出是指語言模型生成符合特定格式和 schema 的回應、產生機器可解析資料而非自由格式文字的能力。最常見的格式是 JSON,模型輸出帶有由 schema 定義的特定欄位、類型和值的有效 JSON 物件。這種能力對於將 LLM 整合到下游程式碼需要程式化地解析和處理模型輸出的軟體系統中至關重要。
結構化輸出可以透過幾種方法實現。基於提示的方法指示模型以特定 格式輸出並期望其遵從——簡單但不可靠。約束解碼方法修改生成過程以強制結構有效性——在每個 token 位置,模型只能從維持有效結構的 token 中選擇。基於 schema 的方法(如 OpenAI 的 Structured Outputs)結合訓練和約束解碼來保證輸出符合提供的 JSON schema。
結構化輸出的可靠性對生產應用至關重要。一個 95% 的時間生成有效 JSON 的模型會在每 20 個請求中造成 1 次錯誤——對生產系統來說不可接受。約束解碼透過使模型不可能生成結構無效的輸出來完全消除這種失敗模式。然而,結構有效性不保證語義正確性——模型仍然可以在格式正確的欄位中放入錯誤的值。
Why It Matters
大多數生產 LLM 應用需要結構化輸出。實體提取、分類、資料轉換、API 整合和工具呼叫都需要模型以程式碼可以可靠解析的特定格式產生輸出。沒有結構化輸出,每個 LLM 整合都需要對自由文字回應進行脆弱的正則表達式解析,這在模型稍微改變其回應格式時就會中斷。
結構化輸出還為 LLM 應用啟用了類型安全。透過使用 JSON Schema 或 Pydantic 模型定義輸出 schema,開發者可以在類型層級驗證模型輸出,在 AI 系統和應用邏輯之間的邊界處捕獲錯誤。這使 LLM 驅動的系統更加健壯且更易於除錯。
How It Works
約束解碼——最可靠的方法——透過修改生成期間的 token 抽樣過程來運作。一個有限狀態機或解析自動機追蹤當前的結構狀態(例如「在 JSON 物件內部,期望鍵名」)。在每個生成步驟中,自動機確定在當前狀態下哪些 token 是結構有效的,並在抽樣前遮罩所有其他 token。這保證每個生成的 token 維持結構有效性。
對於 JSON schema 合規,系統將 JSON schema 編譯為一組結構約束。必填欄位必須出現、欄位值必須匹配其指定類型(字串、數字、布林、列舉),額外欄位可能被禁止。約束解碼器在整個生成過程中強制這些約束,使模型不可能產生違反 schema 的輸出。Outlines 和 Instructor 等函式庫為開源模型實作了這種方法。
Example Use Case
一個文件處理管線使用 LLM 將發票資料提取為結構化格式:{vendor: string, amount: number, date: string, line_items: [{description: string, quantity: number, price: number}]}。使用此 JSON schema 的約束解碼,模型為每張發票產生格式完美的 JSON,直接流入會計系統而沒有任何解析失敗。在使用結構化輸出之前,8% 的提取因格式不正確的 JSON 而失敗,需要人工處理。
Key Takeaways
- 結構化輸出使模型能夠生成符合定義 schema 的機器可解析資料。
- 約束解碼透過在生成期間遮罩無效 token 來保證結構有效性。