☰
claude-mem:为Claude Code注入跨会话长期记忆
2026/10/7 17:36:34 网站建设 项目流程

作为一个重度使用 Claude Code 干活的人,我最大的折磨从来不是模型能力不够,而是它没有记忆。每个新会话都是一张白纸——昨天刚跟它确认好的代码风格、上周定下的模块拆分方案、项目里我们自己人约定俗成的目录命名习惯,全得重新喂一遍。最开始我觉得忍忍就过去了,多写几句话的事。可当项目越来越大、并行任务越来越多,这种"每次重新自我介绍"的消耗,已经明显拖慢了节奏。直到我翻到一个叫 claude-mem 的开源项目,才真正把这块短板补上了。

claude-mem 一句话就能说清:它是给 Claude Code / Claude CLI 加"长期记忆"的组件。安装之后,它会自动监听你的会话,把对话内容做摘要、抽取关键信息,存进本地数据库;下一次开会话,它通过 MCP(Model Context Protocol)把和当前话题相关的旧记忆推给 Claude,让它"想起来你上次说过的约定"。整个过程中数据默认只存在你自己的机器上,不依赖额外的云服务。适合谁?如果你和我一样是 Claude Code 的重度用户、经常在多项目之间来回切换、或者单纯受够了 AI 助手反复问同一个问题,这篇文章值得看完。

下面我会把这几天部署、使用 claude-mem 的实际过程完整走一遍,包括架构原理、部署步骤、记忆召回机制、备份策略,外加我踩过的几个坑。

1. 每个新会话都是一张白纸:claude-mem 到底在解决什么

1.1 失忆的代价

先算一笔账。一个中等规模的项目,我每天至少开三四次会话,每次聊到项目核心问题时,都要重新交代背景:项目用什么技术栈、代码目录怎么组织的、之前已经定过哪些技术选型、哪个模块正在重构不能碰。这些信息少则二三百字,多则上千字。我大概估算过,一个工作日下来,光"重新对齐上下文"就要花掉十分钟到半小时。

这不是模型笨,而是设计如此。Claude Code 默认是会话隔离的,session 结束之后,上下文就释放了。这种设计能保证每次会话的状态干净、不互相污染,但对长期项目来说是灾难:你已经做过的大量决策、写过的关键代码、解释过无数遍的偏好,都在会话结束时灰飞烟灭。

我试过几类土办法:

  • 在项目根目录放一个CONTEXT.md,把约定写在里面,每次会话开头让 Claude 先读。缺点是维护成本高,我记不住更新它。
  • 复制粘贴之前的对话摘要。摘要越写越长,贴一次要占一大段上下文,而且经常贴错版本。
  • 直接把上一轮的关键代码片段贴回去。能用,但非常笨,而且对长对话根本不可持续。

这几个方案本质上都是在"手动搬运记忆",而 claude-mem 是把搬运过程自动化了。

1.2 claude-mem 的定位

claude-mem 做的事情,拆开看就三步:

  1. 收集:读取 Claude Code / Claude CLI 在本地落盘的历史会话记录。
  2. 加工:在后台调用大模型,把这些对话整理成结构化记忆——结论、偏好、代码片段、命令运行记录,各归各的类目。
  3. 召回:新会话启动时,通过 MCP 把与当前话题最相关的旧记忆注入到 Claude 的上下文中。

这三步里,前两步解决的是"记住",第三步解决的是"想起来"。很多记忆方案只做存储,存完之后不知道什么时候该翻出来,导致记了等于没记。claude-mem 的召回设计是整个项目的关键,后面我会单独用一章讲。

它的数据流是一条闭环:会话产生数据 → 后台服务加工 → 写入本地存储 → 下次会话自动命中。全程不需要你手动整理笔记,也不需要给 Claude 写特殊提示词。

1.3 数据从哪来、到哪去

