让模型稳定输出 JSON 的提示写法:字段说明、枚举、空值与示例
想让模型稳定输出 JSON,提示词里要把“结构、取值、缺失怎么办、除了 JSON 什么都不要”四件事写死:用字段说明表定义每个键,用枚举限制取值,明确空值约定,并给一个完整示例。 即便如此,提示词只能降低出错概率,程序端的解析校验和重试仍然不能省。
常见的四类出错
- 多余文字:JSON 前面加一句“好的,以下是结果”,或者包在代码块里;
- 字段漂移:键名时而
name时而title,或者多出你没要求的字段; - 类型不对:数字被写成带单位的字符串,布尔值写成“是/否”;
- 信息缺失时乱填:原文没提的字段被编一个看似合理的值。
下面的写法分别针对这四类问题。
写法一:用字段说明表代替一句“输出 JSON”
只写“请输出 JSON 格式”时,键名和类型都靠模型猜。更好的做法是逐个字段说明:
请从下面的客户反馈中提取信息,只输出一个 JSON 对象,不要输出任何解释、前后缀或代码块标记。
字段说明:
- "product":字符串,反馈涉及的产品名,按原文写法;
- "sentiment":只能是 "positive"、"neutral"、"negative" 三者之一;
- "issues":字符串数组,每项是一个具体问题,用不超过 20 字的中文概括;没有问题时输出空数组 [];
- "order_id":字符串,原文中的订单号;原文没有时输出 null,不要猜测;
- "needs_reply":布尔值 true 或 false。
除以上 5 个字段外不要添加其他字段。
客户反馈:
【粘贴反馈原文】
写法二:取值能枚举就枚举
情绪、类别、优先级这类字段,一旦允许自由填写,就会出现“偏负面”“较为不满”等无法统计的值。列出允许的取值,并说明“无法判断时用哪个值”(例如 "unknown"),比让模型自由发挥稳定得多。
写法三:把空值约定写清楚
“没有信息时怎么办”是乱填的根源。建议在提示词中统一约定:
- 单个值缺失用
null,不要用空字符串或“无”; - 列表缺失用
[]; - 明确写出“不要根据常识推测原文没有的信息”。
写法四:示例要完整、要有边界情况
给一个完整的输出示例能显著减少键名漂移,但要注意:
- 示例里的值要明显是示意(如
"示例产品"),否则模型可能把示例内容抄进结果; - 最好再给一个“信息缺失”的示例,展示
null和[]的用法; - 示例数量不必多,一两个覆盖正常和缺失情况即可。
写法五:长文本字段提醒转义
摘要、原文引用这类长文本字段里经常出现双引号和换行,导致 JSON 无法解析。可以在提示词里加一句“字符串中的双引号请转义,换行用 \n 表示”,或者干脆要求引用原文时改用中文引号。
出错后的修复提示词
程序解析失败时,不必整段重跑,可以把错误信息交给模型修复:
下面这段内容应当是符合字段说明的 JSON,但解析失败,错误信息是:【粘贴解析器报错】。
请只修复格式问题并输出修复后的 JSON,不要改动任何字段的值,不要添加解释。
【粘贴原输出】
提示词管不到的部分
如果你使用的模型接口支持结构化输出或 JSON 模式,优先启用它;无论是否启用,程序端都应解析校验字段和类型,失败时有限次重试,再失败就记录下来人工处理。接口层与校验层的完整方案见 让大模型稳定输出 JSON:提示词、Schema 约束与程序校验,先定结构再写提示的思路见 Schema First 实用教程。想看一个把结构化结果接进脚本的日常例子,可以参考 数据分析师用 AI 写 Python 自动化脚本。