Schema 归一化导读

结构化输出和工具调用常见的问题,不在于模型不会生成 JSON,而在于不同 provider 对 schema 的校验严格度并不一致。

schema normalization 的作用不是“悄悄改 JSON”,而是让不同 provider 在面对严格 schema 时 行为更一致,减少你在客户端和应用层为每个 provider 单独写兼容逻辑的成本。

它会修什么

NameTypeRequiredDescription
required
repair把遗漏或不完整的 required 字段补齐,减少 provider 严格校验失败。
additionalProperties
repair把对象额外字段策略补成更一致的形态,避免严格 provider 直接拒绝。
nested object shape
repair修补嵌套对象和数组里的 schema 细节,让深层结构也更稳定。

一个典型前后对比

json
// 原始 schema(常见问题:additionalProperties 未声明)
{
  "type": "object",
  "properties": {
    "severity": { "type": "string" },
    "summary": { "type": "string" }
  },
  "required": ["severity", "summary"]
}

// 归一化后(更适合严格 provider)
{
  "type": "object",
  "properties": {
    "severity": { "type": "string" },
    "summary": { "type": "string" }
  },
  "required": ["severity", "summary"],
  "additionalProperties": false
}
它解决的是 provider 差异,不是业务建模能力
如果你的 schema 本身就表达错了业务含义,归一化不会替你修产品设计。它做的是把 “原本合理但不同 provider 接受度不同”的 schema 调成更稳定的交集。

什么时候特别值得开

  • 你在多个 provider 间切换,而且 JSON schema 经常被拒。
  • 你要做严格 machine-parseable 输出,而不是“差不多像 JSON 就行”。
  • 你不想在应用层为 OpenAI、Anthropic、Google 分别写一套 schema 兼容逻辑。

最容易犯的错

text
1. 以为 schema normalization 会替你设计 schema。
2. 明明是业务字段定义错了,却把问题怪到 provider 身上。
3. 已经跨 provider 运行严格 schema,却还坚持每家手工兼容。
4. 只看模型输出,不看 provider 在 schema 校验阶段就已经拒绝。

下一步