專項練習 · 10 分鐘閱讀

Python 提示詞驗證練習:JSON、結構與安全

模型只是 AI 功能的一部分。週圍的 Python 決定輸入什麼、輸出是什麼形狀,以及回應錯誤時怎麼辦。這些練習建構驗證層,避免壞回應變成壞操作。

把輸出契約寫清楚

把任務和要求的 JSON 結構放在一個模板裡。寫清欄位名、型別,以及無法回答時怎麼做。契約要短到人類可以審查、測試可以執行。

template = "Return JSON with title and minutes for a lesson about {topic}."
prompt = template.format(topic="loops")
print(prompt)

這是契約,不是願望

用 json.loads 解析

被說明文字或 Markdown 包裹的回應不是合法 JSON。嚴格解析,捕獲 JSONDecodeError,並保留原始文字用於偵錯。絕不要使用 eval:模型輸出是不可信輸入。

import json

raw = '{"title": "Loops", "minutes": 12}'
try:
    data = json.loads(raw)
except json.JSONDecodeError:
    data = None
print(data)

嚴格解析

驗證鍵、型別和範圍

解析成功也可能內容錯誤。檢查必需鍵、期望型別和合理範圍。回傳錯誤列表,而不是在頁面渲染深處拋例外,讓呼叫方決定重試還是回退。

required = {"title": str, "minutes": int}
data = {"title": "Loops", "minutes": "12"}
errors = []
for key, kind in required.items():
    if key not in data:
        errors.append(f"missing {key}")
    elif not isinstance(data[key], kind):
        errors.append(f"wrong type {key}")
print(errors)

把錯誤當成資料

在失敗前設計回退

提前決定解析或驗證失敗後怎麼辦:用更短的提示詞重試一次、顯示安全預設值,還是交給人工。不要靜默編造缺失欄位。記錄失敗類別,但不要記錄密鑰。

def validate(data):
    if not isinstance(data, dict):
        return ["not an object"]
    if "title" not in data:
        return ["missing title"]
    return []

print(validate({"minutes": 12}))
print(validate({"title": "Loops"}))

可預測的失敗路徑

不要把密鑰和個人資料放進去

提示詞裡不要放 API 密鑰、密碼、隱私記錄或不必要的個人資料。檢索文字中的指令是不可信內容,不是呼叫工具的授權。影響重大的決定要保留人工覆核和審計記錄。

record = {"name": "Ada", "email": "ada@example.com", "topic": "loops"}
safe = {key: value for key, value in record.items() if key != "email"}
print(safe)

提示前先最小化

你的練習清單

常見問題

可以讓模型回傳 JSON 然後直接相信嗎?

不能。要求 JSON 之後還要解析和驗證。模型可能回傳合法 JSON 卻欄位錯誤,也可能在物件外包一層說明文字。

應該無限自動重試嗎?

不應該。使用有上限、帶退避的重試和明確回退。無限重試增加成本,還會掩蓋持續存在的結構問題。

提示詞注入只是聊天機器人的問題嗎?

不是。任何讀取不可信文字、又能觸發工具或資料存取的模型,都需要在內容和權限之間建立邊界。

練習提示詞驗證

12 道題,覆蓋模板、JSON 解析、結構驗證、回退和隱私。

打開練習

繼續閱讀: