☰
为Claude Code补上长期记忆:claude-mem跨会话智能实战
2026/10/7 17:33:38 网站建设 项目流程

每天在终端里开三四个 Claude Code 会话,是我最近半年的工作常态。用得越久,越发现有个问题让人抓狂:每个新会话都是金鱼记忆。上午刚讨论完的重构方案,下午新开窗口就忘得一干二净;我早就说过"项目用 pnpm、提交信息写中文、测试用 Vitest",但每个新会话都要重新交代一遍。不是 Claude 本身不够聪明,而是 Claude Code 的会话隔离机制决定了——每次启动,它都是个"失忆"的智能体。

我尝试过把偏好写进CLAUDE.md,但那是静态档案,解决不了动态问题:昨天那个 bug 最后是怎么定位的?上礼拜和 AI 讨论过的性能优化结论是什么?这些碎片化信息根本没法靠一个 Markdown 文件追踪。

直到我发现了claude-mem这个轻量开源工具。它做的事很直接:把每次会话里的关键决策、结论、偏好、标签化的信息,结构化地写进 SQLite 数据库,然后在下一个会话启动时自动注入回上下文。一句话概括就是:给 Claude Code 补上一个可检索、会遗忘、跨会话的长期记忆层。如果你也在用 Claude Code 做日常开发,或者觉得"AI 总是记不住我说过的话",这篇文章应该能帮上忙。下面我把从安装、配置到踩坑的完整过程都摊开讲。

1. 先从实际痛点聊起:为什么 Claude Code 默认"没记忆"

1.1 会话隔离机制:每次启动都是全新 Agent

Claude Code 的设计思路是"一次会话一次任务"。它把当前对话窗口里的所有上下文打包给模型,包括系统提示、工具定义、历史消息,这些内容共同组成了模型"当下"的工作记忆。一旦会话结束、新开窗口,上一个会话的全部内容就会被丢弃。

这个设计本身没问题:上下文窗口是有限的,长期堆积消息不仅浪费 token,还会让模型被无关信息干扰。但问题是,对于持续数周甚至数月的项目来说,这种"每次从零开始"的模式太割裂了。我经常需要同时推进三四个任务,每个任务开一个会话。任务 A 里讨论的技术选型结论,任务 B 里根本不知道;昨天在会话里确认过的接口约定,今天新会话里 AI 又开始提出相反方案。

1.2 现有方案为什么解决不了动态记忆

大家首先想到的肯定是CLAUDE.md。我一开始也把大量内容塞进去:技术栈、目录结构、代码风格、提交规范。时间一长就发现问题了——CLAUDE.md适合放稳定的长期事实,不适合放不断变化的工作状态。举个例子,我每周都要更新"当前 sprint 进展",这种动态信息如果写进CLAUDE.md,要么你得频繁手工维护,要么它就慢慢变成一份过期的文档。

也有人尝试把每次会话的完整历史导出成文件,下次再贴回去。这个思路更不可行:一次深度会话的完整历史可能几万 token,累计几周下来,重新"喂"回去既耗费输入成本,又会把模型淹没在大量已经失去价值的过程信息里。我们需要的是"摘要结论",不是"逐字记录"。

1.3 长期记忆到底该存什么

站在实际使用者的角度,跨会话真正值得记住的内容其实可以分成三类:

  • 偏好类:我习惯用什么包管理器、代码风格、提交信息格式、文档语气。
  • 决策类:某个需求最后选了哪个方案、为什么选它、放弃了哪些备选,以及当时的讨论结论。
  • 状态类:目前进行到哪一步、下一步计划是什么、刚修复的 bug 根因在哪。

这三类信息共同构成了一个项目在 AI 侧"持续工作的基础"。CLAUDE.md能承接偏好类,但决策类和状态类是动态的、有时效性的,必须有一个更灵活的系统来承接。claude-mem 的设计目标恰好就是覆盖这三类,尤其是后两类。

2. claude-mem 的底层设计:SQLite、摘要生成与"会遗忘"的机制

2.1 数据库结构与数据落盘

