OpenAI Structured Outputs 怎么接:JSON Schema、拒答与截断处理

Structured Outputs 能让模型输出匹配指定 JSON Schema,但仍要处理拒答、输出截断和业务语义错误;本文给出选型、Schema 约束、接入步骤与验收用例。

关键词
LALondAI 内容团队发布日期 2026-11-10
6 分钟阅读模型教程
LA
OpenAI Structured Outputs 怎么接:JSON Schema、拒答与截断处理
OpenAI Structured Outputs官方来源与可执行检查LondAI 内容团队

应用需要稳定 JSON 时,普通 JSON mode 只保证输出可解析,不保证字段、类型和枚举符合业务 Schema。OpenAI Structured Outputs 会约束模型匹配指定 JSON Schema,更适合表单抽取、分类和后续程序处理;但它不保证内容事实一定正确,也不会替应用处理拒答或输出被截断的情况。

先选 function calling 还是 text.format

  • 模型需要调用你系统里的函数、数据库或外部工具时,使用 function calling,并为参数启用严格 Schema。
  • 模型只需向用户或下游程序返回结构化内容时,在 Responses API 使用 text.format 的 JSON Schema。
  • 仅要求“返回合法 JSON”且目标模型不支持 Structured Outputs 时才退回 JSON mode,并自行验证和重试。

直接来源:OpenAI Structured Outputs 官方指南。

Schema 的关键约束

根节点必须是 object,不能在根节点直接使用 anyOf;所有字段都要列入 required,可选值可用与 null 的联合类型表达;每个 object 必须设置 additionalProperties: false。官方当前说明还包括最多 5000 个对象属性、最多 10 层嵌套,以及枚举数量和字符串总长度限制。不同模型和微调模型支持的关键字可能不同,部署前应重新核对官方支持表。

可复现的接入步骤

  1. 先从一个小而稳定的业务对象开始,例如包含 category、confidence 与 reason 的工单分类结果。
  2. 在代码中维护唯一 Schema 来源;使用官方 SDK 时优先用 Pydantic、Zod 等辅助方法,避免类型定义与 JSON Schema 分叉。
  3. 把全部字段列入 required,对枚举、数值范围和数组长度设置官方支持的约束,并关闭额外属性。
  4. 请求完成后先判断响应状态、拒答和不完整输出,再读取解析结果;不要直接假定成功响应一定有业务对象。
  5. 对解析后的业务值继续做权限、金额、日期和跨字段校验。Schema 正确不代表语义正确。
  6. 记录 Schema 版本、模型、请求 ID、完成状态和验证错误,不记录不必要的敏感正文。

拒答、截断与错误内容怎么处理

安全拒答应走单独分支,不能伪装成空对象;达到输出 token 上限时可能产生不完整结果,应检查响应状态并决定扩大上限、缩小任务或重新请求。用户输入与 Schema 完全不相关时,模型仍会尝试填满字段,官方建议在提示中约定不兼容输入的表示方式。Structured Outputs 仍可能产生事实或业务判断错误,因此付款、权限变更和写库操作必须经过确定性校验。

验收用例

至少准备正常输入、缺字段输入、无关输入、诱导额外字段、超长输入、安全拒答和输出截断七类用例。验收要求:成功结果通过同一份 Schema;额外字段被拒绝;拒答与截断不会进入业务写入;枚举和数值越界被拦截;同一 Schema 在目标模型与实际 SDK 版本上连续运行结果可解析。最后故意修改一次代码类型而不改 Schema,确认测试或 CI 能发现两者分叉。