跳到主要內容
邊界實驗室 · Boundary Lab
正在啟動 Python 環境(首次約 15 秒)...

資料邊界是什麼?

不是每份資料都能自由流動。你要先決定,它能流到哪裡。

Hook

你寫了一個公司內部的 RAG 助手。 員工可以問流程、 查文件、 找會議紀錄。 一開始大家都很滿意。 問 onboarding, 它答得很快。 問 API 規格, 它也很準。 直到某天下午, 有人問了一句:

最近薪資調整有什麼動向?

系統真的回答了。 而且不是泛泛而談。 它直接引用了一段 HR 還沒公告的薪資表摘要。 回答底下還附了來源片段。 十分鐘後, 截圖出現在員工群組。 你第一個反應可能是: 「是不是模型不該信?」 但這次的核心問題, 不是 trust boundary。 不是模型把外部惡意內容當指令。 而是資料本身流到了不該流到的地方。 HR 文件也許完全可信。 它不是惡意內容。 它甚至可能來自你最信任的內部系統。 問題在於: 這份資料不該被這個使用者、 這個 query、 這個 output 路徑拿到。 這個分界, 就是 資料邊界。 如果 trust boundary 在問:

這段內容能不能被信任?

那 data boundary 問的是:

這份資料能不能流到這裡?

這兩個問題很像, 但不一樣。 你把它們混在一起, 系統就會出現一種很危險的錯覺: 只要資料是真的, 就可以流動。 這是錯的。 很多最尷尬的事故, 不是因為資料是假的。 而是因為資料是真的, 卻被送到了錯的人面前。

Learn

一句話定義

資料邊界不是在判斷真偽。 它在判斷流向。 對工程師來說, 最實用的問句不是:

這段內容準不準?

而是:

這段內容現在能不能被 collect、store、retrieve、output 到這個位置?

只要你少問其中任何一段, 系統就會自己補答案。 而系統自己補出來的答案, 通常是: 「既然拿得到,就先用吧。」

資料邊界 vs 信任邊界

先把兩者切開。 前一門課講的 trust boundary, 是在管輸入的權威性。 這門課講的 data boundary, 是在管資料的可流動範圍。 你可以先看最小對照表:

問題信任邊界資料邊界
核心問句這段內容能不能信?這份資料能不能流到這裡?
主要風險prompt injection、假指令、惡意來源越權檢索、敏感資料擴散、錯層回流
常見場景user message、網頁內容、briefingknowledge base、memory、log、API response
出事方式模型被帶偏去做錯事系統把不該出去的資料送出去

一個內容可以同時在 trust 上安全, 但在 data 上危險。 剛剛那個薪資表例子就是。 HR 文件可能是最可信的內部資料。 可是一旦它被檢索給錯的人, 它一樣是事故。 反過來也成立。 外部網頁內容可能非常不可信, 但如果你只是拿它當低權限素材、 不進高敏流程, 資料邊界未必立刻出事。 所以兩條邊界不能互相取代。 你需要同時畫。

你要先記住的資料流四階段

資料邊界最實用的骨架, 是把整條 data flow 拆成四段:

  1. collect
  2. store
  3. retrieve
  4. output

這四段不是理論分類。 它們對應的就是你系統裡真正的工程節點。 如果你 review 架構圖時畫不出這四段, 表示你根本還不知道資料在哪裡越界。 先看最小定義:

階段問題典型失敗
collect這份資料怎麼進來?一開始就混入不該收的資料
store進來後放哪裡?高敏資料落到低保護儲存層
retrieve誰可以把它撈出來?query 撈到超出權限的內容
output最後吐給誰、吐多少?回答、報表、log 把敏感資訊帶出去

這四段每一段都可能破。 很多團隊只盯 retrieve。 因為 RAG 事故最顯眼。 但真實世界裡, collectstore 的錯誤常常更早埋雷。

collect:不是能抓到就該收

