claude-mem 怎么把『Agent 记忆』做成了零干预的基础设施:钩子捕获、AI 压缩、三层渐进式召回
claude-mem 不是又一个要你手动粘贴历史的记忆插件。它用 5 个生命周期钩子(SessionStart / UserPromptSubmit / PostToolUse / Stop / SessionEnd)在后台自动捕获工具调用与观察,交给 Claude 压缩成语义摘要存入本地 SQLite,再用 Chroma 向量库做混合并行检索,最后用『先返回索引、再按 ID 取详情』的三层渐进式披露把上下文 token 压到约 1/10。本文拆开它的机制、和 Mem0 / 手动 memory 文件 / 上下文塞满三条旧路线对比,并谈清楚它的代价与边界。
捕获层:把『记忆』从手动粘贴变成钩子的副作用
大多数『记忆』方案失败,不是因为存不下来,而是因为要人主动记。你得在对话里敲一句『记住这个』,或者每次开工前把一份 memory.md 全文贴进上下文。claude-mem 把这件事从『主动动作』改成了『副作用』:它注册 5 个 Claude Code 生命周期钩子——SessionStart(会话开始注入相关记忆)、UserPromptSubmit(用户提问时触发检索)、PostToolUse(每次工具调用后捕获观察)、Stop(会话暂停时压缩)、SessionEnd(会话结束落盘)。结果是你正常写代码,工具调用、读到的文件、改动的代码、踩过的坑都被自动记下来,没有任何一步需要你打断手头工作。
这种『钩子即记忆』的设计有两个直接好处。一是零摩擦:记忆的采集成本趋近于零,所以才可能在 30 天里积累到 513 万次请求、3122 亿 token 的处理量——这说明它真的在被持续使用,而不是装完就吃灰。二是可移植:因为记忆是挂在 Claude Code 的钩子机制上的,它后续把同一套安装逻辑搬到了 OpenCode、Antigravity CLI 和 OpenClaw 网关,等于一份记忆后端同时服务多个 Agent 前端。
压缩层:为什么用 AI 摘要、而不是把全文塞进上下文
如果只做『记录』,claude-mem 和一行 tee 重定向没区别。真正的工程决策在第二步:它不存原始流水,而是把每次观察到的工具调用交给 Claude 压缩成语义摘要。为什么不直接存原文?因为原始工具输出(比如一次 grep 返回的三百行、一次 Read 的一整个文件)放进上下文是灾难性的——既撑爆 token,又稀释注意力。AI 压缩把『发生了什么』提炼成『JWT 校验在 validateToken(),关键发现在 auth.service.ts』这种可检索的短句,存储和召回的成本同时下降。
代价也在这里:压缩本身要调一次模型,有延迟和费用;更关键的是压缩是有损的,细节在摘要里丢了就找不回来。claude-mem 的解法是『progressive disclosure(渐进式披露)』——索引里只留足够你判断『这条值不值得看』的线索,真正丢失细节的概率被控制在『你主动选择展开』的那一步之前。
存储与检索:SQLite FTS5 + Chroma 的混合,以及三层渐进式披露
记忆落盘分两层:结构化事实和会话元数据进本地 SQLite(用 FTS5 做关键词全文检索),语义向量进 Chroma(做相似度检索)。两者合并成『混合检索』——既能用 authentication bug 这种关键词精确命中,也能用『之前修登录那个问题的思路』这种语义模糊查询捞回来。这是它和纯向量库(如 Mem0 早期)或纯关键词(如 grep 历史)的本质区别:两种召回互补,漏召回的概率更低。
检索接口是它最讲究设计的地方,也是『长文读完能多知道一件标题得不到的事』的关键。它暴露 4 个 MCP 工具,强制走三层工作流:
search:先返回紧凑索引,每条约 50–100 token,只给 ID 和一句话线索;timeline:围绕某个结果拉出时间线上的上下文;get_observations:只对你真正选中的 ID 取全文,每条约 500–1000 token。
项目方给出的数据是:先过滤再抓取,能把 token 消耗压到约 1/10。换句话说,它把『记忆检索』从『一股脑倒进上下文』变成了一个带审查的步骤——你先看目录,再决定翻开哪几页。这正好对应了长上下文 Agent 最大的隐性成本:不是上下文窗口不够大,而是把垃圾倒进去后,模型反而找不到重点。
和三条旧路线比:Mem0、手动 memory 文件、上下文塞满
把 claude-mem 放到坐标系里才看得清它改了什么。
和 Mem0 比:Mem0 是一个『加进现有 Agent 的记忆层』,你调用它的 extract/store/recall API 来存取用户事实和偏好,后端可选向量、图、键值。claude-mem 不是『调用它』,而是『装好它』——它通过钩子接管 Claude Code 的全生命周期,零代码侵入。两者定位不同:Mem0 适合产品里给终端用户做个性化记忆,claude-mem 适合开发者给自己用的编程 Agent 做项目级连续性。
和手动 memory 文件比:手写 CLAUDE.md 或 memory.md,好处是你能完全掌控写什么,坏处是每次都要人工维护、容易过期、且一贴就是全文(动辄上千 token)。claude-mem 把这件事自动化了,且用渐进式披露避免了『贴全文』的浪费。
和『上下文塞满』比:有人图省事,把整个项目历史、所有文档一次性塞进系统提示。这在小项目还行,项目一大就立刻溢出且检索质量崩塌。claude-mem 的索引→详情两跳,本质是把『塞满』降级成『按需取』。
代价与边界:你付出的,和别把它当什么的
别把它当成『什么都能记住』的黑盒。第一,压缩有损,关键细节可能只在摘要里留个影子,需要 get_observations 才能还原——而这一步要你主动发起。第二,它依赖本地起一个 worker 服务(默认 127.0.0.1:37777,用 Bun 跑),在共享机器上虽有 localhost 绑定降低风险,但配置不当仍有本地进程读走 API key 的可能(官方文档自己提示 GET /api/settings 会明文返回密钥,务必只绑 localhost)。第三,它『记得多』的前提是你允许它记——敏感内容要用 private 标签包起来排除出存储。
谁该用?长期维护一个代码库、受够了每开一个新会话就重新讲一遍项目背景的人;或者想给多个 Agent CLI 共享一份本地记忆的团队。谁不该把它当救命稻草?它不能替代真正的领域知识库和文档,也不是权限/合规系统——它只是把『你之前做过什么』这件事,从靠人记、靠人贴,变成了靠钩子自动沉淀、靠索引按需取回。这个转变看似不大,但『记忆的采集成本趋近于零』这一点,恰恰是过去所有记忆方案没能跨过去的门槛。
