深入理解 Structured Outputs:基于 JSON Schema 的結構化輸出實踐指南

深入理解 Structured Outputs:基于 JSON Schema 的結構化輸出實踐指南

目錄

  • 引言
  • Structured Outputs 概述
  • 應用場景與優勢
  • 核心用法:結構化響應的獲取
  • 功能對比:Structured Outputs 與 JSON 模式
  • 典型應用示例
  • 鏈式思維(Chain of Thought)
  • 拒絕響應處理
  • 最佳實踐與注意事項
  • 支持的 JSON Schema 特性與限制
  • 結語

引言

JSON 作為數據交換格式被廣泛應用于各類系統。隨著大語言模型(LLM)的普及,開發者越來越關注如何高效、可靠地從模型獲得結構化輸出。Structured Outputs 是一個確保模型響應嚴格符合開發者自定義 JSON Schema 的特性,旨在提升類型安全、自動化處理能力以及開發效率。

示例代碼中的 API 域名均使用 https://zzzzapi.com 作為演示用途。實際項目開發時,請替換為自身服務或合規 API 地址。

Structured Outputs 概述

Structured Outputs 是一種能夠讓大模型輸出嚴格遵循指定 JSON Schema 的 API 特性。它在保證響應為合法 JSON 的基礎上,進一步規范響應結構、字段類型和枚舉范圍,減少了手動校驗和錯誤重試的需求。

主要優勢

  • 類型安全與一致性:自動保證類型與結構,無需額外格式校驗。
  • 可檢測的拒絕響應:模型基于安全考慮拒絕請求時,可通過標準字段進行程序化處理。
  • 簡化提示工程:無需復雜的 prompt,也可保證輸出的一致性與可解析性。

Structured Outputs 現已在 OpenAI 最新模型(如 gpt-4o-2024-08-06 及以上)中提供支持。

應用場景與優勢

Structured Outputs 適用于多種場景,包括但不限于:

  • 結構化數據抽取(如實體信息、事件識別)
  • UI 自動生成(如基于 Schema 動態生成界面)
  • 復雜推理(如鏈式思維解題)
  • 內容審核、數據標注

與傳統 JSON 模式相比,Structured Outputs 能夠嚴控輸出格式并自動處理異常,提升了自動化集成能力。

核心用法:結構化響應的獲取

前置依賴

  • Python >= 3.8
  • openai SDK
  • pydantic 用于定義數據模型
示例(Python,文件名:structured_output_demo.py
from openai import OpenAI
from pydantic import BaseModel# 創建 OpenAI 客戶端
client = OpenAI(base_url="https://zzzzapi.com")  # 僅用于演示# 定義事件 Schema
class CalendarEvent(BaseModel):name: str        # 事件名稱date: str        # 日期(如需日期格式限制,可加 format)participants: list[str]  # 參與人列表response = client.responses.parse(model="gpt-4o-2024-08-06",input=[{"role": "system", "content": "Extract the event information."},{"role": "user", "content": "Alice and Bob are going to a science fair on Friday."}],text_format=CalendarEvent,
)
event = response.output_parsed
print(event)

注意事項:
- 確認當前模型版本已支持 Structured Outputs。
- 合理設置超時和錯誤重試。
- 避免對模型返回字段進行二次修改,確保類型安全。

功能對比:Structured Outputs 與 JSON 模式

特性Structured OutputsJSON 模式
輸出合法 JSON??
嚴格遵循 Schema?(支持部分 JSON Schema 約束)?(僅保證 JSON 解析無誤)
支持模型gpt-4o-2024-08-06 及以上等gpt-3.5-turbo, gpt-4等
啟用方法text.format: type: json_schematext.format: type: json_object
自動處理拒絕響應??

更新說明: Structured Outputs 是 JSON 模式的升級,推薦優先使用(如已支持的模型和 API)。

典型應用示例

鏈式思維(Chain of Thought)

開發者可要求模型以結構化、分步方式輸出解題過程。

示例(Python,文件名:chain_of_thought.py
from openai import OpenAI
from pydantic import BaseModelclient = OpenAI(base_url="https://zzzzapi.com")class Step(BaseModel):explanation: stroutput: strclass MathReasoning(BaseModel):steps: list[Step]final_answer: strresponse = client.responses.parse(model="gpt-4o-2024-08-06",input=[{"role": "system", "content": "You are a helpful math tutor. Guide the user through the solution step by step."},{"role": "user", "content": "how can I solve 8x + 7 = -23"}],text_format=MathReasoning,
)
math_reasoning = response.output_parsed
print(math_reasoning)
可能的輸出示例(JSON 格式)
{"steps": [{"explanation": "Start with the equation 8x + 7 = -23.", "output": "8x + 7 = -23"},{"explanation": "Subtract 7 from both sides.", "output": "8x = -30"},{"explanation": "Divide both sides by 8.", "output": "x = -30 / 8"},{"explanation": "Simplify the fraction.", "output": "x = -15 / 4"}],"final_answer": "x = -15 / 4"
}

拒絕響應處理

模型有時會因安全策略拒絕生成響應,此時返回結構中包含 refusal 字段。

示例代碼片段
class MathReasoning(BaseModel):steps: list[Step]final_answer: strrefusal: str = None  # 新增拒絕字段,實際取決于 SDK 結構completion = client.chat.completions.parse(model="gpt-4o-2024-08-06",messages=[{"role": "system", "content": "You are a helpful math tutor. Guide the user through the solution step by step."},{"role": "user", "content": "[不合規請求示例]"}],response_format=MathReasoning,
)
output = completion.choices[0].message
if hasattr(output, "refusal") and output.refusal:print(output.refusal)
else:print(output)
拒絕響應示例
{"refusal": "I'm sorry, I cannot assist with that request."
}

