很多用Claude Code的人都会遇到同一个尴尬:上周明明和Claude把某个项目的技术方案聊透了,这周开个新会话,它却像什么都没发生过一样,又问一遍“这个项目的目录结构是什么”“日志方案定了吗”。我一开始以为是prompt没写好,后来发现这是会话记忆缺失的必然结果。于是我去找了各种方案,最后在GitHub上挖到一个叫claude-mem的开源工具,专门给Claude Code做长期记忆。连续用了一个多月之后,我的Claude Code才算是真正“长脑子了”。这篇文章就把我怎么用起来的、踩过什么坑、日常怎么调教它,一次性说清楚,给同样被“失忆”问题折磨的朋友做个参考。
1. 为什么我会盯上一个叫claude-mem的小工具
先说背景。我日常的工作流里,Claude Code不只是写代码的助手,更像是参与项目讨论的协作者:技术选型、模块划分、接口设计、命名偏好、易踩坑清单,这些东西我都会在对话里和Claude反复确认。但问题恰恰出在这里——我之前默认Claude会“记住”这些讨论,实际上它只记得当前会话里的上下文。会话一关,等于清零。
后来我尝试过把结论手动写进CLAUDE.md(项目记忆文件),让每次新会话自动读取。这个方法有效,但有三个让我难受的地方:
- 手动维护太累。聊十句话只有一句值得沉淀,但什么时候沉淀、沉淀成什么样,完全靠自觉。
- CLAUDE.md越长,每次请求消耗的token越多,最后反而拖慢响应。
- 一些“潜在相关的旧讨论”根本想不起要去翻,等遇到问题时它早丢了。
这时候我看到了claude-mem。它给Claude Code补的正是“长期记忆”:会话结束后自动把聊天记录、关键实体、重要结论抽取出来,存进本地SQLite数据库;下次新会话时,Claude可以通过MCP(Model Context Protocol)服务去检索这些记忆,就像一个人带着过去的笔记本工作。
用一句话概括:它是给Claude Code配的私人笔记系统,负责自动写、自动归档、需要时自动查。
而且它不只在本地存一坨文本,而是做了三层信息抽取:
- 原始会话文本按片段存下,保留上下文。
- 用Claude Haiku模型从对话里提取实体(人名、项目名、API名、决策项等),给每一条记忆打标签。
- 从对话中提取“长期记忆条目”,比如“用户偏好TypeScript而非JavaScript”“这个项目禁止使用xxx依赖”这类跨会话仍然有效的结论。
所以当你新开一个会话,内部问它“我们之前是不是讨论过日志方案”,它能准确翻出那次讨论的核心结论、涉及的文件、当时否决的理由。这个体验和单纯的CLAUDE.md是本质区别:CLAUDE.md像一本你自己整理的笔记本,claude-mem更像一个自动更新、自动索引、还带搜索引擎的私人知识库。
适合谁呢?我个人觉得是这样几类人:
- 重度Claude Code用户,每天开好几个会话,且会话之间主题有连续性。
- 做中大型项目,很多技术决策散落在对话里,不想反复重述上下文。
- 喜欢把Claude当“带记忆的结对编程伙伴”,而不是一次性问答机器。
如果你只是偶尔让Claude写个脚本、跑个正则,那claude-mem的价值不大,装了反而多一层开销。这个判断很重要,别盲目上。
2. claude-mem和Claude Code原生记忆机制到底差在哪
要彻底搞懂claude-mem的定位,先得搞清楚Claude Code自己有哪些“记忆”能力,否则你会以为装了个多余的东西。按我的理解,原生机制大概有三层:
第一层是CLAUDE.md。按项目放一份说明文件,每次会话把全文塞进上下文。它能解决问题,但就像前面说的——静态、靠人维护、有token成本上限。
第二层是代码库索引。Claude Code会读取项目里的代码结构、符号定义、git历史,实现“它自己看代码”的能力。这个对具体代码细节很有用,但不覆盖对话里的结论,比如“这个模块之所以这么设计是因为当时时间紧,后面要重构”这种背景信息,代码里可没写。
第三层是会话恢复(--resume或/continue)。它能延续上一次对话的上下文窗口,确实能“接上”,但问题是你只能接着最近的会话走。跨多个会话翻旧账?做不到。而且一旦会话太多,列表找起来也费劲。
claude-mem补的正是这个世界里最薄弱的环节——跨会话、跨时间的语义记忆。我自己使用过程中总结了两类工具的典型差异,放在下面这个表里:
| 对比维度 | CLAUDE.md手写记忆 | claude-mem |
|---|---|---|
| 内容来源 | 手动整理,靠意志力 | 自动从对话抽取,不遗漏 |
| 存储格式 | 纯文本Markdown | SQLite数据库,结构化实体+文本片段 |
| 查找方式 | 全量塞进上下文读 | 按实体/语义检索,按需取用 |
| 更新频率 | 想起来才更新 | 每个会话结束后自动增量更新 |
| Token成本 | 线性增长,越长越贵 | 只把匹配结果放上下文,成本可控 |
| 私密性 | 明文文件 | 本地数据库,可配置敏感内容过滤 |
这个对比不是想拉踩CLAUDE.md,而是说明它们的适用场景不同。CLAUDE.md适合放那些“每次会话都必须知道”的最核心规则,比如项目启动命令、架构总览、编码规范;claude-mem适合存那些“不一定哪次用到,但用了能省很多解释成本”的分散知识点,比如某个依赖为什么被换掉、某个目录为什么是空的、用户对命名风格的具体偏好。
还有一个很关键的区别:CLAUDE.md是全局一次性注入,claude-mem是命中式检索。我实测下来,把CLAUDE.md压到最短只保留硬性规范,同时把大量背景记忆交给claude-mem,整体响应速度和准确率都更舒服。这个组合方式我一直沿用到今天。
3. 安装和初始化:五步接入Claude Code
claude-mem的安装流程并不复杂,本身是一个命令行工具,核心是往Claude Code的配置里注入一个MCP server。下面是我的完整操作过程,按步骤走基本不会卡住。
3.1 第一步:检查Node版本
claude-mem依赖较高版本的Node.js,官方要求22及以上。我一开始没注意,直接在旧版本Node环境里跑安装脚本,装完一运行就报错,后来升到22才顺畅。
检查命令:
node -v如果版本低于22,建议先升级。macOS上我用的是nvm,直接nvm install 22再nvm use 22就切过去了。Windows上则建议直接去Node官网下载安装包,别在PowerShell里折腾第三方包管理,容易卡权限。
3.2 第二步:安装claude-mem本体
官方提供了一键安装脚本:
curl -fsSL https://claude-mem.sh/install | bash这一步会把可执行文件装到系统路径下,并自动检测当前是否已有Claude Code配置。装完验证一下:
claude-mem --version claude-mem --help看到帮助信息出现就算成功。注意,一键脚本只是个快捷方式,它本质上还是去GitHub拉取发布包,所以网络环境要能正常访问GitHub。如果公司内网限制,可以直接去项目Releases页面手动下载对应平台的二进制包放到PATH里。
3.3 第三步:在项目里初始化
cd到你的项目目录,执行:
claude-mem install这个命令会做两件事:一是创建记忆数据库目录(默认在用户主目录下的~/.claude-mem/),二是往Claude Code的MCP配置里写入一个本地server入口。整个过程是交互式的,会问你是否信任该目录权限,看清楚再确认。如果项目路径里带中文或空格,建议事先确认一下终端编码正常,否则数据库路径偶尔会因为编码问题识别不到。
3.4 第四步:确认MCP配置生效
Claude Code的配置一般在~/.claude.json里,或者项目级.mcp.json。打开看一眼,应该能看到类似这样的本地MCP server记录:
{ "mcpServers": { "claude-mem": { "command": "claude-mem", "args": ["serve"], "type": "stdio" } } }claude-mem serve就是启动那个供Claude Code调用的MCP服务进程。看到这条记录,基本说明logistics已经打通了。如果你用的是Claude Code桌面版或内网定制版,路径可能不同,以实际安装时终端输出的提示为准。
3.5 第五步:跑一个会话做验证
配置完别急着干活,先开一个全新会话,丢一句话进去试:
请检查你的系统里是否有claude-mem的记忆能力,如果有,告诉我你从旧会话里记住了什么。如果Claude回复说找到了历史记忆,或者询问你是否允许访问claude-mem的MCP工具,那就说明已经接通了。第一次使用时Claude会需要手动授权该MCP server,授权一次之后即可自动加载。
我用的是macOS Sonoma,搭配Claude Code最新版,整个安装过程大概五分钟。在Linux服务器上装过一次也顺利,Windows没实测过,但原理相同,只要Node和curl环境正常,走同样流程问题应该不大。
4. 核心功能逐一拆解:存什么、怎么查、如何用
安装只是开始,真正有意思的是摸清claude-mem每个功能到底干什么用。有人装上后只会被自动记录,但不会主动用,等于只发挥了三成功力。下面我把实测过的核心玩法逐一列出来。
4.1 自动会话存储:不需要刻意保存
claude-mem会在每个会话结束后,把对话内容切成“块”存进SQLite。这个切分逻辑我观察了一下,基本按对话话题来分:一个技术问题聊完,它就把这一片对话整体归档。你不需要说“请记住”,它默认就在记。
数据库位于主目录的~/.claude-mem/下面,里面按项目分库。如果你是安全敏感项目的重度用户,建议看一眼这个目录,因为里面有所有历史会话的明文内容——这个后面避坑环节再细说。
4.2 主动添加记忆:add命令
有些判断不适合靠自动抽取,比如你临时决定“从今天起代码里一律用双引号”,这种约定想立刻生效,就可以手动写:
claude-mem add "项目代码风格统一使用双引号,不要使用单引号"这也是一条很实用的路径:Claude Code在会话里本身就会调用这个工具往数据库里加记忆,不需要你每次都跑终端命令。你只需在对话中说“记住:以后API路径统一走/v2版本”,它就会调用MCP工具把这条约定写进记忆。手动add更常用于批量导入场景,比如从旧文档里挖出的几十条注意事项,一条条贴进去或者写个循环脚本批量灌。
4.3 提问式检索:ask命令
这是我最常用的一个功能。比如跨了一个月,我模糊记得之前聊过“打包速度优化”相关的话题,但记不清结论了,就执行:
claude-mem ask "我们的前端构建优化方案是怎么定的?"它会去数据库里做语义检索,返回最匹配的几条记忆片段,并带上对话发生的时间和项目归属。这个用法的价值在于:你不需要记准确的关键字,只需要记得“大概聊过什么”,就能把细节捞回来。
4.4 实体提取:不靠翻聊天记录找人找项目
每次会话结束后,claude-mem会用Claude Haiku模型抽取对话中的实体:人名、项目代号、框架名、域名、决策对象。实体被单独存一张表,和记忆片段建立关联。
举个例子,你在对话里提到“和Aaron确认了数据迁移方案,决定用增量同步”,那么“Aaron”“数据迁移”“增量同步”都会变成可索引的实体。下次你只想查“Aaron相关讨论”,不需要在记忆中搜“数据迁移”。这就是标签化索引带来的检索自由。
下面是一个典型记忆库的统计输出(我运行claude-mem show stats后的简化结果):
项目数:12 会话数:842 记忆文本块:1,203 实体数:2,461 待处理队列:0 数据库大小:27.3 MB从这些数字能直观看出,它到底替你沉淀了多少原本会丢失的信息。
4.5 语义搜索:检索不是关键字匹配
claude-mem search和ask的区别在于:ask更偏自然语言问答,search更偏快速筛选。你输入一段描述,它按语义相似度打分,输出Top N条记忆。
比如我搜“认证模块的权限问题”,它能翻出以前讨论“RBAC模型里admin和owner的区别”“token过期策略”“中间件鉴权顺序”等多个相关片段——这些片段里没有一个字写了“认证”两个字,但语义相关。这个能力就是靠本地嵌入模型对文本做了向量化。如果你在安装时开启了CLAUDE_MEM_EMBEDDINGS=true,检索质量会明显更好。
4.6 遗忘与清理:forget / TTL
除了记录,它也有遗忘机制。默认情况下,记忆条目会设置TTL(存活期),一般是90天。过期后,这些记忆会被标记为“待遗忘”,再经过一步自动压缩,只保留包含关键决策的最精简版本。
如果某条记忆你希望立刻作废,用:
claude-mem forget会进入一个交互式挑选模式;也可以直接指定关键字来批量删除,需要手动确认。我一般每月跑一次清理,把那些已经没有实际参考价值的讨论标记为过期,保证检索结果里不会出现太多过期噪音。
4.7 导入旧日志
如果你不是从装上那天开始用,之前已经有不少有价值的对话记录在Claude Code的日志目录里,可以用claude-mem import把它们导入记忆库。官方Idea是支持从历史会话文件导入的。我导入过一批旧项目记录,效果不错,不过导入后最好抽查几条,确认没有被错误清洗掉关键上下文。
4.8 记忆自动合并机制
最后这个功能我要专门拿出来说:claude-mem不是傻乎乎地一条条堆积记忆。当它发现新记忆和旧记忆描述的“对象”相同,就会触发合并逻辑。比如你第一次说“项目日志库推荐pino”,两周后又说“pino日志会丢上下文,建议换winston”,它合并后的记忆会变成一个带时间节点的链表:推荐pino(当时理由)→ 发现丢上下文 → 换winston(当前结论)。
这样不会因为你只说了一句话,就丢掉之前决策背后“为什么变成现在这样”的过程。只要数据库里保留了这条演化链,你再问“为什么当时用了winston”,它依然能把前因后果翻出来。这一点是很多单纯存文本的工具给不了的。
5. 日常使用技巧:让记忆真正为你工作
上面讲完基本功能,这一节聊聊我在实际使用中摸索出的技巧。这些很难从README里看到,属于“用久了才有感觉”的部分。
5.1 按项目隔离还是全局互通?先想清楚
claude-mem默认按项目目录隔离记忆,也就是说A项目里的对话不会污染B项目的检索。对多数人来说这是最优解。但我接过一个咨询业务的临时目录,每次开的新目录都不同,导致记忆被拆得七零八散。
后来查了一下,它的配置里支持把记忆根目录指向一个固定位置,或者把所有项目记忆合并到同一个库。我的建议是:正式项目请务必保持按项目隔离,不然检索结果混着多个项目的上下文会非常混乱;只有那些“一次性临时目录”,才值得走全局合并的旁路。
5.2 让记忆和CLAUDE.md形成互补
我现在的分工策略是这样的:
- CLAUDE.md只放:项目简介、启动命令、目录结构、硬性编码规范、必须禁止的事项。
- claude-mem负责存:讨论过程、选型理由、否决原因、人的偏好、历史坑位。
这样CLAUDE.md保持在几十行以内,每次请求token开销很低;而大量背景知识靠claude-mem按需提供。如果某个新会话确实需要某段老记忆,我直接在对话里说“用claude-mem查一下XX”,它就会把相关片段拉进来参与回答。实测下来,这种“最小必要注入”的方式,比全量塞CLAUDE.md的响应质量高。
5.3 主动给记忆“起标签”
Claude Code自动提取实体已经很聪明,但机器不可能完全理解你对项目的称呼习惯。所以我在重要结论产生时,会顺手加一句带标签的话:比如“记住,我们项目内部把用户身份服务简称为USVC,统一用这个名字”。《记下来》的时间成本几乎为零,但后续检索命中率能提高一大截。
这个习惯我强力推荐:每条重要记忆配上一组固定叫法,检索时才不会出现“我明明记得聊过,但它的措辞和我不同导致搜不到”的错位感。
5.4 定期运行stats看记忆健康度
我每月看一次claude-mem show stats,主要关注两个数字:实体数和记忆块数的比例、待处理队列长度。如果实体数远低于记忆块数,说明这段时间的对话大多在闲聊,没有产生新知识;如果待处理队列一直不为零,可能是后台提取任务卡住了,这时候重启一下claude-mem serve就能恢复。
5.5 团队协作场景:记忆库跟着人走还是跟着项目走
如果你和我一样,一个项目有好几个人同时用Claude Code,那么大家各自记录的记忆是分开的。claude-mem本身不提供云端同步(至少我用的版本没有做多端同步),所以团队场景下要么各自建自己的知识库,要么约定某个人定期导出记忆给全组共享。我目前采用的办法是:核心决策不让它只存在记忆库里,重要结论会同步更新到项目doc/decisions目录,记忆库更多是个人速查的辅助工具。这样就算记忆库丢了,项目文档层面仍有备份。
6. 绕坑指南:安装和长期使用中遇到的真实问题
讲完优点,说点真实的、我在使用过程中踩过的坑,以及对应的解决办法。这些细节官方文档里往往一句话带过,但实际卡住人的往往就是它们。
6.1 Node版本不匹配导致安装后无法启动
最典型的一个坑:安装脚本成功,但执行任何claude-mem命令都报错,提示找不到模块或版本不兼容。问题根源几乎都是node版本过旧。最新版本的claude-mem要求Node 22+,如果你用的是系统自带的node,多半是16或18。
解决方式很直接:装nvm或fnm,切换到22+,然后把PATH指到新版本再运行安装脚本。如果已经装了旧的claude-mem,升级Node后最好重跑一遍安装脚本,或者手动删掉旧版本的缓存目录再重装。
6.2 MCP端口占用或连接失败
Claude Code通过stdio方式本地启动claude-mem服务,按理说很少出现端口问题,但我遇到过几次:Claude Code的MCP连接探活失败,导致新会话里Claude“看不到”记忆工具。
排查顺序:
- 退出所有开了很久的Claude Code会话,重新启动一个新会话测试。
- 用
claude-mem --help确认cli本身可以正常响应。 - 检查配置文件里的MCP server记录是否被其他安装覆盖过。
- 如果日志里出现
EADDRINUSE相关字样,说明有残留进程占住了通信通道,用pkill -f "claude-mem serve"清掉再重启。
我遇到的一次是macOS上MCP服务子进程异常残留,杀干净后问题消失。如果你跑在同一终端里多个Claude Code实例,这个坑会更容易出现。
6.3 置信阈值设太高,导致“什么也没记住”
claude-mem对“哪些内容值得升格为长期记忆”有一个置信阈值的判断,默认值是0.75。我一开始完全没动这个配置,结果跑了三天后去看stats,发现长期记忆条款数几乎是零——对话都存了,但没有任何一条被“升格”为长期记忆。
原因在于我的对话方式比较口语化:经常是“我觉得”“你看要不要”“其实也不一定”。模型对这类含糊表达打分偏低,全都卡在阈值下面。
解决办法:在配置里调低置信阈值到0.5左右。
CLAUDE_MEM_CONFIDENCE_THRESHOLD=0.5调完之后,记忆抽取明显积极了。代价是偶尔会存进去几条不那么重要的琐碎讨论,但这对我而言利大于弊——宁可多记一些检索时不看,也不要在需要的时候找不到。
6.4 埋着明文历史数据的风险怎么处理
这是提出来不是劝退,但你必须知道:claude-mem把会话明文都存在本地数据库。如果里面涉及客户敏感信息、密钥讨论,那等于在你硬盘上多了一份敏感数据副本。我在配置里把包含password、api_key、token之类关键词的文本在抽取时做了跳过处理,同时对数据库目录本身做了加密盘映射。
配置方式在初始化时会有选项,也可以通过环境变量加:
CLAUDE_MEM_SKIP_PATTERNS="password,api_key,secret,token"另外提醒一句:如果你的电脑支持FileVault(macOS)或BitLocker(Windows),强烈建议打开。这些记忆数据的价值,比你能想到的要高得多。
6.5 数据库体积膨胀后响应变慢
我用了几个月后数据库超过100MB,明显感觉到ask检索速度下降。这里有个容易被忽略的点:检索不只是查一个表,它要先走嵌入模型算出当前问题的向量,再做近似匹配,最后还要读记录文本。数据库越大,这些步骤越慢。
我的解决方案是两条线同时走:
- 调高TTL,让那些讨论类记忆更快进入“待遗忘”状态,减少积压。
- 每月导出一份精简摘要存档,然后清空旧的会话原始文本块,只保留实体索引和摘要记忆。
经过压缩后我的库维持在30MB左右,检索速度基本回到刚装时的水平。如果你不是每天都高强度使用,这个维护可以拉长到两个月一次。
6.6 跨设备使用时记忆“不在线”
很多场景下我会在办公电脑和家用电脑上交替使用Claude Code。claude-mem默认只存在本机“~/.claude-mem/”,两台机器之间没有自动同步。我一开始以为换个电脑它会“自动记得我的习惯”,结果发现完全空白,那一刻才意识到自己已经被它养懒了。
目前的应对方式是:在常用机器上设置一份手动导出任务,定期把记忆库打包上传到自己网盘/s3兼容存储。虽然要主动操作,但至少保证换设备时能恢复大部分记忆。据说项目维护者在计划相关功能,希望等正式版出来能省掉这层手动工作。
7. 用了一个多月后,我的几句真实体会
如果让我给claude-mem一个定位,我会说是“Claude Code的长期记忆外挂”,但更准确地说,它是把你的历史会话从“消耗品”变成“资产”的那一层工具。装上之后最明显的改变是:我敢在对话里放心聊方案取舍、聊可能将来才会用到的背景,而不是担心下次会话一问三不知。因为我清楚,那些讨论离开会话后并没有消失,只是被归档进了知识库,在需要时会自己浮出来。
不过它也不是银弹。它不能替代你自己写文档、整理架构,更不会替你判断哪些知识才是真正值得保留的。它更像一个特别勤奋的秘书,你帮它理清楚规则、定期给它做减法,它才能把记忆保持在一个健康的状态。我目前已经在主项目上跑了几个月,最满意的一点是“重述成本”明显下降了——以前需要花三到五分钟给Claude重新介绍项目背景,现在一句“去查记忆”就够了。把这段时间省出来,足够写不少真正的业务代码了。如果你也被Claude Code的“金鱼记忆”困扰,不妨试一次,给它配一套属于自己的记忆系统。