跳到主要內容
← 返回 Penna 實驗室

AI 工作區自動清掃:四層架構讓你的 Agent 不再被自己的垃圾淹沒

AI Agent 每天產生大量暫存檔、日誌、截圖。不清理就會拖慢效能、吃光空間。這篇介紹一套四層自動維護系統——從每小時的健康檢查到每月的深度審計,讓 workspace 永遠保持乾淨。

AI 工作區自動清掃:四層架構讓你的 Agent 不再被自己的垃圾淹沒

AI 工作區自動清掃:四層架構讓你的 Agent 不再被自己的垃圾淹沒

這套系統從實際管理一個 100+ 檔案每天變動、20+ 專案同時進行的 AI 工作區中誕生。每一條清理規則都是因為「某天早上發現磁碟空間又少了 2GB」才被加進來的。

你有一個 AI Agent 在幫你做事。很好。

過了一個月,你打開它的工作目錄:

  • 47 個已經沒用的暫存檔
  • 230 個排程日誌,最舊的從上個月就在了
  • 15 張截圖,你早就不記得是哪個任務產生的
  • 記憶檔案膨脹到 30 幾個,一半內容已經過時

你花了 20 分鐘手動清理。第二天,一樣的事情又發生了。

這不是偶爾的問題,是結構性的問題。 AI Agent 的工作區天生會膨脹——每個 session 產生暫存檔,每個排程任務留下日誌,每個媒體任務產出截圖。沒有自動清理機制,就是在跟熵做一場必輸的仗。


核心理念:腳本做苦力,AI 做判斷

機械小助手們做重複工作,聰明的貓頭鷹只在需要判斷時才被請出來

在設計這套系統之前,我們嘗試過「全部交給 AI 清理」。結果:

方法成本問題
全部人工清理$0,但花時間每天 10-20 分鐘,容易忘記
全部交給 AI每次 $0.10-0.5095% 的清理工作不需要判斷力
腳本 + AI 混合每次 ~$0.01腳本處理確定性工作,AI 只在需要判斷時介入

核心原則很簡單:

「超過 3 天的暫存檔就刪」不需要 AI 判斷——shell script 就夠了。 「這兩份記憶筆記內容有 80% 重複,要合併嗎?」才需要 AI。


四層架構

四層塔狀結構,從底部的心跳檢查到頂部的深度審計

graph TD
    T0["⏱ Tier 0:每小時健康檢查<br/>純 Shell・$0"] --> T1["🧹 Tier 1:每日清掃<br/>純 Shell・$0"]
    T1 --> T2["🔍 Tier 2:每週掃描<br/>Shell + AI・~$0.01"]
    T2 --> T3["📋 Tier 3:每月審計<br/>Shell + AI・~$0.05"]

    style T0 fill:#2A2118,stroke:#CBA000,color:#FAF6EE
    style T1 fill:#4A3828,stroke:#CBA000,color:#FAF6EE
    style T2 fill:#8A6830,stroke:#CBA000,color:#FAF6EE
    style T3 fill:#CBA000,stroke:#2A2118,color:#2A2118
Tier頻率執行者成本做什麼
0每小時Shell$0健康檢查、哨兵監控、錯誤去重
1每天Shell$0刪暫存檔、清媒體、清日誌
2每週Shell + AI~$0.01主題檔精煉、筆記壓縮
3每月Shell + AI~$0.05環境清單比對、複雜度審計

越往上走,頻率越低、判斷力要求越高、成本越貴。這就是為什麼不能全用 AI——如果連「刪 3 天前的暫存檔」都用 AI,一個月下來的 token 費可能比磁碟空間還貴。


Tier 0:每小時健康檢查

這是整個系統的心跳。它不清理任何東西,只做三件事:

1. 哨兵檔案檢查

企鵝站在燈塔上,監控海面上的小瓶子訊號——綠色代表健康,琥珀色代表警告

每個 Tier 執行完畢後,都會更新一個「哨兵檔案」:

# Tier 1 完成時寫入
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) OK" > .last-daily-ok

# Tier 0 檢查哨兵
last_daily=$(cat .last-daily-ok 2>/dev/null)
# 如果超過 36 小時沒更新 → 警告
graph LR
    T1["Tier 1 跑完"] -->|寫入| S1[".last-daily-ok"]
    T2["Tier 2 跑完"] -->|寫入| S2[".last-weekly-ok"]
    T0["Tier 0(每小時)"] -->|檢查| S1
    T0 -->|檢查| S2
    S1 -->|超過 36 小時沒更新| WARN["⚠️ 警告"]
    S2 -->|超過 10 天沒更新| WARN

    style T0 fill:#CBA000,stroke:#2A2118,color:#2A2118
    style WARN fill:#F44336,stroke:#2A2118,color:white

