如何利用 JSON Schema 强制约束 LLM 输出复杂嵌套结构的稳定性
status: "success" 擅自改成 status: "ok"。我最近在做一套自动化研报解析工具,需要模型把非结构化文本转成一个包含「核心观点 → 支撑证据 → 来源页码」的深层嵌套 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。
全部回复 (0)
还没有回复,来发第一条吧!
