为Claude Code补上长期记忆:claude-mem跨会话智能实战

📅 发布时间:2026/10/7 17:33:47
为Claude Code补上长期记忆:claude-mem跨会话智能实战
每天在终端里开三四个 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 会话隔离机制每次启动都是全新 AgentClaude 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 生态的产物所以一般开发机环境基本都满足。安装直接走 npmnpm install -g claude-mem安装完成后先做初始化会在~/.claude-mem/下生成数据库和配置文件claude-mem init初始化完成后你可以先跑一下claude-mem list看看效果这时数据库还是空的输出会比较冷清但至少说明安装链路是通的。3.2 配置 provider摘要该由哪个模型来生成claude-mem 生成摘要需要调用一个 LLM。我见到的常见做法是直接用 ClaudeAnthropic 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 认识我的感觉之后大概率就回不去了。