重點摘要
- 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 感測器迴路
git commit -m "fix: ..." ↓fix-detect.sh偵測到 fix: commit → 注入:
「現在去更新 brain,不准做下一件事」
precompact.sh壓縮前掃最近 5 個 commit →
「記憶要被清除了,brain 寫了嗎?」
stop-check.sh比對 fix commit vs brain 修改時間 →
有 fix 卻 0 更新 = 警告
三個攔截點:守住 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.sh用find 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 的概念我有開源一份骨架,有興趣可以參考延伸。)
發佈留言