讓 AI 不再失憶:用 Claude Code Hooks 打造大腦反饋迴路

重點摘要

  • LLM 最大的弱點是會忘:session 結束或 context 被壓縮後,這次學到的教訓就蒸發了。
  • 解法是把「教訓」外接到持久的 腦子系統(brain/*.md),並用 hooks 在關鍵時刻強迫寫入。
  • 5 支 hook 腳本在三個點攔截:fix commit 發生時、context 壓縮前、session 結束時
  • 另一支 hook 負責身份錨定,防止 /compact 後 AI 角色崩潰。

大型語言模型最致命的弱點,不是不夠聰明,而是會失憶。每一次對話結束,或是上下文(context)被壓縮(compaction)以節省 token,這一輪辛苦學到的教訓——某個 bug 的根因、某個 API 的雷點——就跟著蒸發,下一次又從零開始,甚至重踩同一個坑。

我在 Claude Code 上的解法,是一套「harness × 腦子系統」的反饋迴路:用幾支 Bash hook 腳本當感測器,在 AI 即將遺忘的關鍵點上攔截,強迫它把這次的教訓寫進持久的 brain 檔。這篇拆解它為什麼需要、每支腳本做了什麼、以及它怎麼跟腦子系統搭配。

為什麼需要這套東西?LLM 的三個結構性缺陷

這套設計不是為了炫技,而是針對 LLM 的三個無法靠「更大模型」解決的缺陷:

  • 沒有長期記憶:模型權重是凍結的,單次對話的學習不會留存。→ 需要一個外部、持久的記憶體(brain 檔)。
  • 記憶會被壓縮清除:對話一長,context 就會被 compaction 截斷,早期內容直接消失。→ 需要在壓縮之前把該留的留下來。
  • 會角色漂移(role drift):尤其在壓縮後,AI 可能忘記自己是誰、該做什麼。→ 需要定期重新錨定身份。

關鍵洞察是:光靠「提醒 AI 要記得寫筆記」沒用,因為它會說「好的我等下寫」然後就忘了。必須把它做成系統層級的強制關卡(gate)——由 harness 在固定時機自動觸發,而不是仰賴 AI 的自律。

一張圖看懂:harness 感測器迴路

🤖 Claude Code Session(工作中)
做事 → git commit -m "fix: ..."
⚡ HARNESS 感測器層(hooks 自動觸發)
① 發生時 · PostToolUse
fix-detect.sh
偵測到 fix: commit → 注入:
「現在去更新 brain,不准做下一件事」
② 遺忘前 · PreCompact
precompact.sh
壓縮前掃最近 5 個 commit →
「記憶要被清除了,brain 寫了嗎?」
③ 離開時 · Stop
stop-check.sh
比對 fix commit vs brain 修改時間 →
有 fix 卻 0 更新 = 警告
↓ 強制寫入教訓
🧠 腦子系統 · brain/*.md(37 個領域檔,持久)
– [source: 專案名] 哪裡踩坑、怎麼修的
↺ 下次 SessionStart 載入 MEMORY.md 索引 → 知識回到 AI,不再從零開始

三個攔截點:守住 fix commit 的整個生命週期

這套機制最聰明的地方,是它不靠單一檢查點,而是沿著「一個教訓從產生到消失」的時間軸,設了三道關卡。每一道都是一支獨立的 Bash 腳本,讀 Claude Code 透過 stdin 餵進來的 JSON,再輸出一段 additionalContext 回去改變 AI 的下一步行為。

時機(Hook) 腳本 做什麼
PostToolUse(每次 Bash 後)fix-detect.sh解析 git commit 訊息,若是 fix: 開頭,注入硬性要求:讀對應 brain 檔、追加教訓、更新前不准進行下一個任務
PreCompact(壓縮前)precompact.sh掃描最近 5 個 commit 找 fix:,在 context 被清除前做最後提醒:「該寫的寫了嗎?現在不寫就來不及了」
Stop(session 結束)stop-check.sh統計今天的 fix: commit 數,對比 brain 檔有沒有被更新過;有修 bug 卻沒留筆記,就丟出「知識可能流失」的警告

三個點分別對應人(或 AI)會偷懶的三個藉口:「等下再寫」(被①擋下)、「我忘了還沒寫」(被②救回)、「這次算了吧」(被③抓出來)

一個巧妙的無狀態設計:時間戳 + mtime 比對

怎麼知道「這個 session 到底有沒有動過 brain」?這裡用了一個很輕量、不需要資料庫的技巧,由兩支腳本配合:

  • SessionStart 時,session-start.sh 只做一件事:touch /tmp/.claude-session-start,在檔案系統上插一根時間戳基準線
  • Stop 時,stop-check.shfind BRAIN_DIR -newer /tmp/.claude-session-start 數出「比這根基準線更新的 brain 檔」有幾個。

0 個,代表這次 session 完全沒碰 brain。用檔案的 mtime 當狀態,既不用記資料庫、也跨工具通用——這是 Unix 哲學的漂亮應用。

另一種 hook 用途:身份錨定,防止角色崩潰

hook 不只用來餵記憶,也能用來穩住 AI 的身份。我跑過一個多 agent 的評測 harness,其中一個 session 擔任「Driver(駕駛)」——負責呼叫 orchestrator、讀結果、寫總結;另一批 agent 才是「被測團隊」。問題是:一次 /compact 之後,Driver 角色崩潰了,退化成被測團隊,開始自己回答原本該交給被測 agent 的技術題。

修法是一支 SessionStart hook:當工作目錄落在該專案內,就注入一段「身份錨定」context,白紙黑字提醒——你是 Driver、不是被測團隊、遇到這些題目只能呼叫 orchestrator 而不是自己答。每次啟動(含 compact 後的重啟)都重貼一次,把漂移的角色拉回來。這是「context injection 對抗 LLM drift」的典型手法。

它跟腦子系統的搭配:三層分工

把整套東西攤開,其實是三層各司其職,像生物的神經系統:

對應 角色
Hooks神經反射自動、不經思考,在固定時機觸發,負責「執行紀律」
Brain 檔長期記憶持久儲存踩過的坑與教訓,跨 session、跨專案可讀
CLAUDE.md價值觀 / 規則每次 session 載入,定義「該怎麼做事」的原則

Hooks 的唯一使命,就是確保「經驗 → 長期記憶」這條路徑不會因為 AI 的健忘或偷懶而斷掉。Brain 負責存、CLAUDE.md 負責規範,而 Hooks 負責在對的時間點逼著迴路閉合。三者缺一,知識就會慢慢漏光。

設計哲學:為什麼是「強制關卡」而不是「溫柔提醒」?

因為知識的衰減是無聲的。沒人會在當下感覺到「我剛剛流失了一條教訓」,只會在三個月後重踩同一個坑時才後悔。溫柔的提醒對抗不了這種無聲衰減——它需要的是一個會在你想跳過時擋在路中間的系統。借別人(與過去的自己)之手學坑,而不是真的每個坑都親自踩一次,這才是把 AI 從「強力的金魚」變成「會累積的夥伴」的關鍵。

(這套 domain brain 的概念我有開源一份骨架,有興趣可以參考延伸。)

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *