MapleCheng

在浩瀚的網路世界中無限潛水欸少年郎!

0%

刪除資料這件小事:AI 自動化裡最容易被低估的安全邊界

最近在調整一個 AI 自動化整理流程時,我又被一個看起來很小的細節敲了一下頭:刪除資料這件事,真的不能只把它當成 housekeeping。

工程師很容易低估「清掉舊檔案」「移除垃圾紀錄」「整理重複資料」這類工作。因為它不像新功能那麼亮眼,也不像線上事故那麼刺激。但當這些工作交給 AI agent 或排程自動執行時,刪除就不再只是整理,而是一條非常清楚的安全邊界。

最危險的指令,常常長得最無聊

rm、批次刪除、regex 掃描後清理,這些東西在日常開發裡太常見了。常見到我們會忘記問一個基本問題:如果判斷錯了,誰救得回來?

人手動下指令時,至少還有一點情境感。你大概知道自己在哪個目錄、剛剛看過哪些檔案、刪掉之後會不會後悔。當然,人也會手滑,這我不敢嘴,畢竟每個工程師心裡都有一個不想回憶的 rm -rf 故事。

但 AI 自動化更麻煩。它可能是凌晨跑的,可能連續處理幾百筆候選資料,可能根據某個規則判斷「這看起來像垃圾」。問題是,「看起來像」這三個字,在刪除場景裡非常危險。

對 AI 來說,刪除不該是普通操作。它應該被視為權限升級。

可逆,比聰明更重要

我現在設計這類流程時,第一個原則是:能不要真的刪,就先不要真的刪。

例如要移除某個受版本控制的檔案,直接用系統層級的刪除指令,看起來很乾脆;但如果改用版本控制工具處理,至少會留下 diff、commit、history,也比較容易被 review 或 rollback。這不是因為 Git 比 shell 神聖,而是因為它把「刪除」變成一個有紀錄的狀態變更。

同樣地,如果要清理資料庫裡的重複資料,我會偏好先標記、移到 quarantine、產出 dry run report,而不是直接 DELETE FROM。如果真的要刪,也要能回答幾個問題:刪了哪些?為什麼刪?依據哪個規則?什麼時間刪?能不能恢復?

聽起來很囉唆對吧?但這就是自動化系統的現實。人類偶爾手動整理,犯錯範圍通常有限;排程一旦犯錯,是很有耐心地把錯誤重複執行到天亮。

Regex 命中不是事實,只是線索

另一個很容易踩的坑,是把 pattern match 當成真相。

例如我們想找出 metadata 垃圾、壓縮後殘留、重複 transcript、無效暫存檔。寫幾個 regex 掃下去,很快就能列出一堆候選。那一刻會很有成就感,彷彿系統突然變乾淨了。

但 regex 命中只代表「它符合某個文字形狀」,不代表「它應該被刪」。尤其在 AI 系統裡,很多檔案的內容本來就長得像模板、像 log、像暫存、像摘要。你以為抓到垃圾,實際上可能抓到一段未來要追溯的上下文。

所以我會把掃描分成兩層:第一層是 detection,負責找出候選;第二層是 decision,負責判斷能不能處置。這兩層不要混在一起。尤其是高風險清理,寧可多產生一份報告給人看,也不要讓 agent 因為「規則看起來很準」就自己動刀。

            
            flowchart LR
  A[掃描候選] --> B[分類風險]
  B --> C{是否可逆?}
  C -->|是| D[自動處理並留下紀錄]
  C -->|否| E[產生 dry run 報告]
  E --> F[人工確認或延後處理]
  D --> G[驗證與可回滾紀錄]
  F --> G
          

不要把安全設計推給 approval dialog

很多 agent runtime 都會有 approval 機制:危險指令要使用者同意、刪除操作要確認、外部寫入要攔一下。這很好,但我不喜歡把它當成主要防線。

原因很簡單:approval dialog 是最後一道煞車,不是道路設計。

如果一個流程每次都要靠人按「允許」才能跑完,它其實還沒有被設計成自動化。更糟的是,按久了人會疲乏,最後看到提示就反射性同意。這跟網站 cookie banner 很像,本來是保護機制,最後變成訓練大家閉著眼睛按確定。

比較好的做法,是把高風險操作改寫成低風險操作。不要讓 agent 去做「不可逆刪除」,而是讓它產生可 review 的變更;不要讓它直接清空資料,而是讓它把候選移到隔離區;不要讓它自由組 destructive command,而是提供受限的工具介面,只允許幾種明確、可記錄、可回滾的動作。

這樣 approval 才是例外,不是日常。

自動化不是少管,而是更好管

我常覺得,大家談 AI agent 時太容易把焦點放在「它能不能自己做事」。這當然重要,但對技術主管來說,我更在意的是:它做完之後,我能不能理解、追蹤、修正?

一個好的 agent 工作流,應該像一個可靠的同事:不只會完成任務,也會留下清楚紀錄;不確定時會降級處理;碰到高風險動作會知道停手;事後 review 時講得出自己做了什麼。

這不是要把 AI 綁到不能動。剛好相反,只有當邊界設計清楚,我才敢讓它跑更遠。因為我知道就算它判斷錯了,錯誤也會被限制在可恢復的範圍內。

小結:刪除是產品決策,不是清潔工作

自動化系統最迷人的地方,是它會默默幫你處理那些無聊但必要的事。整理資料、歸檔紀錄、清掉重複、維護知識庫,這些工作如果都靠人手動做,很快就會荒廢。

但越是無聊的工作,越容易被我們放鬆警戒。尤其是刪除。它不像部署新版本那麼隆重,也不像權限設定那麼敏感,卻可能在某個凌晨安靜地造成不可逆的損失。

所以我現在的標準很簡單:AI 可以幫我找垃圾,可以幫我分類,可以幫我產生清理建議,也可以處理那些已經設計成可逆的變更。但只要牽涉不可逆刪除,就必須有更高規格的流程。

刪除資料不是打掃房間而已。對 AI 自動化來說,它是一個產品決策、一個治理問題,也是一條工程倫理的邊界。

如果我們希望 agent 真的成為可靠的工作夥伴,就不能只教它怎麼做事,也要教它什麼時候不要動手。