不要让 ChatGPT 只看一份样本就猜规则。本教程用正常与失败样本建立字段决策表,生成 JSON Schema,并通过 Ajv 检查错误路径。

最终结果应是一份不过松、也不过度拟合样本的 JSON Schema:它能接受准备好的正常 JSON,并在无效样本上返回准确的字段路径和原因。ChatGPT 负责归纳候选规则与生成初稿,真正的判定来自业务决策、Schema 规范和本地验证器。
版本、权限与准备材料
本文适用于 ChatGPT 当前网页版,或 OpenAI API 当前可用的结构化输出能力,日期为 2026 年 8 月 30 日。网页端与 API 的模型、数据控制、文件限制及 JSON Schema 支持范围并不必然相同,应核对当前界面和 OpenAI Structured Outputs 文档,不要把某个入口的能力推定到所有套餐。

| 材料 | 最低数量与用途 |
|---|---|
| 正常样本 | 至少三份,覆盖可选字段、数组和常见变化 |
| 失败样本 | 至少两份,分别触发缺失字段与错误格式 |
| 业务决策 | 明确必填、可空、枚举、未知字段和版本策略 |
| 验证环境 | 安装 Node.js 与 Ajv,或使用项目既有验证器 |
样本必须先脱敏。订单、用户、医疗或日志数据中的姓名、地址、令牌和内部标识不应直接发送给外部模型;可以保留字段结构,用虚构值替换内容。
从样本建立字段决策表
一份样本只能说明“出现过什么”,不能证明“必须是什么”。逐字段记录观察类型、是否在所有正常样本出现、是否允许 null、格式要求、可选枚举及是否允许额外属性。业务负责人无法确认的项目应标成待定,而不是让 ChatGPT 自行选择。
| 字段 | 观察 | 需要人工决定 |
|---|---|---|
| id | 三个样本均为字符串 | 是否必填、长度和字符范围 |
| 可能缺失 | 缺失与 null 是否等价 | |
| status | 出现两个值 | 是否封闭为枚举 |
| metadata | 键不固定 | 是否允许扩展字段 |
JSON Schema 的关键字组合和逐步建模方式可参考 JSON Schema 官方入门教程。特别要区分 required 与 null:字段可以必填但允许空值,也可以不出现但出现时必须是字符串。
让 ChatGPT 先解释,再生成 Schema
根据以下正常样本、失败样本和字段决策表,生成 JSON Schema 候选稿。
要求:
1. 不从单个示例推断未经确认的枚举或长度。
2. 明确列出 required、null 和 additionalProperties 的选择依据。
3. 使用与验证器兼容的方言,并声明 $schema。
4. 先输出假设与待确认项,再输出完整 Schema。
5. 为每个失败样本说明预期错误路径。
将样本分组粘贴,并明确哪些是应通过、哪些必须失败。生成后逐项审查 type、required、format、items、minimum、pattern 和 additionalProperties。最常见的过拟合是把样本中的两个状态直接锁成 enum,或根据一条编号推断固定长度;最常见的过松则是所有字段都可选、所有对象都允许未知键。
如果 Schema 用于 OpenAI API 的结构化输出,还要单独核对该能力当前支持的 Schema 范围。用于模型输出约束的 Schema 与用于业务 API 验证的完整 Schema,可能需要维护不同版本,不能因为名称相同就假定支持完全一致。
用 Ajv 验证正常与失败样本
Ajv 的安装、编译和错误信息读取方式可参考 Ajv 入门文档。具体配置应与项目采用的 Schema 方言及格式插件保持一致。
import Ajv from 'ajv'
import schema from './schema.json' with { type: 'json' }
import validSample from './valid.json' with { type: 'json' }
const ajv = new Ajv({ allErrors: true })
const validate = ajv.compile(schema)
const ok = validate(validSample)
console.log(ok, validate.errors)
- 逐一运行所有正常样本,任何失败都要判断是 Schema 太严还是样本本身错误。
- 运行每个失败样本,确认它确实失败,且错误路径指向预期字段。
- 为每条核心规则增加一个最小反例,例如缺少必填项、格式错误或出现未知字段。
- 修改 Schema 后重新执行全部样本,避免修复一个错误时放宽其他约束。
- 把样本和 Schema 纳入自动化测试,防止接口演进造成静默变化。
失败诊断与人工复核
- 正常样本被拒绝:检查 required、additionalProperties、数组元素类型和 null 处理。
- 无效样本通过:确认规则是否只写在描述中而没有变成关键字,并检查 pattern 是否正确转义。
- format 没有效果:核对验证器及插件配置,不要假定所有实现默认执行相同格式检查。
- 错误路径不准确:查看嵌套 object、items 与组合关键字,减少不必要的 anyOf 或 oneOf。
- ChatGPT 前后规则不一致:回到字段决策表,要求逐条映射,不要通过反复自由改写解决。
人工复核应覆盖业务兼容性:新增字段是否会被旧客户端拒绝,数值单位是否明确,日期是日期还是日期时间,标识符能否有前导零。Schema 版权通常不取代原始数据和接口文档的许可要求;使用第三方示例前仍要确认授权。
成本与维护边界
网页订阅、API 调用和长上下文可能产生不同成本,具体以当前账户为准。不要把完整生产数据作为提示样本。Schema 应有版本记录、变更评审和回归样本;AI 可以加速初稿,但不能决定字段兼容性、监管保留要求或数据是否允许收集。
结论
ChatGPT JSON Schema 生成的可靠路径是:多样本观察、人工字段决策、约束初稿、本地验证和反例回归。把模型限制在“归纳与起草”角色,并让有效及无效样本共同参与验证,才能得到可维护的数据契约。
常见问题
只有一份 JSON 示例能生成 Schema 吗?
可以生成候选稿,但不能可靠判断必填、枚举和可选变化。至少补充多份正常样本及明确的失败样本,再由业务人员确认规则。
additionalProperties 应该直接设为 false 吗?
不应机械设置。封闭对象有助于发现拼写错误,但也可能破坏向后兼容;应根据接口扩展策略逐层决定。
ChatGPT 生成的 Schema 还需要验证器吗?
需要。模型输出只是文本候选,必须由 Ajv 等兼容验证器执行,并检查正常样本、反例和具体错误路径。