讲数据流的时候,得先说清楚它的存储选型。claude-mem 用的是本地优先模式,所有数据都落在你机器上的~/.claude-mem目录里,不往云端同步。对我这种对数据流向比较敏感的人,这点很重要——我可以随时翻看库里的内容,也随时可以整个删掉。

它内部同时用到了两个存储引擎:SQLite 管结构化元数据,ChromaDB 管向量。为什么要搞得这么复杂?因为"记忆"这个需求本身的查询方式就不是单一维度的——你既需要精确查某条记录("上周三那条部署命令是什么"),也需要语义搜("之前有没有聊过关于数据库索引优化的内容")。一个存储引擎很难同时优雅地处理这两种查询。下一章展开讲这套双存储架构。

2. 双存储架构:SQLite 与 ChromaDB 各管一摊

2.1 一条记忆的完整生命周期

我在刚接触 claude-mem 的时候也好奇:一条"记忆"到底是怎么从对话变成数据库里的记录、又变成下次会话开头的提示词的?实测下来,完整链路是这样:

  1. 会话结束或达到阈值:claude-mem 监视会话文件,当一轮对话达到一定长度(默认有一个 token 阈值,叫summary_threshold_tokens),触发摘要任务。
  2. 后台推理:后台进程把对话丢给大模型,按预定义的类型做抽取和摘要,生成结构化结果。
  3. 写入:结构化结果先写进 SQLite,同时把文本内容向量化,embedding 存入 ChromaDB。两边用同一个 memory id 关联起来。
  4. 召回:下一次会话启动,MCP 端会拿着当前会话的上下文做向量检索,在库里找相似度最高的历史记忆,拼成一段 alert 推给 Claude。

这四步里,容易被人忽略的是第 1 步的"触发时机"。claude-mem 不是等会话结束后一次性处理全部内容,而是会在对话进行中就分批摘要,这样长会话也不会因为信息量太大而摘要失真。用我自己的话说,它有点像在写流水账日记——每过一会儿就记几笔,而不是等到年底一次性回忆全年。

2.2 为什么不用纯关键词检索

有人可能问:既然都用了 SQLite,直接把对话全文存进去,搜索的时候用 LIKE 或者 SQLite 的 FTS5(全文检索)不就行了?何必再上一个 ChromaDB?

问题在于,人话和代码不像文档标题,没有那么多精确关键词。举个例子,我某天聊到"怎么把 Docker 镜像体积从 800MB 压到 300MB",当时根本没用到"瘦身"这个词,只说了"精简层""去掉包管理器缓存""换更小的基础镜像"。几天后我打开新会话,可能会说"之前聊过 Docker 瘦身的方案",关键词对不上,全文检索直接挂掉。

向量检索不看字面匹配,看语义距离。同样一个"瘦身"的 query,embedding 之后跟"删除包管理器缓存""合并 RUN 层"这些历史文本的距离很近,这样就能把记忆翻出来。这是双存储设计最核心的理由:SQLite 负责精确的、带条件的查询,ChromaDB 负责模糊的、联想式的查询,两者互补。

2.3 四类记忆各自的分工

我翻看默认配置,claude-mem 把记忆分成了四种类型,分工非常清楚:

记忆类型存什么典型用途
stream_of_consciousness一段滚动更新的对话摘要,会随新对话持续演化给 Claude 一个"最近在做什么"的连续背景
factual事实与偏好,比如技术栈选择、命令别名、使用习惯回答"你之前说过这个项目用 X 框架"
code_artifacts关键代码片段、可复用的实现细节新会话直接参考之前写过的关键实现
run_logs命令运行记录、报错与修复路径避免同一个坑踩第二次

这四种里最有意思的是 stream_of_consciousness。它不是一个固定快照,而是像一条河流一样持续更新的摘要——每次新的对话结束,它会把旧摘要和当前对话合并,再生成一个新的摘要。这样"最近的记忆"永远是最新鲜的,不会像固定笔记那样过时。

