让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模板"获取可直接使用的提示词模板文件。
夜雨聆风