让 AI 稳定输出 JSON 的五个技巧
用程序调 AI 接口做自动化,最怕的就是输出「自由发挥」:你要 JSON,它给你散文;你要数组,它外面裹一句「好的,以下是结果」。五个技巧,让输出老老实实。
技巧一:把「只输出 JSON」写成硬约束
不要说「以 JSON 形式返回」,要说「只输出合法 JSON,不要任何解释、前后缀或代码块标记」。措辞越像军令,模型越收敛。
技巧二:给出字段示例
空说「返回结构化数据」没有用,直接贴一个字段示例:
只输出合法 JSON,不要解释,不要代码块以外的内容。
字段结构示例:
{"items": [{"name": "名称", "price": 0, "tags": ["标签1"]}]}
模型会模仿你的字段名和嵌套层级,一致性立刻上来了。
技巧三:枚举值写进提示词
字段取值范围有限时,把枚举写死:「status 字段只能是 pending、done、failed 三者之一」。这比事后校验省事得多。
技巧四:温度调低
创造性任务可以高温,结构化任务请把 temperature 降到 0~0.3。同一个提示词,低温下输出格式的稳定性显著更好。
技巧五:校验失败时,把错误喂回去重试
程序里包一层校验:JSON.parse 失败时,把报错和上一轮输出一起发回去,附一句「你上次的输出不是合法 JSON,请修正后重新只输出 JSON」。一次重试能解决绝大多数偶发问题。
一个完整的可抄模板
你是一个数据提取引擎。从下面的文本中提取商品信息。
要求:
1. 只输出合法 JSON,不要解释、不要 markdown 代码块
2. 结构:{"items": [{"name": "string", "price": "number", "tags": ["string"]}]}
3. price 为数字(单位元),tags 取值只能是 ["食品","日用","电子","其他"]
4. 提取不到的字段用 null,不要编造
文本:{{粘贴文本}}
配合本站的 JSON 格式化与校验 工具,粘贴出来先验一遍,再进程序。
三个最常见的坑
坑一:中文引号。 模型偶尔会输出 "name"(弯引号)而不是 "name"(直引号),JSON.parse 直接报错。提示词里加一句「所有引号使用英文直引号」能压住大半。
坑二:字段漂移。 问它十次,字段名从 price 漂成 priceYuan、unit_price。解法还是字段示例——示例里怎么写,它就怎么抄。
坑三:把数组当对象。 你要的是 [{...}],它包了一层 {"items": [{...}]}。在提示词里直接贴出最外层的完整结构(含最外层的括号),让示例「从第一个字符开始正确」。
三个坑都踩过一遍之后你会发现:与其修输出,不如把示例写得足够死。
小结
稳定 JSON 的本质是「把选择权收走」:字段给示例、取值给枚举、措辞下军令、参数调低温、失败带报错重试。五招齐上,输出稳定性可以到九成以上。