什麼是 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。即使語法正確,內容也可能不符合業務規則。
因此,程式至少還要檢查兩件事:
- 輸出能不能由 JSON parser(解析器)解析;
- 欄位、型別、允許值和業務規則是否正確。
如果平台支援 Structured Outputs(結構化輸出)或 JSON Schema(JSON 結構描述),可以優先使用平台提供的結構約束。但具體支援範圍會變化,仍要以所用介面的官方文件為準。
注意: 上面的學生資料全都是虛構範例。不要為了練習,把真實兒童住址、身分證明、健康資訊或其他敏感資料提交給模型。
JSON 讓結果更容易進入程式,但真正的可靠性來自:欄位定義清楚、未知值不亂猜、程式負責驗證、例外有人處理。
上一章: 結構化 Prompt 範本與技巧
下一章: 善用 XML 標籤