我們從 Reliability Engineering 的角度,建立 SLI、SLO、SLA 與 Error Budget 的概念
讓 RAG 系統不只成功上線,也能持續衡量服務品質
但當智慧助理開始處理企業文件、使用者資料與外部工具呼叫時,另一個問題也變得重要:
我們如何確保 AI 只存取有權限的資料,並且不會因為惡意輸入而洩漏機密或執行未授權操作
想像以下幾個情境:
這些問題說明,RAG Security 不只是替 API 加上登入驗證,也不能只靠 Prompt 告訴模型「不要洩漏機密」
我們需要從 API、資料檢索、模型輸入輸出、工具呼叫與部署環境等層面建立多層防護
今天就從這些實際風險出發,建立一套 RAG 系統的安全設計思維
先回顧 RAG 的基本流程
在這條 Pipeline 中,每個階段都可能存在不同的安全風險
安全設計的重點,是不能只假設使用者會善意操作,也不能假設模型永遠會遵守 Prompt
模型的回答可以協助完成任務,但真正的存取控制與安全決策,需由可信任的應用程式與基礎設施負責
API Security 是整個 RAG 系統的第一道防線
不過,Authentication 與 Authorization 是兩個不同的概念
Authentication (身分驗證) 用來確認使用者或服務的身份
常見方式包括:
例如,使用者呼叫 RAG API 時,可以在 HTTP Header 傳遞 Access Token
伺服器應驗證 Token 的簽章、有效期限等必要條件,而不是只要收到一串字串就視為登入成功
即使使用者已成功登入,也不代表他能存取所有資料
這類設計通常會使用 RBAC (Role Based Access Control),也就是根據角色分配權限
如果權限取決於使用者、文件擁有者、部門或其他條件,也可以使用 ABAC (Attribute Based Access Control),根據屬性與政策決定是否允許存取
對 RAG 而言,最容易被忽略的風險之一,就是文件檢索沒有落實使用者權限
如果所有文件都使用同一個 Vector Collection,且每次檢索都只根據語意相似度搜尋,就可能發生越權將資料洩漏
例如,員工詢問:
請整理公司各部門的薪資資訊
即使使用者沒有 HR 權限,Retriever 仍可能找到薪資文件,再交給 LLM 產生回答
此時,問題不是 LLM 回答得好不好,而是未授權的資料已經進入了生成流程
每份文件或 Chunk 可以附加權限 Metadata
當使用者提出問題時,系統先取得可信任的使用者權限,再依據權限過濾檢索結果
這段程式只展示依部門過濾的語法,不能直接視為完整的安全授權實作
因為 Engineering 不能由使用者自行傳入並決定
實際系統要從可信任的身份與授權服務取得部門資訊,並將授權條件套用到每一次檢索
此外,當文件具有多角色、多部門、使用者擁有者等複雜權限時,也要確認資料庫的過濾能力能正確表達授權政策
若需要更複雜的邏輯,應由可信任的授權層處理
因為這時未授權的文件已經進入模型上下文
即使 Prompt 寫著「禁止洩漏機密」,也無法保證模型不會引用這些內容
因此,正確順序應是:
先驗證權限,再檢索資料;不能把授權責任交給 LLM
同時,還要確認引用、快取、對話記憶、日誌與匯出功能不會再次洩漏未授權資料
Prompt Injection 是生成式 AI 應用程式的重要安全風險
攻擊者會試圖將惡意指令放進使用者輸入或模型讀取的內容中,影響模型原本的行為
這類攻擊直接針對使用者輸入與模型指令
而間接 Prompt Injection 更需要注意,因為惡意指令可能藏在模型讀取的文件裡
如果 RAG 將這份文件直接加入 LLM Context,模型就可能受到其中指令影響
這代表文件不一定只是單純的資料來源,也可能包含不可信任的內容
這些指示有助於引導模型行為,但不能當作完整的安全防線
原因是模型可能無法在所有情境下正確區分指令與資料,也可能因為上下文衝突而產生不安全的輸出
因此,Prompt Injection 防護需要結合:
結構化有助於區分不同來源的內容,但 XML 標籤或文字分隔本身並不是安全邊界,也不能保證模型一定不受 Injection 影響
若文件可能包含惡意指令,仍然必須搭配工具權限限制、資料存取控制與安全評估
另外,實際使用時,應依 LLM SDK 的訊息格式分別傳遞 System、User 與 Context,而不是把所有內容都當成同等可信任的字串
當 RAG 系統進一步成為 Agentic AI,模型可能不只回答問題,還能呼叫工具
例如:
此時,風險會從「回答錯誤」擴大到「執行未授權操作」
假設模型可以直接產生 SQL
這樣的設計存在明顯風險
如果使用者要求刪除資料,或模型因 Prompt Injection 產生了不合理的 SQL,應用程式可能直接執行危險操作
應限制模型只能呼叫預先定義的工具,並由應用程式檢查參數與權限
需要有白名單與權限檢查的概念
正式環境還需要:
LLM 可以提出工具呼叫建議,但是否允許執行,必須由應用程式根據可信任的政策決定
RAG 系統通常需要多種憑證:
可能因為 Git Push、日誌輸出或映像檔打包而外洩
即使 API 已經完成身份驗證,仍可能受到大量請求、超長輸入或異常請求影響
例如:
因此,API 還需要基本的濫用防護
這個流程的重點,是把安全性從「上線前人工檢查」轉變為持續驗證的工程流程
真正成熟的 CI/CD,不只確認程式可以運作,也要確認程式沒有破壞既有的安全邊界
今天從 API、RAG Retrieval、Prompt Injection、Agent 工具呼叫與部署流程等角度,建立了 RAG Security 的基本觀念。
我們逐步將 RAG 從一個能夠回答問題的應用程式,發展成具備品質評估、效能監控、成本管理、自動化部署、可靠性管理與安全防護的智慧助理
真正的 AI 工程,不只是讓模型產生好的答案,而是確保整個系統能在正確的權限、資料與安全條件下運作
經過 29 天的實作與架構整理,我們已經涵蓋 RAG 的核心流程、回答品質、效能優化、部署、自動化、可靠性與安全性
最後一天,將把這些技術整合,從系統架構、RAG 品質、效能、成本、監控、部署、安全性與維運流程等面向,檢視一套智慧助理是否已經具備真正上線的條件
讓這 30 天不只是一系列技術文章,而是一套可以持續延伸、實際應用於專案的 AI 工程實踐