我倒是想先问一个问题:有多少次,你在终端里跟Claude Code聊到一半,上下文长到快溢出,然后灵机一动,Ctrl+C换了个新会话,结果发现它把你昨天呕心沥血设计的架构方案忘得一干二净?
这个场景我太熟了。Claude Code本身是会话级别的上下文管理,每个新会话都是从零开始。你上午刚跟它对齐的项目目录结构、代码规范、用户偏好,下午开新终端就全部作废。为了这件事我甚至试过把自己的人设和项目说明写成一份超长的 CLAUDE.md,每次开头先手动贴一遍——说白了,这不叫记忆,这叫自我感动。
后来我找到了claude-mem这个开源工具,用了大概一个多月,彻底改变了我的工作方式。它做的事情很简单:把 Claude Code 每次会话产生的对话、代码决策、用户偏好、项目要点,自动沉淀到本地记忆库,下次新会话启动时再按需召回。简单说,就是给终端里的 Claude Code 装上了一块真正的硬盘。
这篇东西我把它的工作原理、安装配置、实战用法和踩过的坑全部摊开讲,适合重度使用 Claude Code 的开发者、在团队中统一 AI 助手行为的组织,以及所有受够了"每次开新会话都要重新自我介绍"的人。
1. 为什么需要给 Claude Code 加一块"记忆硬盘"
1.1 无状态会话的痛点:你面对的其实是一个"失忆天才"
Claude Code 本身的单会话能力很强,在上下文窗口内,它有极强的推理、代码生成和重构能力。但问题恰恰出在"上下文窗口内"这几个字上:一旦会话结束、上下文缓存清理,或者窗口滚动溢出,它就变成了一张白纸。
我举一个真实的工作场景你就明白了。周一早上我要重构一个老的支付服务,第一件事是打开终端,让 Claude Code 阅读整个项目结构,了解业务模块,确认数据库表关系,然后才开始动手。这个过程大概要消耗 40 分钟的对话时间和大量的 token。但改到一半发现逻辑有冲突,需要下午再继续的时候,我只能选择不关终端、不结束会话,让它一直挂着。
这带来的连锁反应是灾难性的。一方面,挂着的终端会不断累积新的输出,聊天记录越来越长,Claude 会把注意力越来越多地分配给一些无关紧要的早期内容,导致后续回答质量明显下降。另一方面,如果你中途需要处理别的项目,或者笔记本重启、终端误关,一切从头再来——不是代码重写,而是"重新认识这个项目"的成本要再付一遍。
1.2 claude-mem 解决的核心矛盾:上下文延续性
claude-mem 的思路跟"把 CLAUDE.md 越写越长"完全不一样。它不是在会话开始时塞给你一大堆文本,而是在后台建立一个持续的学习回路。每次你在 Claude Code 里跟 AI 对话、运行命令、确认代码修改,claude-mem 会截取这些交互的关键内容,归类、整理、去重之后写入本地存储。下次新会话启动时,它再根据当前项目的特征、工作目录、甚至你刚才的命令,把最相关的记忆片段重新注入到系统提示词里。
这个机制最大的价值,是它把"记忆"从被动粘贴变成了主动召回。你不需要自己维护一份项目笔记,也不需要在每个新会话里手动贴背景资料。claude-mem 会以结构化知识的形式,把散落在历史会话里有价值的信息捞出来,放在它该放的位置。
打个比方吧:原来你的 Claude 是每次考试前翻讲义的学生,翻不到就瞎蒙;用了 claude-mem 之后,它变成了一个会做笔记的学生——每次做题都是基于之前积累的错题本和知识框架,而不是抱着整本教材重新看一遍。
1.3 它跟原生 Claude Code 记忆功能的差异
这里得说清楚:Claude Code 本身也有记忆机制,比如CLAUDE.md项目记忆文件,还有通过用户设置维护的全局偏好。但这些机制都有各自的边界问题。
CLAUDE.md是静态的,只有在会话建立时被加载,之后你无论怎么跟 AI 沟通新的规范和决定,它都不会自动更新里面的内容。全局偏好设置同样需要手动编辑。换句话说,这些功能解决的是"预先声明"的问题,解决不了"会话过程中动态沉淀"的问题。
claude-mem 补的正是这个动态循环:它从对话中自动提炼信息、更新记忆库、并反馈到后续会话。它不是替代 CLAUDE.md,而是跟它互补。我自己现在的做法是:CLAUDE.md 放稳定不变的架构规范和编码约定,动态的经验和决策细节交给 claude-mem 去沉淀。
2. claude-mem 的工作机制:它到底是怎么"记住"你的
2.1 三层结构:缓存层、注入层、存储层
如果你只是把它当成一个"聊天记录存档工具",那就太低估它了。扒开 claude-mem 的内部实现,你会发现它其实是一个典型的三层架构。
第一层是缓存层。它通过 hook Claude Code 的会话事件,在每次 Request 和 Response 往返之间截取数据流。这一层做的是"采集",但它不会把原始对话全部扔进仓库——那样的话,你的记忆库很快就会变成垃圾场,什么东西都往里塞,AI 根本没法区分优先级。
第二层是提炼层(或者叫学习层)。claude-mem 会把截取到的原始内容重新交给模型处理,提取里面的实体、决定、偏好、项目结构和用户命令模式,生成结构化的记忆条目。举个例子,如果你在对话中说了"我们项目的超时时间统一设置成 30 秒",它不会只记录这句话,而是会提取出"超时时间=30s"这个规则,并标记为项目级偏好。
第三层是存储与检索层。提炼后的记忆会写入本地的 SQLite 数据库,按项目、时间、类型做维度划分。当你开启新的 Claude Code 会话时,claude-mem 的注入器会分析当前会话的上下文,从存储层匹配相关记忆,动态插入到系统提示词里。这个过程对用户是完全透明的——你看不到记忆本身,但你能明显感觉到 Claude 「变得更懂你了」。
2.2 关键控制开关:enabled_features和记忆注入策略
安装完 claude-mem 后,配置文件里最核心的一项就是enabled_features。它决定了哪些类型的记忆会被启用,默认开启的核心功能有三个:
session_summaries(会话终结时生成总结并存档)user_preferences(从对话中提取用户的个人偏好)memory_injection(在新会话启动时注入相关记忆)
我强烈建议你在一开始就明确自己的需求,而不是全开。因为每个功能都有成本:session_summaries会唤醒模型做一次总结,多消耗延迟和 token;memory_injection虽然默认注入的 token 量可以配置,但如果你的项目跨度很大,匹配到的记忆片段可能非常多,一旦塞满上下文反而会挤占真正的任务空间。
我的配置大概是这样(基于实际使用中的常用配置):
[storage] backend = "sqlite" path = "~/.claude-mem/store.db" [features] session_summaries = true user_preferences = true memory_injection = true [injection] max_tokens = 1024 mode = "auto"mode = "auto"表示注入器会根据当前对话的复杂度自动调整注入量,而不是机械地每次塞满 1024 个 token,正常场景下这个配置比较省心。如果你发现 Claude 的回答开始频繁跑偏,或者提示词里塞了太多不相干的记忆,再把max_tokens调小。
2.3 记忆的"保质期":时效性与优先级机制
光会记住不行,还得知道什么该忘。claude-mem 在记忆检索上有一套时效性衰减的逻辑——同样一条"项目规范"和一条"早点缀:用 Docker 跑本地 PostgreSQL"这种临时说明,在记忆库里的优先级是完全不一样的。
项目规范属于长期记忆,哪怕过去了半个月,只要你在同一个项目里,它仍然会被高优先级召回。临时解决方案属于短期记忆,如果它在后续的会话里没有再被提及,权重会不断衰减,直到不被召回。这样做的好处很明显:自动过滤噪音。
基于我自己的观察,claude-mem 在做相关性匹配时,是会结合当前工作目录的路径、最近交互的关键词、以及记忆条目的访问时间和权重来综合排序的。所以,如果它在跟你聊支付模块时突然提起了两周前你讨论过的数据库索引优化方案——不用意外,那不是 bug,那叫联想记忆,而且往往是你真正需要的。
3. 从零开始配置 claude-mem:安装与核心参数
3.1 安装方式与前置条件
claude-mem 的安装非常简单,但对环境有一定要求。首先它依赖claude code命令行工具已经安装且能正常联网调用 Anthropic API,这就不用多说了。
其次,claude-mem 目前主要通过 npm 和 Homebrew 分发,两个方式挑一个就行。
# npm 方式(推荐,适合大多数开发者) npm install -g claude-mem # Homebrew 方式(macOS 用户) brew install claude-mem安装完成之后跑一下claude-mem --version,看到版本号输出就说明基础环境没问题。接下来是初始化存储库,这一步会创建默认的 SQLite 数据库和配置文件:
claude-mem initinit 命令会往~/.claude-mem/目录下写入config.toml和store.db。执行完之后建议打开配置文件看一眼,确认enabled_features等核心功能是开启状态。
3.2 环境变量与权限配置:让 claude-mem 能"看见"对话
claude-mem 要截取 Claude Code 的对话流,必须拿到对应的权限和环境变量。最关键的配置是让 claude-mem 以插件的方式挂在 Claude Code 的会话生命周期上。
你需要确认以下几点:
- 环境变量里包含
CLAUDE_CODE_ENABLE_CLAUDE_MEM=1(具体变量名可以通过工具文档确认,常见实践是在 shell 配置中导出该变量)。 - Claude Code 的插件加载路径指向 claude-mem 的安装目录。
- 运行
claude-mem doctor,它会自动检查这些配置是否到位。
export CLAUDE_CODE_ENABLE_CLAUDE_MEM=1 claude-mem doctordoctor是一个非常有用的诊断工具,它会逐项检查环境变量、插件加载、存储路径读写权限。我第一次配置的时候就是靠它发现自己的 shell 配置里少了环境变量导出,导致 claude-mem 根本没有被唤起。
提示:如果你用的是 zsh,记得把 export 写进
~/.zshrc,不要只写在当前终端里生效,否则下次终端一关,claude-mem 就又不工作了。
3.3 验证记忆功能是否真正生效
配置完成之后,最怕的就是表面上一切正常、实际上没生效。我教大家一个可靠的验证方法。
先在一个项目目录下打开 Claude Code,跟它进行一段简短的交互,例如:
我:这个项目的测试框架用的是 pytest,后续新写的模块都统一用 pytest 来写测试。 Claude:好的,我会在编写测试时统一使用 pytest。然后直接退出会话,重新开启一个新会话,问一句:"这个项目的测试框架是什么?"
如果配置成功,Claude 会直接回答 pytest,并且可能会补充一句"根据之前的项目记忆"。如果它回答不知道或者让你提供信息,那说明 claude-mem 的注入环节出了问题。此时用claude-mem doctor检查一遍,或者去 SQLite 数据库里看看有没有生成对应的记忆条目:
sqlite3 ~/.claude-mem/store.db "select content from memories limit 10;"能看到带pytest相关的内容,就说明链路是通的。
4. 实际项目中的用法:让记忆从"玩具"变成"生产力"
4.1 跨会话无缝续接:重构旧项目不再需要重新热身
我之前重构一个内部的报表服务,项目代码量大概两三万行,业务逻辑不算重,但历史包袱很多。最大的麻烦是项目里有大量约定俗成的命名和结构,新写代码必须严格跟随,不然代码风格会变得非常割裂。
这个项目的 CLAUDE.md 是有的,但它只记录了大面上的架构规范,很多细节都是在对话过程中逐步对齐的。比如"这个模块的入口函数叫process_report,不叫run",再比如"数据库查询统一走 repository 层,Service 层不允许直接拼 SQL"。
之前我每次开新会话都要把这些规则重新讲一遍,有时候漏了一条,Claude 就会写出风格完全不一样的代码。用了 claude-mem 之后,这些对话过程中形成的约束会被自动沉淀。某次我甚至发现,在我没有主动提任何背景的情况下,Claude 在新会话里直接问了一句:"这个模块是走 repository 层还是可以直接查询?"
那一刻你就知道,这个记忆功能不是花架子。它真的把前几个会话中逐步对齐的隐性规范学进去了。这对重构类任务价值极大,因为重构过程往往横跨好几天、好多次会话,如果没有记忆延续,每次恢复工作都是一次巨大的心理成本。
4.2 跨项目记忆隔离:不同项目之间不串味
聊完跨会话,再聊聊跨项目。claude-mem 的记忆是跟项目路径绑定的,project_a里产生的记忆不会注入到project_b的会话中。这个设计我一开始觉得多此一举,直到有一天我同时维护一个 Go 微服务和一个 Python 数据处理脚本,才意识到隔离有多重要。
有一次我在处理 Python 项目的时候,Claude 突然提到"根据你之前对这个项目的设定,需要引入 Go 的 channel 机制来并发处理"——我瞬间出了一身冷汗,就差一点它就串味了。幸好 claude-mem 的项目隔离机制足够严格,它只是把所有相关性判定都建立在当前工作目录之上,跨项目记忆根本不会被召回。
当然,有些记忆是全局通用的,比如你自己的编码偏好、常用命令习惯、写作风格,这些可以放进全局记忆区。claude-mem 的配置里通过--scope参数来控制记忆写入的位置,常用的几个值:
project:当前项目的记忆(默认)user:全局用户偏好,任何项目都生效session:仅当前会话有效,用完即焚
我用user作用域记录了一条"代码注释要用中文写,变量名用英文"的偏好之后,所有项目的 Claude Code 都开始遵循这个风格,省掉了我每天重复敲这句话的功夫。
4.3 与 CLAUDE.md 的分工配合
很多人纠结 claude-mem 出现之后,CLAUDE.md 是不是就没用了。我的答案是:它们不是替代关系,而是分工关系。
CLAUDE.md 是"序言",在一个会话开始之前就已经确定了。它适合存放那些你希望每次会话第一时间就明确的硬性规则:目录结构、技术栈、编码规范、部署方式。内容是稳定的、有共识的。
claude-mem 是"日志",它是动态的、增量的、从对话中归纳出来的。它适合存放那些在探索过程中产生的临时决策、踩坑经验、以及你在对话中不经意流露出来的偏好。
我给大家一个实操建议:当你在对话中发现某条记忆被频繁提及、且它已经变成了稳定规则,不妨手动把它从记忆库"转正"到 CLAUDE.md 里。在 claude-mem 的交互界面中,你可以通过claude-mem promote命令将一个记忆条目提升为项目级文档内容。这样长期记忆越来越精炼,短期记忆也不会流失。
5. 我踩过的坑和调优建议
5.1 记忆污染:当旧项目的垃圾回忆出现在新项目中
任何记忆系统最怕的就是"记错了"。claude-mem 用项目路径做隔离已经解决了一大半问题,但如果你在同一个项目目录下长期开发多个功能模块,模块之间的记忆也会互相污染。
举个例子,我在一个项目中先做了订单模块的开发,积累了大量订单状态机的信息,后来切换到同一个项目里的物流模块,Claude 的回答里就开始频繁出现订单模块的术语。虽然同属一个项目,但这两个模块在代码上是完全独立的。
解决思路有两个。第一个是利用会话标签(topic tag)来切割主题,在你准备切换模块之前,主动跟 Claude 说"接下来我们切换到物流模块,之后的对话请以物流模块为主",这样 claude-mem 在划分记忆片段时更容易按主题聚类。第二个办法是给子模块建独立目录,把物理边界做出来,利用项目路径隔离天然切割。我之前嫌文件夹太多太乱,不愿意拆,吃过亏之后发现物理隔离在记忆管理里是最省心的方案。
5.2 注入量过载:记忆塞太多,Claude 反而变傻
这是我一开始最容易犯的错误。我贪心地把max_tokens设得很高,希望 Claude 能记住更多的背景信息,结果换来的是对话质量断崖式下跌。
原因是 Claude 的注意力资源本来就是有限的。如果系统提示词里塞进了大量记忆片段,这些内容会挤占真正的任务描述空间。更麻烦的是,如果注入记忆和对话中反复出现的业务背景之间存在矛盾,模型在调和这些冲突时会变得笨拙——它的回答会变成拼凑记忆片段,而不是基于你的真实需求推理。
最终我把max_tokens控制在 1024 以内,配合mode = "auto"让注入器按需调整。同时,定期去 SQLite 里检查记忆库的内容,把那些明显过时、或者被反复覆盖的旧条目清理掉。claude-mem 提供了claude-mem prune命令,可以按条目年限做批量清理,我一般每周跑一次。
5.3 隐私与成本:本地存储不等于没有成本
claude-mem 的数据存储在本地 SQLite 里,这点对隐私很友好——你的对话内容不会上传到额外的服务器,只在你本地完成提炼和存储。但我还是要提醒一句:本地存储不等于绝对安全,如果你的电脑本身是共享的,或者你把.claude-mem目录同步到了云端网盘,那这些代码讨论里的敏感信息就有泄露的风险。
我最初就把~/.claude-mem直接纳入了 iCloud 同步,后来发现云端的明文数据库文件可以被任意同步设备读取,果断把它排除出同步范围。如果你的项目涉及商业敏感代码,这一步建议尽早处理。
另外是 token 成本的隐性压力。claude-mem 的提炼环节会额外调用模型接口,这部分费用是真实存在的。我测算过,对于一个每天有 200 次交互的重度使用场景,claude-mem 带来的额外 token 消耗大概在 5% 到 15% 之间。这个成本对个人开发者来说可以接受,但如果是团队批量部署,还是值得评估一下。好在你可以通过[features]配置文件把session_summaries关掉,只保留memory_injection,这样提炼的频次会显著降低。
5.4 自建知识闭环:让 claude-mem 成为团队记忆库
最后聊一个进阶玩法。我一个人用顺手之后,把 claude-mem 引入了团队的共用开发机上。因为记忆数据是存在 SQLite 里的,我在团队服务器上建了一个共享的存储位置,所有成员通过同一个路径访问记忆库。
效果非常有意思。团队的架构决策记录下来之后,新来的成员在第一次接触代码库时,不需要追着老同事问"这个模块为什么要这样做",Claude 会直接带着历史决策上下文回答他们。老成员也不用担心新同事写出违背当初决策的代码。当然,这个方案有个前提——你得信任整个团队的代码讨论内容都在同一个存储空间下,而且要做好权限控制。这个策略适合小型技术团队,人一多,记忆库里的主题互相干扰问题就会重新浮出来。
6. 写在最后:记忆是 AI 编程助手的下半场
一个月的实际使用下来,我的总体感受是:claude-mem 并没有让 Claude 变得更聪明,它只是让 Claude 变得更连贯。这种连贯感在长时间项目中带来的体验提升,远比画几张架构图来得实在。
如果你也被"新会话丢失上下文"这个问题折磨过,我的建议是别犹豫,直接装上试试。记得一开始只开核心功能,先用一两个项目跑通闭环,再逐步调整注入策略。等它成为你工作流的一部分之后,你会发现自己跟 AI 协作的方式会慢慢发生变化——你不再把它当成一个"每次都要重新教一遍的实习生",而是一个真正参与了整个项目演进过程的协作者。
最后分享一个小习惯:我现在每天收工之前会花一分钟看一眼 claude-mem 生成的会话摘要,顺手把重要的决策补充到 CLAUDE.md 里。这个动作看起来简单,但它让"从对话中沉淀知识"这件事真正变成了一个可迭代、可传承的工作流。