让 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 前缀,导致风格分裂。

操作步骤

  1. 周一结束前问一句:“请把今天 SDK 的接口命名规则总结成 1 句话, 不要存。”
    (用 <private> 避免敏感内容入库,但本地仍可见。)
  2. 周三重启后先问:“我们之前定的 SDK 命名规则是什么?”
  3. Claude 自动调用 mem-search,把周一的总结片段拉回来,Token 消耗 < 200。

结果
前后两会话接口命名 100% 一致,无需人工再翻历史对话。

3.2 场景 B:修 Bug 时快速确认“有没有踩过同样的坑”

背景
运行 npm run dev 时报 EADDRINUSE,你隐约记得上周也修过。

操作步骤

  1. 直接问:“我们上次怎么解决端口被占用?”
  2. mem-search 先搜到一条 Observation,类型标注为 bug-fix,文件字段含 package.json
  3. 点击查看器 http://localhost:37777/id/xxx,发现当时把 dev 脚本端口从 3000 改成 3777,并加 --if-present 参数。

结果
30 秒复用旧方案,而不是重新 Google 再试错。

3.3 场景 C:Code Review 时让新人 5 分钟看懂“这段业务逻辑的来龙去脉”

背景
新人 Review PR 时发现 worker-service.ts 里有一段“看似多余”的防抖逻辑,不敢乱动。

操作步骤

  1. 在评论里 @claude 并问:“防抖逻辑是什么时候引入的?解决什么问题?”
  2. Claude 调用 /search/files?file=worker-service.ts + /timeline/query
  3. 返回 2025-01-03 的会话摘要:当时因 Redis 连接抖动导致重复消费,于是加 500 ms 防抖。
  4. 新人看完时间线后,确认“不能删,但可提优”,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 小技巧

  1. <private> 排除大段日志,只留关键 5 行;
  2. 把“已知事实”写成 1 句总结,别让整段代码入库;
  3. 查询时先问“有没有”,确认需要再“展开详情”,避免拉全量。

六、隐私、安全与合规

核心问题:代码里混着密钥、用户地址,会不会一股脑被存?

Claude-Mem 默认不存 <private> 包裹的内容,同时支持正则脱敏。
若仍不放心,可给项目配独立 dataDir,起完会话即 rm -rf,实现“阅后即焚”。

6.1 隐私标签使用示例

用户:请把数据库连接串 <private>mysql://user:pass@127.0.0.1:3306/db</private> 写到 .env

该连接串不会进入任何搜索索引,但 Claude 在同一会话内仍可见,确保功能正确。


七、局限与未来路线

核心问题:哪些场景暂时别指望它?

  1. 跨项目记忆:目前一个 Claude Code 窗口 = 一个项目,切换文件夹就新开 DB;
  2. 多媒体记忆:图片、音频只存路径,不向量化;
  3. 多人协作:同一代码库若 A、B 两人各跑各的 Claude,记忆不互通(需自行合并 SQLite)。

官方路线图

  • v7:多项目联邦检索;
  • v8:团队级共享记忆(加密同步);
  • v9:插件市场“记忆包”——把常见框架的最佳实践做成可插拔记忆。

八、实用摘要 / 一页速览

  1. 装:3 行命令,2 分钟验证。
  2. 配:改端口、加隐私标签、调 token 上限。
  3. 用:自然语言问“上次做了什么”“是否修过某 bug”。
  4. 省:渐进式披露,token 成本 < 20%。
  5. 扩:Web 查看器、10 个搜索端点、Beta 无尽模式。

九、可检索 FAQ

  1. Claude-Mem 支持 Windows 吗?
    支持,但需保证 Node ≥ 18 且在 PATH 首位。

  2. 数据存在哪?能否迁移?
    默认 ~/.claude-mem/data,拷走即可迁移,SQLite 单文件。

  3. 如何彻底清空记忆?
    关闭 Claude Code → 删除 dataDir → 重启,即从零开始。

  4. 会不会把私钥存进去?
    <private> 包裹或配 excludeTags 即可过滤。

  5. 查询返回太多怎么办?
    先拿 500 token 摘要,确认相关后继续“展开”,避免一次拉满。

  6. 能和其他插件共存吗?
    目前无冲突,但端口 37777 被占用时需手动改配置。

  7. 记忆有上限吗?
    仅受磁盘限制,SQLite 单表百万级 Observation 无压力。

  8. 如何贡献代码或提需求?
    到 GitHub 仓库开 Issue,官方模板已集成自动日志收集脚本。


记忆永续
图片来源:Unsplash