提示工程 · 結構化輸出

讓模型輸出 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 結構描述),可以優先使用平台提供的結構約束。但具體支援範圍會變化,仍要以所用介面的官方文件為準。

注意: 上面的學生資料全都是虛構範例。不要為了練習,把真實兒童住址、身分證明、健康資訊或其他敏感資料提交給模型。

JSON 讓結果更容易進入程式,但真正的可靠性來自:欄位定義清楚、未知值不亂猜、程式負責驗證、例外有人處理。

上一章: 結構化 Prompt 範本與技巧

下一章: 善用 XML 標籤

Luffy Liu
Luffy Liu

Independent product builder · AI, agents and real workflows.