引言
在與 AI Agent 的長(zhǎng)時(shí)間交互中,你是否遇到過(guò)這樣的困擾:明明上次已經(jīng)告訴它你的偏好,但這次它又重新詢問(wèn)?或者在處理復(fù)雜任務(wù)時(shí),AI 突然"失憶",忘記了之前討論的關(guān)鍵決策?
這些問(wèn)題的根源在于:AI Agent 缺乏持久化的記憶能力。而記憶系統(tǒng)的引入,正是為了讓 AI 從"健忘的助手"進(jìn)化為"懂你的伙伴"。
一、為什么要引入記憶?
1.1 上下文的天然局限
大語(yǔ)言模型(LLM)雖然強(qiáng)大,但它們面臨一個(gè)根本性約束:上下文窗口是有限的。即使最新的模型支持 100 萬(wàn)甚至 200 萬(wàn) token 的上下文,在實(shí)際應(yīng)用中仍然存在三個(gè)關(guān)鍵問(wèn)題:
- 成本問(wèn)題:每次對(duì)話都攜帶完整歷史記錄,計(jì)算成本呈線性增長(zhǎng)
- 效率問(wèn)題:上下文越長(zhǎng),推理速度越慢,用戶體驗(yàn)下降
- 噪音問(wèn)題:大量無(wú)關(guān)信息會(huì)干擾模型的判斷,降低輸出質(zhì)量
1.2 用戶體驗(yàn)的剛需
從用戶角度看,記憶系統(tǒng)解決了幾個(gè)核心痛點(diǎn):
- 個(gè)性化體驗(yàn):記住用戶的偏好、習(xí)慣和特殊要求
- 連續(xù)性任務(wù):在多輪對(duì)話或跨會(huì)話中保持任務(wù)的連貫性
- 效率提升:避免重復(fù)性的信息輸入和說(shuō)明
- 信任建立:AI 能記住你說(shuō)過(guò)的話,增強(qiáng)人機(jī)信任感
1.3 復(fù)雜任務(wù)的必然要求
在代碼開發(fā)、項(xiàng)目管理等復(fù)雜場(chǎng)景中,記憶系統(tǒng)更是不可或缺:
- 記住項(xiàng)目的架構(gòu)決策和設(shè)計(jì)模式
- 跟蹤已修復(fù)的 bug 和錯(cuò)誤模式
- 保存用戶的編碼規(guī)范和風(fēng)格偏好
- 維護(hù)任務(wù)的依賴關(guān)系和優(yōu)先級(jí)
二、記憶是如何實(shí)現(xiàn)的?
2.1 記憶系統(tǒng)的基本架構(gòu)
在 Agent 記憶系統(tǒng)(Agent Memory System) 的設(shè)計(jì)中,核心目標(biāo)是:
讓 Agent 在長(zhǎng)期交互與任務(wù)執(zhí)行中,既能"記住重要的事",又不會(huì)被無(wú)關(guān)信息拖慢或污染推理。
從工程和認(rèn)知兩個(gè)維度來(lái)看,Agent 的記憶通??梢苑譃橐韵聨状箢愋?/strong>,并且在成熟系統(tǒng)中往往是組合使用的。
維度一:按「時(shí)間尺度」劃分(最常見、最核心)
| 記憶類型 | 作用 | 典型內(nèi)容 | 實(shí)現(xiàn)方式 | 特點(diǎn) | 重要性 |
|---|---|---|---|---|---|
|
短期記憶 (Short-Term Memory / Working Memory) |
支撐當(dāng)前一步或幾步的推理 類似人類的"工作記憶" |
? 最近 N 輪對(duì)話 ? 當(dāng)前任務(wù)上下文 ? 中間推理結(jié)果(scratchpad / chain-of-thought 的壓縮版) |
? Prompt 中直接拼接 ? Sliding Window ? Recent Messages Buffer |
? 生命周期短 ? 每次請(qǐng)求都會(huì)加載 ? 成本高(占 token) |
幾乎所有 Agent 都有 |
|
中期記憶 (Episodic Memory / Session Memory) |
記住"發(fā)生過(guò)的事件" 跨多輪任務(wù)仍然可用,但不是永久 |
? 完成過(guò)哪些任務(wù) ? 用戶最近的偏好變化 ? 上一次失敗 / 成功的策略 |
? 結(jié)構(gòu)化日志(JSON / DB) ? 向量化存儲(chǔ) + 相似度檢索 ? 會(huì)話級(jí)緩存(Session Store) |
? 可檢索 ? 不每次都加載 ? 觸發(fā)式注入上下文 |
決定 Agent 是否"有連續(xù)感" |
|
長(zhǎng)期記憶 (Long-Term Memory / Persistent Memory) |
形成"長(zhǎng)期認(rèn)知" 影響未來(lái)決策和行為風(fēng)格 |
? 用戶穩(wěn)定偏好 ? 固定事實(shí)(User Profile) ? Agent 自身能力邊界、經(jīng)驗(yàn)總結(jié) |
? Key-Value Memory ? 文本 + Embedding ? 顯式 Memory Store(如 Claude / Cursor Memory) |
? 持久化 ? 寫入受控 ? 讀取高度選擇性 |
最難設(shè)計(jì),也最容易"記壞" |
維度二:按「內(nèi)容性質(zhì)」劃分(比時(shí)間更重要)
| 記憶類型 | 存儲(chǔ)內(nèi)容 | 典型例子 | 實(shí)現(xiàn)方式 | 特點(diǎn) | 評(píng)價(jià) |
|---|---|---|---|---|---|
|
事實(shí)性記憶 (Semantic / Factual Memory) |
不隨時(shí)間變化的事實(shí) "是什么" |
? 用戶使用 Java / Python ? 項(xiàng)目技術(shù)棧 ? 業(yè)務(wù)規(guī)則 |
結(jié)構(gòu)化存儲(chǔ) | ? 低頻寫,高頻讀 ? 適合結(jié)構(gòu)化存儲(chǔ) |
最安全、性價(jià)比最高的記憶類型 |
|
經(jīng)驗(yàn)記憶 (Procedural / Skill Memory) |
"怎么做" 成功或失敗的策略 |
? 解決某類 Bug 的步驟 ? 某種 Prompt 模板效果很好 ? 排班問(wèn)題用 CP-SAT 比 MILP 更穩(wěn) |
? Rule / Template ? Skill 文件 ? Tool 調(diào)用策略 |
? 可復(fù)用 ? 高價(jià)值 |
Claude Skills 就是典型代表 |
|
情景記憶 (Episodic Memory) |
一次完整事件 含上下文、過(guò)程、結(jié)果 |
? "在 2024-12 的一次排班優(yōu)化中,因?yàn)榧s束沖突導(dǎo)致模型不可行" | 向量化存儲(chǔ) | ? 高維、非結(jié)構(gòu)化 ? 用于"類比推理" |
用于經(jīng)驗(yàn)學(xué)習(xí)和問(wèn)題診斷 |
|
偏好與風(fēng)格記憶 (Preference / Personality Memory) |
用戶偏好 表達(dá)風(fēng)格 輸出習(xí)慣 |
? 喜歡表格而不是長(zhǎng)文 ? 代碼優(yōu)先于解釋 ? 中文 + 專業(yè)術(shù)語(yǔ) |
Key-Value 或 配置文件 |
? 影響交互體驗(yàn) ? 需要?jiǎng)討B(tài)更新 |
決定 Agent 的"個(gè)性化"程度 |
維度三:按「使用方式」劃分(工程視角)
| 記憶類型 | 定義 | 特征 | 示例 | 優(yōu)勢(shì) | 風(fēng)險(xiǎn) |
|---|---|---|---|---|---|
|
顯式記憶 (Explicit Memory) |
明確寫入 明確讀取 有規(guī)則、有生命周期 |
? 結(jié)構(gòu)化 ? 可追溯 ? 用戶可見 |
{"type": "user_preference", "key": "response_style", "value": "engineering-oriented"} |
? 可控 ? 可調(diào)試 ? 可刪除 |
需要顯式管理接口 |
|
隱式記憶 (Implicit Memory) |
融入模型權(quán)重或 Prompt 模板 用戶不可見 難以刪除 |
? 不可見 ? 難以修改 ? 系統(tǒng)級(jí) |
? System Prompt 中的行為約束 ? 微調(diào)模型的偏置 |
不需要額外存儲(chǔ)和檢索 | ?? 風(fēng)險(xiǎn)高 ?? 不適合個(gè)性化長(zhǎng)期記憶 |
一個(gè)成熟 Agent 的"記憶組合架構(gòu)"
┌───────────┐
│ System │ ← 角色、規(guī)則(幾乎不變)
└────┬──────┘
│
┌────▼──────┐
│ Short-Term│ ← 最近對(duì)話 / 當(dāng)前任務(wù)
└────┬──────┘
│
┌────▼─────────────┐
│ Memory Retriever │ ← 向量 / 規(guī)則
└────┬─────────────┘
│
┌────▼──────┐
│ Long-Term │ ← 事實(shí) / 偏好 / 經(jīng)驗(yàn)
└───────────┘
關(guān)鍵設(shè)計(jì)原則(非常重要)
1?? 不是記得越多越好
2?? 寫記憶要比讀記憶更謹(jǐn)慎
3?? 事實(shí)、偏好、經(jīng)驗(yàn)必須分層存儲(chǔ)
4?? 記憶必須可解釋、可回滾、可過(guò)期
5?? Agent 失敗,80% 是記憶污染
一句話總結(jié)
Agent 的記憶不是"聊天記錄",而是"可被檢索、可被治理的認(rèn)知資產(chǎn)"。
三、引入記憶會(huì)帶來(lái)什么問(wèn)題?
3.1 上下文容量的權(quán)衡
雖然記憶系統(tǒng)旨在緩解上下文限制,但它本身也會(huì)占用上下文空間:
- 記憶注入開銷:每次對(duì)話需要注入相關(guān)記憶,占用 token
- 邊際效益遞減:注入的記憶越多,噪音也越大
- 檢索精度困境:檢索不準(zhǔn)確會(huì)引入無(wú)關(guān)記憶,反而降低性能
3.2 記憶的一致性和準(zhǔn)確性
- 記憶沖突:不同時(shí)間的記憶可能互相矛盾
- 記憶失真:模型可能錯(cuò)誤理解或記錄信息
- 記憶過(guò)時(shí):用戶偏好改變,舊記憶成為干擾
3.3 隱私和安全問(wèn)題
- 敏感信息泄露:記憶可能包含用戶不希望保留的敏感信息
- 記憶污染攻擊:惡意用戶可能故意植入誤導(dǎo)性記憶
- 跨會(huì)話泄漏:不當(dāng)?shù)挠洃浌芾砜赡軐?dǎo)致信息跨用戶泄漏
3.4 系統(tǒng)復(fù)雜度的增加
- 存儲(chǔ)成本:大規(guī)模記憶需要持久化存儲(chǔ)和索引
- 維護(hù)成本:記憶的更新、刪除、去重需要額外邏輯
- 調(diào)試?yán)щy:記憶系統(tǒng)引入新的不確定性,問(wèn)題排查更復(fù)雜
四、Cursor 記憶工具的設(shè)計(jì)啟示
當(dāng)我們?yōu)?Agent 引入記憶系統(tǒng)之后,一個(gè)隨之而來(lái)的核心問(wèn)題便是:如何更加合理地使用與維護(hù)這些記憶?創(chuàng)建記憶本身并不困難,真正具有挑戰(zhàn)性的,是記憶的更新與刪除機(jī)制。
一般而言,我們最直觀的做法是通過(guò)規(guī)則來(lái)解決這些問(wèn)題。例如,設(shè)定時(shí)間窗口或最近對(duì)話輪數(shù)來(lái)篩選可用記憶;在生成新的對(duì)話內(nèi)容后寫入記憶,并定期清理過(guò)時(shí)、低價(jià)值的舊記憶。我在實(shí)際開發(fā) Agent 時(shí),也基本沿用了這一套思路。這種方式當(dāng)然談不上錯(cuò)誤,但也很難稱得上有什么新意。
直到我看到 Cursor 在系統(tǒng)提示詞中對(duì)記憶維護(hù)的設(shè)計(jì)方式——它將“是否保留、如何更新記憶”的決策權(quán),再次交還給了大模型本身。第一次看到這種設(shè)計(jì)時(shí),我產(chǎn)生了一種很微妙的感受:一方面覺得“事情本就應(yīng)該如此”,另一方面又不得不佩服 Cursor 工程師在設(shè)計(jì)上的大膽與想象力。
以下是Cursor系統(tǒng)提示詞中對(duì)于 memory 部分的描述:
...
<memories>
你可能會(huì)得到一份記憶清單。這些記憶是從過(guò)去與agent的對(duì)話中產(chǎn)生的。它們可能是正確的,也可能是不正確的,所以如果認(rèn)為相關(guān),請(qǐng)遵循它們,但是當(dāng)你注意到用戶根據(jù)記憶更正了你所做的事情,或者遇到一些與現(xiàn)有記憶相矛盾或增加的信息時(shí),你必須立即使用update_memory工具更新/刪除記憶。絕對(duì)不能使用update_memory工具創(chuàng)建 與 實(shí)現(xiàn)計(jì)劃、代理完成的遷移或其他特定于任務(wù)的信息 相關(guān)的記憶。
如果用戶曾經(jīng)反駁過(guò)你的記憶,那么最好刪除那個(gè)記憶,而不是更新它。
你可以根據(jù)工具描述中的標(biāo)準(zhǔn) 創(chuàng)建、更新或刪除 記憶
<memory_citation>
在生成內(nèi)容、回復(fù)用戶查詢或執(zhí)行命令時(shí),你必須始終通過(guò)引用的方式使用記憶,引用格式為:[[memory:MEMORY_ID]]。你應(yīng)將記憶引用自然地融入回復(fù)內(nèi)容中,而非僅作為注釋。
例如:“我會(huì)使用 -la 標(biāo)志 [[memory:MEMORY_ID]] 運(yùn)行該命令,以顯示詳細(xì)的文件信息?!?
當(dāng)你因某條記憶而拒絕用戶的明確請(qǐng)求時(shí),必須在對(duì)話中提及,如果該記憶有誤,用戶會(huì)糾正你,而你會(huì)更新自己的記憶。
</memory_citation>
</memories>
...
# Tools
## functions
namespace functions {
...
// 在供AI使用時(shí)參考的知識(shí)庫(kù)中創(chuàng)建、更新或刪除一條記憶。
// 如果用戶對(duì)現(xiàn)有記憶進(jìn)行了補(bǔ)充完善,你必須使用此工具并將 action 設(shè)置為“update(更新)”。
// 如果用戶(的對(duì)話)與現(xiàn)有記憶相矛盾,重點(diǎn)是要將此工具與“刪除”操作一起使用,而不是“更新”或“創(chuàng)建”。.
// 要更新或刪除已有記憶,必須提供existing_knowledge_id參數(shù)。
// 如果用戶要求記住一些東西,保存一些東西,或者創(chuàng)建一個(gè)記憶,你必須使用這個(gè)工具的動(dòng)作“創(chuàng)建”。
// 除非用戶明確要求記住或保存某些內(nèi)容,否則不要使用“創(chuàng)建”操作調(diào)用此工具。
// 如果用戶(的對(duì)話)與你的記憶相矛盾,那么最好刪除這段記憶,而不是更新這段記憶。
type update_memory = (_: {
// 記憶的標(biāo)題。這可以用來(lái)查找和檢索以后的記憶。這應(yīng)該是一個(gè)簡(jiǎn)短的標(biāo)題,抓住記憶的本質(zhì)。對(duì)于“創(chuàng)建”和“更新”操作這個(gè)參數(shù)是必需的。
title?: string,
// 要存儲(chǔ)的具體記憶內(nèi)容。其長(zhǎng)度不應(yīng)超過(guò)一個(gè)段落。如果該記憶是對(duì)先前記憶的更新或與之相矛盾,則不要提及或引用先前的記憶。在執(zhí)行“create(創(chuàng)建)”和“update(更新)”操作時(shí),此項(xiàng)為必填內(nèi)容。
knowledge_to_store?: string,
// 對(duì)知識(shí)庫(kù)執(zhí)行的操作。若未提供此項(xiàng),為保證向后兼容性,默認(rèn)操作設(shè)為“create(創(chuàng)建)”。
action?: "create" | "update" | "delete",
// 若操作是“update(更新)”或“delete(刪除)”,則此項(xiàng)為必填項(xiàng)。是要更新(而非創(chuàng)建新記憶)的現(xiàn)有記憶的ID。
existing_knowledge_id?: string,
}) => any;
...
}
通過(guò)分析 Cursor 的記憶工具實(shí)現(xiàn),我們可以提煉出幾個(gè)關(guān)鍵的設(shè)計(jì)智慧:
4.1 記憶的"不確定性"哲學(xué)
Cursor 開篇即聲明:"這些記憶可能是正確的,也可能是不正確的"。
這個(gè)設(shè)計(jì)體現(xiàn)了深刻的認(rèn)知:
- 承認(rèn) AI 理解的局限性,避免過(guò)度自信
- 鼓勵(lì)用戶反饋,建立動(dòng)態(tài)修正機(jī)制
- 記憶應(yīng)該是輔助判斷的參考,而非絕對(duì)真理
工程啟示:記憶系統(tǒng)應(yīng)該是"柔性"的,而非"剛性"的規(guī)則引擎。
4.2 引用式使用(Citation)
Cursor 要求 AI 在使用記憶時(shí)必須明確引用:[[memory:MEMORY_ID]]
這個(gè)設(shè)計(jì)的價(jià)值:
- 可追溯性:用戶知道 AI 的決策基于哪條記憶
- 可糾錯(cuò)性:用戶發(fā)現(xiàn)問(wèn)題時(shí)可以精確定位需要修正的記憶
- 透明度:增強(qiáng)人機(jī)交互的透明度和信任
類比:就像學(xué)術(shù)論文的引用機(jī)制,讓知識(shí)的來(lái)源清晰可查。
4.3 避免"任務(wù)型"記憶
Cursor 明確禁止創(chuàng)建"與實(shí)現(xiàn)計(jì)劃、遷移等特定任務(wù)相關(guān)的記憶"。
為什么?
? 錯(cuò)誤示例:
記憶:"用戶正在將數(shù)據(jù)庫(kù)從 MySQL 遷移到 PostgreSQL"
(這是任務(wù)狀態(tài),會(huì)過(guò)時(shí))
? 正確示例:
記憶:"用戶偏好使用 PostgreSQL 作為主數(shù)據(jù)庫(kù)"
(這是長(zhǎng)期偏好,不易過(guò)時(shí))
任務(wù)型信息應(yīng)該由待辦事項(xiàng)(TODO)系統(tǒng)管理,記憶系統(tǒng)專注于持久性的知識(shí)和偏好。
工程啟示:明確區(qū)分"記憶"與"狀態(tài)",避免系統(tǒng)功能混淆。
4.4 沖突處理的"刪除優(yōu)先"原則
Cursor 特別強(qiáng)調(diào):"如果用戶曾經(jīng)反駁過(guò)你的記憶,那么最好刪除那個(gè)記憶,而不是更新它。"
這是一個(gè)反直覺但極其明智的設(shè)計(jì):
更新的問(wèn)題:
原記憶:"用戶喜歡使用 Vue 框架"
用戶反駁:"我現(xiàn)在更喜歡 React"
如果更新為:"用戶喜歡使用 Vue 框架,但現(xiàn)在更喜歡 React"
→ 產(chǎn)生模糊性,AI 可能困惑
刪除的優(yōu)勢(shì):
- 避免記憶內(nèi)部矛盾
- 讓 AI 基于當(dāng)前上下文重新判斷
- 用戶可以選擇創(chuàng)建新的明確記憶
哲學(xué)思考:有時(shí)候"遺忘"比"記住"更重要。
4.4 工具化的記憶管理
在《ClaudeCode為什么這么強(qiáng)大?通過(guò)解析其系統(tǒng)提示詞一探究竟》一文中,我們指出應(yīng)該按照結(jié)構(gòu)化語(yǔ)言組織提示詞,Cursor系統(tǒng)提示詞告訴我們:這種“結(jié)構(gòu)化”的形式除了文檔還可以使用偽代碼。
Cursor 將記憶操作封裝為標(biāo)準(zhǔn)化的工具接口:
type update_memory = {
title?: string, // 記憶標(biāo)題
knowledge_to_store?: string, // 記憶內(nèi)容
action?: "create" | "update" | "delete", // 操作類型
existing_knowledge_id?: string, // 已有記憶 ID
}
設(shè)計(jì)優(yōu)勢(shì):
- 可控性:明確的操作語(yǔ)義,避免隱式記憶生成
- 可審計(jì):所有記憶變更都通過(guò)工具調(diào)用,可以記錄和審計(jì)
五、Claude Code 的記憶壓縮策略:精準(zhǔn)摘要的藝術(shù)
在上一節(jié)中,我們分享了 Cursor 在記憶維護(hù)機(jī)制上所帶來(lái)的不同視角。本節(jié)將轉(zhuǎn)向另一個(gè)重量級(jí)工具 —— Claude Code。相比之下,Claude Code 面對(duì)的是更極端的場(chǎng)景:當(dāng)上下文窗口用盡時(shí),如何將過(guò)去的對(duì)話壓縮為精準(zhǔn)的摘要,既節(jié)省 token 又不影響任務(wù)的連續(xù)性?
5.1 結(jié)構(gòu)化分析框架
Claude Code 的壓縮 prompt 首先要求進(jìn)行結(jié)構(gòu)化的分析:
你的任務(wù)是對(duì)到目前為止的對(duì)話進(jìn)行詳細(xì)總結(jié),要密切關(guān)注用戶的明確請(qǐng)求以及你之前采取的行動(dòng)。
該總結(jié)應(yīng)全面涵蓋技術(shù)細(xì)節(jié)、代碼模式和架構(gòu)決策,這些內(nèi)容對(duì)于在不丟失上下文的情況下繼續(xù)開展開發(fā)工作至關(guān)重要。
在提供最終總結(jié)之前,將你的分析包裹在 <analysis> 標(biāo)簽中,以組織你的思路并確保你已涵蓋所有必要的要點(diǎn)。在你的分析過(guò)程中:
1. 按時(shí)間順序分析對(duì)話的每條消息和每個(gè)部分。對(duì)于每個(gè)部分,請(qǐng)仔細(xì)識(shí)別:
- 用戶的明確請(qǐng)求和意圖
- 你處理用戶請(qǐng)求的方法
- 關(guān)鍵決策、技術(shù)概念和代碼模式
- 具體細(xì)節(jié),例如:
- 文件名
- 完整的代碼片段
- 函數(shù)簽名
- 文件編輯
- 你遇到的錯(cuò)誤以及你如何修復(fù)它們
- 特別關(guān)注你收到的具體用戶反饋,尤其是用戶要求你以不同方式做某事的情況。
2. 仔細(xì)檢查技術(shù)準(zhǔn)確性和完整性,徹底處理每個(gè)必需的元素。
你的總結(jié)應(yīng)該包括以下幾個(gè)部分:
1. 主要請(qǐng)求和意圖:詳細(xì)捕獲所有用戶明確的請(qǐng)求和意圖
2. 關(guān)鍵技術(shù)概念:列出討論的所有重要技術(shù)概念、技術(shù)和框架。
3. 文件和代碼部分:列舉檢查、修改或創(chuàng)建的具體文件和代碼部分。特別關(guān)注最近的消息,如果合適的話,應(yīng)當(dāng)包含完整的代碼片段,同時(shí)總結(jié)為什么這個(gè)文件讀取或編輯很重要。
4. 錯(cuò)誤和修復(fù):列出你遇到的所有錯(cuò)誤,以及你如何修復(fù)它們。特別關(guān)注你收到的具體用戶反饋,尤其是用戶要求你以不同方式做某事的情況。
5. 解決問(wèn)題: 記錄已解決的問(wèn)題和正在進(jìn)行的故障排除工作。
6. 用戶的所有消息:列出所有非工具結(jié)果的用戶消息。這些對(duì)于理解用戶的反饋和變化的意圖至關(guān)重要。
7. 待處理任務(wù):概述你被明確要求處理的任何待處理任務(wù)。
8. 當(dāng)前工作:詳細(xì)描述在此總結(jié)請(qǐng)求之前正在處理的確切內(nèi)容,特別關(guān)注用戶和assistant的最新消息。在合適的情況下包含文件名和代碼片段。
9. 可選的下一步:列出與你最近正在進(jìn)行的工作相關(guān)的下一步操作。重要提示:確保這一步與用戶的明確請(qǐng)求以及你在此總結(jié)請(qǐng)求之前正在處理的任務(wù)直接一致。如果你的上一個(gè)任務(wù)已經(jīng)完成,那么只有在明確符合用戶請(qǐng)求的情況下才列出下一步。在未與用戶確認(rèn)之前,不要開始處理無(wú)關(guān)的請(qǐng)求。
如果有下一步操作,請(qǐng)包含最近對(duì)話中的直接引用,準(zhǔn)確顯示你正在處理什么任務(wù)以及你停在哪里。這應(yīng)該是逐字引用,以確保任務(wù)解釋不會(huì)偏離。
你的輸出應(yīng)該是結(jié)構(gòu)化的,以下是一個(gè)結(jié)構(gòu)化輸出的示例:
<example>
<analysis>
[你的思考過(guò)程,確保所有要點(diǎn)都被全面準(zhǔn)確地涵蓋]
</analysis>
<summary>
1. 主要請(qǐng)求和意圖:
[詳細(xì)描述]
2. 關(guān)鍵技術(shù)概念:
- [概念 1]
- [概念 2]
- [...]
3. 文件和代碼部分:
- [文件名 1]
- [總結(jié)為什么這個(gè)文件很重要]
- [對(duì)該文件所做更改的總結(jié)(如果有)]
- [重要代碼段]
- [文件名 2]
- [重要代碼段]
- [...]
4. 錯(cuò)誤和修復(fù):
- [錯(cuò)誤1的詳細(xì)描述]:
- [如何修復(fù)這個(gè)錯(cuò)誤]
- [用戶對(duì)錯(cuò)誤的反饋(如果有)]
- [...]
5. 解決問(wèn)題:
[描述已解決的問(wèn)題和正在進(jìn)行的故障排除]
6. 用戶的所有消息:
- [詳細(xì)的用戶消息]
- [...]
7. 待處理任務(wù):
- [Task 1]
- [Task 2]
- [...]
8. 當(dāng)前工作:
[當(dāng)前工作的精確描述]
9. 可選的下一步:
[可選的下一步要采取的步驟]
</summary>
</example>
請(qǐng)根據(jù)到目前為止的對(duì)話提供你的總結(jié),遵循這個(gè)結(jié)構(gòu),并確保你的回答準(zhǔn)確和徹底。
在所包含的上下文中可能會(huì)提供額外的指示。如果是這樣,請(qǐng)記住在創(chuàng)建上述總結(jié)時(shí)遵循以下說(shuō)明。說(shuō)明的例子包括:
<example>
## Compact Instructions
在總結(jié)對(duì)話時(shí),重點(diǎn)關(guān)注 TypeScript 代碼更改,同時(shí)記住你犯的錯(cuò)誤以及你如何修復(fù)它們。
</example>
<example>
## Summary instructions
當(dāng)你使用compact進(jìn)行總結(jié)時(shí) - 請(qǐng)專注于測(cè)試輸出和代碼更改。包括文件逐字讀取。
</example>
5.2 九維度摘要模型
Claude Code 將對(duì)話壓縮為 9 個(gè)維度(重點(diǎn)是前8個(gè)維度,通常稱為8段式壓縮):
| 維度 | 目的 | 示例 |
|---|---|---|
| 1. 主要請(qǐng)求和意圖 | 捕獲用戶的核心訴求 | "用戶要求實(shí)現(xiàn)用戶認(rèn)證系統(tǒng)" |
| 2. 關(guān)鍵技術(shù)概念 | 保留技術(shù)決策上下文 | "JWT、OAuth2.0、bcrypt 密碼加密" |
| 3. 文件和代碼部分 | 精確定位修改位置 | "auth.py: 實(shí)現(xiàn)了 hash_password() 函數(shù)" |
| 4. 錯(cuò)誤和修復(fù) | 避免重復(fù)犯錯(cuò) | "ImportError: 缺少 pyjwt 依賴,已添加到 requirements.txt" |
| 5. 解決問(wèn)題 | 跟蹤問(wèn)題狀態(tài) | "已解決:登錄超時(shí)問(wèn)題;進(jìn)行中:郵件驗(yàn)證功能" |
| 6. 用戶的所有消息 | 保留用戶的原始意圖 | "用戶說(shuō):'密碼必須支持特殊字符'" |
| 7. 待處理任務(wù) | 確保任務(wù)連續(xù)性 | "待實(shí)現(xiàn):郵件驗(yàn)證、密碼重置功能" |
| 8. 當(dāng)前工作 | 精確恢復(fù)工作現(xiàn)場(chǎng) | "正在修改 user_model.py 的第 45-60 行,添加郵箱驗(yàn)證邏輯" |
| 9. 可選的下一步 | 提供上下文感知的建議 | "下一步:測(cè)試郵箱驗(yàn)證流程,然后實(shí)現(xiàn)密碼重置" |
5.3 保留用戶原始消息的重要性
特別值得注意的是第 6 點(diǎn):用戶的所有消息。
為什么要單獨(dú)保留用戶的原始消息?
- 意圖的準(zhǔn)確性:AI 的理解可能有偏差,用戶原話是最可靠的參考
- 細(xì)節(jié)的完整性:用戶可能提到了 AI 認(rèn)為不重要但實(shí)際關(guān)鍵的細(xì)節(jié)
- 糾錯(cuò)的可能性:當(dāng)發(fā)現(xiàn)理解偏差時(shí),可以回溯到原始需求
案例對(duì)比:
? 只保留 AI 的理解:
"用戶要求優(yōu)化數(shù)據(jù)庫(kù)查詢性能"
? 同時(shí)保留用戶原話:
"用戶說(shuō):'首頁(yè)加載太慢了,能不能優(yōu)化一下?我看日志里有很多數(shù)據(jù)庫(kù)查詢。'"
→ 原始消息提供了更豐富的上下文:
- 問(wèn)題表現(xiàn):首頁(yè)加載慢
- 問(wèn)題線索:日志中的查詢
- 用戶語(yǔ)氣:非技術(shù)用戶
5.4 當(dāng)前工作的精確描述
第 8 點(diǎn):當(dāng)前工作的設(shè)計(jì)體現(xiàn)了對(duì)"工作現(xiàn)場(chǎng)"的重視。
Claude Code 要求:
- 詳細(xì)描述在總結(jié)請(qǐng)求之前正在處理的確切內(nèi)容
- 在合適的情況下包含文件名和代碼片段
- 特別關(guān)注用戶和 assistant 的最新消息
實(shí)際效果:
當(dāng)前工作:
正在修改 `solve/employee_timegrid_solve.py` 文件。
已經(jīng)添加了 `EmployeeTimegridSolver` 類(第 50-120 行),
實(shí)現(xiàn)了以下方法:
- `__init__()`: 初始化求解器
- `create_model()`: 創(chuàng)建 CP-SAT 模型
- `add_constraints()`: 添加約束條件
最后一步是在第 115 行添加目標(biāo)函數(shù)優(yōu)化邏輯,
用戶特別強(qiáng)調(diào)要優(yōu)化員工的工作時(shí)間均衡性。
代碼片段:
```python
def add_objective(self) -> None:
# 正在實(shí)現(xiàn)中...
pass
這種精確描述確保了在新的上下文窗口中,AI 能夠無(wú)縫地繼續(xù)工作,不會(huì)出現(xiàn)"我們剛才做到哪了?"的困惑。
5.5 技術(shù)細(xì)節(jié)的取舍原則
Claude Code 強(qiáng)調(diào)"徹底處理每個(gè)必需的元素",但什么是"必需"的?
保留的細(xì)節(jié):
- 完整的文件路徑:
solve/employee_timegrid_solve.py - 具體的函數(shù)簽名:
def create_model(self, employees: List[Employee]) -> CpModel - 關(guān)鍵的代碼片段:實(shí)現(xiàn)的核心邏輯
- 精確的錯(cuò)誤信息:
ImportError: No module named 'ortools'
可以省略的細(xì)節(jié):
- 重復(fù)性的調(diào)試輸出
- 中間狀態(tài)的臨時(shí)代碼
- 已經(jīng)完全解決且不會(huì)再出現(xiàn)的問(wèn)題
取舍原則:如果這個(gè)細(xì)節(jié)的缺失會(huì)導(dǎo)致后續(xù)無(wú)法繼續(xù)工作,就必須保留;如果只是過(guò)程性信息,可以概括或省略。
5.6 錯(cuò)誤驅(qū)動(dòng)的學(xué)習(xí)機(jī)制
第 4 點(diǎn):錯(cuò)誤和修復(fù)是一個(gè)被低估但極其重要的設(shè)計(jì)。
AI Agent 在工作中會(huì)犯錯(cuò),關(guān)鍵是如何從錯(cuò)誤中學(xué)習(xí):
錯(cuò)誤和修復(fù):
1. ImportError: No module named 'ortools'
- 原因:requirements.txt 中缺少依賴
- 修復(fù):添加 `ortools>=9.6.0`
- 用戶反饋:建議鎖定版本避免兼容性問(wèn)題
2. 求解器返回 INFEASIBLE
- 原因:?jiǎn)T工可用時(shí)間約束與需求時(shí)間窗口沖突
- 修復(fù):放寬了部分軟約束,改為懲罰項(xiàng)
- 用戶反饋:滿意,但要求輸出沖突原因
3. 性能問(wèn)題:求解器運(yùn)行超過(guò) 5 分鐘
- 原因:變量數(shù)量過(guò)多(10000+)
- 修復(fù):引入分層求解,先優(yōu)化關(guān)鍵班次
- 用戶反饋:運(yùn)行時(shí)間降到 30 秒,符合預(yù)期
這種錯(cuò)誤記錄的價(jià)值:
- 避免重復(fù)犯錯(cuò):同類問(wèn)題有了解決模式
- 用戶反饋的寶貴性:用戶的修正意見是最重要的記憶
- 問(wèn)題診斷的速度:遇到類似問(wèn)題時(shí)有歷史參考
5.7 下一步行動(dòng)的上下文一致性
第 9 點(diǎn):可選的下一步有一個(gè)重要的約束:
"重要提示:確保這一步與用戶的明確請(qǐng)求以及你在此總結(jié)請(qǐng)求之前正在處理的任務(wù)直接一致。如果你的上一個(gè)任務(wù)已經(jīng)完成,那么只有在明確符合用戶請(qǐng)求的情況下才列出下一步。在未與用戶確認(rèn)之前,不要開始處理無(wú)關(guān)的請(qǐng)求。"
這個(gè)約束防止了 AI 的"功能蔓延":
? 錯(cuò)誤示例:
當(dāng)前任務(wù):實(shí)現(xiàn)用戶登錄功能(已完成)
下一步:實(shí)現(xiàn)用戶注冊(cè)、密碼重置、郵箱驗(yàn)證、第三方登錄...
(AI 自作主張擴(kuò)展了任務(wù)范圍)
? 正確示例:
當(dāng)前任務(wù):實(shí)現(xiàn)用戶登錄功能(已完成)
下一步:根據(jù)用戶的原始要求"實(shí)現(xiàn)基本的用戶認(rèn)證",登錄功能已滿足需求。等待用戶確認(rèn)或提出新的要求。
(保持對(duì)用戶意圖的忠實(shí))
5.8 引用的真實(shí)性原則
Claude Code 強(qiáng)調(diào):
"如果有下一步操作,請(qǐng)包含最近對(duì)話中的直接引用,準(zhǔn)確顯示你正在處理什么任務(wù)以及你停在哪里。這應(yīng)該是逐字引用,以確保任務(wù)解釋不會(huì)偏離。"
逐字引用的價(jià)值:
? AI 的釋義:
"用戶要求優(yōu)化算法性能"
? 用戶的原話:
"能不能讓這個(gè)排班算法快一點(diǎn)?現(xiàn)在 100 個(gè)員工需要跑 10 分鐘,太慢了。"
→ 原話包含的額外信息:
- 具體場(chǎng)景:100 個(gè)員工
- 性能基準(zhǔn):10 分鐘
- 用戶期望:需要更快
逐字引用避免了 AI 在多次轉(zhuǎn)述中逐漸偏離用戶的原始意圖。
六 最終思考
AI Agent 的記憶系統(tǒng),本質(zhì)上是在解決連續(xù)性和個(gè)性化的問(wèn)題。它讓 AI 從一個(gè)無(wú)狀態(tài)的函數(shù)調(diào)用,進(jìn)化為一個(gè)有"經(jīng)歷"、有"學(xué)習(xí)能力"的智能體。
但我們必須認(rèn)識(shí)到,記憶系統(tǒng)不是銀彈:
- 它不能替代清晰的用戶表達(dá)和良好的上下文設(shè)計(jì)
- 它會(huì)引入新的復(fù)雜度和潛在錯(cuò)誤
- 它需要持續(xù)的維護(hù)和優(yōu)化
真正優(yōu)秀的記憶系統(tǒng),應(yīng)該像一個(gè)優(yōu)秀的助手:
- 記住該記的:關(guān)鍵決策、用戶偏好、錯(cuò)誤教訓(xùn)
- 忘記該忘的:過(guò)時(shí)信息、臨時(shí)狀態(tài)、錯(cuò)誤記憶
- 知道何時(shí)求助:不確定時(shí)主動(dòng)向用戶確認(rèn)
從 Cursor 的"引用式記憶"到 Claude Code 的"結(jié)構(gòu)化壓縮",我們看到了不同場(chǎng)景下的設(shè)計(jì)智慧。但更重要的是背后的設(shè)計(jì)哲學(xué):
以用戶為中心,以反饋為驅(qū)動(dòng),以透明為原則,以價(jià)值為導(dǎo)向。
在 AI Agent 日益成為我們工作伙伴的今天,記憶系統(tǒng)的優(yōu)劣,將直接決定人機(jī)協(xié)作的效率和體驗(yàn)。希望本文的分析能為你設(shè)計(jì)或使用 AI Agent 提供有價(jià)值的參考。