CLAUDE.md 與 AI 記憶系統
為什麼 AI 每次對話都會「失憶」?
💡 比喻:金魚的記憶 每次你開一個新的 AI 對話,就像跟一條金魚說話—— 它完全不記得上次你們聊了什麼。 你上次花了 30 分鐘解釋專案架構,這次又要重新來一遍。
CLAUDE.md 就是給金魚裝了一個小抄本, 每次對話開始前,它會先讀小抄,瞬間回憶起所有重要的事。
AI 的記憶問題
對話 1:"我的專案用 .NET 8 + SQLite + EF Core"
對話 2:"我的專案是什麼技術棧?" → AI:"我不知道"
對話 3:"幫我加一個功能" → AI:"你的專案是什麼?用什麼框架?"
每次都要重新解釋 = 浪費時間 + 浪費 Token
解決方案就是 記憶系統。Claude Code 有三層記憶架構,讓 AI 越用越聰明。
第一層:CLAUDE.md(專案級永久記憶)
CLAUDE.md 是放在專案根目錄的檔案,每次開啟 Claude Code 時會自動載入。
為什麼 CLAUDE.md 這麼重要?
沒有 CLAUDE.md:
每次對話都要重新解釋 → 浪費 Token、浪費時間
有 CLAUDE.md:
自動載入 → AI 馬上知道你的專案 → 直接開始工作
而且 CLAUDE.md 有快取機制,幾乎不花 Token!
CLAUDE.md 放什麼?
適合放穩定不常變動的資訊:
# GuitarSchool 專案
## 技術棧
- .NET 8 + ASP.NET Core MVC
- SQLite + Entity Framework Core
- Bootstrap 5 + 自訂 CSS
- 部署:Railway(Docker)
## 專案架構
GuitarSchool/ ├── Controllers/ # MVC Controller ├── Models/ # 資料模型 ├── Views/ # Razor View ├── Data/ # DbContext + Seed Data ├── wwwroot/css/ # 樣式表 └── Program.cs # 應用程式進入點
## CSS 變數(統一色系)
```css
:root {
--bg-warm: #F5F1EB; /* 暖米色背景 */
--text-dark: #2C3E50; /* 深色文字 */
--accent: #E67E22; /* 橘色強調 */
--accent-hover: #D35400; /* 橘色 hover */
}
部署指令
docker build -t guitarschool .
railway up
注意事項
- View 裡的文字全部用繁體中文
- 不用 Repository Pattern,直接用 DbContext
- CSS 用 BEM-like 命名(.card-guitar, .btn-primary-warm)
- 所有 action 用 async/await
### CLAUDE.md 的快取機制
第一次對話:載入 CLAUDE.md → 花少量 Token 讀取 第二次對話:CLAUDE.md 沒變 → 從快取讀取 → 幾乎 0 Token! 修改後: 偵測到變動 → 重新載入 → 更新快取
這就是為什麼 CLAUDE.md 是最省 Token 的記憶方式。
### CLAUDE.md 的位置
專案根目錄的 CLAUDE.md → 這個專案的所有對話都會載入 ~/.claude/CLAUDE.md → 全域設定,所有專案都會載入
建議:專案特定的放專案根目錄,通用偏好放全域
---
## 第二層:Auto Memory(動態自動記憶)
> 💡 **比喻:秘書的筆記本**
> 如果 CLAUDE.md 是「公司手冊」(正式、穩定),
> Auto Memory 就是「秘書的筆記本」(隨時記錄、動態更新)。
> AI 會自動判斷哪些資訊值得記住,存到筆記本裡。
### Auto Memory 怎麼運作?
位置:~/.claude/projects/<你的專案路徑>/memory/
結構: memory/ ├── MEMORY.md # 索引檔(列出所有記憶) ├── preference-001.md # 記憶:用戶喜歡用 tab 縮排 ├── workflow-002.md # 記憶:部署流程是 build → test → push └── context-003.md # 記憶:正在做購物車功能
### 什麼會被自動記住?
AI 會自動記住:
- 你的偏好("我喜歡用 4 空格縮排")
- 重複的指示("不要用 var,用明確型別")
- 進行中的工作("我們正在做第三章的內容")
- 常見的操作("每次改完 code 都要跑 dotnet build")
AI 不會記住:
- 一次性的對話內容
- 太瑣碎的細節
- 跟專案無關的閒聊
### Auto Memory vs CLAUDE.md 的差別
特性 CLAUDE.md Auto Memory ────────────────────────────────────────────────── 維護方式 你手動寫 AI 自動存 載入時機 每次對話自動載入 按需讀取 Token 消耗 有快取,幾乎 0 讀取時花 Token 適合內容 穩定的專案資訊 動態的偏好和進度 位置 專案根目錄 ~/.claude/projects/.../memory/
---
## 第三層:Memory MCP(跨專案知識圖譜)
> 💡 **比喻:公司的知識庫**
> CLAUDE.md 是「部門手冊」(只給這個專案用),
> Auto Memory 是「個人筆記」(動態記錄),
> Memory MCP 就是「公司知識庫」(所有專案都能查、跨專案共享)。
### Memory MCP 怎麼運作?
Memory MCP 是一個 **知識圖譜(Knowledge Graph)**,用「實體」和「關係」來儲存知識。
實體(Entity):
- 名稱:"GuitarSchool"
- 類型:"Project"
- 觀察:["用 .NET 8", "部署在 Railway", "暖米色系"]
關係(Relation):
- GuitarSchool → uses → "SQLite"
- GuitarSchool → deployed_on → "Railway"
- User → prefers → "繁體中文"
### 設定 Memory MCP
在 `~/.claude/settings.local.json` 加上:
```json
{
"mcpServers": {
"memory": {
"command": "cmd",
"args": ["/c", "npx", "-y", "@anthropic-ai/memory-mcp"]
}
}
}
Memory MCP 的用法
> 幫我記住:我所有的專案都用 4 空格縮排,不用 tab
AI 會自動呼叫 Memory MCP 存入:
Entity: "UserPreference_Indentation"
Type: "CodingPreference"
Observations: ["使用 4 空格縮排", "不使用 tab"]
以後在任何專案,AI 都會記得這個偏好。
三層記憶架構設計
┌─────────────────────────────────────────────────┐
│ CLAUDE.md(第一層) │
│ 快取 ≈ 0 Token → 穩定資訊 │
│ 專案架構、部署指令、CSS 變數、技術棧 │
├─────────────────────────────────────────────────┤
│ Auto Memory(第二層) │
│ 按需讀取 → 動態偏好 │
│ 用戶偏好、進行中的工作、常用操作 │
├─────────────────────────────────────────────────┤
│ Memory MCP(第三層) │
│ 查詢用 → 跨專案知識 │
│ 通用偏好、跨專案經驗、歷史決策 │
└─────────────────────────────────────────────────┘
最省 Token 的設計原則
1. 穩定資訊放 CLAUDE.md(快取 ≈ 0 Token)
→ 技術棧、專案架構、部署指令
2. 動態偏好靠 Auto Memory(按需讀取)
→ AI 自動管理,不用手動維護
3. 跨專案知識用 Memory MCP(查詢才花 Token)
→ 通用偏好、經驗累積
實際範例:設計一個完整的 CLAUDE.md
以下是一個真實專案的 CLAUDE.md 範例:
# DotNetLearning 專案
## 專案概述
一個 .NET 學習平台,提供互動式教學內容和測驗。
## 技術棧
- .NET 8 + ASP.NET Core MVC
- SQLite + Entity Framework Core 8
- Bootstrap 5.3 + 自訂 CSS
- Markdig(Markdown 渲染)
## 架構
- Controllers/:MVC Controller(Home, Chapter, Question)
- Models/:Chapter, Question, UserProgress
- Views/:Razor View(_Layout 用 Bootstrap)
- Data/:ApplicationDbContext + SeedChapters_*.cs
## 開發指令
```bash
dotnet build # 編譯
dotnet run # 啟動(https://localhost:5001)
dotnet ef database update # 更新資料庫
dotnet ef migrations add XXX # 新增 migration
程式風格
- async/await 所有資料庫操作
- 不用 Repository Pattern
- View 文字用繁體中文
- 中文註解在每行 code
部署
- 平台:Railway
- Dockerfile 在根目錄
- 環境變數:ASPNETCORE_ENVIRONMENT=Production
### 設計重點
✅ 簡潔:只放最重要的資訊 ✅ 結構化:用 Markdown 標題分類 ✅ 可執行:部署指令可以直接複製使用 ✅ 不超過 200 行:太長會被截斷
❌ 不要放:程式碼片段(太長) ❌ 不要放:對話歷史(不穩定) ❌ 不要放:暫時性的 TODO(用 Auto Memory)
---
## 🤔 常見錯誤
### 錯誤 1:把所有東西塞進 CLAUDE.md
❌ CLAUDE.md 塞了 500 行 → 超過 200 行可能被截斷 → 太多雜訊反而讓 AI 找不到重點
✅ 只放最穩定、最重要的資訊 → 技術棧(10 行) → 架構(15 行) → 指令(10 行) → 風格(10 行) → 總共不超過 100 行最佳
### 錯誤 2:記憶存重複資訊
❌ CLAUDE.md 寫了「用 .NET 8」 Auto Memory 也存了「用 .NET 8」 Memory MCP 又存了「用 .NET 8」 → 三個地方存同樣的東西,浪費又混亂
✅ 分層存放: CLAUDE.md → 專案用 .NET 8(穩定) Auto Memory → 最近在做 Chapter 5(動態) Memory MCP → 所有專案都用 4 空格縮排(跨專案)
### 錯誤 3:不維護 CLAUDE.md
❌ 專案已經從 .NET 7 升級到 .NET 8 但 CLAUDE.md 還是寫 .NET 7 → AI 會用錯誤的資訊工作
✅ 定期更新 CLAUDE.md → 技術棧升級時更新 → 架構變動時更新 → 部署方式改變時更新
---
## 本章重點整理
| 記憶層級 | 位置 | Token 消耗 | 適合內容 |
|----------|------|-----------|----------|
| CLAUDE.md | 專案根目錄 | 快取 ≈ 0 | 專案架構、技術棧 |
| Auto Memory | ~/.claude/projects/ | 按需讀取 | 偏好、進度 |
| Memory MCP | 知識圖譜 | 查詢時 | 跨專案知識 |