很多系統的第一個錯誤, 發生在 ingest 的那一刻。 像是:

  • 把整個 Slack export 全收進知識庫
  • 把 debug dump 連同 access token 一起收
  • 把會議逐字稿原封不動餵進 memory pipeline

這些都不是 retrieve 太貪心。 而是 collect 時沒有先問: 這份資料應不應該進系統? 你要建立的直覺是: 不是每份可得資料都值得被納入。 有些資料在來源系統裡存在, 不代表它應該被 AI 層看見。

store:分類錯一層,後面全部補不回來

資料進來後, 第二關是放哪裡。 這一步最常被低估。 因為很多人覺得: 「先存起來,之後 retrieve 再過濾就好。」 這種想法很危險。 因為只要 store 放錯層, 你後面每一個 consumer 都要補救一次。 補得好不好, 完全看運氣。 典型例子包括:

  • 把 confidential 文件跟 internal FAQ 放同一個 vector store
  • 把 restricted 原文塞進所有 agent 共用的 memory
  • 把含 PII 的原始 payload 放進 everyone 可讀的 object store

你一開始分類沒切開, 後面每次 retrieve 都像在拆炸彈。

retrieve:大多數 RAG 事故死在這裡

retrieve 是最容易出事、 也最常被看見的一段。 因為它直接影響:

  • 模型這次看見什麼
  • 使用者這次能問到什麼
  • agent 這次會不會拿到超出授權的上下文

retrieve 的破洞通常不是「完全沒權限控管」。 更常見的是看起來有控, 但控得太粗。 像這樣:

  • 只用關鍵字相似度,不看資料級別
  • 只驗登入狀態,不驗部門或 principal
  • 只限制 top-k,不限制敏感等級
  • 只做 file-level ACL,不做 chunk-level 過濾

系統表面上是有 gate 的。 但實際上, 它還是讓高一級的資料混進來了。

output:不是拿到了就能原樣吐出來

最後一段是 output。 這也是很多工程團隊最容易「太相信模型」的地方。 因為他們以為: 只要 retrieve 已經做過, 模型就可以自由組句。 但 output 還有自己的邊界。 同一份資料, 可能可以出現在:

  • 給 admin 的完整後台頁面
  • 給一般員工的摘要回答
  • 給 log 的 redacted 版本
  • 給 email 的單段結論

也就是說, 可被 retrieve, 不等於可被原文輸出。 你還要決定:

  • 誰能看完整內容
  • 誰只能看摘要
  • 誰連摘要都不該看
  • 哪些欄位要遮罩

如果你忽略 output boundary, 系統就會把上游所有努力一次吐光。

四級分類:public / internal / confidential / restricted

要把資料邊界做成工程慣例, 你需要一個夠小、 但能落地的分類法。 這門課先用四級就好:

等級代表意思典型例子
public對外公開也沒關係官網文件、已公告規格
internal公司內部可流通,但不該外流SOP、內部 wiki、一般會議摘要
confidential只限特定人或特定流程客戶名單、未公開 roadmap、內部財務資料
restricted高風險,預設不應自由檢索與輸出薪資表、身分證號、醫療或法務文件、主密鑰材料

這四級的重點不在於命名多精美。 而在於每一級都要對應不同的行為規則。 至少要回答三件事:

  1. 它可以存到哪裡?
  2. 誰可以檢索?
  3. 最後可以怎麼輸出?

你可以先用最小版規則理解:

等級StoreRetrieveOutput
public一般 store 可大多數 flow 可可原文或摘要
internal內部 store僅內部 principal以工作目的輸出
confidential分層 store需 principal + 用途驗證預設摘要或局部顯示
restricted高保護 store極少數 flow預設拒絕或人工 gate

你不一定永遠用這四級。 但你至少要有一套明確規則, 而不是每次靠感覺。

三個最常見破洞

這門課先讓你對準三個最常見的 failure mode。 後面幾課都會圍著它們轉。

破洞一:RAG 撈到上一級資料

這是最經典的邊界事故。 一個 internal 問題, 撈到了 confidential 片段。 一個 confidential case, 撈到了 restricted 附件。 模型本身不需要作惡。 它只是很誠實地使用了你提供的上下文。 真正的錯在 retrieval policy。

