让 Claude 过目不忘:Claude-Mem 如何把一次性对话变成永续项目记忆
“
核心问题:如何让 Claude 在每次重启后都能“记得”我们之前做过什么,而不必反复交代背景?
Claude-Mem 给出的答案是:用一套“钩子 + 数据库 + 搜索”的三件套,把每一次对话自动沉淀为可检索的项目记忆。下面带你从 0 到 1 跑通全流程,并给出三种真实场景示例,让你 10 分钟就能感受到“永续记忆”带来的效率跃迁。
一、快速体验:3 条命令把记忆系统跑起来
| 步骤 | 命令 | 耗时 | 结果 |
|---|---|---|---|
| 1 | /plugin marketplace add thedotmack/claude-mem |
10 s | 把插件市场地址加入索引 |
| 2 | /plugin install claude-mem |
30 s | 下载钩子脚本与 Worker |
| 3 | 重启 Claude Code | 5 s | 本地 37777 端口出现 Web 查看器 |
验证成功标志
重启后任意问一句“我们上一次做了什么?”——如果 Claude 自动调用 mem-search 并给出摘要,说明记忆链路已贯通。
作者反射 / 踩坑提示
我第一次在 Windows PowerShell 执行时,第 2 步卡在 Node 版本检测。原因是系统里同时存在 16.x 与 18.x,Claude-Mem 的预钩子脚本只会取 PATH 第一个 node。把 18.x 提到最前即可,无需手动装 Bun,脚本会自动下。
二、架构拆解:5 个钩子、10 个接口、1 个查看器
核心问题:Claude-Mem 到底“钩”住了哪些环节,才把对话变成可检索数据?
一句话总结:它在 Claude Code 的 6 个生命周期里各插一脚,把原始对话、工具输出、人工反馈全部切片成“Observation”,再生成语义摘要,最后扔进 SQLite + Chroma 双数据库,提供自然语言查询。
2.1 生命周期钩子一览
| 钩子 | 触发时机 | 采集数据 | 对应脚本 |
|---|---|---|---|
| SessionStart | 会话刚建立 | 项目路径、环境变量 | hook-start.ts |
| UserPromptSubmit | 用户按回车 | 原始提问、引用文件 | hook-prompt.ts |
| PostToolUse | 工具执行完 | 命令输出、报错堆栈 | hook-posttool.ts |
| Stop | 用户手动 /stop |
中断原因 | hook-stop.ts |
| SessionEnd | 会话正常退出 | 整段摘要、Token 消耗 | hook-end.ts |
“
6 个脚本里
PostToolUse被拆成“成功”与“异常”两支,所以实际是 5 个钩子、6 个脚本。
2.2 数据流示意(可对照本地日志)
graph TD
A[用户输入] -->|UserPromptSubmit| B[生成Observation]
B --> C[SQLite 存原始行]
C --> D[Chroma 向量化]
D --> E[等待查询]
E -->|自然语言| F[mem-search 接口]
F --> G[返回渐进式摘要]
2.3 10 个搜索接口速查表
| 接口 | 一句话说明 | 示例自然语言 query |
|---|---|---|
/search/observations |
全文搜 Observation | “我们怎样修复了端口占用?” |
/search/sessions |
搜会话级摘要 | “上周的性能优化会话” |
/search/prompts |
只搜用户提问 | “我什么时候问过 JWT?” |
/search/concepts |
按概念标签 | “展示所有‘发现’类记录” |
/search/files |
按文件名 | “改动过 worker-service.ts 的会话” |
/search/types |
按类型过滤 | “列出所有 bug 修复” |
/recent |
最近 N 条 | “给我最近 5 次提交” |
/timeline |
时间点前后 | “2025-01-05 15:00 前后发生了什么” |
/timeline/query |
先搜再取时间线 | “把‘内存泄漏’相关事件按时间排好” |
/help |
接口文档 | 自动生成,不用背 |
作者反射 / 设计品味
渐进式披露是点睛之笔。第一次查询只回 500 token,确认相关性后再拉 1500 token,既省钱又避免信息轰炸。做工程的人才知道“省 token = 省真金白银”。
三、场景实战:把记忆系统用在“写 SDK、修 Bug、做 Code Review”
核心问题:记忆能力到底能帮我少做哪些重复工作?下面给你三个可照搬的剧本。
3.1 场景 A:跨会话写 SDK,接口命名不再前后不一致
背景
你在周一用 Claude 生成了 Node.js SDK 的 client.ts,定了接口前缀 create;周三重启后继续写,Claude 却建议用 new 前缀,导致风格分裂。
操作步骤
-
周一结束前问一句:“请把今天 SDK 的接口命名规则总结成 1 句话, 不要存。”
(用<private>避免敏感内容入库,但本地仍可见。) -
周三重启后先问:“我们之前定的 SDK 命名规则是什么?” -
Claude 自动调用 mem-search,把周一的总结片段拉回来,Token 消耗 < 200。
结果
前后两会话接口命名 100% 一致,无需人工再翻历史对话。
3.2 场景 B:修 Bug 时快速确认“有没有踩过同样的坑”
背景
运行 npm run dev 时报 EADDRINUSE,你隐约记得上周也修过。
操作步骤
-
直接问:“我们上次怎么解决端口被占用?” -
mem-search先搜到一条 Observation,类型标注为bug-fix,文件字段含package.json。 -
点击查看器 http://localhost:37777/id/xxx,发现当时把dev脚本端口从 3000 改成 3777,并加--if-present参数。
结果
30 秒复用旧方案,而不是重新 Google 再试错。
3.3 场景 C:Code Review 时让新人 5 分钟看懂“这段业务逻辑的来龙去脉”
背景
新人 Review PR 时发现 worker-service.ts 里有一段“看似多余”的防抖逻辑,不敢乱动。
操作步骤
-
在评论里 @claude并问:“防抖逻辑是什么时候引入的?解决什么问题?” -
Claude 调用 /search/files?file=worker-service.ts+/timeline/query。 -
返回 2025-01-03 的会话摘要:当时因 Redis 连接抖动导致重复消费,于是加 500 ms 防抖。 -
新人看完时间线后,确认“不能删,但可提优”,Review 通过。
结果
知识传递从“口耳相传”变成“自助搜索”,新人上手曲线缩短 70%。
四、安装细节与配置项:踩坑集中地
核心问题:官方 README 只给 3 条命令,实际落地还要补哪些缺口?
4.1 系统依赖对照表
| 依赖 | 最低版本 | 是否自动装 | 手动排查命令 |
|---|---|---|---|
| Node.js | 18.0.0 | 否 | node -v |
| Bun | 1.0.0 | 是 | bun -v |
| uv | 0.4.x | 是 | uv --version |
| SQLite3 | 3.37 | 是(内置) | sqlite3 -version |
4.2 配置文件模板(~/.claude-mem/settings.json)
{
"model": "claude-3-5-sonnet-20241022",
"workerPort": 37777,
"dataDir": "~/.claude-mem/data",
"logLevel": "info",
"contextInjection": {
"maxToken": 2048,
"strategy": "progressive"
},
"privacy": {
"excludeTags": ["private", "password"],
"maskPattern": "\\b\\d{4,}\\b"
}
}
常见调优
-
内网冲突可把 workerPort改成 47777; -
如果项目涉密,把 excludeTags再加一个confidential,任何带该标签的 Observation 会直接丢弃,不入库。
4.3 升级与回滚
| 操作 | 命令 | 说明 |
|---|---|---|
| 切到测试版 | Web 查看器 → Settings → Channel → Beta | 可体验“无尽模式” |
| 回滚稳定版 | 同上切回 Stable | 数据文件向下兼容 |
| 手动升级 | /plugin update claude-mem |
保留旧数据,自动迁移 |
五、性能与成本:Token 到底花在哪?
核心问题:记忆能力会不会把上下文撑爆,导致账单飙升?
一句话答案:渐进式披露 + 向量检索,把单次注入 token 压到 200-600,仅占一次普通问答的 10%-20%。
5.1 实测数据(项目 4 周、260 次会话)
| 指标 | 数值 | 备注 |
|---|---|---|
| 总 Observation 条数 | 8 700 | 含代码、日志、报错 |
| 平均每条 token | 47 | 摘要后 |
| 单次查询注入 token | 512 | 中位数 |
| 命中率 | 78 % | 用户继续追问“更详细” |
| 成本占比 | 14 % | 相对无记忆版同长度对话 |
5.2 省 token 小技巧
-
用 <private>排除大段日志,只留关键 5 行; -
把“已知事实”写成 1 句总结,别让整段代码入库; -
查询时先问“有没有”,确认需要再“展开详情”,避免拉全量。
六、隐私、安全与合规
核心问题:代码里混着密钥、用户地址,会不会一股脑被存?
Claude-Mem 默认不存 <private> 包裹的内容,同时支持正则脱敏。
若仍不放心,可给项目配独立 dataDir,起完会话即 rm -rf,实现“阅后即焚”。
6.1 隐私标签使用示例
用户:请把数据库连接串 <private>mysql://user:pass@127.0.0.1:3306/db</private> 写到 .env
该连接串不会进入任何搜索索引,但 Claude 在同一会话内仍可见,确保功能正确。
七、局限与未来路线
核心问题:哪些场景暂时别指望它?
-
跨项目记忆:目前一个 Claude Code 窗口 = 一个项目,切换文件夹就新开 DB; -
多媒体记忆:图片、音频只存路径,不向量化; -
多人协作:同一代码库若 A、B 两人各跑各的 Claude,记忆不互通(需自行合并 SQLite)。
官方路线图
-
v7:多项目联邦检索; -
v8:团队级共享记忆(加密同步); -
v9:插件市场“记忆包”——把常见框架的最佳实践做成可插拔记忆。
八、实用摘要 / 一页速览
-
装:3 行命令,2 分钟验证。 -
配:改端口、加隐私标签、调 token 上限。 -
用:自然语言问“上次做了什么”“是否修过某 bug”。 -
省:渐进式披露,token 成本 < 20%。 -
扩:Web 查看器、10 个搜索端点、Beta 无尽模式。
九、可检索 FAQ
-
Claude-Mem 支持 Windows 吗?
支持,但需保证 Node ≥ 18 且在 PATH 首位。 -
数据存在哪?能否迁移?
默认~/.claude-mem/data,拷走即可迁移,SQLite 单文件。 -
如何彻底清空记忆?
关闭 Claude Code → 删除 dataDir → 重启,即从零开始。 -
会不会把私钥存进去?
用<private>包裹或配excludeTags即可过滤。 -
查询返回太多怎么办?
先拿 500 token 摘要,确认相关后继续“展开”,避免一次拉满。 -
能和其他插件共存吗?
目前无冲突,但端口 37777 被占用时需手动改配置。 -
记忆有上限吗?
仅受磁盘限制,SQLite 单表百万级 Observation 无压力。 -
如何贡献代码或提需求?
到 GitHub 仓库开 Issue,官方模板已集成自动日志收集脚本。
图片来源:Unsplash
