如何利用 JSON Schema 强制约束 LLM 输出复杂嵌套结构的稳定性

北漂产品狗 中级 2026/5/18 187 浏览 14 点赞 约 2 分钟

让 LLM 输出 JSON 很容易,但要它在 100 次请求中 100 次都严格遵守复杂的嵌套结构,单纯靠 Prompt 几乎是不可能的。尤其是当你的 JSON 里包含多层数组、特定枚举值或者强制要求的字段时,Claude 3.5 或 GPT-4o 偶尔还是会漏掉某个闭合括号,或者把 status: "success" 擅自改成 status: "ok"

如何利用 JSON Schema 强制约束 LLM 输出复杂嵌套结构的稳定性

我最近在做一套自动化研报解析工具,需要模型把非结构化文本转成一个包含「核心观点 → 支撑证据 → 来源页码」的深层嵌套 JSON。实测发现,即便在 System Prompt 里写了详细的 Example,模型在处理长文本时依然会出现字段缺失。

真正解决稳定性问题的方案是直接喂 JSON Schema。

实测对比:Prompt 描述 vs JSON Schema 约束

场景:提取包含多层嵌套的财务数据

方案 A(Prompt 引导):

请输出JSON格式,包含company, fiscal_year, 以及一个reports列表,每个report包含date和amount。
表现: 稳定性 85%。偶尔会出现 amount 变成字符串 "100M" 而不是数字 100000000,或者把 reports 字段名写成 report_list

方案 B(JSON Schema 强约束):

{
  "type": "object",
  "properties": {
    "company": { "type": "string" },
    "fiscal_year": { "type": "integer" },
    "reports": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "date": { "type": "string", "format": "date" },
          "amount": { "type": "number" }
        },
        "required": ["date", "amount"]
      }
    }
  },
  "required": ["company", "fiscal_year", "reports"]
}
表现: 稳定性 99% 以上。配合 OpenAI 的 json_schema 响应格式(Structured Outputs),模型在解码阶段就被强制限制在 Schema 范围内,根本没机会输出非法字符。

不同模型的适配体感

GPT-4o: 目前最稳。开启 strict: true 后,输出几乎等同于代码生成的 JSON,完全不需要再写正则去清洗数据。

Claude 3.5 Sonnet: 虽然没有原生的 Strict Mode 接口,但它对复杂 Schema 的理解能力极强。在 Prompt 中直接粘贴 Schema 并在结尾强调 Strictly follow the provided JSON Schema,其逻辑准确度往往高于 GPT-4o,但在极少数情况下仍会有微小的格式瑕疵。

DeepSeek-V2.5: 在处理简单 JSON 时很快,但在深层嵌套(3 层以上)且包含复杂 enum 约束时,偶尔会丢失部分嵌套层级,建议在 Prompt 中配合少样本(Few-Shot)一起使用。

避坑指南

如果你的结构非常复杂,不要试图在一个 Schema 里解决所有问题。建议将任务拆分,先让模型输出一级结构,再通过循环将子项交给模型细化。此外,required 字段必须全部列出,否则模型在面对不确定信息时会倾向于直接删掉该键值对,导致后端解析报 KeyError

更系统的工具评测汇总在AI工具实测笔记,有不少直接可参考的案例。

全部回复 (0)

还没有回复,来发第一条吧!

发表回复

支持 Markdown 格式