想让模型稳定输出 JSON,提示词里要把“结构、取值、缺失怎么办、除了 JSON 什么都不要”四件事写死:用字段说明表定义每个键,用枚举限制取值,明确空值约定,并给一个完整示例。 即便如此,提示词只能降低出错概率,程序端的解析校验和重试仍然不能省。

常见的四类出错

  • 多余文字:JSON 前面加一句“好的,以下是结果”,或者包在代码块里;
  • 字段漂移:键名时而 name 时而 title,或者多出你没要求的字段;
  • 类型不对:数字被写成带单位的字符串,布尔值写成“是/否”;
  • 信息缺失时乱填:原文没提的字段被编一个看似合理的值。

下面的写法分别针对这四类问题。

写法一:用字段说明表代替一句“输出 JSON”

只写“请输出 JSON 格式”时,键名和类型都靠模型猜。更好的做法是逐个字段说明:

请从下面的客户反馈中提取信息,只输出一个 JSON 对象,不要输出任何解释、前后缀或代码块标记。

字段说明:
- "product":字符串,反馈涉及的产品名,按原文写法;
- "sentiment":只能是 "positive"、"neutral"、"negative" 三者之一;
- "issues":字符串数组,每项是一个具体问题,用不超过 20 字的中文概括;没有问题时输出空数组 [];
- "order_id":字符串,原文中的订单号;原文没有时输出 null,不要猜测;
- "needs_reply":布尔值 true 或 false。

除以上 5 个字段外不要添加其他字段。

客户反馈:
【粘贴反馈原文】

写法二:取值能枚举就枚举

情绪、类别、优先级这类字段,一旦允许自由填写,就会出现“偏负面”“较为不满”等无法统计的值。列出允许的取值,并说明“无法判断时用哪个值”(例如 "unknown"),比让模型自由发挥稳定得多。

写法三:把空值约定写清楚

“没有信息时怎么办”是乱填的根源。建议在提示词中统一约定:

  1. 单个值缺失用 null,不要用空字符串或“无”;
  2. 列表缺失用 [];
  3. 明确写出“不要根据常识推测原文没有的信息”。

写法四:示例要完整、要有边界情况

给一个完整的输出示例能显著减少键名漂移,但要注意:

  • 示例里的值要明显是示意(如 "示例产品"),否则模型可能把示例内容抄进结果;
  • 最好再给一个“信息缺失”的示例,展示 null 和 [] 的用法;
  • 示例数量不必多,一两个覆盖正常和缺失情况即可。

写法五:长文本字段提醒转义

摘要、原文引用这类长文本字段里经常出现双引号和换行,导致 JSON 无法解析。可以在提示词里加一句“字符串中的双引号请转义,换行用 \n 表示”,或者干脆要求引用原文时改用中文引号。

出错后的修复提示词

程序解析失败时,不必整段重跑,可以把错误信息交给模型修复:

下面这段内容应当是符合字段说明的 JSON,但解析失败,错误信息是:【粘贴解析器报错】。
请只修复格式问题并输出修复后的 JSON,不要改动任何字段的值,不要添加解释。
【粘贴原输出】

提示词管不到的部分

如果你使用的模型接口支持结构化输出或 JSON 模式,优先启用它;无论是否启用,程序端都应解析校验字段和类型,失败时有限次重试,再失败就记录下来人工处理。接口层与校验层的完整方案见 让大模型稳定输出 JSON:提示词、Schema 约束与程序校验,先定结构再写提示的思路见 Schema First 实用教程。想看一个把结构化结果接进脚本的日常例子,可以参考 数据分析师用 AI 写 Python 自动化脚本。