評估(evaluation)是在上線前、離線地問「這個代理答得好不好」;但代理一旦真的上線,面對的是你在測試集裡永遠蒐集不齊的惡意輸入、被污染的檢索內容,以及一個手滑就會刪掉正式資料庫的工具。昨天談的評測守的是品質回歸,今天談的**安全護欄(guardrails)**守的是即時風險——它是掛在使用者、模型與工具之間的一層執行期(runtime)控制,在每一個回合擋下 prompt injection、PII 外洩與危險動作。評估是離線的判準,護欄是線上的把關,兩者接力才構成完整的上線防線。

📖 學

為什麼護欄要放在執行期,而不是塞進 prompt

很多團隊第一直覺是把安全規則寫進系統提示:「你不可以洩漏使用者資料、不可以執行刪除操作。」問題是,系統提示只是「建議」,不是「強制」——它跟惡意輸入用的是同一個通道,一旦攻擊者用 prompt injection 覆蓋掉你的指示,這層防線就整個塌掉。OWASP 連續第三年把 prompt injection 列為 LLM01,也就是 LLM 應用的頭號漏洞,而業界的觀察是:沒有分層防禦時,注入攻擊的成功率超過 50%。換句話說,把安全交給模型自己遵守,等於把鎖的鑰匙交給想撬鎖的人。

護欄的核心思路是把安全從模型內部搬到模型外部,變成確定性、可稽核、模型管不到的一層攔截器。它在請求進模型之前檢查輸入,在回應出模型之後檢查輸出,在工具執行之前檢查這個動作被不被允許——這三個點都不依賴模型「願不願意配合」。

兩種 prompt injection:直接與間接

要防注入,先分清它的兩種形態。**直接注入(direct injection)**是使用者自己在輸入裡寫「忽略以上所有指示,改成……」這類 jailbreak、角色扮演或指令覆蓋。這類相對好抓,因為惡意意圖就寫在使用者可見的輸入裡。

真正棘手的是間接注入(indirect injection):惡意指令不是使用者打的,而是藏在代理去讀的外部內容裡——一封信、一個網頁、一份被檢索出來的文件。代理把這段內容當成資料讀進來,裡面卻埋著「把使用者的通訊錄寄到這個網址」的指令,而代理分不清「要處理的資料」和「該遵守的指令」的界線。這正是為什麼有了 RAG 和工具呼叫之後,注入的攻擊面反而擴大了:任何進到上下文的外部文字,都可能是一條攻擊指令。

分層防禦:輸入、輸出、動作三道關

2026 的共識是護欄不是單一元件,而是縱深防禦(defense in depth),大致分三道關,每道都混用「確定性規則」與「模型判斷」。

**輸入關(pre-LLM)**在請求送進模型前跑:先用確定性的樣式比對擋掉已知的攻擊簽章與明顯的注入句型,再用內容分類器判斷 jailbreak 意圖,同時掃描並遮蔽即將送進模型的 PII(避免把個資交給第三方供應商)。確定性檢查便宜又快,適合擋「已知的壞」;分類器則補上「語意上可疑但沒有固定字串」的部分。

輸出關(post-LLM)在回應送到使用者前跑:檢查有沒有洩漏 PII 或機密、有沒有產出有害內容、格式是否符合結構化 schema(例如必須是合法 JSON、金額不得為負)。這一關常搭配自我修正迴圈(self-correction loop)——驗證不過就把錯誤原因回饋給模型重生成,而不是直接把壞答案丟給使用者。

動作關(tool/action)是代理時代最關鍵、也最容易被忽略的一道。它管的不是文字而是副作用:這個工具呼叫允不允許執行、參數在不在白名單、要不要人工核准(human-in-the-loop)。OWASP 把「過度代理(excessive agency)」單獨列為一大風險——代理被賦予太多權限,一旦被注入劫持就能造成真實破壞。務實做法是最小權限:高風險動作(刪除、轉帳、對外發送)一律要通過策略引擎與人工確認,而不是讓模型自由呼叫。

把護欄放在閘道層,而不是散在每個服務裡

實作位置也很關鍵。如果每個應用各自寫一套護欄,規則會漂移、稽核會破碎。2026 的趨勢是把護欄推到 AI 閘道(gateway)層:所有服務共用同一組強制規則,產生統一的稽核軌跡(audit trail),而且不用改寫應用程式。這對合規特別有價值——OWASP、NIST AI RMF、EU AI Act 都要求你能拿出「我們確實有攔截、確實留了紀錄」的證據,集中式閘道正好一次滿足。

