Claude-Mem 技术解析:让 Claude Code 拥有跨会话记忆
前言
使用 AI 编程助手时,一个很常见的痛点是:一次会话里刚刚梳理好的项目背景、技术决策、踩坑记录,到了下一次会话往往又要重新解释。对于中大型项目来说,这种"上下文丢失"会让 AI 协作变成重复沟通。
claude-mem 解决的正是这个问题。它是一个面向 Claude Code 的持久化记忆插件,核心目标是自动捕获开发过程中的关键信息,压缩成可检索的观察记录,并在未来会话中按需注入相关上下文。
一、claude-mem 是什么
简单理解,claude-mem 是 Claude Code 的"项目记忆层"。它不是把完整聊天记录原封不动塞回上下文,而是通过钩子、后台服务、数据库和搜索工具,把开发过程转换成结构化、可检索、可逐层展开的记忆。
它的典型能力包括:
- 跨会话保存项目上下文、决策和操作观察;
- 自动捕获工具调用、文件修改、命令执行等开发行为;
- 使用 AI 对观察内容进行压缩和摘要;
- 通过全文搜索、语义搜索和时间线检索找回历史工作;
- 在新会话启动或用户提问时,自动注入相关上下文;
- 使用
<private>标签排除不希望被存储的敏感信息。
因此,它更像一个面向 AI Agent 的"长期工作日志 + 语义索引 + 上下文注入系统"。
二、为什么 AI 编程需要持久化记忆
传统 AI 编程会话通常有三个问题:
- 上下文窗口有限:项目越复杂,历史对话越容易被截断。
- 会话天然隔离:重新打开 Claude Code 后,AI 不一定知道之前做过什么。
- 人工摘要不稳定:依赖人手维护文档,容易遗漏、过期或写得太粗。
claude-mem 的价值在于自动化:它把"记住项目历史"变成后台能力,而不是要求开发者每次手动整理。尤其在排查 bug、长期重构、跨分支开发、多人协作场景中,过去的决策和失败尝试往往比当前代码片段更重要。
三、整体架构
从本地实现看,claude-mem 可以分为四层:
text
Claude Code 主进程
└─ 生命周期 Hooks
└─ CLI / Bun 编排层
└─ Worker Daemon(Express,本地 37777 端口)
├─ SQLite:结构化存储会话、观察、摘要
├─ ChromaDB:向量索引与语义检索
└─ MCP Server:向 Claude Code 暴露搜索能力
核心组件包括:
| 组件 | 作用 |
|---|---|
| Lifecycle Hooks | 在会话开始、用户提交、工具调用后、摘要、结束等阶段捕获事件 |
| Worker Service | 后台异步处理观察、摘要、搜索和上下文注入 |
| SQLite | 保存会话、观察、用户提示、摘要等结构化数据 |
| ChromaDB | 生成向量索引,用于语义检索 |
| mem-search Skill | 让 Claude 能用自然语言搜索过去的工作 |
| Viewer UI | 在本地 Web 页面查看记忆流和观察内容 |
这种设计的好处是:Claude Code 的前台会话不会被重任务阻塞,记忆处理可以放到后台异步完成。
四、生命周期与数据流
claude-mem 的工作方式可以概括为五个阶段:
- SessionStart:启动 Worker,准备依赖,并注入初始上下文。
- UserPromptSubmit:记录用户请求,查询语义相关的历史内容。
- PostToolUse:工具调用结束后,把有价值的操作记录为观察。
- Summary:会话接近结束时生成摘要。
- SessionEnd:结束会话并处理剩余消息。
一个典型数据流如下:
text
用户提问
-> 初始化会话
-> 语义检索相关历史
-> Claude 执行工具和代码修改
-> PostToolUse 捕获观察
-> Worker 压缩并存储到 SQLite
-> 同步到 ChromaDB
-> 后续会话按需检索和注入
这里最关键的设计是"观察(Observation)"。它不是简单日志,而是对一次开发行为的摘要化表达,例如:修复了什么、发现了什么、做出了什么决策、涉及哪些文件、有什么概念标签。
五、渐进式披露:避免把记忆变成噪音
持久化记忆系统最容易踩的坑是:记得太多,反而污染上下文。claude-mem 采用了渐进式披露的思路,常见检索流程是三步:
- Search:先返回轻量索引,只看 ID、时间、类型、标题。
- Timeline:围绕某个结果查看前后上下文。
- Get Observations:只对筛选后的少量记录拉取完整细节。
这套机制的意义在于节省 token,同时降低错误上下文被注入的概率。AI 不需要一次性读取所有历史,而是先粗筛、再定位、最后展开。
六、工程设计亮点
1. 本地优先
数据默认落在本地,例如 SQLite 数据库和 ChromaDB 索引都位于本机目录。这对开发者来说很重要,因为项目上下文、文件路径、命令输出可能包含敏感信息。
2. 后台异步处理
Worker 负责压缩、存储、同步索引等任务,前台 Claude Code 会话不应该因为记忆系统异常而被卡死。
3. 失败可降级
如果 Worker 不可用,理想状态下不应影响主会话继续工作。记忆增强是辅助能力,不应成为开发流程的单点故障。
4. 搜索工具化
通过 MCP / skill 暴露搜索能力后,用户可以直接问:
text
我们上次是怎么修这个登录问题的?
这个迁移脚本之前有没有踩过坑?
最近一周这个项目做了哪些重构?
这比让用户手动翻聊天记录高效得多。
七、适用场景
claude-mem 特别适合以下场景:
- 长周期项目:需要 AI 持续理解业务和架构演进;
- Bug 排查:避免重复尝试过去已经失败的方案;
- 重构迁移:保留阶段性决策、约束和风险点;
- 多工具协作:把命令、文件编辑、MCP 调用串成统一历史;
- 团队知识沉淀:让 AI 更容易复用已有经验。
但它也不适合无脑启用在所有场景中。对于一次性脚本、小型实验、极度敏感的代码库,需要先评估隐私策略、存储位置和上下文注入边界。
八、实践建议
- 不要把记忆当真理:记忆是历史快照,当前代码仍然是最终事实来源。
- 敏感内容加 private 标签:账号、密钥、客户数据等不应进入记忆系统。
- 按项目隔离理解上下文:不同项目的历史不要混用。
- 优先用搜索再展开:先看索引和时间线,再读取完整观察。
- 定期检查记忆质量:如果发现噪音、重复或过期内容,应及时清理。
九、总结
claude-mem 的本质不是"让 AI 永远记住所有东西",而是给 AI 编程工作流增加一层可控、可检索、可压缩的长期上下文。它通过 Claude Code Hooks 捕获开发事件,通过 Worker 异步处理,通过 SQLite 和 ChromaDB 存储与索引,再通过 mem-search 等工具把历史知识带回未来会话。
对于经常使用 Claude Code 做真实项目开发的人来说,claude-mem 的价值在于减少重复解释、复用历史决策、提升长期协作连续性。真正用好它的关键,是把它当成"辅助记忆系统",而不是替代代码阅读、测试验证和人工判断的万能答案。
参考资料
- Claude-Mem 官方文档:https://docs.claude-mem.ai/
- GitHub 仓库:https://github.com/thedotmack/claude-mem
- Claude Code:https://claude.com/claude-code