Day 27:治理 — 風險矩陣、法規時間軸與權限設計
技術面完成了,今天處理制度面——也是這個系列裡最容易被工程師跳過、卻最可能決定專案生死的一天。
昨天談的是「怎麼做得又快又便宜」,今天談的是「怎麼確保這件事做得下去」。
今天要解決的問題
三個時間點都可能發生的對話:
專案啟動時——法務:「這個系統會處理客戶個資嗎?資料會送到境外嗎?」 上線前——稽核:「如果模型做出錯誤判斷,你們怎麼追溯是哪個版本、什麼依據?」 出事後——主管:「為什麼業務部門的人可以看到人資的薪資文件?」
這三個問題答不出來,技術做得再好都上不了線——尤其在金融、醫療、公部門與大型製造業。
📊 職缺訊號
「治理、安全與權限」出現在 13.8% 的 MLOps 職缺中,是六項任務中倒數第二。但這個數字有個特性:它幾乎只出現在資深職缺。原因很直接——初階做被交辦的事,資深要對「這件事能不能做」負責。
一、現象:把風險畫成一張圖
治理的第一步不是讀法規,是盤點你到底面對哪些風險。用一張風險矩陣(可能性 × 衝擊):

圖 27-1:生成式 AI 系統十項典型風險的可能性 × 衝擊落點(依風險分數精算的示意評估)。分數 ≥ 15 的紅區項目不得以「已知悉」結案。
這張圖最重要的觀察,是落在紅區的三項:
這三項都不在傳統資安清單上。 你的公司可能已通過 ISO 27001、做過滲透測試、有完整的存取控制——但這三個風險,傳統資安框架完全沒有涵蓋。
這就是「AI 治理」必須獨立存在的理由。
二、原理:法規的時程與你的距離
很多台灣工程師覺得「歐盟法規關我什麼事」。有兩種情況它會直接關你的事:你的產品在歐盟提供服務,或你的客戶要求你符合(供應鏈傳導,這在台灣製造業特別常見)。

圖 27-2:AI 治理法規與標準的示意時程。歐盟時程依 AI Act 公布的階段適用日整理;臺灣《人工智慧基本法》於 2026 年 1 月 14 日公布,並自公布日起施行。圖中僅列關鍵節點,實際法遵義務仍須查閱主管機關最新公告。
對台灣團隊最需要注意的三件事:
- 風險分級決定義務。 AI Act 依風險分為禁止、高風險、有限風險、最小風險四級。多數企業內部應用屬於低風險,但用於招募、信用評分、教育評量等場景會落入高風險,義務大幅增加。
- GPAI 義務會沿供應鏈傳導。 即使模型是你外購的,你在價值鏈中仍可能承擔部署者(deployer)義務 。
- 臺灣已有 AI 基本法框架。 《人工智慧基本法》已於 2026 年 1 月 14 日公布,並自公布日起施行,不再停留在草案階段。該法確立以人為本、促進創新、風險管理、隱私與資料治理、透明及問責等原則;第 18 條並要求政府自施行後二年內,完成相關法規的制(訂)定、修正或廢止,以及行政措施的改進。不過,基本法提供的是跨部會治理原則與修法時程,不代表每一種 AI 應用已有完整且相同的義務清單。個別系統仍須依產業法規、主管機關後續規範及實際用途判斷。
💡 一個務實的作法:把判斷寫進 ADR
在專案的架構決策紀錄(Day 28 會談)中,明確寫下「本系統的風險分級判斷、依據與判斷日期」。這樣做的價值是:當法規更新或稽核詢問時,你知道要回頭檢查哪些系統、以及當初是基於什麼資訊做的判斷。
這比「等到被問才開始查」有效太多,成本卻只有十分鐘。
三、動手:三個能落地的治理實作
3.1 權限模型:RBAC + 資料分級
"""governance/rbac.py —— 權限要能同時管「功能」與「資料」。"""
from dataclasses import dataclass
@dataclass
class Permission:
can_query: bool # 能不能問
doc_levels: set[str] # 能看哪些機密等級
departments: set[str] # 能看哪些部門的文件
tools: set[str] # 能用哪些工具(Day 22 的風險分級)
can_export: bool # 能不能匯出/對外傳送
ROLES = {
"一般員工": Permission(True, {"public", "internal"}, {"own_dept"},
{"search_kb"}, False),
"部門主管": Permission(True, {"public", "internal", "confidential"},
{"own_dept"}, {"search_kb", "create_ticket"}, True),
"稽核人員": Permission(True, {"public", "internal", "confidential"},
{"all"}, {"search_kb", "export_audit"}, True),
}
def build_retrieval_filter(user) -> dict:
"""把權限轉成向量庫的查詢過濾條件——在檢索階段就擋掉(Day 18)。"""
p = ROLES[user.role]
f = {"level": {"$in": list(p.doc_levels)}}
if "all" not in p.departments:
f["dept"] = {"$in": [user.dept]}
return f
⚠️ 權限必須在檢索階段執行,不能在生成後過濾
有些團隊的做法是「全部檢索出來,再請模型不要提到無權限的內容」。這是錯的——一旦無權限的內容進入脈絡,就等於已經外洩了:模型可能間接透露、可能被注入攻擊套出、而且它會被寫進日誌與 trace。
權限的執行點必須在資料進入模型之前。
