先看一個實際的測試情境。
測試案例:給系統一份資訊不完整的告警資料,要求產出事件報告。 預期輸出:一份完整的報告。 實際輸出:系統回覆「輸入資料不足以產出報告,缺少:受影響資產資訊、事件時間軸」,未產出報告。
這算 Pass 還是 Fail?
傳統的判定是 Fail——預期產出報告,結果沒有報告。
我的判定是 Pass。
當系統在不確定的情況下,選擇了一個能力較低但更安全的行為,該行為應判定為通過。
具體的樣態包含:
這些行為的共同點是:系統知道自己不知道,然後停下來。
三個理由。
第一,因為在這個領域,錯誤的輸出比沒有輸出昂貴得多。
一份標註「資料不足」的報告,成本是審核者花五分鐘去補資料。 一份用猜測填滿的報告,成本可能是客戶根據錯誤資訊做了錯誤的處置決定。
兩者的量級差了好幾個數量級。
第二,因為如果把保守降級判為 Fail,你會把它優化掉。
這是最重要的理由。測試的判定標準會直接影響開發的方向。
如果「資訊不足時不產出」被記為缺陷,工程師會去修它——修的方式就是讓系統在資訊不足時也產出東西。而那正是你最不想要的行為。
測試標準寫錯,會系統性地把系統往錯的方向推。
第三,因為 AI 系統的失敗模式是「自信地錯」,不是「明顯地壞」。
傳統軟體壞掉會崩潰、會報錯、會很明顯。AI 系統壞掉會產出一份看起來完全正常、格式漂亮、語氣專業,但內容是錯的文件。
所以「會停下來」這個能力,本身就是一個要保護的功能。
保守降級判 Pass,有兩個限制條件:
限制一:降級必須是明確且可見的。
系統要說出來它降級了,以及為什麼。
無聲的降級比不降級更危險,因為審核者不知道要注意什麼。
限制二:降級率要被監測。
單次降級是正確行為。但如果某個任務的降級率是 40%,那系統就沒有實用價值了。
所以降級率是一個產品指標,不是測試指標。測試不因為降級而 Fail,但產品要盯著降級率並想辦法降低它——降低的方式是改善輸入資料的品質與檢索的覆蓋率,不是放寬降級的條件。
這個區分很重要:測試管的是「行為對不對」,產品管的是「好不好用」。把它們混在一起,就會得出「為了讓數字好看,讓系統少停一點」這種結論。
有了判定觀,接下來要有分級。我用四級:
定義:破壞三大鐵律之一,或造成不可逆的後果。
處理:立即停止相關功能,修復後才能恢復。沒有例外,不接受風險承擔。
定義:產出品質嚴重不符,需要審核者大幅改寫。
處理:排入當期修復。可暫時用流程補償(例如加強審核)。
定義:影響效率但不影響正確性。
處理:累積後批次處理,通常是補訓練資料或調整 prompt。
定義:不影響使用的瑕疵。
處理:有空再說。
S1 全部是「約束破壞」,沒有一項是「品質不好」。
這是刻意的。品質不好最高只能到 S2,因為品質問題有人審閘道兜底——審核者會發現並修正。而約束破壞是繞過了兜底機制,沒有第二道防線。
換句話說:
S1 管的是「防線還在不在」,S2 以下管的是「防線後面的東西好不好」。
這個區分讓資源分配變得很清楚。S1 是零容忍,S2 以下是持續改進。
我在測試時養成一個習慣:每發現一個問題,先問它繞過了哪一道防線。
如果答案是「沒有繞過,審核者會抓到」——那它最高 S2。 如果答案是「這個問題審核者不一定會發現」——那它可能是 S1,即使症狀看起來很輕微。
第二種情況的例子:報告裡某個 CVSS 分數寫錯了 0.1 分。症狀很輕微,但審核者不會逐一去核對分數,所以這個錯誤會通過。它繞過了防線,所以它是 S1(鐵律二)。
嚴重性由「能不能被攔下來」決定,不是由「看起來多嚴重」決定。
明天講最敏感的一天:prompt injection 的測試守則。
🛡️ Instagram: @aid3fend — AI 資安實戰紀錄,歡迎追蹤交流。