1. 它到底是什么:一个专给 Claude 补长期记忆的开源工具
如果你天天用 Claude Code 干活,大概率遇到过这种抓狂场景:上个会话里刚定的技术方案、刚梳理完的项目结构,新会话一开,它全忘了,还得从头讲一遍。直到我看到 claude-mem 这个开源项目,才确定“给 Claude 补长期记忆”这件事,真的有解。
一句话概括,claude-mem 就是给 Claude Code 加“长期记忆”的工具。它做了一件看起来简单、实际上很关键的事:把那些散落在各个会话里的技术决策、用户偏好、项目约束抽取出来,沉淀到本地数据库里,下一次新会话开始时,Claude 能带着这些记忆继续干活。你不用再一遍遍重复“我们项目用 uv 管依赖”“API 统一走 /api/v1 前缀”“用户不想看到弹窗提示”这类背景信息。
这个工具适合谁?我体感下来是两类人最受益。第一类是每天泡在 Claude Code 里的重度开发者,连续几小时的开发会话意味着大量的上下文铺垫,记忆系统能直接帮你省掉重复沟通的成本;第二类是对 AI 工程化感兴趣的人,claude-mem 把“记忆的写入、检索、过期管理”做成了一套完整闭环,哪怕你不直接用它,把它整个拆一遍看看设计,也是很好的学习素材。
1.1 Claude 的“失忆”问题出在哪
先把问题根源说清楚。大模型的上下文窗口虽然越来越大,但本质上还是“一次性”的:每次会话开始时,输入给模型的信息都是从零开始组装的。你上个会话里敲下的每一行指令、它给出的每一个结论,都没有被持久化到某个你可以主动取回的地方。Claude Code 这类 Agent 工具虽然能读代码、跑命令、改文件,但它的“记忆”只在当前会话有效,关掉终端就归零。
有人会说,那我每次把项目说明写进 CLAUDE.md 不就行了?这确实是个好习惯,但有两个硬伤。第一,你只能写“静态知识”,写不了“我们昨天刚决定把订单模块拆成三个服务”这种动态变化的信息;第二,靠人肉维护说明文档太反人性,写着写着就过期了。claude-mem 的价值在于,它把记忆变成了一种运行时能力——对话中自然沉淀,需要时主动检索,而不是靠人工去记。
1.2 claude-mem 的核心能力快照
我把它拆成三层来看:
- 记忆层:把人话转成结构化的“记忆条目”,按类型存储,支持语义检索。
- 桥接层:通过自定义工具或 MCP 协议接到 Claude Code 上,让 Claude 在对话中能调用“记住”“回忆”“忘掉”这些动作。
- 管理面:提供 CLI 和配置文件,用来查看、删除、批量导出记忆,也能调整提取阈值、注入条数这些参数。
这三层加在一起,才真正形成了记忆闭环。你可以主动告诉它“记住这个”,它也会在对话中自动发现值得沉淀的信息,并在下次相关话题出现时主动把旧记忆翻出来。说白了,这就像给 Claude 配了一个能长期跟着项目走的助手笔记。
2. 核心设计拆解:记忆怎么存,又是怎么被想起来
光知道它能记东西还不够,得明白它背后是怎么运作的。工具用久了总会出各种状况,不理解内部机制,排起查来会非常痛苦。我按照我的理解,把 claude-mem 的设计拆成存储、检索、桥接三块。
2.1 三种粒度的记忆:事实、时间线、项目知识
从我实际使用和翻源码的感受来看,claude-mem 并不是把对话内容原封不动塞进去,而是把记忆按粒度分成了几类,不同类型对应不同的生命周期。
- 事实型记忆(memory):最核心的静态知识点,比如“用户希望错误提示用中文”“项目使用 FastAPI 和 SQLite”“部署环境是 Docker Compose”。这类记忆价值最高,适合长期保留,也会在后续会话中被优先注入。
- 时间线型记忆(memory stream):类似事件日志,记录“什么时候发生了什么”,比如“2025-03-12 完成订单模块拆分”“下午讨论确定引入 pytest 并清理 unittest”。它主要解决“上次进行到哪了”“当时为什么这么改”这类连续性问题。
- 项目知识型记忆:偏代码库层面的理解,比如模块结构、核心类的职责、某个历史决策的来龙去脉。这类记忆往往和具体项目强绑定,适合按项目隔离存放。
把记忆拆得细,是因为不同信息的过期速度完全不同。“用户偏好 Python 3.12”要记一年,“昨天临时把 dev 分支合到 main 上验证了一下”这种事件,过两周就没人关心了。分开存,后续才能分开做淘汰和清理,这一点在后面“记忆保鲜”的部分会再展开。
2.2 SQLite 与向量检索的搭配逻辑
存储上,我看到的主流版本用的是 SQLite,记忆条目连同向量一起落库。为什么选 SQLite?首先是部署零成本,一个文件就是整个库,备份、迁移、清空都非常直接,对个人开发者极其友好;其次是它足够支撑单机读写量,你一天产生的记忆条目撑死几百条,SQLite 就算每个会话都写入也毫无压力。
但光有关系型存储还远远不够。你回忆的时候,往往不会用记忆里的原话。比如你脑子里想的是“上次那个数据库方案最后选了什么”,而当时存进去的可能是“PostgreSQL vs MySQL 对比,最终选了 PgSQL”。关键词完全对不上,所以 claude-mem 会为每条记忆生成向量索引,用语义相似度来检索。常见做法是调用商用 embedding API 或者用本地轻量模型生成向量,检索时把问题同样转成向量,取余弦相似度最高的几条返回。这个思路跟 RAG 殊途同归,只不过数据源是你的历史对话,而不是一堆文档。
2.3 和 Claude Code 的桥接方式
Claude Code 本身只负责执行代码和对话,它怎么知道要调 claude-mem?答案是桥接层。claude-mem 把自己暴露成一个自定义工具或 MCP server,同时把工具说明写进 Claude 的系统提示里,告诉它:当你听到用户说要记住某件事,或者发现对话里有值得沉淀的结论时,就去调用记忆的写入接口;当新任务看起来和过去某些记忆相关时,就去检索旧记忆。
这一步看起来简单,实际是整套系统的灵魂。工具调用意味着 Claude 可以在最恰当的时刻主动读写记忆,而不是靠用户手动敲命令。我自己的体会是,自动提取很容易产生噪声,所以工具说明和提取阈值之间的平衡需要反复调,后面我会专门讲怎么调。
3. 安装与初始化:把记忆系统跑起来
先说句实话:这类工具迭代很快,不同版本的安装方式会有差异。下面我按通用流程来写,命令以你 clone 下来的 README 为准,但核心思路是一致的。
3.1 环境准备与安装方式
前置条件通常是 Python 3.10 及以上,以及一个能正常工作的 Claude Code 环境。Python 3.10+ 不是随便定的,项目依赖了不少新语法和类型特性,用旧版本会直接跑不起来。依赖管理上,现在这类工具大多推荐 uv,比 pip 快且锁依赖更干净。
我的惯用装法分三步:
- 把仓库 clone 到本地:
git clone https://github.com/thedotmack/claude-mem.git - 创建虚拟环境并安装依赖:
cd claude-mem && uv sync - 跑一下
claude-mem --help或项目 README 里对应的启动命令,确认 CLI 正常起来。
这里我特意选 git clone 而不是直接 pip 装,原因很简单:这类快速迭代的项目改命令改配置很频繁,跟着仓库源码走,出了问题容易查,也方便切版本回滚。装完之后别急着用,还要做两件事:初始化数据库、生成配置文件。
3.2 claude-mem.json 配置拆解
项目根目录或用户目录下会有一个 claude-mem.json,这是整套系统的控制面板。我整理了一个常见结构的示例,字段名不同版本可能略有差异,但思路基本一致:
{ "version": "0.1", "memory": { "storage": { "local": { "database_path": "~/.claude-mem/memory.db" } } }, "claudeCode": { "enabled": true, "autoExtract": true, "memoryLimit": 20 }, "factExtraction": { "enabled": true, "threshold": 0.8 }, "blockManager": { "enabled": true, "allowlist": ["code", "architecture", "preferences"] } }逐个说下关键项:
database_path:SQLite 数据库存放位置,建议放在用户目录而不是项目目录,避免被版本控制误提交。autoExtract:是否允许 Claude 在对话里自动提取记忆。开自动提取很省心,但噪声也大,新手建议先开着,跑两天再回头手动清理。memoryLimit:每次会话最多注入多少条旧记忆。这个值不是越大越好,注入太多会稀释注意力、挤占上下文。threshold:语义检索时只返回相似度超过这个阈值的记忆。阈值越高召回越少但更精准,我通常从 0.7 试起。blockManager:过滤掉某些不相关的信息源,让记忆系统只关注代码、架构、偏好这类高价值内容。
3.3 初始化数据库与验证
配置写完之后,一般会有一个初始化命令,比如claude-mem init。它会创建数据库文件、写入初始表结构,并在 Claude Code 的工具列表里注册记忆工具。初始化完成后,我会先手动插入一条测试记忆:claude-mem add "用户偏好使用 uv 管理 Python 依赖",然后跑claude-mem search "Python 依赖怎么管"。如果搜索能返回刚才那条,说明整条链路已经通了,可以正式投入使用。
这一步验证很重要,我见过不少人配置完了直接开聊,结果发现 Claude 根本没调起工具,白白浪费了半天时间才排查出来。测试一下,十秒钟的事。
4. 实操记录:让 Claude 主动记住、按需回忆
系统跑通后,最关键的还是日常怎么用。我实际用了大概四周,把“主动记忆”这件事总结成了两种触发路径,以及一套顺手的管理手段。
4.1 两条触发路径:显式指令与自动提取
第一条是显式指令。你在对话里说“记住,我们项目的 API 统一用 /api/v1 作为前缀”,Claude 就会调用记忆工具把这句话整理成结构化记忆。显式指令的特点是可控性最高,适合存那些你自己就知道以后一定会用到的决策和偏好。
第二条是自动提取。开启 autoExtract 后,Claude 会在对话过程中自行判断哪些内容值得沉淀,比如你们为某个方案争论了半天、终于定下来的结论,或者你反复强调过的一个约束条件。自动提取的好处是零成本,但它的准确率取决于模型判断力,经常会提取出一些“正确的废话”。我的处理办法是每两三天跑一次claude-mem list,把明显没用的条目批量删掉,避免记忆库慢慢变成噪声垃圾场。
4.2 常用 CLI 操作一览
不同版本的 CLI 命令名可能会有调整,但常用操作就那么几类。我按语义整理了一份,命令名仅供参考,建议先用claude-mem --help查一遍:
| 意图 | 命令示例 | 说明 |
|---|---|---|
| 手动写入一条记忆 | claude-mem add "项目使用 FastAPI" | 测试或补充性写入 |
| 搜索相关记忆 | claude-mem search "后端框架" | 语义检索,带相似度返回 |
| 列出全部记忆 | claude-mem list --limit 50 | 分页查看入库内容 |
| 删除某条记忆 | claude-mem delete <id> | 清理噪声记忆 |
| 查看统计信息 | claude-mem stats | 看看库里有多少条、按类型分布 |
| 清空记忆库 | claude-mem reset | 慎用,全量删除 |
4.3 一个完整的工作流示例
我拿一个真实场景演示。早上接到任务:把项目的用户模块从单体路由里拆出去。以前我会先花十分钟给 Claude 讲现状:“用户模块现在在 app/user.py 里,和订单共享一个 session 机制,ORM 是 SQLAlchemy 2.0……”但这次因为之前几轮会话已经自动沉淀过相关记忆,我只说了一句“按我们之前商量的拆分方案,把用户模块拆出去”。
Claude 搜索记忆,命中了两条:一条是“用户模块拆分方案:独立路由 + 独立测试目录,尽量不动 session 机制”,另一条是“用户偏好小步提交,每完成一个子任务就 commit”。于是它直接基于这两条记忆开始干活,中途还会提醒我“这个改动会影响订单模块,记得跑测试”。整个过程下来,我重复解释背景的时间几乎为零。这就是 claude-mem 最大的价值:它不会让你觉得“AI 变聪明了”,而是让你觉得“对话终于可以连续了”。
5. 常见问题与排查技巧实录
用这类工具,坑是免不了的。我把遇到过的典型问题整理成一张速查表,再拆几个实际处理经验,希望能帮你少走弯路。
5.1 高频问题速查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 说了“记住”但没有入库 | 工具注册失败或 autoExtract 未开启 | 检查 Claude Code 工具列表里是否有记忆工具,重跑 init |
| 搜索不到明显相关的记忆 | 阈值太高或向量索引缺失 | 调低 threshold,检查搜索是否走了向量检索 |
| 每次会话注入一堆无关旧记忆 | memoryLimit 设置过大 | 调小 memoryLimit,优化 blockManager 白名单 |
| 数据库文件损坏或写入报错 | SQLite 并发写冲突 | 开启 WAL 模式,避免多进程同时写 |
| 配置改了但行为没变化 | 配置文件路径不对 | 确认 claude-mem.json 在正确的项目或用户目录下 |
| 启动时提示 Python 版本过低 | 依赖新语法特性 | 升级到 Python 3.10+,重装依赖 |
5.2 我的几个避坑经验
第一个是关于记忆噪声的。自动提取功能刚开那两天,库里堆了三十多条“用户使用了 xx 命令”“这次修改了文件 xx”这类毫无长期价值的内容。后来我把factExtraction的阈值从 0.5 调高到 0.8,并且把 blockManager 里只保留code、architecture、preferences三个类别,情况立刻好转。阈值不是越高越好,但至少能让入库内容保持在一个每周手清五分钟就能维护住的量级。
第二个是别让注入的旧记忆占据太多上下文。我一度贪心把memoryLimit调到 50,结果 Claude 反而被一堆旧偏好干扰,动手速度明显变慢。现在固定在 15 到 20 之间,只注入和当前任务最相关的记忆。这个值跟任务复杂度直接相关:做大型重构可以稍微放宽,做小需求就收紧。
第三个经验可能很多人想不到:记忆也需要版本管理。我会定期把 SQLite 文件备份进自己的笔记仓库,同时每周导出一份 Markdown 格式的记忆摘要。这样哪怕某天数据库崩了,我也能快速恢复核心记忆,而不是从零开始。另外还有一个容易忽略的坑:Claude 偶尔会出现调用工具后的“静默失败”——它不告诉你工具没调成功,只是顺着话往下说。我的应对办法是,遇到重要信息会补一句“确认一下这条已经入库”,逼它验证结果。
6. 多项目与长期使用的几个建议
用了一个月之后,我逐渐意识到 claude-mem 不只是“给 Claude 加记忆”的插件,它本质上是一套知识管理工具。既然是知识管理,就越用越需要自己的方法论。
6.1 按项目隔离记忆
如果你同时维护好几个项目,最忌讳的是把不同项目的记忆混在同一个库里。claude-mem 的设计上,配置文件是可以按项目拆的:每个项目一个独立的 claude-mem.json,指向不同的 SQLite 文件。这样就不会出现“在 A 项目里回忆出来的却是 B 项目的技术选型”这种尴尬。初始成本只是多初始化几次,长期收益却非常明显,值得一开始就做好。
6.2 记忆的“保鲜”与清理
记忆库需要像代码仓库一样做卫生管理。我的固定节奏是:每周清一次时间线型记忆,把超过两周、且当时是一次性验证性质的事件删掉;每月做一次事实型记忆的 Review,过期或者已经被推翻的结论直接删除或更新。事实型记忆一旦过期,危害比没有记忆更大——它会一本正经地误导 Claude,让你误以为它“懂”,实际上它懂的是三个月前的世界。
6.3 更适合团队的玩法
如果是团队场景,可以考虑把记忆库放到共享存储上,比如一个大家都能读写的数据库服务,或者用 Git 仓库管理 SQLite 文件让成员同步。但要注意锁竞争和冲突问题,共享写入对 SQLite 是个不小的考验,团队规模一大就得谨慎。还有一个更轻量的玩法:只共享“项目知识型记忆”的导出文件,团队成员各自保留个人偏好的本地记忆,既协作又不互相污染。
最后聊点我自己的体会。我见过不少人把 claude-mem 当成灵丹妙药,以为装上之后 AI 就无所不知了。用下来的真实感受是,它解决的是“连续性”问题,不是“理解力”问题。它真正帮你消化的,是那些你懒得写进文档、但又反复在对话里重申的隐性上下文。想让这套系统长期好用,核心不在于工具本身,而在于你愿不愿意花一点点时间维护它——定期清理噪声、及时更新过期结论、按项目做好隔离。做到这几点,它才会真的像一个越用越懂你的长期搭档。