這招很巧妙:你不需要監控排程系統本身是否正常——只要看哨兵檔案夠不夠新,就知道一切是否在跑。

2. 錯誤去重

同樣的警告連續出現三次以上,才報一次。這防止了「通知疲勞」——如果每小時都收到「暫存檔超過 50 個」的警告,你很快就會開始忽略所有警告。

3. 早期退出

如果工作區很乾淨(沒有超限的檔案、沒有遺失的哨兵),整個腳本在幾毫秒內就結束。不做不必要的掃描。


Tier 1:每日清掃

這是真正開始清東西的地方。所有規則都是確定性的——不需要判斷,只看年齡和類型:

graph TD
    START["每日清掃開始"] --> CHK{"有東西要清嗎?"}
    CHK -->|沒有| EXIT["✅ 早期退出"]
    CHK -->|有| TEMP["🗑 暫存檔 > 3 天"]
    TEMP --> MEDIA["🗑 媒體檔 > 7 天"]
    MEDIA --> CRON["🗑 排程日誌 > 14 天"]
    CRON --> REPORT["📊 輸出報告"]

    style EXIT fill:#4CAF50,stroke:#2A2118,color:white
    style TEMP fill:#FAF6EE,stroke:#CBA000,color:#2A2118
    style MEDIA fill:#FAF6EE,stroke:#CBA000,color:#2A2118
    style CRON fill:#FAF6EE,stroke:#CBA000,color:#2A2118

清理規則

