你叫 AI 幫你把一堆訂單整理成表格,第一次它乖乖回你漂亮的 JSON,第二次卻多了一段「好的,以下是整理結果」,第三次欄位名又自己改成英文——只要你想把 AI 的回答直接餵進系統、試算表或自動化流程,這種「格式每次都跑掉」的問題就會讓你抓狂。
這篇要解決的問題:怎麼設計 Prompt,讓 AI 每次都穩定輸出可被程式解析的結構化資料(JSON、表格、固定欄位)? 適合誰讀:想把 AI 接進自動化、營運報表、客服系統的營運、行銷、工程與一人公司工作者。 讀完你會得到:一套可重複使用的結構化輸出設計法、可複製的 Prompt 與 Workflow 流程圖,以及一個台灣團隊導入前後的真實對照。
為什麼結構化輸出這麼重要?
對話框裡,AI 回得漂不漂亮你一眼就看得出來;但當你要把 AI 接到下游系統——例如自動寫進 Google 試算表、觸發 n8n 流程、塞進資料庫、餵給另一個 AI Agent——「漂亮」沒有意義,「格式正確、欄位穩定、機器讀得懂」才有意義。
差別在於對象換了。聊天時的讀者是人,人可以容忍多一句廢話、欄位順序換一下;但程式不行。程式期待的是一份契約:欄位叫什麼、是什麼型別、有沒有可能是空的,全部都要事先講好。只要 AI 某一次自作主張多包一層、或把數字寫成「約三千」,你的自動化流程就會在半夜默默解析失敗、整條斷掉。
這也是很多人「AI 自動化做不起來」的真正原因:不是模型不夠聰明,而是輸出不可預測。把輸出穩定下來,AI 才從「好玩的玩具」變成「可上線的零件」。
核心概念:把 AI 當成「會偶爾手滑的 API」
理解結構化輸出,最有用的比喻是:把 AI 想成一個很厲害、但偶爾會手滑的 API。
一般的程式 API,你給它什麼參數、它回你什麼格式,幾乎百分之百固定。AI 不是——它是機率性生成文字的模型,沒有約束時,它會憑「語感」幫你補東西。所以你的工作,就是把這個「會手滑的 API」用各種手段收斂到接近確定。
收斂的手段大致分三層,由弱到強:
| 收斂手段 | 做法 | 可靠度 | 適用情境 |
|---|---|---|---|
| 純文字描述 | 在 Prompt 裡用文字說「請回傳 JSON,包含 a、b、c」 | 低 | 快速試做、一次性任務 |
| 範例鎖定(few-shot) | 直接給一兩個完整輸出範例讓它照抄 | 中 | 大多數日常自動化 |
| 結構化輸出 / JSON 模式 | 用模型內建功能,在解碼階段強制合法 JSON 或符合 schema | 高 | 正式上線、串接系統 |
一句話:能用結構化輸出功能就用,不能用時就靠範例+明確規則把格式逼出來,最後一定要在程式端驗證。 不要只靠「拜託 AI」這一層。
關於用範例鎖定格式的更多技巧,可以延伸閱讀 ChatGPT Prompt 寫作指南。
實際教學:五步驟設計穩定的結構化輸出
Step 1:先定義輸出的資料結構,再寫 Prompt
最常見的錯誤是「先叫 AI 做,再來收拾格式」。正確順序相反:先問下游系統要吃什麼。
打開你的試算表或資料庫,把欄位列出來,每個欄位想清楚三件事:欄位名(建議全用英文小寫、底線分隔,避免中文當 key)、型別(字串、數字、布林、陣列)、是否可為空。例如要整理客戶詢問:
order_id(字串,必填)
customer_name(字串,必填)
amount(數字,可為 null)
status(字串,只能是 new / processing / done)
這份清單就是你的 schema,後面所有 Prompt 都圍著它寫。
Step 2:用範例鎖定格式(few-shot)
與其用一長串文字描述格式,不如直接給一個完整範例讓 AI 照抄。模型很擅長模仿結構,給範例的穩定度遠高於純口頭描述:
範例輸出(請完全照這個結構):
{"order_id": "A1001", "customer_name": "林小姐", "amount": 3200, "status": "new"}
如果欄位有「允許值」(像 status 只能三選一),務必在範例之外再用文字明訂,避免 AI 自己發明新值。
Step 3:明令「只輸出資料」,砍掉一切多餘文字
AI 預設很愛當好人,前面加「好的,以下是…」、後面補「希望對你有幫助」、甚至把 JSON 包進 ```json 程式碼框。這些對人友善,對程式全是雜訊。
在 Prompt 結尾加上一段硬規則:
輸出規則:
- 直接輸出 JSON,不要任何說明文字、前言或結語
- 不要使用 Markdown 程式碼框(不要 ```)
- 第一個字元必須是 {,最後一個字元必須是 }
Step 4:預先規定缺漏與不確定怎麼處理
真實資料一定有缺漏。如果你不講,AI 會自由發揮——有時省略整個欄位(害你的程式找不到 key 而報錯)、有時自己填「未提供」這種你沒約定的字串。
事先講死:「資料不存在時,數字欄位填 null、文字欄位填空字串,欄位一律保留、不可省略。」這一句話能擋掉大量解析錯誤。
Step 5:在程式端驗證並建立重試迴圈
最後一道防線在程式,不在 Prompt。拿到 AI 輸出後,用 schema 驗證(型別對不對、必填欄位在不在、status 是否在允許值內)。一旦驗證失敗,不要直接報錯給使用者,而是把「錯誤訊息+原始輸出」回丟給 AI,請它修正後重試一次。這個「驗證失敗就帶錯誤回去重生」的迴圈,是讓自動化穩定上線的關鍵。
想讓這套流程接上真實工具與資料源,可以參考 MCP 是什麼?讓 AI Agent 連上工具 與 RAG 是什麼?讓 AI 引用你的資料。
範例:Prompt 與 Workflow
可複製的 Prompt 範本
你是一個資料擷取引擎。你的任務是把使用者提供的客戶詢問訊息,轉成固定格式的 JSON。
【輸出 schema】
{
"order_id": 字串,訂單編號,若無則填空字串,
"customer_name": 字串,客戶稱呼,若無則填空字串,
"amount": 數字,金額(純數字,不含貨幣符號),若無則填 null,
"status": 字串,只能是 "new" / "processing" / "done" 三者之一,無法判斷時填 "new",
"summary": 字串,一句話摘要這則詢問
}
【範例輸出】
{"order_id": "A1001", "customer_name": "林小姐", "amount": 3200, "status": "new", "summary": "詢問訂單到貨時間"}
【輸出規則】
- 直接輸出單一個 JSON 物件,不要任何說明文字、前言或結語
- 不要使用 Markdown 程式碼框,不要出現 ```
- 所有欄位一律保留,不可省略;缺資料依 schema 規定填 null 或空字串
- 字串值內避免使用雙引號,必要時改寫
【待處理訊息】
{在此貼上客戶訊息}
Workflow 流程圖(文字版)
[來源訊息 / 表單 / Email]
│
▼
[組裝 Prompt:schema + 範例 + 規則]
│
▼
[呼叫 AI(盡量開啟 JSON 模式 / 結構化輸出)]
│
▼
[程式清洗:去掉多餘文字與 ``` 標記]
│
▼
[用 schema 驗證型別與允許值]
│
┌────┴────┐
▼ ▼
通過 失敗
│ │
│ ▼
│ [帶錯誤訊息回丟 AI 修正,重試一次]
│ │
▼ ▼
[寫入試算表 / 資料庫 / 觸發下一個流程]
這條流程的精神是:AI 負責理解與抽取,程式負責把關格式。兩邊各做自己擅長的事,自動化才跑得久。
常見錯誤
- 只靠 Prompt 拜託、不在程式端驗證:再完美的 Prompt 都有失手的一天,沒有驗證與重試,遲早在半夜斷線。
- 用中文當 JSON 的 key:欄位名用中文容易踩到編碼與相容性問題,key 一律用英文小寫加底線,中文放在值裡就好。
- 沒規定缺漏處理,欄位時有時無:AI 省略欄位是解析失敗的頭號元兇,務必明訂「欄位一律保留」。
- 巢狀結構塞太深一次到位:欄位多、層級深時,AI 漏欄位的機率暴增。拆成多段產生或先扁平化再組裝會穩很多。
- 忘了砍掉 ``` 與前後綴:很多人 Prompt 寫了不要程式碼框,AI 還是加。程式端一定要做一層清洗,別假設 Prompt 百分百生效。
- 允許值沒寫死:像 status 這種只能幾選一的欄位,沒明訂允許值,AI 會發明你系統不認得的新值。
最佳實務
- 能用結構化輸出功能就用:許多主流模型已支援 JSON 模式或依 schema 強制輸出,可靠度遠勝純 Prompt,正式上線優先採用。
- Prompt 講語意,系統管格式:用 Prompt 把每個欄位的意義講清楚,用 JSON 模式與程式驗證保障格式合法,兩者分工。
- 範例優於描述:給一個完整輸出範例,比寫三段文字說明更能鎖定結構。
- 欄位語意明確、型別寫死:每個欄位都註明型別、是否必填、允許值,把模糊空間降到最低。
- 建立自我修復迴圈:驗證失敗時自動帶錯誤訊息重試,是低成本卻高效的穩定性提升。
- 保留原始輸出做日誌:解析失敗時記下 AI 的原始回應,方便除錯與持續優化 Prompt。
- 拆解複雜結構:與其一次生出深層巢狀,不如分段產生再由程式組裝,準確率更高。
實際案例:台灣電商客服的詢問自動分類
情境:一家位於台中的中小型電商,每天 LINE 與 Email 進來上百則客戶訊息,過去由兩位客服人員手動判讀,再貼到 Google 試算表分類,標上「訂單查詢/退換貨/一般詢問」與處理狀態,供主管追蹤。
導入前:每則訊息平均要花 1 分多鐘讀懂、分類、貼進表格;尖峰時段訊息塞車、欄位常漏填,主管的儀表板數字對不起來,月底還要花半天人工校正。
導入後:團隊用上面這套結構化輸出 Prompt,把每則訊息丟給 AI,要求輸出固定 JSON(類別、緊急程度、一句話摘要、建議回覆方向),程式端用 schema 驗證,失敗就自動帶錯誤重試一次,通過就寫進試算表並觸發 n8n 流程分派給對應客服。關鍵動作(例如標記為退款)仍保留人工確認。
成果數據:
| 指標 | 導入前 | 導入後 |
|---|---|---|
| 單則訊息分類耗時 | 約 70 秒(人工) | 約 5 秒(自動) |
| 欄位漏填 / 格式錯誤率 | 約 15% | 低於 1% |
| 月底人工校正時間 | 約半天 | 幾乎為零 |
| 客服可處理量能 | 基準 | 約提升 3 倍 |
原創觀點:這個案例最值得學的,不是「AI 很神」,而是他們花最多力氣的地方是『程式端驗證』,而不是『把 Prompt 寫得更花俏』。很多團隊以為結構化輸出是 Prompt 工程問題,拼命調字句;但真正讓它能上線的,是把 AI 當成「會手滑的 API」、在系統層補上驗證與重試這道安全網。Prompt 負責把命中率從六成拉到九成,驗證迴圈負責把剩下那一成的失誤擋在門外——兩者缺一不可,而後者常被忽略。
結論
讓 AI 穩定輸出結構化資料,本質是一場「把機率性輸出收斂成可預測契約」的工程。記住三層收斂:用範例鎖定格式、用明確規則砍掉雜訊、用程式端驗證與重試守住最後一道防線。再加上「能用結構化輸出功能就用、Prompt 講語意系統管格式、欄位型別與允許值一律寫死」這幾個原則,你就能把 AI 從對話框裡的玩具,變成自動化流程上可靠的零件。
下一步,挑一個你目前還在手動整理的資料任務——客服分類、發票擷取、表單彙整都好——照著本文的五步驟與 Prompt 範本試做一次,再用 Prompt 產生器 微調你的欄位設計。當第一條自動化流程穩定跑起來,你會發現「AI 接系統」其實沒那麼難,難的只是一開始沒人告訴你:重點不在拜託 AI,而在驗證它。
❓ 常見問題 FAQ
為什麼 AI 每次輸出的 JSON 格式都不一樣?
JSON 模式(JSON mode)和我自己寫 Prompt 要格式,差在哪?
AI 回傳的 JSON 前後常多出 ```json 標記或一段說明,怎麼辦?
欄位很多、巢狀很深時,AI 容易漏欄位或型別錯,如何處理?
中文內容輸出 JSON 會不會有編碼或標點問題?
🔗 延伸閱讀
每週把這類實戰教學寄給你
訂閱 AgentAI 智庫情報週報,新的 Prompt、AI Skills、工作流與教學第一時間收到。
免費 · 隨時取消