如何利用 JSON Schema 强制 LLM 稳定输出复杂的嵌套数据结构
JSONDecodeError。解决这个问题的终极方案是利用 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)
还没有回复,来发第一条吧!
