乐于分享
好东西不私藏

让LLM输出稳定JSON:提示词模板的黄金法则

让LLM输出稳定JSON:提示词模板的黄金法则

让LLM输出稳定JSON:提示词模板的黄金法则

问题描述

你一定遇到过这种情况:

给ChatGPT一个复杂的JSON Schema让它返回,结果:- 有时候返回纯JSON ✅- 有时候返回 markdown 代码块 ```json ❌- 有时候混入解释文字 ❌- 有时候字段名对不上 ❌

这让开发者非常头疼:LLM的输出像开盲盒,根本没法稳定解析

本文将分享一套经过实战验证的提示词模板,让LLM输出99%稳定的JSON结果。

根因分析

LLM输出不稳定的原因:

1. 缺少明确的格式约束2. 没有给出输出示例3. 没有建立输出与输入的对应关系4. 没有处理边界情况

LLM本质上是在"猜"你想让它输出什么。你给的信息越精确,它猜得越准。

解决方案

步骤1:使用结构化指令

这是最基础但最有效的一步:

你是一个JSON生成器。你的输出必须满足以下要求:1. 输出格式:纯JSON,不包含任何解释、备注或markdown标记2. 编码格式:UTF-83. 换行处理:不使用不必要的换行4. 字段控制:如果字段无值,使用 null 而不是空字符串

原理:明确告诉LLM"不是什么",比只说"是什么"更有效。

步骤2:提供完整的Schema定义

{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","required":["status","data"],"properties":{"status":{"type":"string","enum":["success","error"],"description":"请求状态"},"data":{"type":"object","properties":{"id":{"type":"integer","description":"用户ID,必须为正整数"},"name":{"type":"string","minLength":1,"maxLength":50,"description":"用户名称"},"tags":{"type":"array","items":{"type":"string"},"description":"标签列表,允许为空数组"}}},"error":{"type":"object","nullable":true,"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}

关键点:Schema中的description字段非常重要,它告诉LLM每个字段的约束条件。

步骤3:提供正向和负向示例

示例比规则更直观:

## ✅ 正确示例输入:获取用户ID为123的信息输出:{"status":"success","data":{"id":123,"name":"张三","tags":["VIP","活跃"]},"error":null}## ✅ 正确示例(空数据)输入:获取一个不存在的用户输出:{"status":"error","data":null,"error":{"code":"USER_NOT_FOUND","message":"用户不存在"}}## ❌ 错误示例(不要这样输出)输出:用户信息如下:{  "status": "success",  ...}获取成功!

步骤4:使用渐进式约束

对于复杂场景,分步骤约束效果更好:

## 任务:提取文章信息请严格按照以下步骤执行:### 第一步:识别实体从文本中识别出:标题、作者、发布时间、关键词列表### 第二步:验证约束- 标题不超过30个字符- 发布时间必须是 YYYY-MM-DD 格式- 关键词数量在1-5个之间### 第三步:输出格式直接输出JSON,不包含任何中间过程描述## 附加规则- 如果原文缺少必填字段,在对应字段填入 null- 不要编造任何原文没有的信息

步骤5:处理边界情况的指令

## 边界情况处理| 情况 | 处理方式 ||------|----------|| 字段不存在 | 使用 null || 数字是浮点数 | 保留2位小数 || 文本过长 | 截断并在开头加"..." || 包含特殊字符 | 使用转义 \\ || 日期格式不对 | 尝试转换,失败则用 null |

避坑指南

1. 不要同时要求JSON和解释

# ❌ 错误写法请返回JSON并解释每个字段的含义# ✅ 正确写法  请返回纯JSON。如需说明,请查看附带的文档。

2. Schema中的枚举值要穷举

# ❌ 错误"status": {"enum": ["success"]}  # 只写了一个值# ✅ 正确"status": {"enum": ["success", "error", "pending"]}  # 穷举所有可能

3. 用强制指令而非建议语气

# ❌ 弱约束你可能想返回JSON格式# ✅ 强约束你必须返回纯JSON。你的输出将以程序方式解析,任何额外字符都会导致解析失败。

4. 复杂JSON要分步生成

如果JSON嵌套超过3层,考虑让LLM分步构建:

第一步先生成外层结构:{"basic": {...}, "details": [...]}第二步填充details数组...

总结:完整的JSON输出提示词模板

# JSON生成任务## 角色定义你是一个精确的数据转换器,只输出JSON,不输出其他任何内容。## 输出约束1. 格式:纯JSON,无markdown、无解释、无空行2. 编码:UTF-83. 字段:无值用null,不用空字符串或空数组占位## Schema定义```json{SCHEMA_HERE}

示例

输入:{INPUT_EXAMPLE}

输出:{OUTPUT_EXAMPLE}

边界处理

  • • 缺失字段 → null
  • • 超出范围 → 取边界值
  • • 格式错误 → null

使用这套模板,实测JSON解析成功率从60%提升到99%以上。


关注公众号,回复"json模板"获取可直接使用的提示词模板文件。