factual 类的抽取我也单独测过。比如我在某个会话里无意中说过"这个项目统一用 pnpm,不用 npm",后续的会话里它真能把这条偏好捞出来。这类信息如果靠我自己维护,大概率两三天就忘了写进文档。

3. 部署全流程:安装、初始化、MCP 接入

3.1 安装与初始化

claude-mem 是用 Python 写的,环境要求 Python 3.10 以上。我这边是在一个独立的虚拟环境里装的,避免跟系统 Python 打架:

# 我习惯先建虚拟环境,再安装 python3 -m venv claude-mem-env source claude-mem-env/bin/activate pip install claude-mem

装完之后,看一下版本和状态:

claude-mem --version claude-mem status

第一次跑status的时候,它会提示初始化。我印象中需要执行一下:

claude-mem init

init 会生成本地数据目录和配置文件。之后你正常使用 Claude Code / Claude CLI 就行,claude-mem 会自己盯着会话文件。

需要注意的是,摘要和抽取这类加工动作需要调用大模型接口,因此要配置 API Key。claude-mem 支持通过环境变量传入:

export ANTHROPIC_API_KEY="sk-..."

如果你想把摘要模型指向别的兼容推理服务,可以通过INFERENCE_API_KEY、INFERENCE_BASE_URL这类环境变量调整。我用的是默认配置,摘要质量已经够用;如果你对摘要细节有要求,可以到配置文件里换成更强的模型。

3.2 MCP 服务注册

这一步是让 Claude Code 真正"用上"记忆的关键。claude-mem 会提供一个 MCP server,注册到 Claude Code 之后,新会话才能自动获取记忆。

我直接改了 Claude Code 的 MCP 配置文件,加了一条:

{ "mcpServers": { "claude-mem": { "command": "claude-mem", "args": ["mcp"], "env": {} } } }

如果 claude-mem 装在虚拟环境里,command 建议写绝对路径,否则 Claude Code 可能找不到可执行文件:

"command": "/home/你的用户目录/claude-mem-env/bin/claude-mem"

配置保存后重启 Claude Code,让它重新加载 MCP 服务。然后在会话里问它一句"你现在能访问 claude-mem 吗",或者直接问"帮我查一下记忆库里有没有关于 XX 的旧记录",它如果能给出答案,说明 MCP 已经通了。

如果你的 Claude Code 版本支持命令行注册 MCP,也可以直接用:

claude mcp add --transport stdio claude-mem -- claude-mem mcp

两条路效果一样,选一个就行。

3.3 常见环境问题

我在部署时踩了两个环境相关的小坑,写出来省得你重复:

第一,PATH 问题。用 systemd 或者一些终端管理器启动 Claude Code 时,通常不会加载你 shell 里的.bashrc,于是command: "claude-mem"直接报 command not found。解决办法就是上面说的,在配置里写绝对路径。

第二,后台服务状态异常。claude-mem 有后台服务和守护进程,如果status显示服务没起来或者异常,先别急着重装,看看是不是 init 之后没有正常启动。不同版本处理方式略有差异,我这边是用claude-mem status确认,再根据提示重启相关服务进程。改完配置之后,记得把旧的后台进程 kill 掉再启动,否则配置可能不生效。

4. 记忆如何被召回:stream_of_consciousness 与语义检索的配合

4.1 相邻记忆召回(Alert)机制

很多人以为,有了记忆库之后,Claude 会像搜索引擎一样,在你提问的时候临时去数据库里查。实际上 claude-mem 的召回时序比这更聪明,它会主动推送。

在新会话开始的时候,claude-mem 会根据当前对话的开场内容,在记忆库里做一轮向量检索,把命中的旧记忆作为"alert"塞给 Claude。比如我在一个新会话里说"继续上次的 xx 模块重构",它就能把之前关于这个模块的 stream_of_consciousness 摘要、相关的 code_artifacts 一起推上来。Claude 看到这些 alert,就直接拥有了上下文,不再需要我重新解释背景。

