OpenAI Structured Outputs 怎么接:JSON Schema、拒答与截断处理
Structured Outputs 能让模型输出匹配指定 JSON Schema,但仍要处理拒答、输出截断和业务语义错误;本文给出选型、Schema 约束、接入步骤与验收用例。
应用需要稳定 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 层嵌套,以及枚举数量和字符串总长度限制。不同模型和微调模型支持的关键字可能不同,部署前应重新核对官方支持表。
可复现的接入步骤
- 先从一个小而稳定的业务对象开始,例如包含
category、confidence与reason的工单分类结果。 - 在代码中维护唯一 Schema 来源;使用官方 SDK 时优先用 Pydantic、Zod 等辅助方法,避免类型定义与 JSON Schema 分叉。
- 把全部字段列入 required,对枚举、数值范围和数组长度设置官方支持的约束,并关闭额外属性。
- 请求完成后先判断响应状态、拒答和不完整输出,再读取解析结果;不要直接假定成功响应一定有业务对象。
- 对解析后的业务值继续做权限、金额、日期和跨字段校验。Schema 正确不代表语义正确。
- 记录 Schema 版本、模型、请求 ID、完成状态和验证错误,不记录不必要的敏感正文。
拒答、截断与错误内容怎么处理
安全拒答应走单独分支,不能伪装成空对象;达到输出 token 上限时可能产生不完整结果,应检查响应状态并决定扩大上限、缩小任务或重新请求。用户输入与 Schema 完全不相关时,模型仍会尝试填满字段,官方建议在提示中约定不兼容输入的表示方式。Structured Outputs 仍可能产生事实或业务判断错误,因此付款、权限变更和写库操作必须经过确定性校验。
验收用例
至少准备正常输入、缺字段输入、无关输入、诱导额外字段、超长输入、安全拒答和输出截断七类用例。验收要求:成功结果通过同一份 Schema;额外字段被拒绝;拒答与截断不会进入业务写入;枚举和数值越界被拦截;同一 Schema 在目标模型与实际 SDK 版本上连续运行结果可解析。最后故意修改一次代码类型而不改 Schema,确认测试或 CI 能发现两者分叉。