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) | 大模型觉得这样更规范 | 在指令中明确说“不要用代码块包裹” |

 


八、写在最后

今天这篇文章只讲了一件事:给大模型看例子。

这可能是整个工作流开发中,投入产出比最高的技巧。不需要写代码,不需要复杂配置,只需要在提示词里多加几行示例。

你被大模型的“任性”输出坑过多少次?欢迎评论区分享你的惨痛经历,我会继续写文章帮你排雷。

下一篇预告:很多人问“工作流里的消息节点为什么有时候不显示?有时候显示两次?”——下一篇,我们讲消息节点的正确姿势:避免重复发送和位置错误。

如果觉得本文有帮助,点赞、收藏、关注,更新会第一时间推送。

柒柒  

更多推荐