提示工程 · 结构化输出

让模型输出 JSON 数据

通过老师录入学生资料的递进案例,理解为什么程序需要结构化数据,以及怎样定义字段、未知值并校验 JSON。

什么是 JSON?

JSON(JavaScript Object Notation)是一种常用的数据交换格式。它使用键值对组织数据,既方便人阅读,也方便程序解析。

{
  "name": "John",
  "age": 30,
  "isStudent": false,
  "grades": [90, 85, 88],
  "address": {
    "city": "New York",
    "zipcode": "10001"
  }
}

这个例子表示一个人的姓名、年龄、学生状态、成绩和地址。

JSON 的值可以是字符串、数字、布尔值、null、数组或对象。大多数主流编程语言都提供处理 JSON 的工具,所以它经常被用来在系统之间传递数据。

但为什么要让模型输出 JSON?

我们来看一个例子。

老师的烦恼

假如我是一位小学老师。开学第一天,我让班上的小朋友写一段个人介绍,然后想把这些信息录入学生管理系统。

每个小朋友的写法肯定不一样。

我叫张三,今年 9 岁,住在幸福小区。妈妈是老师,爸爸是医生。我喜欢画画和唱歌。
我是小美,8 岁,住在梧桐花园。我最喜欢跳舞。爸爸每天都在抓坏人,妈妈在家照顾我。

我们可以让模型提取姓名、年龄、父母工作、地址和爱好。

对于张三,原文已经明确写出了父母职业。对于小美,“每天抓坏人”并不能可靠证明父亲一定是警察,“在家照顾我”也不能证明母亲的职业就是家庭主妇。

不能因为一种解释听起来合理,就把推断写成事实。

所以,一份更稳妥的结果应该把没有明确提供的字段保留为空:

姓名:小美
年龄:8 岁
父亲工作:未提供
母亲工作:未提供
家庭住址:梧桐花园
爱好:跳舞

这么看好像没问题。

但需要思考的是:假如我们要把这些数据录入学生管理系统,该怎么办?

如果只有两个学生,可以手动录入。

如果有 100 个学生呢?

这个老师怕是要累坏了。

于是,我们写一个程序,批量把模型提取的结果导入系统。

问题来了。上面的结果只是一段多行文本。程序要取姓名,可能会读取第一行;要取年龄,可能会读取第二行。

假如现在新增一个“性别”字段:

姓名:小美
性别:女
年龄:8 岁
父亲工作:未提供
母亲工作:未提供
家庭住址:梧桐花园
爱好:跳舞

原来第二行是年龄,现在变成性别,代码就可能出错。

有同学可能会想:不用第几行,直接找“年龄:”不就行了?

那假如我们还要增加父亲和母亲的年龄呢?

姓名:小美
年龄:8 岁
父亲工作:未提供
父亲年龄:未提供
母亲工作:未提供
母亲年龄:未提供
家庭住址:梧桐花园
爱好:跳舞

字段越来越多,层级也越来越复杂。继续依赖行号和文字截取,程序会越来越难维护。

根本原因是什么?

这段数据没有一个稳定、明确的结构。

用 JSON 表示层级

同样的信息可以写成:

{
  "name": "小美",
  "age": 8,
  "father": {
    "job": null,
    "age": null
  },
  "mother": {
    "job": null,
    "age": null
  },
  "address": "梧桐花园",
  "hobby": ["跳舞"]
}

现在,程序可以直接读取 name、age 或 father.job,不需要猜它们在第几行。

JSON 不是所有任务都必须使用的格式。如果结果只给人阅读,普通文本或 Markdown 往往更自然。只有当结果还要交给程序继续处理时,结构化数据才特别有价值。

怎样要求模型输出 JSON?

请从 <student></student> 中提取学生信息,并只输出一个 JSON 对象。

字段:
- name:字符串或 null
- age:数字或 null
- father_job:字符串或 null
- mother_job:字符串或 null
- address:字符串或 null
- hobby:字符串数组

规则:
- 只提取原文明确提供的信息;
- 不根据描述猜测职业;
- 未提供的单值字段写 null;
- 不要输出 JSON 之外的解释文字。

<student>
{{学生自我介绍}}
</student>

这里最重要的,不只是“返回 JSON”四个字。

我们还说明了字段、类型、缺失值和不能推断的边界。

模型说“这是 JSON”,就一定能用吗?

不一定。

它可能多输出一段解释,漏掉字段,使用错误类型,或者生成语法不合法的 JSON。即使语法正确,内容也可能不符合业务规则。

因此,程序至少还要检查两件事:

  1. 输出能不能被 JSON parser 解析;
  2. 字段、类型、允许值和业务规则是否正确。

如果平台支持 Structured Outputs 或 JSON Schema,可以优先使用平台提供的结构约束。但具体支持范围会变化,仍要以所用接口的官方文档为准。

注意: 上面的学生资料全部是虚构示例。不要为了练习,把真实儿童住址、身份证明、健康信息或其他敏感数据提交给模型。

JSON 让结果更容易进入程序,但真正的可靠性来自:字段定义清楚、未知值不乱猜、程序负责校验、例外有人处理。

上一章: 结构化 Prompt 模板与技巧

下一章: 善用 XML 标签

Luffy Liu
Luffy Liu

Independent product builder · AI, agents and real workflows.