claude-mem 用 SQLite 作为存储后端。初始化之后,数据存放在~/.claude-mem/目录下,核心文件是memory.db。数据库里主要维护几张表:sessions(会话记录)、memories(独立记忆条目)、tags(标签索引)、summaries(自动生成的会话摘要)。

我最初以为它会像聊天记录软件一样,把每条消息都存下来,实际看它的设计才发现不是:它存的是"提炼后的信息",不是原始对话。每次会话结束(或达到一定长度),claude-mem 会把该会话的上下文整体交给一个 LLM 来生成一段精炼摘要,再把摘要和关键结论拆成若干条独立记忆,按带时间戳的形式写入数据库。你随时可以通过命令行查询、搜索、删除这些记忆。

这种"链下提炼、按需注入"的模式,和给模型无限堆历史消息有本质区别。它不是补丁式地扩大上下文窗口,而是对信息做了一层"压缩-索引-召回"的处理,有点像一个真正的记忆系统——把重要的留下,把噪音丢掉。

2.2 时间衰减:为什么记忆必须会"遗忘"

这是 claude-mem 里我最欣赏的设计:记忆会随着时间推移而衰减权重。它内置了一个遗忘曲线机制,每条记忆的"得分"会按照时间流逝乘上一个衰减因子,默认的衰减因子在 0.98~0.99 左右,具体数值你可以在配置文件里调整。

翻译成人话就是:昨天的记忆在召回时权重很高,一周前的记忆权重明显降低,一个月前的记忆基本上只有通过主动搜索才能被翻出来。这个设计看似反直觉,但非常合理。真实的大脑也不可能把所有事情都记得一样清楚,如果不做衰减,两周前某个临时讨论产生的记忆,可能会在新项目中反复被注入上下文,不仅浪费 token,还可能干扰当前任务的判断。

我希望 claude-mem 的实际体验也验证了这一点。刚配置好的头几天,它会优先注入近期会话的决策和偏好,效果非常直观;而当我隔了半个月回到一个老项目时,它不会把半个月前那些已经过时的状态一股脑塞进来,只会给出仍然有参考价值的长期结论。这种"自动淡忘"恰恰是它优于简单全文记录的关键点。

2.3 为什么选"摘要 + 衰减"而不是"全量存储"

很多人会问:直接存全文不好吗?这样 AI 什么细节都能查。但实际跑过就知道,全量存储有几个硬伤:第一,成本高。每个会话几万 token 的原始消息,如果反复注入,光输入费用就够呛;第二,信噪比差。原始对话里大量寒暄、试探性讨论、中间状态的过程性内容,对后续决策毫无帮助,强行注入只会降低模型对真正重要信息的注意力;第三,记忆应该是指向性的,不是堆积性的。

摘要的作用是"提炼核心",衰减的作用是"控制时效",两者叠加,才能让注入回上下文的记忆保持高浓度、高相关性。打个比方:你不可能靠回放一整天的监控录像来回忆"中午吃了什么",你靠的是当时随手记下的笔记——claude-mem 做的事,就是替 AI 写笔记、整理笔记,并在适当的时候把笔记翻出来给它看。

3. 完整接入流程:初始化、配置 provider、挂载 hooks 一次性跑通

3.1 环境准备与安装

claude-mem 依赖 Node.js 环境,建议 Node 18 及以上版本。因为 Claude Code 本身也是 Node 生态的产物,所以一般开发机环境基本都满足。安装直接走 npm:

npm install -g claude-mem

安装完成后,先做初始化,会在~/.claude-mem/下生成数据库和配置文件:

claude-mem init

初始化完成后,你可以先跑一下claude-mem list看看效果,这时数据库还是空的,输出会比较冷清,但至少说明安装链路是通的。

3.2 配置 provider:摘要该由哪个模型来生成

claude-mem 生成摘要需要调用一个 LLM。我见到的常见做法是直接用 Claude(Anthropic API),因为模型风格和 Claude Code 保持一致,摘要生成的输出会更贴合原始上下文。配置文件在~/.claude-mem/config.json,大致长这样:

{ "provider": "claude", "decayFactor": 0.99, "maxTokens": 4000 }

