深入理解 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…