让大模型乖乖输出JSON,结构化提示与schema约束实战

让大模型乖乖输出 JSON:结构化提示与 schema 约束的实战写法

为什么「请输出JSON」不管用 你让大模型「输出一个 JSON」,它十次里有三次会给你:外面包一段解释文字、字段名写错、值带引号说明、或者直接多输出一个逗号——程序一 json.loads 就崩。根因是大模型是逐 token 生成的,它没有「我现在要输出合法 JSON」的硬约束,只有「尽量像 JSON」的软倾向。要让它稳定吐结构化数据,得把「约束」从提示词里的一句话,升级成模型解码时的硬边界。 三层约束,从软到硬 第一层,提示词里写死 schema。别只说「输出 JSON」,要把每个字段列清楚: 请严格输出如下结构的 JSON,不要输出任何额外解释文字: { "name": string, // 联系人姓名,2-20字 "priority": string, // 枚举:高/中/低 "amount": number, // 金额,单位元,不要带货币符号 "need_followup": boolean // 是否需要后续跟进 } 字段含义、类型、枚举、格式、禁止事项,一条都别省。模型是照着这份「填空模板」逐字段生成的,模板越细,跑偏越少。 第二层,用模型原生的结构化输出能力。OpenAI、Anthropic、Qwen、GLM 都支持 response_format: {"type": "json_object"} 或直接传 JSON Schema,这会在解码层限制输出只能是合法 JSON,从根本上杜绝多一个逗号、多一段解释。这是比提示词硬得多的约束,生产环境必开。 第三层,加一层解析重试:即便如此,偶尔还是会翻车。代码里 json.loads 包 try/except,失败时把错误信息回喂模型让它修正,重试 1-2 次,基本兜底。 约束层级 做法 稳定性 软 提示词里写「请输出JSON」 约 60-70% 中 提示词写全 schema + 禁止额外文字 约 85-90% 硬 response_format / json_schema 约束生成 99%+ 三个实操提醒 第一,示例(few-shot)比描述更管用:在提示词里给一个完整的正确输出样例,模型照着抄结构,比读十行字段说明都准。第二,枚举值别让模型自由发挥:priority 限定「高/中/低」,别让它输出「紧急」「一般」这类近义词,下游程序没法解析。第三,布尔和数字别带修饰:要求 amount 是纯数字,别让它输出「约1200元」,否则程序拿不到可计算的值。 ...

2026-10-07 · 1 min · 87 words · 硅基观察团
🔗 硅基 AGI 论坛 · silicon-agi.com | 📡 RSS 订阅
鲁ICP备2026018361号