这个设计我很喜欢,因为它把"记忆"做成了模型上下文的一部分,而不是等模型自己去查工具——后者意味着模型得"记得"去查,一旦忘了查,记忆库就是个空摆设。主动推送的方式,大大提高了记忆的利用率。

4.2 召回阈值与 token 预算

主动推送虽然好,但有个实际问题:一次推多少?推少了不够用,推多了会把上下文撑爆。

claude-mem 的做法是设置 token 预算。它对召回的候选记忆做排序、截断,只往上下文里放最相关且总量可控的内容。默认阈值这块,我调过summary_threshold_tokens,控制在合理范围,避免一次推送太多把 Claude 的上下文窗口挤占掉。尤其是写代码的场景,上下文里如果塞满了旧记忆,留给真正的代码生成和工具调用的空间就变小了,反而影响质量。

如果你发现召回内容太少,先别急着调大预算,去看看是不是 embedding 阶段的问题。我后面会讲中文内容上踩的坑。

4.3 用 status 和 search 观察记忆库

记忆库是黑盒还是白盒,决定了你敢不敢长期用它。claude-mem 给了命令行工具来观察内部状态,我常用的几个:

# 看整体状态和统计信息 claude-mem status # 按关键词或语义搜索记忆 claude-mem search "Docker 镜像优化" # 查看某条记忆的详情 claude-mem view <memory-id> # 列出某一类型的记忆 claude-mem list

我建议每两天跑一次claude-mem search,看看库里的内容是否符合你的预期。如果发现某些不该被记录的内容混进来了,就该考虑下一章说的忽略规则了。

另外,status里能看到后台最近的活动日志,我印象中带--tail参数可以看实时日志。每次部署完新环境,我都会先开一个 tail 窗口观察,确认记忆在正常生成,再放心去干活。

5. 数据安全、备份与清理:给记忆设好边界

5.1 本地存储与隐私边界

记忆工具最敏感的问题就是数据隐私。claude-mem 的数据都在本机~/.claude-mem目录里,这让我放心不少。但要注意,本地存储只意味着默认不联网,不代表内容本身适合长期保存。

对话里难免会出现一些不该进存储的东西:密码、API Key、私人地址、临时的调试密钥。这些东西一旦被摘要进记忆库,就会长期躺在磁盘上。所以从第一天用,我就建议你先想清楚边界:哪些项目用记忆,哪些项目不装 claude-mem,或者至少用忽略规则把敏感内容挡在外面。

5.2 备份、恢复、清空

记忆是长期积累的资产,跟代码一样需要备份。claude-mem 提供了备份命令,我一般一周跑一次:

# 导出备份,支持加密 claude-mem backup --encrypted # 从备份文件恢复 claude-mem restore <backup-file>

备份文件里是整个记忆库的快照,恢复的时候直接指向备份文件即可。如果你要彻底清理数据,可以用claude-mem wipe,它会清空整个记忆库;想停掉后台服务而不是销毁数据,就用claude-mem kill。

我的个人习惯:每次完成一个里程碑(比如模块重构结束、版本发布),备份一次;备份文件存到和项目文档同一个目录下。这样万一后续某次操作把记忆库弄坏了,还能退回去。

5.3 用 skip_regexes 给敏感内容上锁

claude-mem 支持配置正则表达式来跳过特定内容,这是我对它好感度最高的功能之一。你可以在配置文件里定义skip_regexes,凡是匹配到的内容都不会进入记忆库。

我实际配了几个规则,供你参考:

{ "skip_regexes": [ "(api[_-]?key|password|secret|token)", "\\b[A-Za-z0-9_-]{20,}\\b", "\.env\." ] }

