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

运营喵小美 中级 2026/5/14 127 浏览 4 点赞 约 1 分钟

直接把 Prompt 里的“请输出 JSON 格式”当成约束,在处理深层嵌套结构时几乎必然翻车。一旦数据量增加,LLM 经常在闭合括号上出错,或者随心所欲地更改字段名,导致后端解析直接抛出 JSONDecodeError

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

解决这个问题的终极方案是利用 OpenAI 或 Claude 最新的 Structured Outputs (JSON Schema) 模式。不要在 Prompt 里用自然语言描述结构,而是直接传一个标准的 JSON Schema 定义。

以我最近写的一个“自动化需求分析工具”为例,我需要 AI 把一段杂乱的原始需求拆解为:功能模块 -> 具体需求点 -> 验收标准(三层嵌套)。如果只用 Prompt 描述,AI 经常把验收标准直接扁平化写在需求点后面。

我的配置技巧是:定义一个严格的 Schema,并开启 strict: true

以下是我的 Schema 定义片段(TypeScript 风格,适配 OpenAI SDK):

const RequirementSchema = {
  name: "requirement_analysis",
  strict: true,
  schema: {
    type: "object",
    properties: {
      modules: {
        type: "array",
        items: {
          type: "object",
          properties: {
            module_name: { type: "string" },
            features: {
              type: "array",
              items: {
                type: "object",
                properties: {
                  feature_desc: { type: "string" },
                  acceptance_criteria: {
                    type: "array",
                    items: { type: "string" }
                  }
                },
                required: ["feature_desc", "acceptance_criteria"],
                additionalProperties: false
              }
            }
          },
          required: ["module_name", "features"],
          additionalProperties: false
        }
      }
    },
    required: ["modules"],
    additionalProperties: false
  }
};

这里有几个实操踩坑点:
1. 必须显式声明 additionalProperties: false。如果不加这一句,LLM 可能会在对象里塞入它认为“有帮助”的额外字段,导致你的强类型解析代码崩溃。
2. 所有属性必须在 required 数组中。在 Strict 模式下,你不能有可选字段,必须全部定义为必填。如果某个字段可能为空,请将类型定义为 ["string", "null"]
3. 别在 Prompt 里重复描述结构。既然已经传了 Schema,Prompt 里只需要写:“请分析以下需求并按结构输出”,写得越多反而容易产生冲突。

效率提升非常明显。以前我需要写一套复杂的正则或者用 langchain 的 OutputParser 去反复重试(Retry),现在一次请求的成功率接近 100%,且解析速度快了许多,因为省去了冗余的自然语言引导词。

如果是在 Cursor 里调试,建议直接在 .cursorrules 中定义好这种数据交互规范,让 AI 在生成代码时就遵循这个 Schema,这样前后端对接时完全不需要手动对字段名。

全部回复 (0)

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

发表回复

支持 Markdown 格式