如果你不想把摘要生成请求全部走 Claude API,也可以把 provider 配置成兼容 OpenAI 格式的其他服务,或者设置为通过本地的一些模型网关转发。这块取决于你的实际网络环境和成本预算。我的建议是:摘要模型不需要最强大,但需要稳定,因为摘要质量直接决定后续召回的信息质量,如果经常生成些文不对题的总结,那后面所有环节都会受影响。

3.3 挂载 SessionStart Hook:让记忆自动注入

安装好、配置好 provider,这只是完成了"能存"。真正让它做到"自动注入",需要把 claude-mem 挂到 Claude Code 的 hook 上。

Claude Code 的 hook 机制允许你在特定生命周期事件发生时自动执行外部命令。我们需要的是在每次会话开始时注入历史记忆,对应的 hook 点是SessionStart。在~/.claude/settings.json里加一段:

{ "hooks": { "SessionStart": [ { "matcher": "", "hooks": [ { "type": "command", "command": "claude-mem --recall --full" } ] } ] } }

这个配置的意思很直白:每当一个新会话启动,就执行claude-mem --recall --full,把数据库里经过衰减筛选后的记忆,以文本形式插进系统提示词区域。改完配置后重启 Claude Code 再开一个新会话,你就能在会话里看到 AI 主动说出类似"根据你之前的记录,你习惯用 pnpm 管理依赖"这样的话语,说明记忆注入已经生效。

我建议头一次配置时,先不要加--full,而是先跑claude-mem recall手动确认输出内容是否符合预期,再挂 hook。避免一开始就把太多杂乱内容注进上下文,导致新会话"带病作业"。

3.4 验证安装效果

验证分三步走。第一步,开一个新会话,跟 Claude 随便聊两句,确认 hook 没有报错;第二步,在会话里讨论并确认一个具体的决策(比如"这个模块用职责分离模式重构"),会话结束后命令行执行claude-mem list看是否多出记忆条目;第三步,再开一个全新会话,直接问它"上一个会话里我们讨论了什么重构方向",如果它能接上话,整个链路就算通了。

4. 提升召回质量的实战用法:标签、搜索和多会话协作

4.1 利用标签系统给记忆分区

claude-mem 支持标签功能,这是我从"能用"到"好用"最依赖的一个特性。你在对话中让 Claude 记录重要信息时,可以明确要求它带上标签,比如"记住:这个支付模块优先保证幂等性 #支付 #订单服务"。标签会在摘要生成时被一并提取,后续召回时就能按标签过滤。

