上一篇把 RAG 的用途與風險列出來了。接下來進入 PoC 驗收,我會先準備好資料與驗收條件:哪些文件能放進來、誰能查,以及怎麼知道回答是合適的。
放進幾份文件,問幾個問題,答案大致正確,看到這裡很容易覺得已經可以用了。不過,我還會繼續確認文件版本與權限。企業裡每個人能看的資料不同,這一段也要真的測過。
例如,回答引用了一份使用者原本沒有權限看的文件。內容可能答得很正確,權限卻出了問題。如果一直用管理員帳號測試,就很容易漏掉這個情況。
每份候選文件,我會先記錄負責人、來源、版本、有效日、機密等級、允許群組與保留期限。擁有者核准、版本與分類都確認後,再納入 PoC。文件撤回或權限調整,索引也要跟著更新。
下面的圖先整理文件進庫與查詢取回這兩條路徑:文字由 Embedding 模型轉成向量存進 Milvus,查詢則經過 HNSW 索引與權限過濾,才取回 Top-K 結果。這一套最後是否採用,還是要看 PoC 的資料量、權限過濾、召回品質、延遲與維護成本。

圖 Day 22-1:檢索與權限過濾路徑。
無權查看的內容,不能被帶進模型輸入,所以我會特別看圖裡權限 Filter 的位置:檢索時就要排除這些片段。這一段除了正常查詢,也要換不同群組的帳號測試。
另外,原始文件已經不能用了,系統卻還持續拿舊內容回答,這是要避免的。所以文件更新事件發出後,有一個 consumer 監聽它,先刪掉舊的 chunk,再在背景重新索引;撤回也走同一條路,只刪不重建。同步方式已經定了,從事件發出到索引更新的延遲上限,還要在 PoC 量測。
原本的資料權限要一路保留。使用者不能看的文件,在檢索階段就排除,不先交給模型再要求它隱藏。所以可見範圍不是由呼叫端在請求裡指定,而是後端依登入身分算出來,再交給向量資料庫當過濾條件;呼叫端就算多填了範圍也會被忽略。有一支測試會刻意在請求裡多填範圍,確認取回的結果沒有因此變多。
遇到 SOP 改版時,使用者要知道自己看到的答案來自哪一份內容。所以回答也要讓人找得到出處,來源、版本與引用段落都列出來。
資料不夠、內容衝突、文件過期或權限不足,都要有對應的拒答或人工處理方式。內容衝突指的是檢索回來的片段對同一個問題講法互相矛盾,最常見的是同一份 SOP 的新舊版本同時被取回。呼叫端要知道是哪一種,後面才有辦法接手,所以四種都先分類回覆:
| 取捨 | 這樣選的理由 | 何時要重新評估 |
|---|---|---|
| 權限過濾放在檢索階段 | 避免無權內容進入模型輸入 | 無 |
| PoC 先縮小資料與使用範圍 | 一次納入過多資料無法確認品質與權限 | 縮小範圍已驗證通過後 |
| 是否擴大範圍待 PoC 結果 | 資料量與權限過濾的實測結果會影響擴大的方式 | PoC 完成並取得實測資料後 |
| 回答一律附來源與版本 | 使用者需能自行確認適用性 | 無 |
前面要準備的事情不少,所以範圍可以先小一點。挑低風險、能人工覆核的情境,驗證好資料與權限,再慢慢擴大,也比較容易掌握每一步的結果。
PoC 先建立固定題庫:一組不再變動的提問,每題事先標好應該被檢索到的來源,之後調參數、換資料都用同一份重測。再分別測試資料納管、權限隔離、檢索、生成、拒答與稽核紀錄:
| 指標 | 說明 | 想回答的問題 |
|---|---|---|
| Recall@K | 前 K 筆結果中找回的預期來源比率 | 檢索是否找得到該找的文件? |
| 引用正確率 | 引用來源與實際依據一致的比率 | 引用是否真的對應答案內容? |
| 答案忠實度 | 答案內容不超出引用範圍的比率 | 是否有超出資料的推論? |
| 拒答率 | 應拒答而確實拒答的比率 | 資料不足或內容衝突時是否誠實拒答? |
| 越權測試通過率 | 應被排除而確實被排除的比率 | 權限過濾是否真的生效? |
| P95 latency | 查詢回應時間的 P95 | 效能是否可接受? |
要分享結果時,大家得知道數字是怎麼來的,所以樣本、資料集、環境與計算方式也一起寫出來。
把資料與權限準備好,再看檢索與回答的結果,最後決定可用範圍,這是我想採取的順序。下一篇,回到 API,看看限流、逾時、重試與冪等怎麼一起安排。