我們的小章魚 SDK 爆掉了。
小章魚是一套防禦 prompt injection 的工具。prompt injection 是指把惡意指令偽裝成一般訊息,騙 AI 照做的攻擊。這次我只測試第一層 Input Guard(輸入守門員,訊息進到 AI 之前的第一道檢查)。
我的測試順序是這樣的:
deepset/prompt-injections。這份資料集總共 662 筆(訓練集 546 筆、測試集 116 筆),其中 263 筆是攻擊,其餘 399 筆是正常訊息。結果馬上爆掉:Recall(召回率)0.13、Precision(精確率)0.97、F1(綜合成績)0.22。
Recall(召回率):抓到惡意攻擊的能力。
Recall = 抓到的惡意攻擊數 ÷ 所有惡意攻擊總數
0.13 代表 263 筆攻擊裡,我只抓到大約 34 筆,剩下 87% 全部放行。⚠️ Recall 太低,就是非常嚴重的漏報。
Precision(精確率):被攔下來的訊息裡,有多少真的是攻擊。
Precision = 真的是惡意攻擊的數量 ÷ 被攔下的總數
0.97 代表我攔下的幾乎都是真的攻擊,很少誤傷正常訊息。
兩個數字合起來看:我的防禦一旦出手,幾乎都是對的,但它出手的次數太少了。大部分攻擊,它根本沒認出來。
F1:把 Recall 和 Precision 平衡後的綜合成績。
F1 = 2 × (Precision × Recall) ÷ (Precision + Recall)
算出來 0.22,相當於總分 22 分。
回頭看,內部的 100 分不是假的,只是那份考卷是我自己出的。測試題是 Claude 寫的,防禦規則也是 Claude 寫的,等於同一個腦袋出題、同一個腦袋作答。規則認得的句型,剛好就是測試題會出現的句型,分數當然漂亮。⚠️
外部資料集是別人出的題,攻擊的寫法、語言、手法都不在我的預期裡,真正的程度就露出來了。
我用的流程很像準備模擬考:
.bakN(N 是第幾版,改壞了可以退回)。 就像寫新的練習題,同時保留舊考卷方便比較。我的習慣是一次只改一個變因,patch 盡量小。這樣分數動了,我才知道是哪一個修改造成的。
改到一半,我發現一件事:我一直拿同一份考卷重考。分數上升,可能只是我把這份考卷的答案背起來了,而不是防禦真的變強。
這跟內部測試拿 100 分,其實是同一個錯誤。我差點再犯一次。
下一篇,我會打開錯題本:漏掉的那 87% 攻擊到底長什麼樣子,以及我怎麼避免再背一次答案。