实际使用中,我习惯按两个维度打标签:项目维度(#某个项目名)和特性维度(#重构、#bugfix、#性能优化)。项目维度用来隔离不同项目的记忆,避免 A 项目的技术决策跑到 B 项目里去捣乱;特性维度用来做任务级的快速召回,比如我想找上周关于性能优化的讨论结论,直接按#性能优化过滤就行。没有标签体系的时候,所有记忆全混在一起,召回效果会大打折扣,尤其是项目多的时候。

4.2 直接往记忆库里写东西

除了让 AI 在会话里自动沉淀,你也可以手动往记忆库里添加条目。命令行就能操作:

claude-mem add "这里写你想让 AI 长期记住的一句话" #标签

这个方法特别适合记录那些"还没在对话里讨论过、但你希望 AI 从一开始就知道"的事情。我经常在开新项目第一天就跑几条add,把项目背景、约束条件、技术红线先写进去,然后再开始会话。这样 AI 第一次回答问题时就已经有了项目背景,而不是先聊几十轮才开始进入状态。

add还有个特别有用的场景:交接。比如你上午在电脑上讨论的方案,下午想在另一台机器上继续,先把结论add进去,新环境一recall就全回来了。

4.3 搜索历史记忆:把记忆库当知识库用

记忆累积到几百条之后,靠自动注入已经覆盖不了所有场景了。这时搜索功能就派上用场。claude-mem 提供关键词搜索,我常用的形式是:

claude-mem search "限流方案"

它会扫描记忆库里的摘要和标签,把相关的历史会话、决策、结论列出来。这在处理"我记得之前聊过类似问题,但想不起细节"的场景下非常好用。它本质上把 claude-mem 变成了一个项目专属的 AI 记忆知识库,而不只是自动注入的一层皮。

搜索出来以后,如果某条记忆对当前任务特别关键,你甚至可以把它单独add进当天会话,让 AI 在后续对话里带着这条记忆工作。

4.4 多会话协作的经典操作模式

我现在典型的工作流是这样的:早上开工,先开一个新会话,让它自动召回昨天的记忆;然后我快速扫一眼注入的内容对不对,有遗漏就手动add补充;如果今天的工作跟某个老专题有关,直接search拉出相关历史讨论,把关键结论加进上下文;关会话之前,我会提醒 AI 把今天的重要结论写进记忆,并带上清晰的标签。这套流程跑顺以后,多个会话之间不再是信息孤岛,而是像一个持续运转的团队里,每个新同事上岗前都会先读一遍交接文档。

5. 实测踩坑记录:token 膨胀、误召回、冷启动与隐私考量

5.1 记忆注入过多导致上下文膨胀

一开始挂 hook 时,我图省事直接用了--full,结果新会话还没开始干活,光系统提示词里塞的记忆就有好几千 token。短时间看不出来,但等记忆库条目多了,每次开机会默认加载所有高权重记忆,对话框还没输入就已经占用了可观的上下文窗口,模型思考和生成的空间被压缩了。

后来我调整了策略:把 hook 里的命令改成按会话标签过滤,或者限制召回条数和 token 数,比如只取最近 N 条、只取包含指定标签的记忆。再配合时间衰减,旧而低相关的内容基本不会进上下文。记忆注入要的是"精准的几条",不是"全部的一堆",这个度需要你根据自己的项目量和上下文窗口大小慢慢调。

5.2 误召回:A 项目的记忆跑到 B 项目里捣乱

跨项目召回是我踩过最深的坑。有一阵子我同时维护一个 Node 项目和一个小型 Python 工具,claude-mem 没做项目维度隔离时,在 Python 项目的新会话里,AI 会突然建议我用 npm 安装依赖,甚至引用 Node 项目里的代码决策。原因很简单:记忆库里所有内容混在一起,按时间衰减排名后,Node 项目的最新讨论权重高,就被一并注入了。

解决方案有两个:一是养成打项目标签的习惯,并在 hook 命令里加上标签过滤;二是按项目给记忆库做物理隔离,不同的项目用不同的数据库文件。claude-mem 本身有会话级、标签级的过滤能力,但对自动化程度要求高的话,我更推荐"一个项目对应一套记忆库目录"的做法,彻底避免串味。这个坑也提醒我:记忆系统必须能区分"这是哪个任务域里的记忆",否则就越帮越忙。

5.3 冷启动:新库没有任何记忆,前几次会话毫无帮助

claude-mem 不是装完立刻就有魔法效果的。新初始化的记忆库空空如也,头几次会话它什么都注入不了,你甚至会产生"这工具到底有什么用"的怀疑。我实际体验下来,至少要积累 5~10 个有效会话之后,它才开始显出价值。

这段冷启动期不用干等着,可以主动做几件事:把项目背景、技术栈、你的偏好用add手动喂进去;每次会话结束前,明确让 AI 总结今天的结论并写进记忆;跑一次claude-mem的快速总结命令,把还没沉淀的零散信息先合并起来。我大概是在两周的持续使用后,明显感觉到新会话的 AI"越聊越懂我",冷启动期过去之后,记忆复利才开始显现。

5.4 隐私和敏感信息不可忽视

记忆库里存的都是提炼后的摘要和结论,但摘要也可能包含敏感信息。比如你在会话里讨论过的内部系统接口细节、未公开的技术方案、客户信息,这些内容经摘要生成后会明文保存在~/.claude-mem/memory.db里。我见过有人在共享开发机上跑这个工具,后来发现数据库文件被同步工具传到了公司仓库,虽然不是特别严重的事件,但足够让人警觉。

我的建议是:不要把密钥、口令这类绝对机密的东西放进会话,更不要让 AI 把敏感信息写进记忆;如果你无法避免,至少要在配置文件里加排除关键词,或者定期检查记忆库内容并删除敏感条目;涉及多人协作的开发机,最好给数据库目录做访问权限限制。记忆是为了提高效率,不是为了制造安全隐患。

5.5 Hook 在非交互终端下的执行问题

最后分享一个很实际的问题:如果 Claude Code 不是在常规终端里跑,而是在 CI 环境、编辑器内置终端,或者通过编程方式调用,SessionStart hook 命令执行时可能会卡住,因为它会等待一些交互输入。遇到这种情况,检查两点:一是确认 hook 命令是完整的、无需手动确认的命令形式;二是在非交互环境里考虑去掉与界面交互相关的参数,或者直接不挂 hook,改为在会话开头手动执行一次召回。这个坑不算大,但遇到时会让你一头雾水,排查一圈才发现只是交互模式的问题。

6. 把 claude-mem 接入完整工作流:分层记忆架构与进阶玩法

6.1 与 CLAUDE.md 配合:静态档案 + 动态记忆的分工

用熟了之后,我形成一个明确的分层记忆架构。CLAUDE.md负责稳定层:项目技术栈、目录结构、编码规范、团队约定,这些几个月都不会变的内容,一次性写进去。claude-mem 负责动态层:每轮会话的决策、当前进度、临时发现的问题、新确定的接口约定,这些频繁变化的内容让 AI 自动沉淀。

两层各司其职,互不干扰。我见过有人把所有东西都塞进CLAUDE.md,导致它变成一份巨大的、难以维护的文件;也有人完全依赖 claude-mem,结果项目里长期的基本约定反而没有稳定载体。正确的姿势是两层配合:静态的靠文档,动态的靠记忆库。这样 Claude Code 每次启动,既有稳定的项目背景,又有最新的会话上下文,工作连贯性会好很多。

6.2 养成"会话收尾"习惯:让 AI 主动沉淀关键信息

claude-mem 自动生成的摘要虽然省事,但要发挥最大价值,最好在会话结束前花半分钟做个"收尾动作"。我现在每次关会话前都会补一句:"把这次讨论的重要结论和下一阶段计划写入记忆,加上 #项目名 标签。" AI 会据此整理出比自动摘要更针对性的记忆条目。

这个习惯的成本极低,但收益非常大。因为自动摘要是按时间线和对话内容来提炼的,"重要结论"和"下一步计划"这两个维度的信息在自动摘要里经常不够突出。你主动要求 AI 提炼一遍,等于是在给它一个"什么值得记"的优先级信号,长此以往,记忆库的质量会明显高出一截。

6.3 记忆库的备份、迁移与长期维护

最后聊聊维护。很多人在本地跑了几个月,某天换电脑才发现记忆库没备份,导致 AI 的"记忆"全部丢失。我的做法是把~/.claude-mem/目录纳入备份体系,或者直接做成一个私有 git 仓库,定期提交。这样换机器时一条命令就能把记忆库拉回来,新环境里的 AI 直接继承旧记忆,无缝衔接。

我还习惯每隔一两周做一次"记忆整理":把已经过时的、项目已经结束的记忆删掉,把零碎的短期记忆手动合并成一条长期结论。这其实和整理自己的笔记是一回事——不要指望系统自动帮你维护好一切,定期清理才能让召回质量维持在理想水平。记忆库不是越大越好,有效且新鲜的记忆才有价值。


我个人的体会是,claude-mem 这类工具真正的价值,不在于"把聊天记录存下来",而在于它让 AI 从一个"每次遇到你都像第一次见面"的陌生人,变成一个"记得你习惯、知道你进展"的老搭档。给 AI 装记忆这个想法听起来很玄,实际落地后你会发现,核心无非是"该忘的忘掉、该记的记牢、该找的找得到"这三件事。如果你也在为 Claude Code 的"失忆"头疼,可以按上面的路径从手动模式先试起来,等体会到"新会话里的 AI 认识我"的感觉之后,大概率就回不去了。

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

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

立即咨询