如果你常年在命令行里用 AI 辅助编程,或者平时喜欢让大模型处理一些“连续作战”的活儿,你应该早就发现了一个让人抓狂的问题:对话一结束,记忆就归零。项目背景、上一步改到哪、之前定下的术语口径、踩过的坑,换个新会话全部要重新交代一遍。
claude-mem 这个开源工具,就是冲着这个痛点去的。它做的事情本质上很简单:给 Claude Code 这类命令行 AI 助手外挂一层长期记忆。对话过程中自动记录重要信息,会话结束后整理成结构化的记忆文件,下次开新会话时再把相关记忆自动塞回上下文里。你不用手动写什么“请记住以下内容”,它自己会判断、提取、整理、归档。
这篇文章我会从项目定位、底层机制、安装配置到使用心得完整拆一遍,包括我在实际使用中踩过的坑和调整方案。如果你在寻找“怎么让 AI 记住上次项目进度”这类问题的答案,看完应该能有直接能抄作业的方案。
1. 项目定位:为什么我们需要一个外挂记忆系统
1.1 无状态对话带来的持续返工
大模型本身是“无状态”的,每一次对话请求,它看到的只是你通过上下文窗口塞给它的内容。窗口再大也有限,而且一旦会话结束、缓存失效,之前聊过的内容就全忘了。
在写代码的场景里,这特别致命。比如一个跨平台系统的开发,通常要持续几天、十几个会话。如果你在会话 A 里定义了一套模块划分方案,在会话 B 里让 AI 按照这个方案继续实现,你就得先在会话 B 里花大量篇幅把方案重新描述一遍,描述得还不够完整、不够精确。更不要说那些隐藏在代码之外的隐性约定,比如“错误码统一返回 null 而不是抛异常”“数据库字段名全部用下划线分隔”这类细节。真正干过这种活的人,都知道每次重新交代、反复校正有多消耗耐心。
1.2 claude-mem 的定位与解决思路
claude-mem 不是去改模型本身,它走的是“外挂记忆层”的路线。设计上有三个层次:
- 会话级记忆:记录当前会话的消息摘要、工具调用、测试结果、用户偏好,形成一份“会话档案”;
- 项目级记忆:按项目维度汇总多个会话的结论,沉淀项目背景、约定、技术决策;
- 用户/组织级记忆:跨项目记住你对 AI 的使用偏好,比如“回复尽量给完整代码,不要只给 diff”。
三个层次放在一个以目录为骨架的存储里,形成类似“人脑笔记”的效果。项目相关的记忆跟着项目走,个人偏好跟着用户走,互不干扰。
1.3 为什么是文件,而不是数据库
我第一次接触 claude-mem 时也好奇过这个问题:记忆数据为什么不用 SQLite 或者向量数据库存,偏偏落成一堆 Markdown 文件?
实际用过之后,我理解了。文件方案的几个优势非常贴合这类工具的使用场景:
- 可读性:记忆全是 Markdown,用编辑器直接打开就能看,能手动修正错误记忆,这是数据库难以比拟的透明感。
- 可用 Git 管理:记忆文件纯文本,天然适合放进版本控制,或者直接同步到网盘。我后来就把记忆目录放进了自己的同步盘,换了机器也能带上历史记忆。
- 零依赖:不引入数据库引擎,安装、部署的复杂度直线下降。对一个命令行工具来说,这很重要——我装了就能跑,不用起服务调配置。
- 检索简单:记忆量没大到必须上向量数据库的程度,基于关键词和简单的相关度排序就够用。工具保持简单,反而稳定可靠。
2. 安装与快速上手:十分钟跑通流程
2.1 环境准备
我的环境是 macOS + Node.js 18+,这套工具依赖 Node 运行时,建议装一个较新的 LTS 版本。如果你需要配合命令行版本的 AI 助手使用,需要先确认本机已经装好并配置好对应助手的基础环境,能正常在终端里发起对话。
2.2 安装 claude-mem
安装走 npm 全局安装,很常规:
npm install -g @yojan/claude-mem装完之后检查版本:
claude-mem --version能打印出版本号,说明安装成功。
2.3 启动记忆服务
核心命令就一条:
claude-mem start这步做的事比名字看起来多一些。它会:
- 启动一个本地钩子服务,用来监听 AI 对话过程中的各种事件;
- 检查你的 AI 客户端配置文件,把对应的钩子注册进去;
- 建立默认记忆目录(用户主目录下的
.claude-mem文件夹); - 打印当前服务状态。
启动完可以用下面的命令确认状态:
claude-mem status正常会看到服务运行中、钩子已注册、记忆目录路径等关键信息。
2.4 第一次真实对话测试
工具装好,一定要跑一个完整链路验证记忆生效。我的验证方式是这样:
- 打开新的对话窗口;
- 明确说一句带关键信息的话:“这个项目统一使用 TypeScript 严格模式,错误处理全部走自定义的 Result 类型”;
- 再聊一些其他代码内容,故意让这个约定在后续对话中出现;
- 结束当前会话;
- 查看记忆目录下生成的文件。
会话结束后,你会在记忆目录里看到新生成的文件,里面应该包含刚才那句约定的提取结果。这时候再开一个新的会话,问一句“刚才约定的错误处理方式是什么”,如果它能准确回答出来,那这第一关就通过了。
注意:第一次跑通前,别急着配太多花哨的参数。先用默认配置走一遍完整链路,确认“记录→存储→检索→注入”四个环节都正常,后面再优化不迟。
2.5 查看记忆内容
默认记忆目录在~/.claude-mem。用编辑器或者ls看一眼,结构大概是这样:
.claude-mem/ ├── organizations/ ├── users/ ├── projects/ ├── conversations/ └── knowledge_graph.json刚跑完一次对话,conversations下会出现一个以会话 ID 命名的子目录,里面存着会话摘要和消息记录。organizations和users下面则是对应维度的记忆归档。我对这个目录结构的评价是:一眼能看懂谁写了什么、在哪一层,出了问题也方便手动修。
3. 核心机制拆解:钩子、记忆提取与上下文注入
如果只把 claude-mem 当成“多存了几句话的记事本”,那理解就浅了。它真正有价值的是背后那套事件驱动的记忆生命周期。
3.1 钩子机制
你启动 claude-mem 之后,它会在 AI 助手的配置里注册几个钩子,相当于在对话的不同阶段埋了监听器。常见的钩子点包括:
- 会话开始(SessionStart):在会话启动时触发,负责载入该项目的历史记忆,准备注入;
- 用户输入时(UserPromptSubmit):在用户提交问题前触发,可以把当前输入和之前提取到的记忆一起交给模型;
- 工具调用前后(PreToolUse / PostToolUse):记录每一次工具调用的输入输出,尤其是命令执行结果、文件读写结果这类高价值信息;
- 会话结束(SessionEnd):整理本次会话的摘要,归档到对应层级的记忆中。
这套机制的好处是,记忆的采集是“被动”的——你不需要每次向 AI 声明“记住这个”,只要对话在正常进行,记录就在同步发生。
3.2 记忆是怎么被提取出来的
采集到原始对话之后,怎么变成结构化记忆?这个过程我不完全掌握全部实现细节,但通过观察生成的文件,可以大致还原它的思路:
模型级的摘要负责“提炼”。在每个会话片段结束后,工具会调用一次大模型接口,把最近的对话压缩成几条带标签的记忆条目。注意,它不会逐字保存所有内容,而是提取“值得记住”的信息:任务目标、技术决策、错误与解决方案、用户偏好等。
降噪靠规则。不是所有对话内容都会进记忆。比如“你好”“继续”“报个错”这类即时性、会话性的信息,或者已经被模型成功消费、不再需要留存的临时细节,会被规则过滤掉。我自己的经验是,它提取的记忆整体比较精简,绝大多数是真正有沉淀价值的内容。
记忆条目最终以 Markdown 文件落地。每个条目包含标签、时间、来源会话、正文等字段。同时还会写一份 JSON 索引,方便机器检索。
3.3 上下文注入:记忆怎么回到对话里
记忆存了,不注入就等于白存。claude-mem 的检索注入逻辑大致如下:
- 会话开始时,根据当前工作目录确定项目范围;
- 在该项目对应的记忆目录下,扫描所有记忆条目;
- 结合当前会话的历史记录和项目背景,按相关度排序;
- 把最相关的一批记忆条目格式化之后,追加到系统提示或者对话上下文中;
- 如果当前会话过程中产生了新的关键信息,还会实时更新记忆作用域。
这个机制最让我满意的一点是,注入的记忆不是简单拼接到提示词尾部。它会做筛选和去重,避免把过时或者矛盾的信息再次丢给模型。尤其是当一个项目里有多个历史会话、记忆条目较多时,筛选和排序的价值就体现得非常明显。
3.4 知识图谱是个加分项
除了文件式记忆,claude-mem 还会维护一个知识图谱文件。它记录实体之间的关联关系,比如“模块 A 依赖模块 B”“方案 X 在项目 Y 中使用”。
这个图谱的价值在于:当新会话需要判断某段记忆是否与当前问题相关时,图谱能提供比纯关键词更精确的线索。比如你在新会话里问“首页加载性能优化”,光靠关键词匹配,可能只能找到包含“性能”“首页”字样的记忆;但图谱中“首页→使用组件懒加载→导致首屏请求减少→相关决策记录”这样的路径,能把更深的上下文捞上来。
实际体感是,用图谱辅助检索之后,命中率比纯关键词搜索高不少,尤其是跨会话、跨项目但语义关联比较远的记忆。
4. 配置与高级玩法:让记忆按你的方式工作
4.1 关键配置项
claude-mem 的配置主要通过环境变量注入,在启动服务之前设置即可。我整理了一份自己常用的配置对照:
| 配置项 | 作用 | 我的常用值 |
|---|---|---|
CLAUDE_MEM_DATA_DIR | 指定记忆存储目录 | 默认是~/.claude-mem,我自己会改为项目同步目录 |
CLAUDE_MEM_PORT | 本地钩子服务的监听端口 | 默认值即可,除非端口冲突 |
CLAUDE_MEM_SUMMARY_MODEL | 用于生成记忆摘要的模型 | 一般用默认的模型,追求速度可换轻量模型 |
CLAUDE_MEM_HOOK_HANDLER | 启用/停用钩子事件的处理逻辑 | all表示全部处理 |
CLAUDE_MEM_CONFIG | 指定配置文件路径 | 指向我自己的.claude-mem-config |
配置文件的写法是标准的键值格式,以我自己用的为例:
CLAUDE_MEM_DATA_DIR=/path/to/sync/claude-mem CLAUDE_MEM_PORT=3719 CLAUDE_MEM_SUMMARY_MODEL=quick-model CLAUDE_MEM_HOOK_HANDLER=all配置的完整清单建议以你本地claude-mem --help的输出为准,不同版本会有差异,别把网上看到的配置项全盘硬套。
4.2 排除规则:有些内容我不想记
记忆不是越多越好。有些项目是敏感业务逻辑,或者设计文档里含了不应长期留存的隐私信息,这时候清扫记忆就非常重要。
claude-mem 支持配置排除规则,按目录、按文件模式、按内容关键词做过滤。我的做法是:
CLAUDE_MEM_IGNORE_GLOBS=.env,*.pem,secrets/*,internal-docs/* CLAUDE_MEM_IGNORE_KEYWORDS=password,token,api_key,secret配置之后,凡是路径匹配到这些模式,或者内容里带这些关键词的对话片段,都不会被写入记忆。这一条建议所有人在正式项目里必须做。你不想哪一天同事在 AI 会话里看到自己的访问密钥被自动归档进记忆文件吧。
4.3 手动管理记忆
文件式记忆最大的好处就是能直接改。我用过几种手动管理的操作:
- 修正错误记忆:AI 提取的记忆偶尔会不准确。直接用编辑器打开 Markdown 文件,改成正确的描述,后续注入的就是修正后的内容;
- 删除无用记忆:项目结束后,把对应项目目录整个删掉,记忆空间清爽;
- 合并重复条目:同一个项目反复聊,可能产生几条语义重复的记忆。我会手动合并成一个条目,避免上下文被冗余信息浪费。
另外项目提供了一个基于 Web 的可视化界面,可以浏览记忆条目和知识图谱。我偶尔会用来看一下某个项目的记忆全貌,比逐个翻文件直观。
提示:如果你准备手工编辑记忆文件,先停掉 claude-mem 服务再改,避免出现写入竞争导致文件损坏。改完再
claude-mem start拉起来。
4.4 跨项目共享记忆
claude-mem 默认按项目隔离记忆,但有些偏好和经验应该跨项目生效。比如“回复尽量用中文”“测试命令统一用 pnpm”这类固化的习惯,如果每个项目都重新提取一遍,太浪费。
解决办法是把这些内容写进用户级记忆目录,路径一般在~/.claude-mem/users/your-user-id/。这种层级关系清晰,项目级记忆管代码细节,用户级记忆管个人习惯,组织级记忆管团队规范。
4.5 与其他工具配合
claude-mem 的本体是本地服务加命令行,这意味着它也可以被脚本和定时任务调用。我自己试过几个集成方式:
- 配合 Git 钩子:每次 commit 之后触发一次“记忆整理”命令,把本次提交关联的项目进展汇总到记忆;
- 定时备份:用 cron 定期压缩记忆目录并备份到私有仓库;
- CI 预处理:在 CI 里启动一个临时 claude-mem 实例,把测试报告的关键结论写入记忆,下次开发时 AI 可以直接引用。
这些扩展的稳定性取决于你的使用场景,但文件式存储和 CLI 接口的组合,确实给了足够的自由度。
5. 常见问题与排查技巧实录
5.1 钩子没生效,对话记录不到
这是最常见的坑。症状是claude-mem status显示服务正常,但对话结束之后记忆目录里什么也没生成。
排查顺序按概率排列:
- 检查 AI 客户端配置文件里的钩子是否被正确注册。有的客户端版本更新会覆盖配置文件,导致钩子丢失,需要重新
claude-mem start; - 确认启动 claude-mem 之后再打开对话窗口。如果你先打开了对话窗口再启动服务,已经启动的会话不会加载新钩子;
- 查看本地日志。日志里会有每次钩子触发记录,如果连日志都没有,基本可以断定是钩子注册环节出了问题。
经验之谈:升级 AI 客户端之后,立刻看一眼claude-mem status,这是钩子最容易丢的时机。
5.2 记忆过于冗余,上下文被挤占
默认配置下,记忆注入允许一个较高上限,但如果你项目历史悠久、记忆条目堆积太多,每次会话注入的记忆可能反而稀释重点。
我自己的处理方式:
- 定期用
claude-mem find查看高频出现的记忆条目,把真正重要但表述分散的条目手动合并; - 项目大版本迭代后,删除那些已经过时的技术决策记录。比如旧目录结构已经废弃,留着只会误导模型。
注意:记忆不是越老越有价值。过时的记忆如果没被清理,新会话的模型可能把旧方案当最佳实践输出,这在项目重构期特别要小心。
5.3 敏感信息写入记忆
文件式存储方便的同时也意味着:一旦敏感信息被提取到记忆文件,它就静静地躺在磁盘上。轻则占空间,重则泄露。
我遇到过一次测试环境的密钥出现在记忆摘要里,事后专门补了两道防线:
- 在配置里加严关键词排除规则,包括
key、token、secret等模式; - 使用完 AI 助手后,手动扫描记忆目录里是否出现不该出现的内容,发现就立即删除。
这不算 claude-mem 的缺陷,更像是“AI 助手 + 长期记忆”这类工具的必然风险。使用者必须在享受便利的同时,把隐私边界画清楚。
5.4 记忆文件损坏或格式错乱
如果你在会话进行中强制杀掉了进程,偶尔会留下只写了半截的记忆文件。遇到这种情况,我一般直接删除该条记忆文件,让它下次对话时重新生成,损失通常很小。
不建议手工去修一个内容结构已经乱的文件,因为模型后续读取时可能会被格式混乱的内容干扰。删掉比修复更划算。
5.5 性能影响
开了钩子服务和记忆提取,每次会话结束时会多一次模型调用用于生成摘要,这是不可避免的额外开销。在大型会话上,这个耗时可能增加一二十秒甚至更多,我能接受,毕竟换来的是长期记忆。
如果你的对话长度普遍很大、频率又高,可以考虑把摘要模型切换到更快的版本,或者在配置里降低摘要触发频率。
5.6 多设备环境
我同时用办公机和笔记本,两套环境的历史记忆不一致会带来上下文漂移。解决办法是把CLAUDE_MEM_DATA_DIR指向同步目录(比如网络同步盘),并在切换设备前保证同步完成。
注意同步冲突:如果两台设备几乎同时写入同一个记忆文件,同步网盘会产生冲突副本。重度使用场景下,最好固定一台设备作为“记忆主力机”,另一台以读取为主。
最后想说的
我在实际使用 claude-mem 的过程中,最大的感受是:它真正解决的不是“AI 记性差”这一个问题,而是把 AI 对话从“一次性问答”变成了“可累积的生产过程”。项目背景、技术决策、错误经验,不再随着会话窗口的关闭而流失。哪怕只是被自动记录下一条决策依据,在两周后重新打开项目时,这个工具都帮你节省了一次完整的上下文重建。
如果你也想长期用它,我建议把这篇文章里提到的隐私排除规则、记忆清理习惯一开始就落实。记忆工具用得好是效率助手,用不好就是隐私隐患。踩过几次坑之后,我现在每两周会花十分钟过一遍记忆目录,看看哪些该删、哪些该合并。这个习惯,执行起来非常简单,但带来的收益非常稳定。