.pdf / .docx 這類非結構化文件裡的個資與機敏資訊,怎麼被辨識出來、又怎麼去識別化。涵蓋七類資料的具體盤點與對應手法、遮掉名字為什麼還不夠、用文件形態決定處理強度的最低限度做法,跨到越南之後哪些會變哪些不變,以及什麼時候根本不需要技術方案。
顧問業務手上會累積大量客戶與公司內部的文件:勞動契約、薪資清冊、申訴紀錄、工作規則、人事規章。這些文件要拿去餵 RAG、要當對外案例、要委外標註之前,都得先做去識別化。
這篇整理的是「怎麼做」的前半段:先把要處理的東西盤清楚,再決定每一類用什麼手法。規則以台灣為主,跨國情境(目前面對的是越南)另闢第四節處理。
一、資料分類:七類與對應手法
分類的軸不看「資料多敏感」,看「用什麼方法抓得到」。因為手法決定成本:正則抓得到的可以全自動、零人審;只能靠語意判斷的,就得付模型跟人工的錢。
1. 強格式直接識別碼
有固定格式,部分還有檢查碼可驗。誤判率最低,可以全自動處理。以下是台灣的規則集;這一類的規則屬於地區資料,換個國家就換一套,流程本身不動。
| 資料項 | 格式特性 | 手法 |
|---|---|---|
| 身分證統一編號 | [A-Z][12]\d{8},有檢查碼 | 正則+檢查碼驗證 |
| 外籍居留證統一證號 | [A-Z][89]\d{8},有檢查碼 | 正則+檢查碼驗證 |
| 公司統一編號 | 8 碼,有檢查碼 | 正則+檢查碼驗證 |
| 護照號碼 | 台灣 9 碼數字;外籍格式雜 | 正則+上下文關鍵詞 |
| 健保卡號 | 12 碼數字 | 正則+上下文關鍵詞 |
| 手機號碼 | 09xx-xxxxxx,含 +886 變體 | 正則 |
| 市話與分機 | 區碼 2–4 碼+號碼+#分機 | 正則 |
| 電子郵件 | RFC 格式 | 正則 |
| 信用卡號 | Luhn 可驗 | 正則+Luhn |
| 銀行帳號 | 3 碼銀行代號+分行+帳號 | 正則+銀行代號表 |
| 郵局帳號 | 局號 7 碼+帳號 7 碼 | 正則 |
| 車牌號碼 | 新舊制多種格式 | 正則 |
| 勞保證號、勞退個人專戶 | 固定格式 | 正則+上下文關鍵詞 |
| 發票號碼 | AB-12345678 | 正則 |
| 出生年月日 | 民國/西元混用 | 正則+日期正規化 |
| 郵遞區號 | 3 或 5 碼 | 正則 |
出生年月日最容易漏抓:同一份文件裡「85.03.12」「民國85年3月12日」「1996/3/12」三種寫法並存是常態,正則要一起吃掉。
什麼是檢查碼驗證
檢查碼是號碼裡內建的一位自我驗證欄位。發號時用前面幾碼算出來接在最後,驗證時把同一套算式再跑一次,對不上就代表這串數字不可能是合法號碼。
以身分證字號 A123456789 為例,最後一碼 9 就是檢查碼:
- 開頭字母查表換成兩位數(A=10、B=11⋯⋯Z=33),拆成 N1、N2
- 依序乘上固定權重:N1×1、N2×9,接著八個數字 ×8 到 ×1,檢查碼 ×1
- 總和能被 10 整除就通過
A → 10,所以 N1=1、N2=01×1 + 0×9 + 1×8 + 2×7 + 3×6 + 4×5 + 5×4 + 6×3 + 7×2 + 8×1 + 9×1= 1 + 0 + 8 + 14 + 18 + 20 + 20 + 18 + 14 + 8 + 9= 130130 ÷ 10 整除 → 通過最後一碼改成 A123456788,總和變 129,除不盡,直接判定不是身分證字號。
LETTER = {c: 10 + i for i, c in enumerate("ABCDEFGHJKLMNPQRSTUVXYWZIO")}def is_valid_twid(s: str) -> bool: n = LETTER[s[0]] total = n // 10 + (n % 10) * 9 total += sum(int(d) * w for d, w in zip(s[1:9], range(8, 0, -1))) return (total + int(s[9])) % 10 == 0這一步決定了第 1 類能不能全自動。光靠正則 [A-Z][12]\d{8},契約編號、案號、內部流水號、OCR 雜訊都會被一起撈進來;加上檢查碼之後,隨機字串矇混過關的機率只剩十分之一,誤判量砍掉九成。
信用卡號用的是另一套,叫 Luhn,1954 年由 IBM 的 Hans Peter Luhn 提出。原理同一類,權重規則更簡單:從右邊數,每隔一位乘 2,乘完超過 9 的減掉 9,全部加起來能被 10 整除就通過。
用測試卡號 4539 1488 0343 6467(公開的測試號碼,不是真卡):
位置 4 5 3 9 1 4 8 8 0 3 4 3 6 4 6 7乘2 ×2 ×2 ×2 ×2 ×2 ×2 ×2 ×2結果 8 5 6 9 2 4 7 8 0 3 8 3 3 4 3 7 ↑16-9 ↑12-9 ↑12-98+5+6+9+2+4+7+8+0+3+8+3+3+4+3+7 = 8080 ÷ 10 整除 → 通過def luhn(s: str) -> bool: digits = [int(c) for c in s if c.isdigit()][::-1] total = 0 for i, d in enumerate(digits): if i % 2 == 1: d *= 2 if d > 9: d -= 9 total += d return total % 10 == 0Luhn 抓得出所有單一位數打錯,以及絕大多數相鄰兩位對調,唯一漏網的是 09 跟 90 互換。它的設計目的是防手動輸入錯誤,不是防偽造:知道算法的人要湊一個通過驗證的假卡號很容易。除了信用卡,手機 IMEI、加拿大社會保險號也用 Luhn。
信用卡號在勞資文件裡不算常見,但報帳單、費用核銷、出差申請這類文件會出現。它的處境比較接近第 6 類的 IT 憑證:卡號出現在你手上的文件裡本身就是合規問題(PCI DSS 對持卡人資料的儲存有明確限制),遮掉之後可能還要往回追這份文件為什麼會有卡號、有沒有別的副本。
有兩個地方容易誤會。通過檢查碼只證明格式合法,不證明真有這個人;去識別化本來就不需要查真偽,目標是「這看起來是身分證字號,遮掉」。另外,沒有檢查碼的號碼別假裝有:手機、健保卡號、護照都只能靠上下文關鍵詞壓誤判,誤判率天生比較高。
公司統一編號與外籍居留證統一證號也有檢查碼。統編的餘數規則財政部調整過,實作前要查一下現行規定。
2. 弱格式直接識別碼
沒有格式特徵,正則抓不動,得靠詞典或 NER。誤判率高,要設人審門檻。
| 資料項 | 為什麼難 | 手法 |
|---|---|---|
| 中文姓名 | 與一般詞彙重疊,無格式特徵 | 姓氏表+NER+欄位名上下文 |
| 英文與外籍音譯名 | 移工文件常見,音譯無標準 | NER |
| 地址(戶籍/通訊/公司) | 縣市區路段巷弄號樓之,寫法極不一致 | 正則骨架+郵遞區號與路名詞典 |
| Line ID、社群帳號 | 自由字串 | 上下文關鍵詞 |
| 緊急聯絡人、眷屬姓名 | 同姓名,但多出現在表格欄位 | NER+表格欄位名 |
| 簽名、印章 | 在影像層,不在文字層 | 見第 7 類 |
什麼是 NER
NER 是 Named Entity Recognition,命名實體辨識。它在一段文字裡標出哪幾個字合起來是一個人名、地名或組織名,輸出是位置區間加上類型。
正則問的是「這串字元長得對不對」,NER 問的是「這幾個字在這個句子裡扮演什麼角色」。人名沒有格式可言,只能靠上下文判斷。
輸入:本公司林口分公司之陳美玲於 113 年 3 月申請留職停薪NER 輸出: 林口分公司 ORG 陳美玲 PER 113 年 3 月 DATE同樣三個字「王品牛」,在「王品牛排用餐」裡是組織的一部分,在「王品牛先生來電」裡是人名。字面一樣,判斷靠前後文,這是查字典做不到的事。常見類型是 PER(人)、LOC(地)、ORG(組織),有些模型還會標 DATE、MONEY、TIME。
繁中主流是中研院的 CKIP Transformers(BERT-based,繁體語料訓練),另外有 spaCy 中文模型、HanLP。越南那邊是 underthesea、PhoBERT、VnCoreNLP。這些都能地端跑。
誤判率高的原因有四個,會疊在一起:
- 中文沒有空格,詞的邊界要模型自己猜。「陳美玲」被切成「陳美」+「玲」,遮蔽就遮錯位置
- 姓名跟一般詞彙重疊。「林口」的「林」是常見姓氏,地名很容易被誤判成人名,結果把公司名遮掉
- 罕見姓氏、外籍音譯名、OCR 錯字都會讓模型失手
- 領域落差最要命。這些模型多半用新聞語料訓練,實際餵進去的卻是薪資清冊、申訴書,表格排版與法律用語都是模型沒看過的文體,準確率會明顯掉
所以不會單靠 NER,實務上疊三層:欄位名上下文(「姓名:」後面那一格幾乎一定是人名)、姓氏表過濾、跨文件一致性投票(同一個字串在別份文件被判為人名,這份就跟著判)。
LLM 也能做 NER,通常更準也不用訓練,但慢、貴,而且原文要送出去,跟第四節的跨境傳輸限制直接衝突。合理的分工是 NER 當第一道:地端跑、批次快、成本低,先掃掉八成的姓名地址;剩下模型信心低的片段再交給 LLM 或人工,送出去的量也小很多。
3. 特種個資(個資法 §6)
法律上另有一套更嚴的蒐集處理限制。這一類幾乎都沒有格式,只能靠語意判斷,是 LLM 真正該上場的地方。勞資顧問手上的案件文件,這類內容不少。
| 資料項 | 出現場景 | 手法 |
|---|---|---|
| 醫療與健檢紀錄、診斷書 | 病假證明、職災案件 | LLM 語意+人審 |
| 身心障礙證明、職災傷病描述 | 職災補償、定額進用 | LLM+關鍵詞 |
| 犯罪前科、良民證 | 錄用審查 | LLM+關鍵詞 |
| 工會會員身分、工會活動參與 | 勞資爭議、不當勞動行為案件 | LLM |
| 原住民身分、國籍與族群 | 定額進用、移工管理 | 關鍵詞+LLM |
| 宗教信仰、政治傾向 | 申訴書偶爾出現 | LLM |
| 基因、性生活 | 性騷擾調查案件 | LLM+整段人審 |
4. 人事與薪酬敏感資料
法律上不全屬個資,但在顧問情境下常常需要處理,條件見第三節。特點是很多是「數字」而非「識別碼」,所以手法通常是泛化成區間而不是整個遮掉。
| 資料項 | 手法 |
|---|---|
| 薪資、獎金、薪級、調薪紀錄 | 上下文關鍵詞+數值區間化 |
| 出勤與加班時數、打卡紀錄 | 表格欄位辨識+泛化 |
| 考績、績效評等 | 關鍵詞 |
| 懲處、申誡、記過紀錄 | LLM 語意 |
| 資遣與解僱事由、離職原因 | LLM 語意 |
| 申訴、性騷擾調查、爭議調解內容 | LLM+整段人審 |
| 薪轉帳戶 | 同第 1 類,正則處理 |
5. 準識別碼
單獨看都不是個資,組合起來卻能還原到個人。這是最容易整桶漏掉的一類,也是重識別風險的主要來源。
| 資料項 | 手法 |
|---|---|
| 部門、職稱、職級 | 泛化(「副店長」→「基層主管」) |
| 到職日、年資、年齡 | 泛化為區間 |
| 性別、婚姻狀況、國籍 | 視 k 值決定保留或泛化 |
| 員工編號、工號、分機 | 假名化,保留跨文件一致性 |
| 工作地點、廠區、門市代號 | 泛化到縣市層級 |
處理原則是 k-匿名任一組準識別碼的組合,在資料集中至少要對應到 k 個人;不足就往上泛化,直到達標。,實際做起來要跨文件統計,沒辦法單份文件獨立處理完。
6. IT 憑證與技術識別
| 資料項 | 特徵 | 手法 |
|---|---|---|
| API Token、API Key | 各家有前綴:sk-、ghp_、AKIA、AIza、xoxb- | 前綴表+熵值偵測 |
| 私鑰、SSH key | -----BEGIN ... PRIVATE KEY----- | 正則 |
| JWT | eyJ 開頭三段式 | 正則 |
| 資料庫連線字串 | postgres://user:pass@host | 正則 |
.env 內容、Service Account JSON | 鍵值結構 | 正則+結構解析 |
| 內網 IP、主機名、URL、port | 標準格式 | 正則 |
| MAC address、裝置 UUID | 標準格式 | 正則 |
7. 載體層:影像與檔案 metadata
這不是一種資料類型,是一整個容易被漏掉的層,前面六類都可能藏在這裡。
| 位置 | 內容 | 手法 |
|---|---|---|
| 掃描件、身分證影本、簽名與印章圖 | 前六類皆可能出現 | OCR+版面偵測,遮蔽需重繪影像 |
| docx metadata | author、last modified by、company | 直接清洗,不需偵測 |
| PDF XMP metadata | 作者、建立工具、原始檔路徑 | 直接清洗 |
| 追蹤修訂、註解 | 修訂者與註解者姓名 | 解析時一併處理 |
| 檔名與路徑 | 「王小明_離職申請.docx」 | 檔名一併改寫 |
二、遮掉名字就夠了嗎?
姓名、身分證字號都拿掉之後,薪資、考績這些留著到底有沒有差?
多數情況下這個判斷成立,因為薪資、出勤、考績是敏感「屬性」,不是「識別碼」。一份沒有名字的薪資數字,就只是一個數字。反過來說,數字全遮掉,那份文件拿去做分析或 RAG 也就沒意義了。
但有兩種情況會讓這個判斷翻車,而且在中小企業客戶身上很常見。
三、最低限度:用文件形態決定處理強度
每份文件都把七類跑滿,錢多半是白花的。比較省的做法是先判斷文件形態,再決定跑到第幾層。
三種文件形態
| 形態 | 例子 | 個資密度 | 額外處理 |
|---|---|---|---|
| A. 敘述型 | 工作規則、人事規章、SOP、契約範本、內部公告 | 極低,多半只有簽核人 | 無,人事薪酬類完全不處理 |
| B. 個案型 | 申訴書、調解紀錄、懲處通知、職災報告、離職證明 | 一份對一人 | 加語意層:事由描述本身可能識別 |
| C. 名冊型 | 薪資清冊、出勤表、員工名冊、考績表 | 一列一人,最容易被交叉比對 | 加準識別碼泛化與 k-匿名 |
三層處理強度
Tier 0:一律做,全自動零人審
第 1 類強格式識別碼、第 6 類 IT 憑證、第 7 類 metadata 與檔名。
正則就解決,成本極低,沒有不做的理由。
Tier 1:一律做,需要模型
第 2 類姓名與地址。
誤判率高,要設人審門檻。
Tier 2:條件觸發
第 3、4、5 類:特種個資、人事薪酬、準識別碼。
只有文件被判為 B 型或 C 型才啟動。
實務上 A 型文件通常佔量最大,公司內部規則那一整批幾乎都是 A。這一刀切下去,多數文件只要跑 Tier 0 跟 Tier 1。
TF-IDF 在這裡的角色
判斷一份文件屬於 A、B 還是 C,正好是 TF-IDF 加線性分類器最擅長的事:不需要 LLM、不需要大量標註,訓練成本極低,而且判錯也不致命,把門檻設寬一點偏保守,誤判成高強度只是多花錢。
TF-IDF 在整條流程裡只做一件事:決定每份文件跑到第幾層。辨識工作交給正則、NER 與 LLM。
四、跨國:什麼會變,什麼不變
前三節的規則以台灣為主。業務跨到越南之後,七類的分類架構不用動,因為分類的軸是「用什麼方法抓得到」,這件事跟國別無關。真正要換的是規則集內容與法源。
規則集要抽出來
實作上把識別碼規則做成註冊表,一個 locale 對應一組 {pattern, validator, context_keywords},偵測引擎讀註冊表跑,新增國家等於新增一筆資料,不改程式。
七類的跨國影響
| 類別 | 跨國影響 |
|---|---|
| 1. 強格式直接識別碼 | 換規則集,但驗證強度可能下降,見下方 |
| 2. 弱格式直接識別碼 | 衝擊最大。越南姓名是姓+墊字+名的結構,Nguyễn 一個姓就佔近四成,中文 NER 完全不適用;地址是 tỉnh/huyện/xã 三級制,跟台灣結構無關 |
| 3. 特種個資 | 法源不同。台灣依個資法 §6,越南依 PDPD(Nghị định 13/2023),敏感個資的列舉範圍不一樣。這是「該不該遮」的問題,跟「怎麼抓」無關 |
| 4. 人事與薪酬 | 大致通用 |
| 5. 準識別碼 | 手法通用,但母體規模差很多。越南廠 3000 人跟台灣辦公室 20 人,同樣的 k 值意義完全不同 |
| 6. IT 憑證 | 完全通用,唯一不受國別影響的一類 |
| 7. 載體層 | 通用,但 OCR 要支援越南文的變音符號 |
越南:檢查碼會退化
台灣這邊之所以能把第 1 類設成 Tier 0 全自動零人審,是因為檢查碼幫機器確認抓對了。越南的號碼大多沒有這一層。
CCCD(12 碼身分證)目前的理解是沒有公開的檢查碼,只有結構:前 3 碼省市代碼、第 4 碼含世紀與性別、接著 2 碼出生年、後 6 碼流水。能做的是「結構驗證」,用省市代碼表與出生年合理性去篩,強度比檢查碼弱。稅號 MST 則有檢查碼。
結論是 Tier 0 的零人審前提在越南不成立,第 1 類在越南要往 Tier 1 靠,設抽樣人審。
跨境傳輸要先拍板
PDPD 對個資的跨境傳輸有申報要求。這件事決定越南的文件能不能送到雲端 LLM,比前面所有偵測細節都更早需要決定:如果不能,第 3 類的語意判斷就只剩地端模型一條路,成本與效果都要重估。
跨國情境下,這個問題要在動工前先問,不要等 pipeline 都搭好才發現整條路走不通。
五、先問要不要做
前面四節都在講怎麼做。這一節講什麼時候不用做。
三個條件同時成立才划算
技術去識別化要值得做,需要量大、接收方不可信、無法用權限控制,三個同時成立。少一個,通常有更便宜的解法。紙本時代的做法一直都是鎖檔案室跟借閱登記,很少有人真的把文件洗一遍。
| 目的 | 需要技術去識別化嗎 |
|---|---|
| 內部 RAG(HRM AI) | 不需要,見下方 |
| 餵雲端 LLM | 問題不在這一層,見下方 |
| 對外案例、教材 | 量小,人工改寫更划算,還能連情境一起改掉 |
| 委外標註、交第三方廠商 | 需要,量大且對象不可控 |
| 訓練模型 | 需要,量大 |
情境一:內部 RAG
文件本來就全公司看得到的話,把它放進 RAG 並不會產生新的揭露。RAG 不改變資料的可見範圍,只改變取用的便利性;索引範圍跟原本的權限對齊,就沒有去識別化的問題。
這裡該做的是來源分級:確認每份進索引的文件原本給誰看,讓檢索結果照同一條線過濾。
但有三件事要留意。
- 便利性本身會製造問題。 「全公司看得到」跟「全公司一秒查得到」是兩回事。原本要翻三小時檔案才拼得出「誰被記過」,現在一句話就有答案。這不見得違法,但員工觀感、工會反應、內部信任都會出事。
- 來源清單常常混進不該全員看的東西。 工作規則的附件裡有簽核人手機、範本裡忘了刪的真實案例、公告 PDF 的 metadata 還留著人事主管姓名。審查的對象是來源清單,逐份確認它原本的可見範圍。
- 雲端 embedding 也是傳輸。 如果向量化走的是雲端 API,文件其實已經出門了。「內部 RAG」這個名字很容易讓人以為資料沒離開公司。
情境二:餵雲端 LLM
這裡真正的問題是能不能送出去。去識別化只是繞過限制的其中一條路,而且是最貴的一條。
三個選項照優先序排:
地端模型
文件不出門,問題直接消失。成本與效果要評估,但這是唯一能徹底解決的做法。
企業條款
Azure OpenAI、Bedrock、Vertex 這類提供資料處理協議、不用於訓練、zero data retention 的方案,讓「送出去」這件事本身變成可接受的行為。
去識別化
洗乾淨再送。排最後。
排最後有個理由:它的失敗模式不可逆。漏掉一筆,資料就真的出去了,沒有第二道防線。拿它當送出門的通行證,等於把整份合規責任壓在一個做不到 100% 的技術上。
前兩個選項失敗的代價是成本或談判破局,第三個失敗的代價是外洩。
如果還是要做
定位成風險分流與人工複核輔助,產出是一份降低風險的文件加一張待審清單。
最省的一刀是分流。 高風險文件(B 型個案、C 型名冊)不進自動流程,或走人工通道,讓機器只處理它有把握的 A 型。這比把準確率從 95% 推到 99% 便宜太多,也可靠太多。
人工確認那一關要設計。 介面只放一個「請確認」按鈕的話,人會全部按過去,品管上叫橡皮圖章,等於沒有這一關。要讓它有效:只呈現模型信心低的片段、可疑項預設標紅並要求逐項處理、限制每次審查量避免疲勞、記錄誰在什麼時間確認了什麼。
最後一項是重點。誰按下確認,誰承擔。這把「系統有沒有 100%」的問題,轉成「有沒有盡到適當安全維護措施」,而後者才是法律真正在問的。
六、內部 RAG 的權限控管
第五節的結論是內部 RAG 不需要去識別化,需要的是權限對齊。這一節講怎麼對齊。
一句話原則:檢索結果的可見範圍等於來源文件的可見範圍。權限跟著文件走,不跟著索引走。
權限模型直接繼承來源系統
不要為了 RAG 另外發明一套權限。文件原本放在哪裡(SharePoint、Google Drive、檔案伺服器、HR 系統),就沿用那邊的授權設定,否則會養出兩套會不同步的權限,而且不同步的那一天你不會知道。
以 HRM 的情境,可見範圍大致是四層:
| 層級 | 內容 | 誰能看 |
|---|---|---|
| 全員 | 工作規則、人事規章、SOP、公告、福利說明 | 所有員工 |
| 部門 | 所屬部門的出勤、考核、人力配置 | 該部門主管 |
| 人資 | 全公司名冊、薪資結構、申訴與調查案件 | HR 與經營層 |
| 本人 | 自己的薪資、出勤、考績、勞健保 | 員工本人 |
「本人」這一層是 HRM 特有的難題。前三層是文件層級的權限,一份文件對一群人開放,向量庫的 metadata filter 就能處理。但「本人」是資料列層級:同一份薪資清冊裡,每一列只有一個人能看,文件層的 ACL 模型撐不住。
過濾要做在檢索之前
| 做法 | 原理 | 評價 |
|---|---|---|
| 索引分離 | 每個權限等級各建一個索引 | 最不會出錯。等級少又穩定時的首選;缺點是跨等級文件要複製,權限異動要重建 |
| 前過濾 | 向量檢索時就帶入權限條件 | 正解。多數向量庫支援 filtered search,要留意過濾後的召回率下降 |
| 後過濾 | 先檢索 top-k,再依 metadata 篩掉 | 有風險,不建議 |
後過濾的問題在於 top-k 會被高權限文件佔滿,篩完之後可能只剩兩三筆甚至是空的,而使用者無從得知答案是在殘缺的檢索結果上生成的。這種失敗是沉默的。
還有一個容易漏的細節:ACL 要帶到 chunk 層。文件切塊之後,每一塊存進向量庫時都要帶上權限 metadata。只在文件層記錄、chunk 沒帶的話,過濾條件根本套不上去。
權限會變,索引不會自己知道
調職、離職、專案結束,權限每天都在變,但索引裡的 ACL 是建檔當下的快照。
比較省事的做法是在 ACL 裡存群組:索引寫的是「業務二部主管群組」,成員異動由來源系統管理,索引完全不用動。真正需要即時查的只剩「這個人現在屬於哪些群組」,那是一次很輕的查詢。
離職當天要能立刻失效,這件事不能靠定期同步的排程。
生成階段還有四個洩漏面
檢索過濾做對了,資料還是可能從後面漏出去。
- 答案要附引用來源。 這既是讓使用者判斷可信度,也是唯一能發現越權的方式。答案裡出現一份他不該看到的文件,只有標了出處才看得出來。
- 聚合效應。 每一份來源都合法,組合出來的答案卻可能構成新的揭露。第五節提到的「全公司看得到」跟「一秒查得到」的差別,在生成階段會被放大。
- 對話紀錄與快取。 語意快取如果跨使用者共用,會直接把 A 的答案送給 B。對話歷史被拿去做分析或給管理後台看,也是同樣的問題。查詢紀錄本身就很敏感,「某人連續三天在問資遣費怎麼算」這件事就是資訊。
- 提示注入。 文件內容裡藏的指令可能誘導模型吐出 context 裡的其他內容。防線是讓 context 裡從頭到尾只有這個人有權看的東西,模型層不做第二次過濾。
沒有權限時怎麼回應
這裡有個容易忽略的洩漏:回「你沒有權限查看這份文件」,等於告訴對方這份文件存在。在人事情境下,光是「有一份關於你的調查報告」就是資訊。
保守做法是一律回「查無相關資料」。缺點是使用者會困惑、會重複問。折衷是依內容敏感度分級:一般文件可以提示「有 N 筆結果因權限未顯示,請洽人資」,調查案件與個案文件則完全不透露存在。
稽核紀錄
記錄誰在什麼時間問了什麼、命中哪些 chunk。這是合規要求,也是唯一能事後發現異常的方式。
但查詢紀錄本身要當敏感資料保管:設保存期限、限制誰能看、不要讓部門主管能翻自己下屬問過什麼。
權限撐不住的三種情況
回到去識別化的時機只有這三種:
- 跨等級的聚合統計。 「全公司平均加班時數」需要讀所有名冊,但答案本身不敏感。這種要另外預先算好去識別化的彙總資料集,不要讓 RAG 直接讀原始名冊。
- 對外或委外。 案例、教材、第三方標註。
- 送出公司邊界。 包含雲端 embedding,見第五節。
除此之外,內部 RAG 的個資問題都是權限問題。