ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

给 Claude Code 装上长期记忆:claude-mem 使用与配置指南

给 Claude Code 装上长期记忆:claude-mem 使用与配置指南 我一直有个固执的看法Claude Code 这种终端里的 AI 编程助手真正值钱的不是它一次能写多少行代码而是它能不能记住你上次聊到哪儿了。刚把 claude-mem 用进日常工作那阵子我最大的感受就是早该有这种东西了——它等于给我的 Claude Code 装上了一块长期记忆项目约定、技术决策、你讨厌什么写法、上次卡在哪个环节下次启动会话时全部给你拎回来。这篇文章就围绕 claude-mem 这个开源小工具展开讲讲它到底是什么、为什么值得装、我在真实项目里怎么配的、以及踩过哪些坑。适合正在用 Claude Code 这类终端 AI 编程工具、又总被每次都要重新交代上下文折磨的开发者参考。1. claude-mem 到底解决了什么问题AI 助手的失忆症1.1 没有长期记忆的日常每次开终端都像第一次见面如果你用过 Claude Code下面这个场景一定不陌生周二晚上你让它把日志库从 winston 换成 pino理由写得很详细改完也验证过了。周四早上新开一个会话想让它继续优化日志输出格式结果它一脸茫然地又把 winston 的配置翻了出来。你只能耐着性子重新解释一遍我们上周已经迁移到 pino 了。更烦人的是那些项目级偏好比如测试用 vitest 别用 jest、“组件文件用 kebab-case 命名”、“提交信息必须带 conventional 前缀”每一件单拿出来都是小事但每个新会话都要重复一遍累积起来非常消耗耐心。这就是我所说的失忆症。终端 AI 助手默认把每个会话当成一张白纸它只能看到当前窗口里喂给它的上下文。就算 Claude Code 能读取项目里的 CLAUDE.md 或 README那也是静态的、需要你手动维护的文档。一旦你依赖的是上一次对话里随口说的一句约定而这句话又没有被写进任何文件那它就像没发生过一样。短会话还好如果是那种跨越两三天的大功能重构遗忘成本会直接变成返工成本。我在最开始用 Claude Code 的一两周里几乎每天都在重复做同一件事把已经交代过的技术选型和代码规范再讲一遍。后来我统计了一下一次完整的项目初始化对话里大概有三分之一的内容是在给 AI补历史课。这种体验让我意识到真正缺的不是 AI 的理解能力而是记忆能力。1.2 它到底记住了什么四类最有价值的记忆条目claude-mem 做的事情简单说就是给 Claude Code 加一个外挂记忆库。它不是对话引擎不参与你每次提问的推理过程而是像一个项目助理那样在每次会话结束之后把值得留下的信息提取出来、分类存档并在下一次会话开始前把这些档案重新送到 AI 面前。实际用下来它记住的内容基本可以分成四类。第一类是项目约定比如这个仓库统一用 pnpm 安装依赖、ESLint 配置不允许禁用 no-explicit-any。第二类是技术决策比如缓存层选 Redis 而不是 Memcached因为需要支持复杂数据结构、API 响应统一用 { success, data, message } 包装。第三类是工作流偏好包括你喜欢的提交信息格式、代码 review 方式、测试覆盖率的底线。第四类是进行中任务的状态例如用户模块的重构做到了一半下一步是补单元测试。这四类内容有一个共同点它们都来自真实对话中的上下文而不是你专门写的文档。claude-mem 的价值就在于把对话里发生过但没落地的信息打捞出来沉淀成下一次会话可以直接使用的东西。听起来简单但真正做起来关键就在如何判断哪些对话内容值得存档——这就不是一个简单的关键词匹配能搞定的需要模型去理解语义。关于这一块我会在第 3 章详细拆解它的处理流程。1.3 为什么不能只靠手动维护 CLAUDE.md有人可能会问我直接在 CLAUDE.md 里把这些约定写清楚不就行了何必再多装一个工具。我一开始也是这么想的但真正坚持手动维护一段时间之后发现了三个很难绕过的问题。第一个问题是惰性。人在赶进度的时候根本想不起来要更新 CLAUDE.md。往往是项目做完了一周文档还停留在初始版本。对话里做出的决策如果没同步到文档就等于没发生。第二个问题是结构。CLAUDE.md 本质上是一段自然语言写多了之后AI 每次启动都要把整篇读一遍才能找到相关段落信息密度低还会挤占上下文窗口。第三个问题是时效。手动文档很难体现这个决定是什么时候做的、当时基于什么理由等三个月后再看你甚至想不起来当初为什么要这么定。claude-mem 的思路是把维护动作自动化把存储格式结构化。每条记忆都带时间戳、来源会话、状态标签AI 下次读取时可以按需加载而不是全部吞进肚子里。说白了它就是承担了会议纪要员 索引系统的角色把人工维护文档这件事从可能被跳过变成了每个会话自动发生。这条路径比单纯依赖自觉要可靠得多。2. 从安装到跑起来15 分钟给 Claude Code 接上记忆2.1 环境检查与安装安装 claude-mem 只需要 Python 3.10 以上环境整个过程比较顺。我这边用的是 uv 来管理 Python 工具链一条命令就能装完uv tool install claude-mem如果你平时不习惯用 uv直接用 pip 也是一样的效果pip install claude-mem装完之后先验证一下claude-mem --version能正常输出版本号就说明基础环境没问题。这里我特别建议用 uv 而不是直接 pip 装到系统 Python 里一是安装速度快二是它会把工具隔离在独立环境里不会因为某个项目的依赖冲突把 claude-mem 搞挂。我刚开始图省事用 pip 装过一版后来电脑上同时开了几个 Python 项目莫名其妙出现过一次找不到模块的问题换成 uv 之后再没遇到过。还有一件事要提前准备claude-mem 在做记忆提取时要调用大模型 API 做语义分析所以需要配置 ANTHROPIC_API_KEY。我在~/.zshrc里加一行export ANTHROPIC_API_KEYsk-ant-...如果你已经在用 Claude Code这个环境变量通常已经存在跳过即可。这里也给个提醒API key 别写进项目目录里的任何配置文件中尤其是会被提交到 git 的文件这是底线。2.2 初始化项目记忆库并看懂目录结构安装完先别急着用进到你的项目根目录里做一次初始化cd ~/work/myapp claude-mem init这条命令会在当前项目下创建一个记忆目录。我这边跑完之后看到的典型结构大概是这样的memory/ ├── decisions/ ├── preferences/ ├── workflows/ ├── status/ └── index.md每个子目录对应一类记忆条目后面会讲到它们的格式。同时init 还会检查项目根目录下有没有 CLAUDE.md没有的话会新建一个并追加一段简短说明告诉 AI 启动时要去memory/目录里读取记忆摘要。这一步可以理解为先把记忆加载规则注册到 Claude Code 的启动流程里。关于memory/目录要不要提交到 git我的建议分两种情况。如果是单人项目可以不提交在.gitignore里加一行memory/避免隐私泄漏如果是团队项目反而建议提交让每个人的 Claude Code 都共享同一份项目记忆。我们团队后来就把memory/视作项目文档的一部分和 README 一样在 code review 时接受检查。这里没有绝对对错但一定要提前决定好不然哪天把本地记忆推到仓库里里面包含敏感信息的时候就很尴尬。2.3 与 Claude Code 的 hook 集成让捕获动作自动触发claude-mem 的默认工作流是会话结束后自动提取记忆所以要把这个动作挂到 Claude Code 的生命周期事件上。我用的 Claude Code 版本支持在~/.claude/settings.json里配置 hooks 事件我的配置里加了这样一段// ~/.claude/settings.json { hooks: { Stop: [ { matcher: , hooks: [ { type: command, command: claude-mem capture --last-session } ] } ] } }大意是每次 Claude Code 会话正常结束时自动执行一次claude-mem capture --last-session把最近这次会话的输出做一次记忆提取。如果你的 Claude Code 版本 hooks 写法不同以官方文档为准核心思路没区别。我一开始在这里踩过坑配置好 hooks 之后怎么测试都不触发。后来查了一下发现是我的claude命令是通过 shell alias 启动的hook 所用的 PATH 环境和正常终端不一样claude-mem 命令根本找不到。解决方式是在配置里用绝对路径指向 claude-mem 的可执行文件比如/home/user/.local/bin/claude-mem或者在 settings 里显式设置 PATH。这类装好了但不生效的问题我后面会在第 5 章的排查清单里再展开。3. 记忆是怎么长出来的自动提取的工作机制3.1 一条记忆的诞生从原始对话到结构化条目要说清楚 claude-mem 好不好用得先明白它内部是怎么处理会话内容的。我理解它的处理流程大致可以拆成五步捕获原始输出、按 Token 分块、调用模型抽取语义、映射成结构化条目、分类写入记忆库。第一步捕获原始输出比较简单就是通过 hook 拿到整段会话文本。第二步分块是因为大模型的上下文窗口有限一次超长对话可能超过几百万 Token不可能整段塞给模型去分析所以要按长度切成若干块每块单独做抽取。这里的关键点是分块一定要保持对话逻辑的完整不能硬按字符切否则一个技术决定被切到两个块里两边都提取不完整。第三步是整个流程的核心把每个分块交给模型让它判断哪些内容值得记住。这一步不是找关键词而是理解语义——比如用户说我觉得这里用 Redis 比较合适因为要存列表结构模型要能识别出这是一个技术决策而不是闲聊。第四步是把模型返回的结果按固定 Schema 映射成条目。第五步则是按类型写入对应目录同时更新索引。我之所以详细讲这个流程是因为它决定了 claude-mem 的体验上限只有你的 API key 有足够额度、模型质量足够好记忆提取的准确率才有保障。如果只是拿一个小模型做抽取很可能会把大量无关的闲聊也当成记忆存下来那还不如不搞。3.2 记忆条目的存放格式带元数据的 Markdown记忆文件不是一段随意的文字而是带 YAML front matter 的 Markdown。我在一个项目里随便打开一条技术决策大概是这个样子--- type: decision status: accepted created: 2025-06-11T14:22:0008:00 source: fix-deps-20250611 tags: [deps, workflow] --- # 包管理器统一使用 pnpm ## 背景 仓库里同时存在 package-lock.json 和 pnpm-lock.yaml 导致 CI 环境偶尔装出不同的依赖树。 ## 决策 后续所有安装依赖、更新锁文件、编写 CI 脚本的场景 默认使用 pnpm。 ## 理由 - pnpm 安装速度更快 - 磁盘占用更低 - 团队内已经统一使用这种格式好处很明显front matter 部分方便程序解析正文部分方便 Claude Code 直接阅读。status 字段标了 accepted说明这条决策是最终敲定的下次会话遇到类似问题可以直接采用created 字段记录了时间AI 可以据此判断这条记忆是否还适用于当前代码库source 字段保留了来源会话 ID万一要追溯原始对话能直接找到当时的上下文。偏好类记忆的格式也类似比如组件文件命名一律用 kebab-case就会被记成一条 preference携带创建时间和来源会话。这种结构化设计让我在翻记忆库的时候非常省心用 grep 就能快速定位某类规则而不是在一大段自然语言里找针。3.3 三条防止记忆失控的机制去重、分级、过滤记忆条目会越攒越多如果毫无节制地全存下来Claude Code 的启动上下文很快就会被记忆摘要塞满。我在实际使用中观察到 claude-mem 至少做了三件事来控制记忆质量。第一是去重。如果新提取的条目的语义和已有条目高度相似它会选择合并或丢弃而不是无限新增。第二是分级。每条记忆会被赋予一个置信度只有高置信度的内容才默认注入到后续会话中中低置信度的内容只归档不注入需要时可以主动查看。第三是过滤。工具支持配置敏感词和阻断规则比如包含 token、password、API key 等关键词的内容直接不放行这一点极其重要后面我会专门讲。当然自动机制再完善也有判断不准的时候所以 claude-mem 通常会提供一个 review 入口让你在每轮会话结束后过一眼这条要不要存。我的习惯是每周五下午花十分钟翻一遍记忆库删掉过期的决策、合并重复的条目。这个动作看起来不起眼却能保证记忆库长期保持干净。记住工具是自动的但脏数据清理永远需要人来做。4. 实测三周记忆加持下的真实开发流4.1 偏好固化再也不用重复交代项目规范我把 claude-mem 接到一个 React 项目上试了三周第一个明显变化是重复交代规范的次数骤降。最开始我配置了几条偏好比如组件用函数式写法而不是 class、禁止从 default export 引入组件、文件命名统一用 kebab-case。第一周我还会时不时在对话里纠正它到第二周开始基本新开会话直接说需求它写出来的代码已经默认符合这些规则了。让我印象最深的一次是第三天我让它重构一个页面组件它自动把之前约定过的测试写法也带上了——用 vitest 而不是 jest、断言用testing-library/react的方式、测试文件放在组件同目录下。这些我只在第一天提过一次但它通过记忆库在后续会话里一直沿用。这种一次设定长期生效的感觉才是 AI 编程助手该有的样子。4.2 断点续传隔三天还能继续一个大功能第二个让我惊喜的场景是跨会话续接。有一周我周三上午在做 Redis 缓存层的重构当时和 Claude Code 把 key 命名前缀、TTL 策略、缓存穿透兜底逻辑都讨论清楚了但下午因为临时需求打断了没有收尾。周五我重新打开终端新建会话只说了一句继续看一下缓存那个分支。它居然真的接上了——不仅能说出我们当时定的 TTL 是 10 分钟还提醒我当时说好要加一个空值缓存防止穿透这个还没有写。我当时没有在内存里留下任何提示文件它之所以知道这些就是因为周三会话的决策被 claude-mem 写进了记忆库周五启动会话时注入了摘要。这种连续性带来的体验提升不是锦上添花而是把 AI 编程工具从单次会话的干活助手变成了参与整个项目演进的协作者。4.3 多项目隔离记忆不串味的关键第三个经验是多项目隔离。我一开始图省事在~/work下面只初始化过一次记忆库结果 A 项目的代码风格偏好被带到了 B 项目里B 项目写的组件突然按 A 项目的目录结构组织乱了不少。后来我仔细看了初始化逻辑发现问题就出在共用一个记忆库上。正确的做法是每个独立项目分别执行claude-mem init让记忆库跟着项目走。这样你在~/work/project-a里启动 Claude Code 时加载的是 A 项目的记忆切到~/work/project-b时B 项目又有自己独立的一套两边互不干扰。这个切换是自动的因为记忆库就放在项目根目录下不用手工操作。团队场景下还有个额外收益如果整个团队把memory/提交到 git那每个新加入的同事第一次打开项目时Claude Code 就已经带着全队积累下来的项目决策。新人不需要追着老员工问这个项目为什么这么设计AI 直接就能告诉他上下文。这个价值比纯单机使用大得多但对记忆库的纪律要求也更高——团队里一旦有人把不该记的东西提交进来影响面就大了。5. 常见问题与排查技巧实录5.1 claude-mem 装完不生效按顺序检查这五处头一周我就遇到过配置好了但会话结束始终没有记忆文件的问题。与其一个个试不如按顺序排查第一确认你是在项目根目录执行的 init。Claude Code 工作目录如果不是项目根目录记忆库路径会错位工具找不到可写的 CLAUDE.md干脆就跳过了。用git rev-parse --show-toplevel看一眼当前仓库根路径再对比 memory 目录的位置。第二检查 hook 配置有没有被 Claude Code 真正读进去。我踩过 alias 导致 PATH 不对的坑处理方式是在 hook 命令里写 claude-mem 的绝对路径或者把 PATH 显式写进命令前缀。另外如果 hook 的命令执行失败往往只会在 Claude Code 的日志里留一行报错不会弹窗提醒所以看不到日志就等于没排查。第三确认用于提取的 API key 还有额度。claude-mem 做提取时如果请求失败通常会静默处理不会打断你的主流程但记忆也就没存下来。最简单的方法是手动在终端执行一次claude-mem capture --last-session看有没有输出分析和写入的日志。第四看一下会话内容是不是太少了。工具一般会设一个最小触发阈值如果你只跟 AI 说了三五句话就结束它可能认为没有值得沉淀的内容。第五确认可执行文件在 hook 环境里可用。这一步其实就是第二点的延伸我用which claude-mem和echo $PATH对比过之后才定位到问题。5.2 记忆文件越来越长上下文被记忆污染怎么办工具用久了另一个典型问题是记忆越攒越多Claude Code 每次启动读入的摘要越来越长结果反而是 AI 输出开始变得啰嗦、不聚焦。我把它叫做记忆污染症状是明明只是让它改一个按钮样式它非要复述一遍整个项目的技术决策。治这个病我总结了三个办法。第一个是定期 review把过期的决策删掉。比如项目已经切到 pnpm 半年了那条我们正在从 npm 迁移到 pnpm的中间状态记忆就可以删了。第二个是调整注入策略只让摘要注入细节按需询问。我改过 CLAUDE.md 里那行加载逻辑把记忆摘要限制在最近 30 天的高置信条目其他内容不进上下文。第三个是把 workflows 类型的条目从自动注入列表里挪出去这类内容多且长大多数时候不是每轮都用得上需要时让 AI 自己去看文件就好。清理记忆和清理代码库一样需要形成习惯。我每周末都会跑一遍claude-mem review过一下本周新增的条目顺手把明显过时的标成 archived。一次清理大概花十分钟换来的后续会话流畅度提升是很值的。5.3 敏感信息泄露风险记忆库也需要保密协议这是我最想强调的一点。claude-mem 的机制决定了它会把你看似安全的对话内容提取出来存成文件这些内容里可能藏着 API key、数据库密码、客户名称。而记忆文件又是给 Claude Code 自动读取的等于把敏感信息从对话日志里搬到了更持久、更难清理的地方。我的做法有三层。第一层是配置过滤词表把token、password、secret、AKIA、sk-ant-这类关键词全部加进阻断列表凡是命中这些词的条目直接不写盘。第二层是把memory/目录写进.gitignore除非你确认里面没有任何敏感信息否则不提交到仓库。第三层是定期扫描我在自己机器上挂了一个很简单的 grep 命令grep -riE sk-ant-|AKIA|password|secret memory/每周跑一次有输出就去清理对应文件。这件事不是工具本身能做好的必须有人的介入。记住任何自动记录工具都只是把风险转移到了别处不等于风险消失了。5.4 常见问题速查表把这一周里高频遇到的现象整理一下方便你对症处理现象可能原因处理方式会话结束没有生成记忆文件hook 未生效或执行失败检查 settings.json 中的 hooks 配置改用 claude-mem 绝对路径记忆提取内容明显不正确模型误判或上下文分块切碎了关键对话手动运行 capture确认文本块低置信度条目直接删除AI 每次启动变得啰嗦记忆摘要过长、混入了低价值条目缩短注入窗口只保留近期高置信条目定期清理多个项目互相污染共用了同一个记忆库每个项目独立执行 claude-mem init记忆文件里有敏感信息没有配置过滤词表立即删除对应文件加过滤规则扫描全库我个人觉得这里面最值得提前预防的还是敏感信息问题。别的坑顶多是效率低一点这个坑一旦踩中可能直接导致凭据泄漏。该有的防护一开始就配上。我这三周用下来最大的体会是claude-mem 不是一个装完就完事的工具它更像一个需要长期维护的项目文档系统。自动化部分帮我把记录这件事坚持了下来但真正有价值的记忆还是靠我每周花十分钟 review、清理、调整注入策略。用一句话总结我的感受别把所有上下文都交给 AI 托管工具负责存储和提示判断和取舍必须留在自己手里。如果你也想给 Claude Code 加上记忆我建议从一个小项目开始先只保留 decisions 和 preferences 两类条目跑一周看看效果再逐步放开其他类型。这样既能感受到变化也不会一上来就被一堆低质量记忆淹没。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进