:為 Claude 構(gòu)建跨會話長期記憶系統(tǒng))
1. 從零認(rèn)識 claude-mem它到底解決什么問題第一次看到claude-mem這個名字很多人會以為它又是一個套殼的對話客戶端。實際上完全不是。claude-mem是一套圍繞 Claude 對話過程做長期記憶管理的工具方案核心目標(biāo)只有一個讓 AI 在跨會話、跨項目、跨時間的協(xié)作中記住該記住的東西忘掉該忘掉的東西。我接觸它的起因很樸素。那段時間我同時推進(jìn)三個項目每個項目都要反復(fù)跟 Claude 解釋同樣的背景技術(shù)棧是什么、命名規(guī)范是什么、上次那個 bug 修到哪一步了、為什么某個方案被否決了。每次開新會話我都要把幾百字的上下文重新粘貼一遍粘到后來自己都煩。更麻煩的是有些關(guān)鍵決策散落在幾十個歷史會話里想找回來得靠翻聊天記錄效率極低。claude-mem要解決的就是這個痛點。它把記憶從單次會話里抽出來變成一份可以持久化、可以檢索、可以按項目隔離的外部資產(chǎn)。你可以把它理解成給 AI 配了一個隨身筆記本每次對話結(jié)束重要的結(jié)論、偏好、待辦被記下來下次對話開始相關(guān)的記憶被自動調(diào)取出來塞進(jìn)上下文。這套東西適合誰我梳理了三類人。第一類是長期用 Claude 做開發(fā)或?qū)懽鞯闹囟扔脩魰挃?shù)量多、上下文重復(fù)率高收益最明顯。第二類是團隊協(xié)作場景需要把某個項目的共識沉淀下來避免每個人都要重新對齊。第三類是對隱私和本地化有要求的人因為claude-mem的記憶存儲通常落在本地文件或自建存儲里數(shù)據(jù)不出自己的機器。需要先說明一點claude-mem并不是 Anthropic 官方發(fā)布的產(chǎn)品它更像是一個社區(qū)里逐漸成型的實踐模式圍繞 Claude 的上下文機制、文件讀寫能力和外部存儲做組合。所以不同人手里的claude-mem實現(xiàn)細(xì)節(jié)會有差異但底層思路是相通的。下面我講的這套方案是我自己實際跑通并穩(wěn)定用了幾個月的版本涉及具體參數(shù)和步驟的地方我會明確標(biāo)注哪些是通用原理、哪些是我基于常見實踐補全的選型。2. 記憶系統(tǒng)的整體設(shè)計與思路拆解2.1 為什么不能只靠把歷史全塞進(jìn)上下文很多人第一反應(yīng)是既然 Claude 支持長上下文那我干脆把所有歷史對話都拼進(jìn)去不就行了我試過結(jié)論是行不通原因有三個。第一是成本。上下文越長每次請求消耗的 token 越多費用是線性甚至超線性增長的。你不可能為了記住一句這個項目用 pnpm 不用 npm每次都帶上十萬 token 的歷史。第二是信噪比。歷史對話里大量內(nèi)容是寒暄、試錯、被否決的方案。這些信息混在上下文里會稀釋真正重要的指令模型反而更容易跑偏。我實測過一個場景把 50 輪歷史全塞進(jìn)去模型對最新指令的遵循度明顯下降因為它被中間那些廢棄方案干擾了。第三是沖突。歷史里可能同時存在用方案 A和后來改成方案 B兩條記錄。如果不做時間排序和優(yōu)先級處理模型不知道該聽誰的。所以claude-mem的核心設(shè)計哲學(xué)是記憶不是存儲而是檢索。存的時候要壓縮、要結(jié)構(gòu)化用的時候要按相關(guān)性召回而不是全量加載。2.2 三層記憶結(jié)構(gòu)的設(shè)計考量我最終采用的是三層結(jié)構(gòu)這個劃分參考了認(rèn)知科學(xué)里工作記憶 / 短期記憶 / 長期記憶的經(jīng)典模型落地到工程上就是三個不同的存儲層。層級名稱存儲內(nèi)容生命周期存儲位置L1工作記憶當(dāng)前會話的即時上下文單次會話內(nèi)存 / 會話變量L2短期記憶最近幾次會話的摘要數(shù)天到數(shù)周本地 JSON 文件L3長期記憶項目級共識、用戶偏好、關(guān)鍵決策長期結(jié)構(gòu)化數(shù)據(jù)庫或 Markdown 庫L1 不用我們操心那是 Claude 會話本身自帶的。真正要設(shè)計的是 L2 和 L3。L2 我選擇用會話摘要而不是原始記錄。每次會話結(jié)束讓 Claude 自己生成一段 200 字以內(nèi)的摘要包含本次解決了什么、產(chǎn)生了什么結(jié)論、有什么未完成事項。這段摘要存成 JSON字段包括時間戳、項目標(biāo)簽、摘要正文、關(guān)鍵詞數(shù)組。為什么用摘要因為原始對話動輒幾千字檢索和加載都太重而摘要保留了 90% 的有用信息體積只有 5%。L3 是重頭戲我把它拆成三類內(nèi)容分開存偏好類用戶或團隊的固定習(xí)慣比如代碼注釋用中文提交信息遵循 Conventional Commits。這類內(nèi)容變化少但每次都要用。決策類項目里做過的關(guān)鍵技術(shù)選型帶時間戳和理由。比如2024-03 決定用 SQLite 而非 Postgres因為部署環(huán)境不支持獨立數(shù)據(jù)庫服務(wù)。事實類項目的客觀信息比如目錄結(jié)構(gòu)、接口約定、環(huán)境變量清單。分開存的好處是召回策略可以差異化。偏好類幾乎每次都全量加載因為它短且通用決策類按關(guān)鍵詞檢索事實類按需加載。2.3 為什么選文件系統(tǒng)而不是向量數(shù)據(jù)庫網(wǎng)上很多記憶方案一上來就上向量數(shù)據(jù)庫做 embedding 檢索。我一開始也跟風(fēng)搭了一套后來放棄了改用純文件系統(tǒng)加關(guān)鍵詞檢索。原因很實際。向量檢索的優(yōu)勢是語義相似度能召回意思相近但用詞不同的內(nèi)容。但它的劣勢在我的場景里被放大了一是不可解釋召回了什么、為什么召回很難調(diào)試二是維護(hù)成本embedding 模型要更新、索引要重建對一個個人項目來說太重三是精度問題記憶條目通常很短短文本的 embedding 質(zhì)量不穩(wěn)定經(jīng)常召回一堆似是而非的東西。文件系統(tǒng)方案就樸素多了每條記憶是一個 Markdown 或 JSON 條目帶標(biāo)簽和關(guān)鍵詞。檢索時用關(guān)鍵詞匹配加時間衰減。我實測下來在記憶條目數(shù)量低于幾千條時這種樸素方案的召回準(zhǔn)確率反而更高因為記憶內(nèi)容本身就是高度結(jié)構(gòu)化的關(guān)鍵詞命中率很高。提示如果你預(yù)計記憶條目會超過一萬條或者需要跨語言檢索那向量方案值得重新考慮。但對絕大多數(shù)個人和小團隊場景文件系統(tǒng)足夠用而且調(diào)試起來舒服得多。3. 核心細(xì)節(jié)解析與實操要點3.1 記憶條目的數(shù)據(jù)結(jié)構(gòu)設(shè)計數(shù)據(jù)結(jié)構(gòu)設(shè)計得好不好直接決定了后面檢索順不順。我踩過的第一個坑就是一開始用自由文本存記憶結(jié)果檢索時只能全文模糊匹配噪音極大。后來改成結(jié)構(gòu)化字段問題迎刃而解。我最終用的條目結(jié)構(gòu)是這樣的以 JSON 為例{ id: mem_20240315_001, type: decision, project: blog-engine, created_at: 2024-03-15T10:23:00Z, updated_at: 2024-03-15T10:23:00Z, keywords: [數(shù)據(jù)庫, SQLite, 部署], content: 決定使用 SQLite 作為主存儲原因是目標(biāo)部署環(huán)境不提供獨立數(shù)據(jù)庫服務(wù)且數(shù)據(jù)量預(yù)估在 10 萬條以內(nèi)。, reason: 部署環(huán)境限制 數(shù)據(jù)量評估, status: active, supersedes: null }幾個字段值得單獨說。type字段是檢索的第一道過濾。偏好、決策、事實三類的召回策略不同先按 type 過濾能大幅縮小范圍。keywords是我手動或半自動打的標(biāo)簽。這里有個經(jīng)驗關(guān)鍵詞不要打太多3 到 5 個最合適。打多了等于沒打因為每個詞都會命中反而失去區(qū)分度。我一般讓 Claude 在生成記憶時順便提取關(guān)鍵詞然后我人工過一遍刪掉太泛的詞。status和supersedes是處理記憶沖突的關(guān)鍵。當(dāng)一條新決策推翻了舊決策不是刪掉舊的而是把舊的status改成superseded新的條目supersedes指向舊條目 ID。這樣既保留了歷史又能在召回時排除失效記憶。這個設(shè)計我是從數(shù)據(jù)庫的軟刪除思路借鑒來的非常實用。reason字段單獨拎出來是因為我發(fā)現(xiàn)決策的理由比決策本身更重要。半年后你回頭看為什么當(dāng)時不用 Postgres如果只存了結(jié)論你可能會重新踩一遍坑。存了理由就能避免重復(fù)決策。3.2 記憶的寫入時機與觸發(fā)條件記憶不是越多越好。我早期犯的錯是每輪對話都寫記憶結(jié)果庫里塞滿了用戶問了 X我答了 Y這種無價值條目檢索時全是噪音。后來我定了三條寫入觸發(fā)規(guī)則只有滿足其一才寫產(chǎn)生了明確結(jié)論比如確定用方案 A這個 bug 的根因是 X。判斷標(biāo)準(zhǔn)是這句話能不能獨立成一條可復(fù)用的知識。用戶表達(dá)了偏好比如以后都用中文回復(fù)這個項目不要用某個庫。偏好類記憶優(yōu)先級最高因為復(fù)用頻率最高。出現(xiàn)了未完成事項比如下次要驗證 Y 方案。這類記憶帶一個todo標(biāo)記下次會話開始時主動提醒。寫入動作我做成半自動的會話結(jié)束時我讓 Claude 按上面的規(guī)則生成候選記憶條目輸出成 JSON我掃一眼確認(rèn)或修改然后追加到記憶庫文件里。為什么不完全自動因為自動寫入容易把臨時性的、錯誤的結(jié)論也存進(jìn)去污染長期記憶。人工確認(rèn)這一步花不了 30 秒但能保證記憶庫的干凈。注意千萬不要把用戶說錯了然后糾正這個過程里的錯誤結(jié)論存進(jìn)去。我踩過這個坑結(jié)果模型后來反復(fù)引用一個已經(jīng)被推翻的錯誤認(rèn)知排查了半天才發(fā)現(xiàn)是記憶庫污染。3.3 記憶的召回策略與上下文注入召回是整套系統(tǒng)里最考驗設(shè)計的一環(huán)。我的召回邏輯分三步走。第一步是全量加載偏好類記憶。這類記憶通常只有幾十條總量可控而且?guī)缀趺看味加玫蒙纤灾苯尤咳M(jìn)上下文。加載時按updated_at倒序最新的在前。第二步是按當(dāng)前會話主題檢索決策類和事實類。檢索用關(guān)鍵詞匹配具體做法是把當(dāng)前會話的前幾輪內(nèi)容提取關(guān)鍵詞然后跟記憶條目的keywords字段做交集。命中數(shù)越多的條目排越前。這里加一個時間衰減因子同樣命中數(shù)的情況下越新的記憶權(quán)重越高。公式大概是score 命中關(guān)鍵詞數(shù) * 1.0 時間衰減系數(shù)時間衰減系數(shù)我用的簡單線性衰減超過 180 天的記憶權(quán)重減半。第三步是沖突消解。召回結(jié)果里如果同時出現(xiàn)status為active和superseded的條目只保留 active 的。如果兩條 active 記憶內(nèi)容矛盾比如都涉及同一個技術(shù)選型但結(jié)論不同按時間取最新的并在注入上下文時明確標(biāo)注以下為最新決策早期決策已廢棄。注入上下文時我會給記憶加一個明確的邊界標(biāo)記比如用[MEMORY]和[/MEMORY]包起來并在前面加一句說明以下是歷史記憶供參考如與當(dāng)前指令沖突以當(dāng)前指令為準(zhǔn)。 這句話很重要它防止模型把過時記憶當(dāng)成硬性約束。3.4 記憶的壓縮與歸檔機制記憶庫用久了會膨脹需要定期壓縮。我的做法是每月做一次歸檔整理具體三步。第一步把status為superseded且超過 90 天的條目移到歸檔文件主庫不再加載。歸檔文件保留著需要考古時還能翻。第二步把同一主題下的多條零散記憶合并成一條。比如關(guān)于日志規(guī)范可能有五條分散記憶合并成一條完整的規(guī)范說明。合并時保留所有原始時間戳作為附注。第三步檢查有沒有長期未被召回的條目。如果一條記憶半年內(nèi)一次都沒被命中過要么是它不重要要么是關(guān)鍵詞打得不好。前者刪掉后者修關(guān)鍵詞。這套壓縮機制讓我的記憶庫在用了幾個月后依然保持在 300 條以內(nèi)的活躍規(guī)模檢索速度和準(zhǔn)確率都沒退化。4. 實操過程與核心環(huán)節(jié)實現(xiàn)4.1 環(huán)境準(zhǔn)備與目錄結(jié)構(gòu)搭建先說環(huán)境。claude-mem本身不需要什么特殊依賴核心就是文件讀寫。我用的是最樸素的方案一個本地目錄里面放幾個 JSON 和 Markdown 文件。如果你用 Claude 的桌面端或 API都能通過文件讀寫能力對接。目錄結(jié)構(gòu)我這樣組織claude-mem/ ├── memory/ │ ├── preferences.json # 偏好類記憶 │ ├── decisions.json # 決策類記憶 │ ├── facts.json # 事實類記憶 │ └── archive/ # 歸檔目錄 │ └── 2024-Q1.json ├── sessions/ │ └── 2024-03-15-summary.json # 會話摘要 ├── scripts/ │ ├── recall.py # 召回腳本 │ └── write.py # 寫入腳本 └── config.json # 全局配置為什么按類型分文件而不是全放一個文件因為加載策略不同。偏好類每次全量加載單獨一個文件讀起來快決策類和事實類按需檢索分開存方便做不同的索引。如果全塞一個文件每次都要讀全量再過濾效率低。config.json里放幾個關(guān)鍵參數(shù){ recall_limit: 20, time_decay_days: 180, preference_full_load: true, archive_after_days: 90, max_keywords_per_memory: 5 }recall_limit是單次召回的最大條目數(shù)我設(shè) 20。設(shè)太大上下文會被記憶占滿設(shè)太小又可能漏掉關(guān)鍵信息。20 是我實測下來比較平衡的值。4.2 會話摘要的自動生成流程會話摘要是 L2 記憶的來源我把它做成了半自動流程。每次會話結(jié)束前我會發(fā)一條固定指令給 Claude請為本次會話生成摘要輸出 JSON 格式包含以下字段 - summary: 200 字以內(nèi)的會話摘要 - conclusions: 本次產(chǎn)生的結(jié)論列表 - todos: 未完成事項列表 - keywords: 3-5 個關(guān)鍵詞 - project: 所屬項目標(biāo)簽Claude 返回 JSON 后我把它存到sessions/目錄文件名用日期加序號。然后跑一個腳本把摘要里的conclusions按規(guī)則轉(zhuǎn)成記憶條目追加到對應(yīng)的記憶文件。這里有個細(xì)節(jié)摘要生成要用獨立的會話不要跟主會話混在一起。因為主會話上下文很長讓模型在長上下文里做摘要質(zhì)量反而不如開個干凈會話、把關(guān)鍵內(nèi)容貼進(jìn)去讓它總結(jié)。我試過兩種方式獨立會話的摘要質(zhì)量明顯更高關(guān)鍵詞也更準(zhǔn)。4.3 召回腳本的核心邏輯實現(xiàn)召回腳本是整個系統(tǒng)的心臟我用 Python 寫核心邏輯大概 80 行。下面貼關(guān)鍵部分并解釋。import json import re from datetime import datetime, timedelta def load_memories(path): with open(path, r, encodingutf-8) as f: return json.load(f) def extract_keywords(text, top_n5): # 簡化版關(guān)鍵詞提取實際可用 jieba 等分詞庫 words re.findall(r[\u4e00-\u9fa5]{2,}|[a-zA-Z]{3,}, text) freq {} for w in words: freq[w] freq.get(w, 0) 1 return [w for w, _ in sorted(freq.items(), keylambda x: -x[1])[:top_n]] def score_memory(memory, query_keywords, now): hits len(set(memory[keywords]) set(query_keywords)) if hits 0: return 0 created datetime.fromisoformat(memory[created_at].replace(Z, 00:00)) days_old (now - created).days decay max(0.5, 1.0 - days_old / 360) return hits * decay def recall(query_text, config): now datetime.now() query_kw extract_keywords(query_text) results [] for fname in [decisions.json, facts.json]: memories load_memories(fmemory/{fname}) for m in memories: if m[status] ! active: continue s score_memory(m, query_kw, now) if s 0: results.append((s, m)) results.sort(keylambda x: -x[0]) return [m for _, m in results[:config[recall_limit]]]這段代碼里score_memory是核心。命中關(guān)鍵詞數(shù)決定基礎(chǔ)分時間衰減決定權(quán)重。衰減公式我用的是max(0.5, 1.0 - days_old / 360)意思是記憶在一年內(nèi)線性衰減到 0.5 倍權(quán)重之后不再繼續(xù)衰減。為什么設(shè)下限 0.5因為有些老記憶比如項目的基礎(chǔ)架構(gòu)決策雖然舊但依然重要不能讓它衰減到零。extract_keywords我用的是簡化版正則實際生產(chǎn)里建議用分詞庫中文分詞質(zhì)量會好很多。但即便用這個簡化版實測召回效果也能接受因為記憶條目的關(guān)鍵詞是我人工確認(rèn)過的匹配精度本來就高。4.4 上下文注入的格式與邊界處理召回出記憶后怎么塞進(jìn)上下文也有講究。我用的格式是這樣的[MEMORY] 以下是與當(dāng)前任務(wù)相關(guān)的歷史記憶供參考 [偏好] - 代碼注釋使用中文 - 提交信息遵循 Conventional Commits [決策] - (2024-03-15) 使用 SQLite 作為主存儲原因部署環(huán)境限制 - (2024-02-20) 前端框架選定 Vue 3原因團隊熟悉度高 [事實] - 項目根目錄為 /workspace/blog-engine - 環(huán)境變量配置文件為 .env.local [/MEMORY] 如以上記憶與當(dāng)前指令沖突以當(dāng)前指令為準(zhǔn)。幾個設(shè)計點解釋一下。按類型分組是為了讓模型快速定位每條記憶帶時間戳是為了讓模型判斷新舊最后那句以當(dāng)前指令為準(zhǔn)是防止模型被過時記憶綁架。我實測過加不加這句話模型對沖突指令的處理差異很明顯加了之后模型更傾向于遵循最新指令。提示記憶注入的位置也有講究。我一般放在系統(tǒng)提示之后、用戶當(dāng)前問題之前。放在最前面容易被忽略放在最后又可能干擾當(dāng)前問題。中間位置是實測效果最好的。5. 常見問題與排查技巧實錄5.1 記憶污染模型引用了錯誤的歷史結(jié)論這是最常見也最頭疼的問題。表現(xiàn)是模型在回答里引用了一條明顯錯誤或過時的記憶導(dǎo)致整個回答跑偏。排查思路分三步。第一步先確認(rèn)這條記憶是不是真的存在。去記憶庫里搜關(guān)鍵詞看有沒有對應(yīng)條目。第二步如果存在看它的status是不是active。很多時候是舊記憶沒被正確標(biāo)記為superseded導(dǎo)致它還在被召回。第三步如果 status 正常看它的關(guān)鍵詞是不是打得太泛導(dǎo)致在不該命中的場景被召回了。解決方法給舊記憶補上superseded標(biāo)記并讓新記憶的supersedes指向它。同時收緊關(guān)鍵詞把太泛的詞比如配置方案刪掉換成更具體的詞。我踩過最典型的一次坑早期存了一條考慮用 Redis 做緩存后來決定不用了但忘了標(biāo)記舊記憶。結(jié)果模型在討論緩存方案時反復(fù)提 Redis我還納悶它怎么這么執(zhí)著查了半天才發(fā)現(xiàn)是記憶庫的問題。5.2 召回為空明明存了記憶卻檢索不到這個問題的原因通常是關(guān)鍵詞不匹配。你存記憶時打的關(guān)鍵詞和當(dāng)前會話提取出的關(guān)鍵詞對不上交集為空自然召回不到。排查方法手動跑一次召回腳本打印出當(dāng)前會話提取的關(guān)鍵詞再打印出記憶庫里的所有關(guān)鍵詞對比看差在哪。常見情況是記憶里存的是數(shù)據(jù)庫當(dāng)前會話說的是DB記憶里存的是部署當(dāng)前會話說的是上線。解決方法是建一個同義詞映射表把常見的同義表達(dá)歸一化。比如標(biāo)準(zhǔn)詞同義詞數(shù)據(jù)庫DB, database, 存儲部署上線, deploy, 發(fā)布配置config, 設(shè)置, 參數(shù)召回時先把查詢關(guān)鍵詞和記憶關(guān)鍵詞都映射到標(biāo)準(zhǔn)詞再做匹配。這個表不用一開始就建全遇到一次補一次慢慢就完善了。5.3 上下文超限記憶太多把上下文撐爆了當(dāng)召回條目太多或者單條記憶太長時注入的上下文會擠占正常對話的空間導(dǎo)致模型記不住當(dāng)前問題。排查方法統(tǒng)計每次注入的記憶總字符數(shù)。我的經(jīng)驗閾值是不超過 2000 字。超過這個數(shù)就要考慮精簡。解決方法有三個。一是降低recall_limit從 20 降到 10。二是對長記憶做摘要把超過 200 字的記憶壓縮到 100 字以內(nèi)。三是分級加載偏好類全量加載決策類和事實類只加載 top 5。我一般三個方法組合用效果最好。5.4 常見問題速查表問題現(xiàn)象可能原因排查動作解決方法模型引用錯誤結(jié)論舊記憶未標(biāo)記失效檢查 status 字段補 superseded 標(biāo)記召回為空關(guān)鍵詞不匹配對比查詢與記憶關(guān)鍵詞建同義詞映射表上下文超限召回條目過多統(tǒng)計注入字符數(shù)降 limit / 壓縮記憶記憶庫膨脹未定期歸檔統(tǒng)計活躍條目數(shù)每月歸檔 合并摘要質(zhì)量差在主會話里做摘要檢查摘要生成方式改用獨立會話生成偏好不生效偏好未全量加載檢查加載策略偏好類強制全量加載5.5 幾條獨家避坑心得第一記憶庫要版本控制。我用 Git 管理記憶文件每次修改都提交。這樣萬一改錯了能回滾。而且提交歷史本身就是一份記憶變更日志排查問題時特別有用。第二不要存過程只存結(jié)果。我早期存了很多討論了 A 方案和 B 方案這種過程性記憶后來發(fā)現(xiàn)完全沒用。真正有用的是最終選了 A因為 X。過程可以丟結(jié)論必須留。第三定期做記憶庫的體檢。我每月花 20 分鐘隨機抽 10 條記憶問自己這條還有用嗎關(guān)鍵詞準(zhǔn)嗎內(nèi)容還準(zhǔn)確嗎這個習(xí)慣幫我清掉了不少僵尸記憶。第四給記憶加置信度字段。有些結(jié)論是確定的有些是暫時這么定可能還會改。我在content里用確定和暫定前綴區(qū)分。召回時暫定類記憶會帶上此結(jié)論可能變更的提示避免模型把它當(dāng)鐵律。6. 記憶系統(tǒng)的擴展方向與個人體會6.1 從個人記憶到團隊記憶的演進(jìn)個人用順了之后我試著把它擴展到小團隊。核心變化是記憶庫從本地文件變成共享存儲加了一層簡單的權(quán)限和沖突處理。團隊場景下最大的挑戰(zhàn)是記憶的寫入沖突。兩個人同時往記憶庫寫可能產(chǎn)生矛盾條目。我的處理方式是引入一個簡單的審核隊列所有新記憶先進(jìn)入pending狀態(tài)由一個人定期審核合并通過后才變成active。這個流程聽起來重但實際每天也就幾條新記憶審核花不了幾分鐘。另一個變化是記憶的歸屬標(biāo)記。團隊記憶里要區(qū)分全局共識和個人偏好。全局共識所有人都加載個人偏好只對本人加載。這個區(qū)分很重要否則你的個人習(xí)慣會污染別人的上下文。6.2 記憶與提示詞工程的結(jié)合用久了之后我發(fā)現(xiàn)claude-mem其實可以跟提示詞工程深度結(jié)合。具體做法是把高頻使用的提示詞模板也存進(jìn)記憶庫作為偏好類記憶的一種。比如我有一套固定的代碼審查提示詞模板以前每次都要手動粘貼。現(xiàn)在把它存成一條記憶類型標(biāo)記為template召回時自動加載。這樣每次做代碼審查模板自動就位省了不少事。這個思路可以進(jìn)一步擴展把常用的工作流、檢查清單、輸出格式要求都做成模板記憶。本質(zhì)上claude-mem從記住事實進(jìn)化成了記住工作方式。6.3 我個人的使用體會用了幾個月下來最大的感受是記憶系統(tǒng)的價值不在于記住多少而在于忘掉多少。一開始我貪多什么都想存結(jié)果記憶庫成了垃圾場檢索質(zhì)量直線下降。后來學(xué)會做減法只存真正會復(fù)用的東西系統(tǒng)反而越來越好用。另一個體會是人工確認(rèn)這一步不能省。全自動寫入看起來很美好但記憶庫的干凈程度直接決定系統(tǒng)上限?;?30 秒確認(rèn)一條記憶比事后花半小時排查污染劃算得多。最后分享一個小技巧我會在記憶庫里單獨維護(hù)一個meta.json記錄記憶庫自身的統(tǒng)計信息比如總條目數(shù)、各類型占比、最近一次歸檔時間、召回命中率。這個文件不參與召回純粹是給我自己看的儀表盤。每次打開看到命中率在 70% 以上就知道系統(tǒng)運轉(zhuǎn)正常如果掉到 50% 以下就該做一次體檢了。這套東西沒有什么高深技術(shù)核心就是結(jié)構(gòu)化存儲 關(guān)鍵詞檢索 人工把關(guān)三件事。但就是這三件事做扎實了跨會話協(xié)作的體驗會有質(zhì)的提升。如果你也在被重復(fù)解釋上下文的問題困擾不妨從最簡單的版本開始搭先跑起來再慢慢優(yōu)化。