OpenAI 结构化输出 API 功能公告
TL;DR
OpenAI 为其 API 宣布了 结构化输出 功能,该功能保证模型响应严格符合开发者提供的 JSON Schema,从而提升面向数据的应用的可靠性。
什么是结构化输出
结构化输出强制模型的输出必须匹配开发者提供的 JSON Schema。这超越了之前的 JSON 模式,后者仅鼓励生成有效的 JSON,却未能确保遵循特定的 schema。
如何使用结构化输出
函数调用接口
- 在工具定义中将
strict: true设置为 true。 - 适用于所有支持工具的模型(例如
gpt‑4‑0613、gpt‑3.5‑turbo‑0613以及更新的模型)。 - 示例请求展示了一个
query函数及其针对表名、列、条件和排序的详细 schema。模型返回的 JSON 对象完全符合该 schema。
response_format 接口
- 在
response_format中通过新的json_schema选项提供 JSON Schema。 - 适用于最新的 GPT‑4o 系列模型:
gpt‑4o‑2024‑08‑06和gpt‑4o‑mini‑2024‑07‑18。 - 示例请求将数学辅导的响应格式化为包含
steps数组和final_answer字段的结构,模型返回的数据符合该 schema。
安全保证
- 结构化输出遵循现有的安全策略;模型仍然可以拒绝不安全的请求。
- 当发生拒绝时,API 在响应中包含
refusal字段,开发者可以以编程方式检测到不符合的输出。
原生 SDK 支持
- 更新后的 Python 与 Node SDK 可直接接受 Pydantic(Python)或 Zod(Node)对象。
- SDK 将这些类型化对象转换为 JSON Schema,发送至 API,并将返回的 JSON 反序列化回原始的类型结构。
- 示例代码演示了如何解析
QueryPydantic 模型和MathResponse模型。
关键使用场景
- 动态 UI 生成 – 生成符合递归 schema 的 UI 组件树,实现即时界面创建。
- 将推理与最终答案分离 – 返回
reasoning_steps数组和简洁的answer字段,提高透明度。 - 提取结构化数据 – 将会议记录中的行动项、截止日期和负责人提取到明确的 schema 中。
技术细节
受限解码
- 模型的 token 采样器在每一步都被限制为仅能产生在给定 schema 下仍保持有效的 token。
- JSON Schema 被编译为上下文无关文法(CFG)。在生成过程中,推理引擎根据当前的部分输出屏蔽无效 token。
- 首次使用新 schema 的请求会产生预处理延迟(通常在 10 秒以内;复杂 schema 最多约一分钟),用于构建文法缓存。
为什么使用 CFG 而非 FSM/正则
- CFG 能表示递归结构,而 FSM 无法可靠地处理递归。
- 这使得能够支持包含嵌套或自引用对象的 schema,例如动态生成的 UI 组件树。
限制
- 仅支持 JSON Schema 的子集(具体列表请参见文档)。
- 首次使用新 schema 会有延迟;后续调用速度快。
- 拒绝、token 限制或提前停止等原因可能导致模型返回不符合 schema 的响应。
- JSON 中的值仍可能不正确;开发者应提供示例或将任务拆分为更小的子任务。
- 并行工具调用不兼容;请将
parallel_tool_calls: false设置为 false 以避免不匹配。 - 在结构化输出中使用的 schema 不符合零数据保留(Zero Data Retention)的条件。
可用性与定价
- 结构化输出已在 Chat Completions、Assistants 和 Batch API 中全面可用。
- 函数调用模式适用于所有支持工具的模型,包括
gpt‑4o、gpt‑4o‑mini以及任何具备工具支持的微调模型。 response_format模式适用于gpt‑4o‑2024‑08‑06、gpt‑4o‑mini‑2024‑07‑18以及兼容的微调模型。- 相较于 2024 年 5 月的版本,切换到
gpt‑4o‑2024‑08‑06可将输入费用降低 50%,输出费用降低 33%。
致谢
OpenAI 感谢开源社区的启发,提及 outlines、jsonformer、instructor、guidance 与 lark 等项目对结构化输出实现的影响。
本文概述了 OpenAI 于 2024 年 8 月 6 日发布的结构化输出官方公告。