讓 AI 穩定輸出 JSON 的提示詞(JSON Schema 約束、字段說明與示例、缺失值規則、程序端校驗與失敗重試)
需要讓大模型輸出程序能直接解析的 JSON(資訊抽取、分類打標、生成配置),卻經常遇到多了解釋文字、字段名不對、類型錯誤、格式殘缺時用:AI 幫你設計 JSON Schema 和對應的提示詞,說明何時應改用 API 的結構化輸出功能,並給出程序端的校驗與重試代碼。
通用大模型 對話模型通用
你是一名構建大模型應用的工程師,負責讓模型穩定地輸出結構化數據。請幫我設計 JSON 輸出方案。 - 任務:[任務](例:從客服對話中抽取問題類型、訂單號、用戶訴求、情緒) - 期望的字段(名稱、類型、含義、是否必填): [字段說明] - 調用方式:[調用方式](例:通過 API 調用,或在聊天介面手工使用) - 使用的模型或平台:[模型或平台] - 程序端語言:[程序語言](例:Python、TypeScript) 請輸出: 1. JSON Schema:類型、必填字段、枚舉值、取值範圍、字符串格式;不允許出現未定義的字段;能用枚舉的不用自由文本。 2. 方案選擇: - 如果平台支持結構化輸出或函數調用(工具調用)並能直接傳入 Schema,優先使用,這是最穩定的方式;說明在我的平台上如何使用(以平台官方文檔為準); - 不支持時,用提示詞約束(下面第 3 點)加程序端校驗與重試。 3. 提示詞: - 明確要求「只輸出 JSON,不要任何解釋、前言或代碼塊標記」; - 給出 Schema 或字段說明,以及一個完整的示例輸出; - 缺失值規則:資訊不存在時填 null,不要猜測或編造;不確定時的處理方式(例如增加置信度字段); - 需要推理的任務,可以先讓模型在一個說明字段中寫簡短理由,再給結論字段——但要權衡這會增加長度。 4. 程序端: - 解析前清理常見的多餘內容(代碼塊標記、首尾空白); - 用 Schema 校驗(給出所用的校驗庫); - 校驗失敗時,把錯誤訊息連同原輸出發回模型要求修正,最多重試 2 次;仍失敗時記錄並走兜底邏輯。 5. 測試用例:資訊缺失、多個候選值、輸入很長、輸入與任務無關,這幾種情況下的期望輸出。
高亮處換成你自己的內容:[任務]、[字段說明]、[調用方式]、[模型或平台]、[程序語言]
ChatGPT Plus 充值
已被複製 0 次
使用說明
怎麼填變量:[字段說明] 要寫清每個字段的含義和取值範圍,例如「問題類型:只能是退款、物流、質素、其他之一」。[調用方式] 很關鍵:通過 API 調用時,大多數主流平台都提供結構化輸出或工具調用功能,可以直接約束輸出格式,比單純靠提示詞可靠得多。
常見坑:
- 只在提示詞裏寫「請輸出 JSON」,模型偶爾加一句「好的,以下是結果」,或者把 JSON 包在代碼塊裏,程序直接解析失敗。
- 沒有規定缺失值怎麼處理,模型為了「填滿」字段會編造訂單號、日期。明確要求不存在就填 null。
- 只靠提示詞、沒有程序端校驗,偶發的格式錯誤會直接導致線上報錯。始終要校驗,並準備好重試與兜底。
- 一些平台的新模型已不再支持通過「預先填寫回答開頭」來強制格式,應改用結構化輸出功能或明確的指令(以平台文檔為準)。
追問技巧:追問「這個 Schema 用在批量處理 1 萬條數據時,怎麼統計失敗率並抽樣人工檢查」。
示例輸出
示例,僅供參考(節選)
json
{
"type": "object",
"properties": {
"issue_type": { "type": "string", "enum": ["退款", "物流", "質素", "其他"] },
"order_id": { "type": ["string", "null"], "pattern": "^O\\d{12}$" },
"user_request": { "type": "string", "maxLength": 100 },
"sentiment": { "type": "string", "enum": ["正面", "中性", "負面"] }
},
"required": ["issue_type", "order_id", "user_request", "sentiment"],
"additionalProperties": false
}
python
import json, jsonschema
def parse_with_retry(call_model, prompt, schema, retries=2):
text = call_model(prompt)
for attempt in range(retries + 1):
try:
data = json.loads(text.strip().removeprefix("json").removesuffix("").strip())
jsonschema.validate(data, schema)
return data
except (json.JSONDecodeError, jsonschema.ValidationError) as e:
if attempt == retries:
raise
text = call_model(f"{prompt}\n\n你上一次的輸出:\n{text}\n\n校驗錯誤:{e}\n請只輸出修正後的 JSON。")同款作品
用這條提示詞做出來的作品;原作者會因此獲得積分
還沒有同款,來做第一個。


0 條評論
還沒有評論,來搶沙發~