大模型输出格式总是不听话?用“输出格式示例”一招驯服
JSON格式 | 数组输出 | 格式约束 | 告别随机抽风
你有没有遇到过这种情况:
在工作流里用大模型节点,明明提示词写得很清楚“输出JSON格式”,它却给你一段带解释的纯文本。或者你让它输出一个数组,它却输出一个对象。更崩溃的是,同一个提示词,10次运行有3次格式正确、7次乱七八糟。
这不是你的问题,是大模型“随性”的天性。
大模型本质上是“文字接龙”模型,它会根据概率“猜”下一个字。即使你给它格式约束,它也可能“觉得”加一段解释更自然。
今天这篇文章,我就教你一个不用改代码、不用写复杂正则的方法:用“输出格式示例”让大模型100%乖乖按格式输出。
📌 本文解决什么问题?
— ✅ 大模型应该输出JSON,却返回带解释的纯文本
— ✅ 要求输出数组,却返回对象(或反过来)
— ✅ 同一个提示词,输出结果格式不一致,无法稳定解析
— ✅ 想让大模型严格按照指定的字段名输出
读完这篇文章,你会掌握一个简单但极其有效的技巧,让大模型变得“规规矩矩”。
一、问题重现:大模型的“任性”输出
1.1 场景:提取用户信息
假设你有一个大模型节点,任务是:从用户输入中提取姓名和年龄,输出JSON。
提示词:
```
从用户输入中提取姓名和年龄,输出JSON格式,例如:{"name": "张三", "age": 25}
```
用户输入:“我叫李四,今年30岁。”
1.2 大模型的几种“任性”输出
— 类型一(带解释):
```
好的,这是您需要的JSON:
{"name": "李四", "age": 30}
```
→ 前面多了“好的,这是您需要的JSON:”,不是纯JSON。
— 类型二(换行乱入):
```json
{
"name": "李四",
"age": 30
}
```
→ 虽然内容是JSON,但多了换行和缩进,如果后续节点用`json.loads()`解析,会报错(因为`json.loads`接受带换行的字符串,其实可以,但很多人不知道;关键问题是前面的解释文本)。
— 类型三(字段名变化):
```json
{"user_name": "李四", "user_age": 30}
```
→ 字段名和约定的`name`、`age`不一致。
— 类型四(非JSON):
```
姓名:李四,年龄:30
```
→ 完全不是JSON。
后果:后续的代码节点或插件节点因为解析失败,整个工作流报错中断。
二、根本原因:大模型不懂“约束”,只懂“模仿”
大模型不是编译器。你给它“输出JSON”,它知道JSON长什么样,但它不知道“除了JSON什么都不要输出”。
它看到训练数据里很多示例都是“好的,这是您需要的JSON:{...}”,所以它“觉得”这样更完整、更礼貌。
解决办法:给大模型看一个“完美示例”,明确告诉它:只输出这个格式,不要多一个字。
三、解决方案:在提示词中嵌入“格式示例”
3.1 错误写法(无效)
```
输出JSON格式。
```
太模糊,大模型不知道“严格到什么程度”。
3.2 正确写法(有效)
```
请严格按照以下格式输出,不要有任何额外的解释、标记或空格:
{"name": "李四", "age": 30}
注意:只输出上面的内容,不要输出其他任何字符。
```
关键点:
— 用一个具体的例子展示格式。
— 明确指令:“不要有任何额外的解释”。
— 把格式示例放在单独一行,用代码块包裹更佳(但不是必须)。
3.3 针对数组输出的示例
如果你需要大模型输出数组:
```
请严格按照以下格式输出一个数组,不要有任何额外的文字:
["北京", "上海", "广州", "深圳"]
只输出上面的内容,不要输出序号、不要换行、不要解释。
```
3.4 针对复杂JSON的示例
如果需要输出更复杂的嵌套结构:
```
请严格按照以下JSON格式输出,不要有任何额外的解释:
{
"city": "北京",
"weather": {
"temp": 25,
"condition": "晴"
},
"recommendations": ["故宫", "长城"]
}
只输出上面的内容,不要输出任何其他字符。
```
四、进阶技巧:在提示词中使用变量示例
如果你的输出内容依赖于输入变量,可以在提示词中用占位符,然后在示例中写虚构值。
例如,你想让大模型根据用户输入生成一个包含`name`和`age`的对象:
```
用户输入:{{user_input}}
请严格按照以下JSON格式输出,不要有任何额外的解释:
{"name": "张三", "age": 25}
注意:只输出JSON,不要输出其他内容。用实际提取的值替换示例中的"张三"和25。
```
大模型会“模仿”示例的结构,用实际提取的值填充。
五、为什么这种方法有效?
大模型的工作原理是预测下一个最可能的字符序列。
当你给它一个精确的示例,并且明确要求“只输出这个,不要其他”,它在生成时,看到“{”就会倾向于继续生成完整JSON,而不是先输出“好的”。
5.1 对比实验
| 提示词方式 | 成功率(稳定输出纯JSON) |
| “输出JSON格式” | 约60% |
| “输出JSON,不要有其他内容” | 约75% |
| “输出JSON,示例:{"name":"张三"}” | 约85% |
| “输出JSON,示例:{"name":"张三"},只输出这个,不要解释” | 约95% |
数据来自个人经验,非官方统计,但趋势明显。
5.2 边界情况
即使这样,大模型偶尔还是会“抽风”。如果仍然不稳定,可以在工作流后面加一个代码节点,用`json.loads()`尝试解析,如果失败则抛出友好错误或重试。
但绝大多数情况下,加上示例就够了。
六、实战:修复一个经常报错的智能体
6.1 问题背景
你的旅游规划工作流中有一个大模型节点,任务是:根据用户输入的日期范围,输出开始日期和结束日期(JSON格式)。
原来的提示词:
```
从用户输入中提取开始日期和结束日期,格式为YYYY—MM—DD,输出JSON。
```
运行10次,有3次输出类似:
```
好的,开始日期是2026—06—01,结束日期是2026—06—03。
```
导致后续节点无法解析。
6.2 修复后的提示词
```
用户输入:{{user_input}}
请严格按照以下JSON格式输出,不要有任何额外的解释、空格或换行:
{"start_date": "2026—06—01", "end_date": "2026—06—03"}
注意:只输出上面的内容,不要输出其他任何字符。用实际解析出的日期替换示例中的值。
```
6.3 效果
修改后,连续测试20次,全部输出正确的纯JSON格式。再也没报错过。
七、避坑清单
| 问题 | 原因 | 解决方法 |
| 大模型仍然输出解释文字 | 示例不够明确 | 在示例前加上“只输出下面的内容,不要有任何解释” |
| 输出的JSON有换行 | 示例中没写换行,但大模型自动加了 | 在示例中明确写成单行,或后期用代码节点替换换行符 |
| 字段名不一致 | 示例中的字段名和实际提取的不一样 | 确保示例中的字段名就是你想要的最终字段名 |
| 输出的JSON用双引号但值是数字时却用了引号 | 大模型不确定数字是否需要引号 | 示例中数字不要加引号:{"age": 25} 而不是 {"age": "25"} |
| 输出的JSON带了Markdown代码块标记(```json) | 大模型觉得这样更规范 | 在指令中明确说“不要用代码块包裹” | | ||
八、写在最后
今天这篇文章只讲了一件事:给大模型看例子。
这可能是整个工作流开发中,投入产出比最高的技巧。不需要写代码,不需要复杂配置,只需要在提示词里多加几行示例。
你被大模型的“任性”输出坑过多少次?欢迎评论区分享你的惨痛经历,我会继续写文章帮你排雷。
下一篇预告:很多人问“工作流里的消息节点为什么有时候不显示?有时候显示两次?”——下一篇,我们讲消息节点的正确姿势:避免重复发送和位置错误。
如果觉得本文有帮助,点赞、收藏、关注,更新会第一时间推送。
柒柒
更多推荐
所有评论(0)