工具生態

工具定位特點
NeMo Guardrails(NVIDIA)可程式化對話護欄用 Colang DSL 定義輸入/輸出/對話/工具四類護欄,開源
Llama Guard(Meta)內容安全分類器依有害類別分類法(taxonomy)判定輸入與輸出「安全/不安全」
Guardrails AI結構化輸出驗證用 validator 校驗輸出格式與內容,支援自我修正重試
AWS Bedrock Guardrails平台級策略框架在模型推論層做集中治理,PII、拒答主題、內容過濾

一個常見的組合拳是:Llama Guard 做內容分類 + Guardrails AI 做結構化輸出驗證 + NeMo Guardrails 做對話約束 + 確定性樣式比對擋已知攻擊簽章。選型重點不是誰功能多,而是能不能把「輸入、輸出、動作」三關都覆蓋,並且讓規則集中、可稽核。

🧠 記

  • 評估是離線判準、護欄是線上把關:評估防品質回歸,護欄防即時風險,兩者接力才是完整上線防線。
  • 別把安全塞進系統提示——提示只是「建議」,和惡意輸入走同一通道;護欄要放模型外部,做確定性、可稽核的攔截。OWASP 連三年把 prompt injection 列為 LLM01,無分層防禦時注入成功率 >50%。
  • 注入分直接(使用者自己覆蓋指令)與間接(惡意指令藏在被讀取的外部內容裡);RAG 與工具讓間接注入的攻擊面變大。
  • 縱深防禦三道關:輸入(pre-LLM)、輸出(post-LLM,含自我修正)、動作(工具最小權限 + 人工核准);每關混用確定性規則與模型分類器。
  • 過度代理(excessive agency) 是代理時代的獨立風險;高風險副作用動作一律走白名單與人工確認。
  • 護欄放閘道層才能規則不漂移、稽核不破碎,一次滿足 OWASP / NIST / EU AI Act 的舉證需求。

✍️ 實踐

  1. 先畫出你代理的攻擊面:列出所有「外部文字會進到上下文」的入口(使用者輸入、RAG 檢索、工具回傳、讀取的信件/網頁),標出哪些是間接注入的高風險來源。這張圖決定你的護欄要擺在哪。
  2. 從動作關做起,而不是文字關:先盤點代理能呼叫的工具,把刪除、轉帳、對外發送這類高風險動作抽出來,強制走白名單 + 人工核准。這是投報率最高的一道護欄——擋住的是真實破壞。
  3. 輸入輸出各加一層確定性 + 一層分類器:輸入端用樣式比對擋已知注入句型、掃 PII;輸出端加結構化 schema 驗證(Guardrails AI)並掛自我修正重試。先接 Llama Guard 這類現成分類器,不要自己從零訓。
  4. 把護欄事件接進昨天的追蹤後端:每一次攔截(擋了什麼、為什麼擋、哪一關擋的)都寫成 span,讓護欄的觸發也變成可觀測、可回放的資料——這同時就是你的合規稽核軌跡。

🔗 延伸學習

💬 問 AI

我想替一個已經上線的 AI 代理設計「安全護欄(guardrails)」,做即時的執行期防護,而不是把安全規則塞進系統提示。請幫我:
1. 用一個具體例子解釋,為什麼把「不可洩漏資料、不可刪除」寫進系統提示擋不住
   prompt injection,以及護欄放在模型外部(確定性、可稽核)為什麼才擋得住。
2. 說明直接注入與間接注入的差別,並解釋為什麼有了 RAG 和工具呼叫之後,
   間接注入的攻擊面反而變大,舉一個藏在被檢索文件裡的惡意指令的例子。
3. 說明縱深防禦的三道關——輸入(pre-LLM)、輸出(post-LLM 含自我修正)、
   動作(工具最小權限 + 人工核准)——各自擋什麼、怎麼混用確定性規則與分類器,
   以及 OWASP 說的「過度代理(excessive agency)」為什麼是代理時代的獨立風險。
4. 給我一個實作步驟:怎麼盤點攻擊面、先從動作關做起、用 Llama Guard + Guardrails AI
   + NeMo Guardrails 搭出輸入輸出護欄,並把護欄事件接進既有追蹤後端當稽核軌跡。
請用繁體中文、台灣用語,盡量給機制與實例,不要只講抽象概念。