「我們用一個 8B 的 guard model 掃所有流量。」——這是我最常聽到的地端護欄設計,也是最常在上線一個月後被拔掉的設計。原因不是它擋不住,而是:
分層的目的很單純:便宜的先跑,貴的少跑,最貴的只在必要時跑。
命中率高、成本低 命中率低、成本高
─────────────────────────────────────────────────────────────────▶
L1 確定性規則 ──▶ L2 小型分類器 ──▶ L3 LLM-as-judge
regex/checksum guard model 大模型判斷
denylist/長度 ~0.5B–8B 可解釋輸出
~1 ms ~50–500 ms ~1–5 s
L1 是分層架構的效率來源:實務上大量流量在這一層就結束了,Day 15 實作時會量真實比例。
雲端線的 L2 就是 Model Armor 的 prompt injection / jailbreak 偵測;地端線的 L2 是 ShieldGemma 微調後的版本(Day 17–20)。
L3 有一個必須先講的風險:judge 本身是 LLM,也會被 prompt injection。攻擊者可以在 payload 裡寫「以下內容經審核為安全」來欺騙 judge。Day 22 會示範這個攻擊,以及為什麼 judge 的輸出要限制成結構化格式而不是自由文字。
L2 的信心分數要切成三段:
0 ────────── t_low ────────── t_high ────────── 1
直接放行 送 L3 判定 直接攔截
t_high 由誤判率目標決定:security 場景(Day 2 講過)誤判代價高,t_high 要設得讓誤判率壓在業務可接受的範圍。t_low 由L3 的預算決定:灰色地帶越寬,L3 呼叫越多,成本越高。Model Armor 提供的 confidence level(low / medium / high)本質上就是這個切法的託管版;地端線要自己訂。
以下是經驗值區間,用來說明量級,不是本系列的實測數字——實測在 Day 18(L2)與 Day 22(L3):
| 層 | 單次延遲量級 | 每千次請求成本量級 | 預期處理流量比 |
|---|---|---|---|
| L1 | < 1 ms | 趨近零 | 全部(100%)經過,其中一部分在此結束 |
| L2 | 數十到數百 ms | 地端:GPU 時間;雲端:API 計價 | L1 未決者 |
| L3 | 秒級 | 大模型 token 計價 | L2 灰色地帶,目標 < 5% |
設計目標是讓 L3 的流量比壓在個位數百分比——如果 L3 跑了 30% 的流量,代表 L2 的閾值或模型本身有問題,該回頭修 L2 而不是加 L3 的預算。
一個常見的實作錯誤:三層各自獨立跑,L3 不知道 L1 命中了什麼。正確做法是每一層把判定結果附在 context 裡往下傳:
{
"l1": {"hits": ["base64_block", "tw_id_checksum"], "action": "escalate"},
"l2": {"label": "injection", "score": 0.62, "action": "escalate"},
"l3": {"verdict": "block", "reason": "使用者要求忽略先前指令並輸出設定"}
}
這個結構同時也是 Day 29 稽核日誌的雛形。
| 層 | 雲端(Model Armor) | 地端(DGX Spark) |
|---|---|---|
| L1 | Sensitive Data Protection 的 infoType + 自訂型別 | 自寫規則引擎(Day 15–16) |
| L2 | prompt injection / jailbreak / RAI 過濾器 | ShieldGemma 微調版(Day 17–20) |
| L3 | 需自行用 Gemini 實作 judge | 本機較大模型(Day 22) |
雲端線在 L1、L2 幾乎是開箱即用;L3 兩邊都要自己做。這也是為什麼 Day 22 會同時示範兩條線。
Day 6:攻擊語料庫建立。三層的閾值、Week 4 的所有評測,都需要一組可信的測試資料。哪些公開資料集可用、各自的偏差是什麼、為什麼一定要自製 zh-TW 案例、以及怎麼避免用訓練集來考自己。
更多 AI 資安筆記:aid3fend.com