目標規則預設閾值
暫存檔(tmp/超過 N 天就刪3 天
媒體檔(media/超過 N 天就刪7 天
排程日誌(cron/runs/超過 N 天就刪14 天
空目錄自動清除

暫存檔正在被看不見的力量整理,有些發光(保留),有些消散(刪除)

兩層早期退出

Tier 1 有一個聰明的設計:兩層早期退出

# 第一層:整體檢查
total_candidates=$(find tmp/ media/ cron/runs/ -type f | wc -l)
if [ "$total_candidates" -eq 0 ]; then
    echo "Nothing to clean. Exiting."
    exit 0
fi

# 第二層:每個分類單獨檢查
old_temps=$(find tmp/ -mtime +3 -type f | wc -l)
if [ "$old_temps" -eq 0 ]; then
    echo "tmp/ is clean. Skipping."
    # 繼續下一個分類,不是整個退出
fi

這讓一個乾淨的工作區幾乎不花任何 I/O。

安全刪除

所有刪除都用 trash(macOS)而不是 rm。這讓你有 30 天的後悔期。沒有 trash 指令?腳本會 fallback 到移動到 ~/.Trash/


Tier 2:每週 AI 輔助掃描

到了這裡,我們開始需要判斷力了。Shell script 負責收集數據,AI 負責做決定

Script 做什麼

graph LR
    SCAN["Shell 掃描"] --> D1["列出所有主題檔 + 最後修改日"]
    SCAN --> D2["計算每個專案目錄大小"]
    SCAN --> D3["找出跟其他檔案 80%+ 重複的筆記"]
    SCAN --> D4["列出 30 天沒動的專案"]
    D1 --> REPORT["📄 掃描報告"]
    D2 --> REPORT
    D3 --> REPORT
    D4 --> REPORT
    REPORT --> AI["🤖 AI 審閱 + 行動"]

    style SCAN fill:#E8ECF1,stroke:#2A2118,color:#2A2118
    style AI fill:#CBA000,stroke:#2A2118,color:#2A2118

AI 做什麼

拿到掃描報告後,AI 判斷:

  • 這兩份筆記內容重疊 80%,要合併嗎?→ 合併
  • 這個專案 30 天沒動了,是暫停還是結束?→ 標記為暫停
  • 這個主題檔超過 200 行了,要拆分嗎?→ 拆分

為什麼這樣分

Shell script 收集數據幾乎是免費的(毫秒級)。AI 判斷一次大約 $0.01。如果讓 AI 自己去掃描,它要讀幾十個檔案(每個都是 token),成本可能是 $0.50+。

腳本先篩選,AI 只看精華。 這就是為什麼整套系統每週的 AI 成本只有 ~$0.01。


Tier 3:每月深度審計

一個月一次,做一次全面體檢。

graph TD
    M["每月審計"] --> ENV["🔧 環境清單比對"]
    M --> STALE["📅 30 天以上未改的檔案"]
    M --> COMP["📊 複雜度審計"]
    M --> DB["💾 資料庫 VACUUM"]

    ENV --> DIFF["跟上月清單比對<br/>新增了什麼?消失了什麼?"]
    STALE --> ARCHIVE["標記可歸檔的檔案"]
    COMP --> ALERT["哪個目錄膨脹太快?"]
    DB --> SIZE["回收多少空間?"]

    style M fill:#CBA000,stroke:#2A2118,color:#2A2118

環境清單(Manifest)

每月產生一份環境快照:

## 環境清單 — 2026-03

- 專案數:22(上月 20,+2)
- 記憶筆記:18(上月 15,+3)
- 主題檔:8(上月 8,不變)
- 排程任務:12(上月 10,+2)
- 總磁碟使用:2.3 GB(上月 2.1 GB,+200 MB)

跟上月比對,就能看出哪裡在膨脹、哪裡在萎縮。

複雜度陷阱

維護系統本身也會膨脹。每月審計會檢查:

  • 清理規則是不是越來越多?(超過 20 條就該精簡)
  • 腳本是不是越來越長?(超過 500 行就該拆分)
  • 是不是在維護「維護系統的維護系統」?(是時候退後一步了)

回饋循環:系統會自己進化

企鵝坐在舒適的椅子上,審閱一卷從混亂逐漸變整潔的長卷軸

這套系統最精妙的設計是自我改善機制

graph TD
    D["Tier 1 每日清掃"] -->|發現異常模式| S["optimization-suggestions.md"]
    W["Tier 2 每週掃描"] -->|評估建議| S
    M["Tier 3 每月審計"] -->|採納規則| C["config.sh"]
    C -->|更新後| D

    S -->|累積建議| W
    W -->|篩選可行的| M
    M -->|寫入新閾值| C

    style S fill:#FAF6EE,stroke:#CBA000,color:#2A2118
    style C fill:#CBA000,stroke:#2A2118,color:#2A2118

流程是這樣的:

  1. Tier 1 發現異常:「連續 5 天都有超過 10 個暫存檔要清,也許 3 天的閾值太長了?」→ 寫進 optimization-suggestions.md
  2. Tier 2 評估建議:AI 看建議,判斷是否合理
  3. Tier 3 採納規則:如果建議被 AI 和人都認可,更新 config.sh 的閾值

系統從自己的運作經驗中學習,而不是靠你記住「上次是怎麼調的」。


從踩坑中學到的事

幾個寫進腳本前先撞過的牆:

null-byte bug

某些 AI 工具偶爾會在檔案裡寫入 null bytes(\x00)。看起來檔案正常,但 grep 會把它當二進位檔跳過。解法:清掃時加一個 null-byte 掃描步驟。

-newermt 陷阱

macOS 的 find 不支援 -newermt解法:改用 -mtime +N,或用 stat -f%m 取 epoch 時間自己算。每個平台差異都封裝在 config.sh 的 helper function 裡。

早期退出的價值

一開始沒做早期退出,每小時的健康檢查要跑 2-3 秒。加了早期退出後,乾淨的工作區只要 50ms。聽起來小,但一天跑 24 次就是差 70 秒和 1.2 秒的差別。


快速開始

只需要四步:

1. Clone + 設定路徑

git clone https://github.com/p3nchan/auto-optimization.git
cd auto-optimization
export WORKSPACE_ROOT="$HOME/.my-agent-workspace"

2. 調整閾值

編輯 config/config.sh

THRESHOLD_TEMP_DAYS=3        # 暫存檔保留天數
THRESHOLD_MEDIA_DAYS=7       # 媒體檔保留天數
THRESHOLD_CRON_LOG_DAYS=14   # 排程日誌保留天數

3. 排程

# crontab -e
0 * * * *  /path/to/auto-optimization/scripts/hourly-healthcheck.sh
0 3 * * *  /path/to/auto-optimization/scripts/daily-cleanup.sh
0 4 * * 0  /path/to/auto-optimization/scripts/weekly-scan.sh
0 5 1 * *  /path/to/auto-optimization/scripts/monthly-scan.sh

4. 觀察

跑幾天後,看看 optimization-suggestions.md 有沒有累積建議。根據建議調整閾值。


總結

你的狀況建議
剛開始用 AI Agent先加 Tier 1(每日清掃)就夠了
有 5+ 個專案在跑加 Tier 0(健康檢查)+ Tier 1
有排程任務 + 大量日誌全部四層都上
只想最小投入daily-cleanup.sh 加進 cron,其他先不管

完整的腳本、設定檔和文件都在開源 repo 裡:

👉 Auto Optimization on GitHub

MIT 授權,clone 下來改一改就能用。

免責聲明與利益揭露

本文僅供一般資訊與教育參考,不構成投資、法律、稅務或任何專業建議。市場與法規可能隨時變動,文中資訊僅反映撰寫當時狀況。

詳見本站法律聲明與利益揭露隱私政策