破洞二:memory consolidation 把高敏資料落到低層

這一種比較陰。 你本來覺得 restricted 資料沒有直接對外。 但 consolidation pipeline 在做長期記憶時, 把它提煉成一般摘要, 又落到了較低敏的層。 幾週後, 另一個 agent 從低敏層撈到這段摘要。 這就是典型的資料降階外流。 它不是一次性爆炸。 它是慢慢滲出去。

破洞三:log / debug 把 PII 印出

很多資料邊界事故根本不發生在主功能。 而是發生在你覺得「只是為了方便除錯」的地方。 像是:

  • print(payload)
  • request body 全量記錄
  • 失敗重試時把原文片段寫入 error log

主程式也許有做 retrieve gate。 但 log 沒做 redaction, 一樣會把敏感資訊送到另一個大水池裡。

先建立心智模型,不急著找神奇技術

這一課故意不講太多具體技術。 不講哪個向量資料庫比較安全。 不講哪個 access control framework 最潮。 也不講哪個 redaction library 最方便。 原因很簡單。 如果你腦中沒有 flow map, 你最後只會得到一堆散落的 patch:

  • 這裡補一個 allowlist
  • 那裡加一個 regex
  • 另一邊再塞一個 guardrail

然後每次出事, 你都不知道到底是哪一段越界。 真正要先長出來的, 是這個反射:

任何資料問題,都先問它發生在 collect、store、retrieve、還是 output。

只要你能先把事故落到其中一段, 修法就開始有方向。

一張你可以帶去 review 會議的檢查表

下次你在看 AI agent 或 RAG 設計時, 先別急著問模型選哪個。 先用這張表問:

問題你要逼團隊講清楚的事
資料怎麼進來?collect 是否有排除不該收的來源
進來後放哪裡?store 是否按敏感等級分層
誰能撈?retrieve 是否同時看 principal、用途、資料級別
怎麼吐?output 是否有遮罩、摘要、拒絕策略
出事時在哪段?能不能把事故歸到四階段之一

如果一個設計回答不了這五題, 那就不是「之後再補」。 而是還沒準備好上線。

這一課你先帶走兩句話

第一句:

資料可信,不代表資料可以自由流動。

第二句:

資料邊界不是只看 retrieval;collect、store、output 每一段都要有 gate。

這兩句話先記住。 後面幾課, 我們才會開始把它壓成具體做法:

  • 怎麼替每筆資料掛 provenance
  • 怎麼驗寫入者是不是合法 principal
  • 怎麼用 namespace 把不同 agent 隔開
  • 怎麼做一條不會吃自己摘要的 consolidation pipeline

AI 協作:學了這個,跟 AI 怎麼配合?

這個技能在 AI 協作中的定位,是讓你先把資料流畫清楚,再要求 AI 幫你找邊界缺口,而不是一開始就瞎補技術。 你的人類優勢:

  • 只有你知道哪份資料在你的組織裡算 internal、confidential、還是 restricted。
  • 只有你能判斷某個 output 看似方便,實際上會不會造成跨部門或跨角色外流。

可以這樣跟 AI 說:

我有一個 RAG / memory flow。請先不要提解法,先把整條資料流拆成 collect、store、retrieve、output 四段,列出每段碰到的資料類型、principal、和可能的越界點。最後幫我找出最容易被忽略的一段,並說明為什麼。

Do

挑戰任務

Task 1

請直接印出一個 JSON 物件,為下面 4 個場景標記最需要先補 boundary 的階段:slack_dump_to_kb(把整個 Slack export 收進知識庫)、salary_pdf_in_shared_store(把薪資 PDF 放到共用向量庫)、faq_query_hits_hr_chunk(一般 FAQ 問題撈到 HR 片段)、debug_log_prints_id_number(debug log 印出身分證字號)。鍵名固定用這 4 個,值只能是 collect、store、retrieve、output。

Next Lesson →