第一行把常见的密钥字段名挡掉,第三行挡掉 dotenv 文件路径。第二行那个规则是拦长字符串的,专治误把 token 贴进对话的情况。这里注意,正则不是越严格越好,太宽会把正常的代码内容也拦掉,建议先跑几天看实际效果再收窄或放宽。

另外,记忆是分内容类别的,比如 coding、personal、work 等。不同类别默认的保留时间不一样——我的理解是 coding 相关的短期内容保留期短一些,personal/work 这类需要长期稳定引用的内容保留期长一些。你也可以改这些配置,但除非有明确需求,我建议保持默认,避免无意间把长期有用的上下文删了。

6. 实测一周:体验、坑位与真正适合的场景

6.1 连续使用一周的感受

我用 claude-mem 连着跑了七天,最直观的变化是:新开会话时,我再也不用从头讲项目背景了。头一天,我把项目约定(技术栈、目录规范、不能动的模块)在日常对话里提了几次,之后这些内容自动沉淀成了记忆。第二天开会话,我直接说"继续优化支付模块的异常处理",Claude 就能接上话,关键词、文件名、之前写的代码全都能对上。

最有价值的一次是周六。我周五下午查过一道关于 SQLite 并发写入的坑,当时没来得及落地,只是聊了几句思路。周六新开会话,claude-mem 把那段记忆推上来,Claude 直接顺着思路给出了具体实现。这种跨会话的衔接感,是以前完全没有的。

6.2 踩过的坑

体验背后也有代价,这几个坑我认为值得单独写出来。

坑一:中文召回质量不稳定。ChromaDB 默认的 embedding 模型对英文效果好,但中文语义召回只能说差强人意。我搜"数据库索引"的时候,翻出来的记忆经常跟"表结构设计"相关但不精准。如果纯中文场景占主导,可以考虑把 embedding 换成对中文更友好的模型。这个在配置文件里改,改完要重启服务。

坑二:token 预算调太大,会话上下文被记忆挤占。我第一次图省事,把召回 token 预算调得很大,结果 Claude 写代码时上下文里塞满了历史摘要,反而影响生成质量。后来我把它调回一个适中的值,召回内容只保留最相关的几条,效果反而更好。这事的教训是:记忆是辅助,不是主角,别让它喧宾夺主。

坑三:改了配置忘了重启服务。配置文件改完之后,后台进程还拿着旧配置跑,导致新规则半天不生效。我一度以为 skip_regexes 没起作用,排查了半天才发现是服务没重启。现在我每次改完配置,就顺手claude-mem kill再启动,基本不会出问题。

坑四:敏感项目要慎用。有一个客户项目,里面全是保密信息,我装完 claude-mem 之后想了想,还是把它从那个项目的工作目录里摘了出去。记忆工具很好用,但前提是数据边界可控。如果不确定项目内容适不适合长期落盘,宁可不用。

6.3 什么场景真正值得用,什么场景别装

结合实际体会,我给出一个简单判断标准:

值得用的场景:

  • 长期项目,每天都开会话,项目背景知识积累多。
  • 多项目并行,记忆可以帮你快速切回某个项目的上下文。
  • 研究型工作,经常跨天整理思路、方案。
  • 工作中重复性解释特别多,比如反复跟 AI 交代规范、偏好。

不太适合的场景:

  • 一次性的脚本/工具任务,会话本身就是一次性的,记忆收益几乎为零。
  • 高度敏感的项目,数据不出本机也不放心,那别折腾。
  • 完全使用无法覆盖的模型服务或没配置好 API Key 的环境,摘要根本跑不起来。

说到底,claude-mem 的价值不是"存了多少字",而是把之前每会话浪费在重新对齐上下文上的时间找补回来。我自己的体会是:一旦用顺了,你会很自然地把"明天继续做 XX"这样的话直接抛给 Claude,因为它真的能接住。最后再分享一个实操小习惯——每周五下班前跑一次claude-mem backup --encrypted,周末不折腾,周一看备份目录也能心安。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询