1. 项目概述与核心定位
1.1 这个工具到底解决什么问题
claude-mem这个名字第一次看到的时候,我下意识以为是某个 Claude 的周边小工具,实际用下来才发现它解决的是一个非常具体的痛点:AI 编程助手在长会话中的记忆丢失问题。
用过 Claude Code 或者类似 AI 编程助手的人应该都有体会——刚开始对话的时候,助手能记住你前面说的项目结构、代码风格、命名习惯,但聊到几十轮之后,它开始"忘事"。你前面强调过"这个项目用 pnpm 不用 npm",结果它后面又给你生成npm install;你告诉过它"数据库字段用下划线命名",它转头就写成驼峰。这不是模型变笨了,而是上下文窗口被塞满了,早期的信息被挤出去了。
claude-mem就是冲着这个问题来的。它的核心思路是:把 AI 会话中产生的关键信息(决策、偏好、项目约定、代码片段)持久化到本地存储,在需要的时候自动检索并注入到当前上下文中。说白了,就是给 AI 助手装了一个"外挂记忆库"。
这个工具适合谁用?我总结了三类人:
- 重度 AI 编程用户:每天用 Claude Code 写代码超过 2 小时,经常遇到上下文丢失问题
- 多项目并行开发者:同时维护几个项目,每个项目有不同的技术栈和约定,需要 AI 能区分对待
- 对隐私敏感的用户:不希望把项目信息传到第三方服务,需要本地化的记忆存储方案
1.2 核心架构拆解
claude-mem的架构并不复杂,但设计得很巧妙。它主要由四个模块组成:
| 模块 | 职责 | 技术选型 |
|---|---|---|
| 会话监听层 | 捕获 Claude Code 的对话事件 | Hook 机制 |
| 记忆提取器 | 从对话中识别值得记住的信息 | 规则 + 模型判断 |
| 存储引擎 | 持久化记忆数据 | SQLite + 向量索引 |
| 检索注入器 | 在合适时机把记忆塞回上下文 | 相似度检索 + 优先级排序 |
这里最值得说的是记忆提取器的设计。它没有傻乎乎地把所有对话都存下来——那样只会让检索变得又慢又不准。它用了一套组合策略:先用规则匹配识别明显的"决策语句"(比如包含"以后都用"、"记住"、"不要用"这类关键词的句子),再用轻量模型判断哪些信息具有长期价值。这个设计的好处是信噪比高,存下来的都是真正有用的东西。
存储引擎选了 SQLite 而不是纯文件,这个选择很务实。SQLite 支持全文检索,单文件便于迁移,不需要额外部署服务。向量索引部分用的是本地嵌入模型,不依赖外部 API,保证了隐私性。
2. 核心细节解析与实操要点
2.1 记忆提取的触发时机
很多人以为记忆提取是"每轮对话都跑一次",实际上claude-mem采用的是事件驱动 + 批量处理的策略。具体来说,它监听这几类事件:
- 会话结束事件:一次对话结束时,批量提取本轮的关键信息
- 显式标记事件:用户在对话中说了"记住这个"、"这个很重要"之类的话
- 上下文压力事件:当检测到上下文使用率超过阈值(默认 70%)时,主动触发提取
为什么要这样设计?因为每轮都跑提取会拖慢响应速度,而且很多中间对话其实是"废话"——比如"好的"、"继续"、"嗯"这种。批量处理能过滤掉这些噪音,只在真正有信息量的时候才动手。
提示:上下文压力阈值可以在配置里调整。如果你的项目对话轮次特别多,可以把这个值调低到 60%,让记忆提取更早介入。
2.2 记忆的存储结构
存下来的记忆不是一堆散乱的文本,而是有结构的。每条记忆包含这几个字段:
{ "id": "mem_20250115_001", "type": "preference", "content": "项目使用 pnpm 作为包管理器,不要用 npm 或 yarn", "scope": "project:my-app", "confidence": 0.92, "created_at": "2025-01-15T10:30:00Z", "last_accessed": "2025-01-20T14:22:00Z", "access_count": 7, "tags": ["package-manager", "tooling"] }这里有几个字段值得展开说:
type 字段区分了记忆的类型,常见的有preference(偏好)、decision(决策)、fact(事实)、snippet(代码片段)。不同类型在检索时的权重不一样,preference和decision的优先级最高,因为它们直接影响 AI 的行为。
scope 字段是解决多项目冲突的关键。你可以把它理解成"命名空间",不同项目的记忆互不干扰。检索的时候只会拉取当前项目 scope 下的记忆,避免 A 项目的约定污染 B 项目。
confidence 字段是提取器给出的置信度。规则匹配到的记忆置信度高(0.9+),模型判断的会低一些(0.6-0.8)。检索时可以设置阈值,只注入高置信度的记忆。
access_count 和 last_accessed用于实现"记忆衰减"。长期不被访问的记忆会被降权,甚至自动归档。这个机制模拟了人类记忆的遗忘曲线,避免记忆库无限膨胀。
2.3 检索注入的策略
检索注入是整个工具最考验设计功力的地方。注入太少,AI 还是会忘事;注入太多,又会挤占宝贵的上下文空间。claude-mem用的是多路召回 + 重排序的方案:
第一路是关键词召回,用当前对话的最后几轮内容做全文检索,快速捞出一批候选记忆。第二路是向量召回,把当前对话的语义向量和记忆向量做相似度计算,补充关键词匹配不到的语义相关记忆。第三路是高频召回,把 access_count 最高的记忆也纳入候选,保证核心约定永远在场。
三路召回的结果合并去重后,进入重排序阶段。重排序的打分公式大致是:
score = 0.4 * 语义相似度 + 0.3 * 置信度 + 0.2 * 访问频率 + 0.1 * 时间新鲜度这个权重是我实测下来比较均衡的配置。如果你更看重语义相关性,可以把第一项调到 0.5;如果项目约定比较稳定,可以把访问频率的权重提上去。
注意:注入的记忆总长度要控制在上下文窗口的 15% 以内。超过这个比例,留给实际对话的空间就不够了,反而会降低 AI 的表现。
3. 实操过程与核心环节实现
3.1 环境准备与安装
claude-mem的安装过程比想象中简单,但有几个坑需要提前避开。我按实际操作顺序梳理一遍。
第一步是确认 Node.js 版本。这个工具要求 Node 18 以上,因为用到了较新的 API。检查命令:
node --version # 应该输出 v18.x.x 或更高如果版本不够,建议用 nvm 管理多版本:
nvm install 20 nvm use 20第二步是安装claude-mem本体。它提供了 npm 包,全局安装即可:
npm install -g claude-mem这里有个坑:如果你之前装过旧版本,建议先卸载再装,避免残留文件冲突:
npm uninstall -g claude-mem npm cache clean --force npm install -g claude-mem第三步是初始化配置。在项目根目录运行:
claude-mem init这个命令会做三件事:创建.claude-mem目录、生成默认配置文件、注册 Claude Code 的 Hook。Hook 注册这一步很关键,它决定了工具能不能自动捕获对话事件。
3.2 配置文件详解
初始化后会生成~/.claude-mem/config.json,默认配置长这样:
{ "storage": { "path": "~/.claude-mem/data", "maxMemories": 10000, "archiveAfterDays": 90 }, "extraction": { "contextPressureThreshold": 0.7, "minConfidence": 0.6, "batchSize": 20 }, "retrieval": { "maxInjectTokens": 2000, "scoreWeights": { "semantic": 0.4, "confidence": 0.3, "frequency": 0.2, "recency": 0.1 }, "minScore": 0.5 }, "privacy": { "localOnly": true, "excludePatterns": ["*.env", "*secret*", "*password*"] } }我重点说几个需要根据实际情况调整的参数:
maxMemories默认 10000 条,对大多数个人项目够用。但如果你同时维护十几个项目,建议调到 20000 以上,或者给每个项目单独配置存储路径。
contextPressureThreshold我前面提过,默认 0.7。实测下来,对于对话轮次特别密集的调试场景,调到 0.6 效果更好,能让记忆更早介入。
maxInjectTokens是单次注入的最大 token 数。2000 是个保守值,如果你的模型上下文窗口很大(比如 200K),可以适当提高到 3000-4000。
excludePatterns是隐私保护的关键。默认排除了.env和包含 secret、password 的文件。建议根据项目情况补充,比如*.key、config/credentials*等。
3.3 记忆的写入与验证
配置好之后,正常使用 Claude Code 就会自动触发记忆写入。但怎么验证它真的在工作?我总结了几个检查点。
第一个检查点是看日志。claude-mem会把提取过程写到日志文件:
tail -f ~/.claude-mem/logs/extraction.log正常工作时,你会看到类似这样的输出:
[2025-01-15 10:30:15] Session ended, extracting memories... [2025-01-15 10:30:16] Found 3 candidate memories [2025-01-15 10:30:16] Memory mem_001 saved (type=preference, confidence=0.92) [2025-01-15 10:30:16] Memory mem_002 saved (type=decision, confidence=0.85) [2025-01-15 10:30:16] Memory mem_003 rejected (confidence=0.45 < 0.6)第二个检查点是用命令行查询记忆库:
claude-mem list --scope project:my-app --limit 10这会列出当前项目最近的 10 条记忆。如果列表是空的,说明提取环节有问题,需要检查 Hook 是否注册成功。
第三个检查点是手动测试检索:
claude-mem search "包管理器"这个命令会模拟检索过程,返回匹配的记忆和打分。如果搜不到你明明存过的记忆,说明索引可能没建好,可以尝试重建索引:
claude-mem reindex3.4 与 Claude Code 的集成细节
claude-mem和 Claude Code 的集成靠的是 Hook 机制。具体来说,它在 Claude Code 的配置里注册了两个 Hook:
- SessionEnd Hook:会话结束时触发记忆提取
- UserPromptSubmit Hook:用户提交新消息时触发记忆检索和注入
Hook 的注册信息在~/.claude/settings.json里,长这样:
{ "hooks": { "SessionEnd": [ { "command": "claude-mem extract --session-id $SESSION_ID" } ], "UserPromptSubmit": [ { "command": "claude-mem inject --session-id $SESSION_ID" } ] } }这里有个容易踩的坑:Hook 的执行是同步的,如果claude-mem执行太慢,会拖慢 Claude Code 的响应。我实测下来,提取操作平均耗时 200-500ms,检索注入平均 100-300ms,基本无感。但如果你存了几万条记忆,检索可能会变慢,这时候需要优化索引或者降低召回数量。
提示:如果发现 Claude Code 响应明显变慢,可以先临时禁用 Hook,排查是不是
claude-mem的问题。禁用方法是在 settings.json 里把对应的 Hook 注释掉。
4. 常见问题与排查技巧实录
4.1 记忆提取不生效
这是反馈最多的问题。表现是:用了很久,但claude-mem list里还是空的。排查思路按这个顺序走:
第一步,确认 Hook 是否注册成功。打开~/.claude/settings.json,看有没有claude-mem相关的 Hook 配置。如果没有,说明init命令没跑成功,重新跑一次。
第二步,确认 Hook 是否被触发。在~/.claude-mem/logs/下看有没有extraction.log文件。如果文件不存在,说明 Hook 根本没被调用。这时候要检查 Claude Code 的版本,老版本可能不支持 SessionEnd Hook。
第三步,确认提取器是否在工作。如果日志文件存在但内容为空,说明提取器跑了但没找到候选记忆。可能的原因是minConfidence设得太高,或者对话内容确实没有值得记的东西。可以临时把阈值调到 0.3 测试。
第四步,确认存储是否可写。检查~/.claude-mem/data目录的权限,确保当前用户有写权限。Linux 和 macOS 下可以用ls -la查看。
4.2 记忆注入不准确
另一个常见问题是:记忆存进去了,但注入的时候不准确,要么注入了无关的记忆,要么该注入的没注入。这个问题的排查要分两种情况。
情况一:注入了无关记忆。通常是minScore设得太低,导致低分记忆也被注入。建议把minScore从默认的 0.5 提高到 0.6 或 0.7。另外检查一下scope配置,如果 scope 没设对,不同项目的记忆会混在一起。
情况二:该注入的没注入。可能是maxInjectTokens太小,高分记忆还没轮到就被截断了。也可能是记忆的confidence太低,被阈值过滤了。可以先用claude-mem search手动搜一下,看目标记忆的打分是多少,再决定调哪个参数。
我整理了一个速查表,方便对照排查:
| 现象 | 可能原因 | 调整方向 |
|---|---|---|
| 记忆库为空 | Hook 未注册/未触发 | 检查 settings.json 和日志 |
| 记忆库增长慢 | minConfidence 过高 | 降到 0.5 测试 |
| 注入无关记忆 | minScore 过低 | 提高到 0.6-0.7 |
| 该注入的没注入 | maxInjectTokens 太小 | 提高到 3000+ |
| 多项目记忆混淆 | scope 配置错误 | 检查项目 scope 设置 |
| 检索速度慢 | 记忆数量过多 | 启用归档或重建索引 |
4.3 性能优化的几个实操技巧
用了一段时间后,记忆库会越来越大,检索速度会下降。我总结了几个优化技巧,都是实测有效的。
技巧一:定期归档低价值记忆。claude-mem提供了归档命令:
claude-mem archive --older-than 60 --max-access 2这个命令会把 60 天以上、访问次数少于 2 次的记忆移到归档库。归档库不参与常规检索,但需要的时候可以手动恢复。
技巧二:给高频记忆打 pin。有些核心约定(比如项目的技术栈、代码规范)需要永远在场,可以手动 pin 住:
claude-mem pin mem_20250115_001被 pin 的记忆不参与衰减,检索时永远优先注入。
技巧三:分项目独立存储。如果你同时维护多个项目,建议给每个项目配置独立的存储路径,避免记忆库过大。在项目根目录的.claude-mem/config.json里覆盖全局配置即可。
技巧四:定期重建索引。SQLite 的索引在大量写入后可能会碎片化,定期重建能恢复性能:
claude-mem reindex --vacuum我一般一个月跑一次,重建后检索速度能提升 30% 左右。
4.4 隐私与安全的注意事项
虽然claude-mem是本地存储,但有些细节还是要注意。
第一,excludePatterns 要配全。默认只排除了.env和包含 secret、password 的文件。建议根据项目情况补充,比如数据库连接串、API key 文件、证书文件等。配置支持 glob 模式,写起来很灵活。
第二,敏感对话要主动清理。如果某次对话涉及敏感信息,可以在会话结束后手动删除对应的记忆:
claude-mem delete --session-id <session-id>第三,备份要加密。记忆库文件本身是明文的,如果要备份到云盘,建议先加密。SQLite 支持加密扩展,或者用系统自带的加密工具打包。
第四,多用户环境要隔离。如果多人共用一台机器,每个人的记忆库要放在各自的用户目录下,避免互相读取。
注意:
claude-mem的记忆提取是基于对话内容的,如果你在对话里粘贴了敏感代码或配置,它可能会被提取并存储。养成好习惯,敏感内容不要直接粘贴到对话里。
5. 进阶用法与扩展思路
5.1 自定义记忆提取规则
默认的提取规则覆盖了大部分场景,但每个团队都有自己的特殊情况。claude-mem支持自定义提取规则,配置在~/.claude-mem/rules.json里:
{ "rules": [ { "name": "team-conventions", "pattern": "(团队约定|规范要求|必须遵守)[::]\\s*(.+)", "type": "preference", "confidence": 0.95 }, { "name": "api-endpoints", "pattern": "(接口地址|API 路径)[::]\\s*(https?://\\S+)", "type": "fact", "confidence": 0.9 } ] }这个机制很实用。比如你们团队有固定的代码审查清单,可以加一条规则,只要对话里提到"审查清单",就自动提取并高置信度存储。
5.2 记忆的导入导出
claude-mem支持记忆的导入导出,这在团队协作场景下很有用。导出命令:
claude-mem export --scope project:my-app --output memories.json导出的 JSON 文件可以分享给团队成员,他们导入后就能获得相同的项目记忆:
claude-mem import --file memories.json --scope project:my-app这个功能特别适合新成员入职场景。把项目的历史决策、技术约定导出给新人,他们的 AI 助手就能快速"上手"项目,减少重复沟通。
5.3 与其他工具的联动
claude-mem的记忆库是开放的,可以通过 API 被其他工具读取。我试过几个联动场景:
场景一:生成项目文档。写了个脚本定期读取记忆库,把decision类型的记忆整理成 ADR(架构决策记录)文档。
场景二:代码审查辅助。在 CI 流程里读取记忆库的preference类型记忆,自动检查代码是否符合项目约定。
场景三:新人 onboarding。把记忆库导出成 Markdown,作为新人培训材料的一部分。
这些联动不需要改claude-mem的源码,直接读 SQLite 数据库就行。表结构很清晰,memories表存记忆内容,tags表存标签,access_log表存访问记录。
5.4 我踩过的几个坑
最后分享几个我实际踩过的坑,希望能帮你少走弯路。
坑一:Hook 冲突。如果你同时装了其他 Claude Code 的 Hook 工具,可能会冲突。表现是 Hook 有时候触发有时候不触发。解决方法是检查 settings.json 里的 Hook 顺序,确保claude-mem的 Hook 在前面。
坑二:路径含空格。claude-mem的存储路径如果包含空格,在某些系统上会出问题。建议路径用下划线或短横线,不要用空格。
坑三:大文件对话。如果你在对话里粘贴了很大的文件(比如几千行的代码),提取器可能会超时。可以在配置里设置maxContentLength,超过这个长度的内容不参与提取。
坑四:模型切换。如果你在 Claude Code 里切换了模型(比如从 Sonnet 切到 Opus),记忆库是共享的,但不同模型的表达习惯可能不同,提取出来的记忆风格会不一致。建议给不同模型配置不同的 scope。
坑五:时区问题。记忆的时间戳默认用 UTC,如果你在日志里看到时间对不上,别慌,是时区问题。可以在配置里设置timezone字段。
这个工具我用了大概三个月,最大的感受是:它把 AI 助手从"金鱼记忆"变成了"有笔记的助手"。以前每次开新会话都要重新交代项目背景,现在基本不用了。当然它也不是银弹,记忆的准确性依赖提取规则的质量,需要花点时间调优。但一旦调好,效率提升是实实在在的。