最佳實踐與注意事項

  • 用戶輸入處理:對于不符合 Schema 或非法輸入,應在 prompt 中約定返回空對象或特定字段。
  • 錯誤與異常:Structured Outputs 并不保證輸出內容完全準確,僅保證類型和結構。可通過調整系統提示、拆分任務等方式優化。
  • 同步 Schema 與類型定義:建議使用 pydantic/zod 等直接生成類型和 JSON Schema,避免二者偏離。
  • 流式處理:支持對模型流式輸出的解析,可顯著優化 UI 體驗或實時處理場景。
流式流處理示例(Python,文件名:streaming_structured_output.py
from typing import List
from openai import OpenAI
from pydantic import BaseModelclass EntitiesModel(BaseModel):attributes: List[str]colors: List[str]animals: List[str]client = OpenAI(base_url="https://zzzzapi.com")
with client.responses.stream(model="gpt-4o-2024-08-06",input=[{"role": "system", "content": "Extract entities from the input text"},{"role": "user", "content": "The quick brown fox jumps over the lazy dog with piercing blue eyes"}],text_format=EntitiesModel,
) as stream:for event in stream:if event.type == "response.refusal.delta":print(event.delta, end="\n")elif event.type == "response.output_text.delta":print(event.delta, end="\n")elif event.type == "response.error":print(event.error, end="\n")elif event.type == "response.completed":print("Completed")print(event.response.output)final_response = stream.get_final_response()print(final_response)

支持的 JSON Schema 特性與限制

支持的類型

  • string、number、boolean、integer、object、array、enum、anyOf

字段限制示例

{"type": "object","properties": {"name": {"type": "string", "description": "用戶名"},"username": {"type": "string", "pattern": "^[a-zA-Z0-9_]+$", "description": "用戶名,需由字母、數字或下劃線組成"},"email": {"type": "string", "format": "email", "description": "郵箱地址"}},"additionalProperties": false,"required": ["name", "username", "email"]
}

限制說明

  • 根對象必須為 object 類型,不支持 anyOf 作為頂層。
  • 所有字段必須為必填(但可用 [string, null] 模擬可選)。
  • 最大嵌套層級為 5,最多 5000 個屬性。
  • additionalProperties: false 必須設置。
  • 不支持 allOf、not、dependentRequired、dependentSchemas、if/then/else 等高級組合。
  • 詳細限制請參閱官方文檔和模型支持列表。

結語

Structured Outputs 顯著提升了大模型 API 的類型安全、可用性和自動化能力。合理利用該特性,可在數據抽取、交互式 UI、自動推理等領域實現更高效的開發與更可靠的產出。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94470.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94470.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94470.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型應用編排工具Dify之插件探索

1.前言 ? dify 1.x版本以后插件功能豐富了很多,推出的插件市場上有各式各樣的插件,比如 連接數據庫、連接大模型、搜索和 mcp服務等。其中,有一個比較大的改動,模型供應商不再內置,而是通過插件的形式提供。因此&…

ubuntu2204安裝搜狗拼音輸入法

安裝必要的軟件包 sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-config-qt fcitx5-configtool -y安裝搜狗拼音 下載最新 .deb 包(官方地址:https://pinyin.sogou.com/linux/),安裝: sudo dp…

三,設計模式-抽象工廠模式

目的 在 工廠模式 中,當需要創建新的產品時,則額外需要創建新的工廠,這種模式是對產品制造方法的抽象化,如果產品種類變多,則工廠數目變多,則代碼規模會越來越大,且不同的產品類的生成依賴不同…

Vue3響應式編程核心:ref與reactive全方位對比

在Vue3的Composition API中,ref和reactive是構建響應式數據的核心工具。許多開發者對它們的選擇存在困惑:何時用ref的.value?何時用reactive的直接訪問?為何解構會丟失響應性?本文從原理、場景到實戰陷阱,為…

Redis實戰-緩存的解決方案(一)

1.什么是緩存緩存就是數據交換的緩存區,是存儲數據的臨時區域,讀寫性能高。瀏覽器會有緩存,tomcat服務器也會有緩存,數據庫也會有緩存,CPU也會有緩存,磁盤也會有緩存,所以說緩存是無處不在的并且…

CI/CD企業案例詳解

7.持續集成持續交付企業示例 為了讓容器構建鏡像可以持續集成并自動上傳到harbor倉庫,業務主機通過持續交付自動從倉庫中下載鏡像最近版本并實現業務更新7.1 在jenkins中添加registry節點 7.1.1 在業務節點中安裝docker和java環境并配置其可以從倉庫中下載鏡像 # 新…

C++ 入門核心知識

一、C 課程概述與發展歷史1. 發展歷程:從 C 語言擴展到標準化C 的起源可追溯至 1979 年,由貝爾實驗室的 Bjarne Stroustrup 主導開發。當時他為解決大型項目開發中 C 語言在可維護性和擴展性上的不足,在 C 語言基礎上引入了面向對象編程特性。…

labelme數據標注保姆級教程:從安裝到格式轉換全流程,附常見問題避坑指南(含視頻講解)

引言:為什么選擇labelme? 在人工智能和機器學習領域,高質量的標注數據是訓練優秀模型的基礎。而 labelme作為一款開源、跨平臺的圖像標注工具,憑借其強大的功能和易用性,成為了數據標注領域的熱門選擇。 它支持多種標…

人工智能-python-深度學習-自動微分

自動微分:基礎概念與應用 自動微分(Autograd)是現代深度學習框架(如PyTorch、TensorFlow)中的一個核心功能。它通過構建計算圖并在計算圖上自動計算梯度,簡化了反向傳播算法的實現。以下是自動微分的基本概…

k8s原理及操作

簡介 kubernetes的本質是一組服務器集群,它可以在集群的每個節點上運行特定的程序,來對節點中的容器 進行管理。目的是實現資源管理的自動化,主要提供了如下的主要功能: 自我修復:一旦某一個容器崩潰,能夠在…

理解音頻響度:LUFS 標準及其計算實現

LUFS 及其重要性 1.1、什么是 LUFS? LUFS(Loudness Units relative to Full Scale)是音頻工程中用于測量感知響度的標準單位。它已成為廣播、流媒體和音樂制作領域的行業標準,用于確保不同音頻內容具有一致的響度水平。 LUFS 是 I…

【在ubuntu下使用vscode打開c++的make項目及編譯調試】

在ubuntu下使用vscode打開c的make項目及編譯調試第一步:安裝必要的軟件第二步:示例項目準備1. 創建C源文件: main.cpp2. 創建頭文件: utils.h3. 創建實現文件: utils.cpp第三步:使用 VS Code 打開項目第四步…

3-2.Python 函數 - None(None 概述、None 應用場景)

一、None 概述在 Python 中,None 是一個特殊的常量,用于表示空值或無值None 是 Python 中唯一的一個 NoneType 類型的實例二、None 應用場景 1、定義變量 None 常用于初始化變量,表示該變量暫時不需要有具體值 name Noneprint(name) print(t…

js獲取html元素并設置高度為100vh-鍵盤高度

獲取HTML元素并設置高度為(100vh - 鍵盤高度) 我將設計一個頁面,展示如何獲取HTML元素并動態設置其高度為視口高度減去鍵盤高度,這在移動設備上特別有用,可以避免鍵盤遮擋內容。 設計思路 創建一個帶有輸入框的界面,模擬鍵盤彈…

基于SpringBoot的校園博客管理系統

🔗 目錄 一. 前言 ??二. 前端框架、后端框架以及存儲框架使用情況說明 ??三. 核心技術 ????1. ?Java開發語言 ????2. ?MyBatis ????3. ?Mysql ????4. ?Vue ????5. ?部署項目 ??四. 演示效果 ????1. 管理員功能模塊 ??????…

Nginx + Certbot配置 HTTPS / SSL 證書

前提條件: 1.已有域名 2.Nginx 已安裝并正在運行,且有對應的 Server 配置 3.防火墻開放 80 和 443 端口 安裝 EPEL 倉庫: sudo yum install epel-release -y安裝 Snapd sudo yum install snapd -y啟用并啟動 Snapd Socket sudo systemctl ena…

圖結構使用 Louvain 社區檢測算法進行分組

圖結構使用 Louvain 社區檢測算法進行分組 flyfish Louvain 算法是一種基于模塊度最大化的社區檢測算法,核心目標是在復雜網絡中找到“內部連接緊密、外部連接稀疏”的社區結構。它的優勢在于高效性(可處理百萬級節點的大規模網絡)和近似最優…

layui.formSelects自定義多選組件在layer.open中使用、獲取、復現

layui.formSelects自定義多選組件在layer.open中使用、獲取、復現 引入css和js //<th:block th:include"include :: layui-formSelects-css"/> <link th:href"{/ajax/libs/layui-formSelects/formSelects-v4.css}" rel"stylesheet"/>…

基于SpringBoot的社團管理系統【2026最新】

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

運行node18報錯

又碰到一個奇葩的問題&#xff0c;報錯如下> tigermes.vue30.1.0 serve > vue-cli-service serveBrowserslist: caniuse-lite is outdated. Please run:npx update-browserslist-dblatestWhy you should do it regularly: https://github.com/browserslist/update-db#rea…