☰
claude-mem:给Claude加装SQLite本地记忆,让AI协作不再失忆
2026/10/26 7:41:24 网站建设 项目流程

先说一个我最近几乎天天在用的开源小工具:claude-mem。如果你也受够了 Claude 开新会话就失忆的毛病,这个项目能直接改变你跟 AI 协作的体验。它是给 Claude 挂一层外部持久化记忆的 CLI 工具,核心用本地 SQLite 存储四类内容——明确记住的偏好、临时笔记、领域知识事实、术语表。每次对话开始或提问时,claude-mem 会把相关记忆提取出来注入到上下文里,让模型从第一次见面变成"我记得你"。它特别适合重度使用 Claude Code 的开发者、多个项目并行的效率党,也想给 Claude API 应用接记忆层但不想从零写检索逻辑的人。

1. 项目概述与核心设计思路

1.1 claude-mem 到底解决了什么问题

大模型本身没有真正意义上的长期记忆。日常使用中所谓的"记忆",本质上只是把历史对话全部塞进上下文窗口,窗口有上限,会话一关数据就没了。这带来一个非常现实的问题:在跨周、跨月的项目协作里,大量时间浪费在重复告知同一件事上。三天前刚确认过"后端用 FastAPI 不用 Django",新开一个会话它又开始一本正经推荐 Django;跟 Claude 敲定好的接口命名规范,第二天全部归零。

claude-mem 的解法很务实,它不去改模型,也不做复杂的向量检索,而是在模型外部维护一个结构化记忆库。对话开始时,通过系统提示词把长期偏好注入;对话过程中,通过显式指令或自动钩子把新信息写入数据库。模型本身没有变化,但它能访问的外部"工作记忆"变成了可持久化、可检索、可跨会话共享的资产。这个思路跟人类用笔记补脑是一个道理——不是让你记性变好,而是让你需要的信息总在触手可及的地方。

这里有个关键选型:为什么用 SQLite 而不是向量数据库?我的理解是,个人使用场景下 SQLite 单文件存储零部署成本,SQL 查询对结构化记忆极其友好,可以按标签、类型、时间精准过滤。向量检索适合模糊语义匹配,但对"项目用 uv 管理依赖"这种精确偏好来说,普通关键词加标签已经绰绰有余,还省去了 embedding 模型的算力和精度问题。我实际用下来,SQLite 的毫秒级响应完全够用,反而那些动不动就上向量库的方案有点杀鸡用牛刀。

1.2 四类记忆载体与标签系统:为什么要这么分层

claude-mem 把记忆分为 memories、notes、knowledge/facts、glossary 四类,这个分层非常讲究,对应的是人脑记忆的不同层次。

memories 存的是明确、稳定、长期有效的偏好和决策,比如"项目用 uv 管理 Python 依赖""用户偏好 TypeScript 严格模式"。这类内容每次会话大概率都要用到,属于高频常驻记忆。notes 存的是临时性过程记录,比如"正在排查登录接口偶发 502""下周切换 staging 数据库",这类信息只在相关任务中才有价值,权重低、召回频率也低。knowledge/facts 是客观事实和领域知识,比如"FastAPI 0.100+ 支持 Annotated 依赖注入",它不依赖具体项目,但会在合适的话题中被检索到。glossary 是术语表,专门解决项目里的黑话、缩写,比如"EE 指实体抽取服务""老炮指 legacy 系统",有了术语表,模型才能听懂你们团队内部的语言。

把记忆拆成四类,核心原因是召回时机和频率完全不同。偏好和术语每次对话都应注入,属于长期稳定型;笔记和事实只在相关话题中按需召回,属于过程变化型。如果混在一起存,结果只有两种:要么上下文被大量无关信息撑爆,要么关键偏好被边缘化。claude-mem 还允许每条记忆打标签,比如@architecture、@config,召回时可以按标签定向筛选,相当于给记忆装了路由地址。这套设计很像笔记软件的双链,但在 AI 记忆场景下更直接,标签就是召回的路由表。

1.3 整体架构与数据流

从架构角度看,claude-mem 是典型的"仓储 + 注入"模式。数据流大概是这样的:用户或 Claude Code 通过命令或 hooks 触发写入,记忆数据先经过解析,提取出时间戳、会话 ID、标签等元信息,再按类型落入 SQLite 的对应表。召回时,claude-mem 先做一次"常驻注入",把 memories 和 glossary 按配置上限拼进系统提示词,再做"按需检索",通过关键词和标签匹配把相关 notes 和 facts 抓出来。两条路径汇合后,统一作为上下文交给模型。

这个架构最聪明的地方在于隔离性。记忆存储与模型调用完全解耦,你可以随时导出、备份、删除数据库,不影响模型本身。而且所有数据都在本地,没有额外的服务端依赖,架构简单到一眼能看穿。对于想借鉴思路做二次开发的开发者来说,这个数据流几乎可以直接照搬。

2. 快速上手:安装、初始化与基础命令

2.1 安装与初始化步骤

安装 claude-mem 非常简单,需要 Python 3.9 以上,一条命令搞定:

pip install claude-mem

装完先初始化配置:

claude-mem init

这一步会在~/.claude-mem/下生成配置文件config.toml,并自动创建 SQLite 数据库。如果想跟 Claude Code 深度集成,再执行:

claude-mem install

这条命令会自动往 Claude Code 的配置文件里注册 hooks,让后续的自动记忆成为可能。我建议装完后先跑一下claude-mem status,看到存储路径、数据库大小、记忆条目数都没问题,再手动存几条测试记忆验证读写链路。很多人装上就急着用,结果半天没反应,最后发现是初始化那步没执行,或者 hooks 没注册上。

2.2 基础命令速查表

claude-mem 提供了一组cmm开头的命令,覆盖记忆的增删查改。我用得最勤的几张表在这里:

命令作用典型用法
cmm remember保存一条长期记忆cmm remember "项目使用 uv 管理依赖 @config"
cmm notes查看所有笔记cmm notes add "待办:升级消息队列版本"
cmm facts查看知识事实cmm facts list
cmm glossary管理术语表cmm glossary add "EE 实体抽取服务"
cmm search关键词全文检索cmm search "uv"
cmm recall按类型或标签召回记忆cmm recall --type memories --tag config
cmm context查看当前会话将注入的上下文内容cmm context --session-id dev
cmm stats查看记忆库统计信息cmm stats
cmm forget删除一条记忆cmm forget 12

初次上手不需要记全,remember、search、stats三个命令就覆盖九成使用场景。cmm系列命令统一支持--help参数,可以在命令行里随时查看子命令说明,这一点比很多散装 CLI 工具做得规范。

2.3 配置文件里几个值得关注的参数

配置文件~/.claude-mem/config.toml里有几个参数直接影响使用体验,我用一个实际调整过的例子说明:

storage_path = "~/.claude-mem/memories.db" max_memories = 10 max_notes = 5 max_glossary = 8 max_contexts = 20 enable_auto_learn = true

max_memories和max_notes控制每一类记忆在单次会话中最多注入多少条。默认值看起来不够大,但它防止的是上下文被记忆挤爆。Claude 的窗口再宽,塞进去一百条记忆也会严重影响实际对话质量。enable_auto_learn是自动学习的总开关,开启后 Claude Code 在特定触发点上会尝试提炼并保存记忆。max_contexts则是按会话注入的上下文总条数上限,项目越复杂,这个值越需要谨慎调整。不同版本的键名可能有细微差异,以你安装版本里附带的注释为准,但调整思路是一样的:记忆不是越多越好,而是越精准越好。

3. 与 Claude Code 深度集成:让自动记忆真正落地

3.1 钩子机制的工作原理与事件选择

claude-mem 能"自动"记住东西,靠的是 Claude Code 的 hooks 机制。Claude Code 在会话生命周期中会触发多种事件,包括工具调用前(PreToolUse)、工具调用后(PostToolUse)、通知(Notification)、会话结束(Stop)。claude-mem install本质上就是把这些事件与对应的 claude-mem 脚本绑定,比如在 Stop 事件触发时自动提炼本次会话的关键信息。

这里有个值得认真考虑的选型问题:为什么不监听频率更高的 PostToolUse,而是监听 Stop 或 Notification?因为 PostToolUse 太碎了。Claude 一次回复里可能连续调用十几个工具,每个工具调用后都跑一次记忆提取,既慢又贵,还容易把中间态的垃圾信息当成长期价值存进库。Stop 事件发生在一轮完整回复结束后,这时候上下文里通常已经沉淀了用户确认过的结论;Notification 适合捕捉需要即时感知的状态变化。选低频但完整的信号源,比高频碎片化的信号源靠谱得多。我当初试过用 PostToolUse,结果库里全是"正在调用 xx 工具""读取到 xx 文件内容"这类废条目,清理起来别提多头疼。

3.2 自动提取记忆的两类触发方式

第一类触发是在对话里直接下达"记住"指令。集成好后,跟 Claude 说一句:

记住:以后这个项目所有 Python 新代码都用 uv 管理依赖。

它会通过工具调用执行cmm remember,把内容连同时间戳、会话 ID、关联标签一并写入记忆库。这种方式自然、可控,适合有意为之的记忆沉淀。

第二类触发是开启自动学习。把enable_auto_learn设为true,并给 Claude 一个规则性指令,比如:

当构建成功或出现新的架构决策时,自动更新相关记忆。

之后 Claude Code 会在对应事件触发时调用记忆工具,把值得记录的信息自动沉淀下来。自动学习的判断标准一般偏保守,只存它认为重要且稳定的内容,日常闲聊不会入库。如果发现自动学得太少,建议先检查 hooks 事件有没有绑定到合适的时机,别一上来就怀疑工具坏了。

3.3 会话隔离与多项目管理

多项目并行时最怕的是记忆串场——A 项目的偏好被注入到 B 项目的上下文里,Claude 在 B 项目里一本正经地用 A 项目的架构做指导,那种体验真的让人血压拉满。claude-mem 用 session 维度做隔离:

claude-mem init --project-name my-project --project-root /path/to/project

这样该目录下的对话记忆独立存储,互不干扰。没有显式指定时,claude-mem 默认按当前工作目录区分。我的实践建议是:不同业务线的项目一定要显式声明--project-name,尤其是同时开两三个相似项目的人。目录结构一旦重叠或工作路径切不干净,召回结果就会混入别的项目上下文,排查起来非常费劲。清理时,cmm forget删单条,清空某类型可以用对应的flat子命令,彻底重置就删掉数据库文件重新 init,干净利落。

4. 召回策略与上下文质量

4.1 记忆如何被召回并注入上下文

存入记忆只是第一步,真正决定价值的是召回质量。claude-mem 召回逻辑分两条路径。路径一是直接注入,在会话启动时把当前 session 的 memories 和 glossary 按配置上限拼进系统提示词,这一层不需要用户操作,所有已配置的会话都会自动携带。路径二是按需检索,当用户提问时,claude-mem 根据当前上下文与关键词、标签、时间的匹配度,把可能相关的 notes 和 facts 提取出来。

这个设计很像搜索引擎的两级调度:常年必备的常驻信息放首页,临时需要的内容走查询接口。实际体验下来,两条路径的配合能兼顾稳定性和灵活性。但要注意,注入上下文是有代价的。每条记忆都会占 token,max_contexts就是用来做硬性上限的。如果你的对话突然变慢或者上下文明显变长,先看看是不是这个值配得太大。

4.2 提升召回精度的五个实战技巧

第一,拆分记忆粒度。一条记忆只讲一件事,不要攒。错误的例子是把"项目用 uv,且后端部署在 /data/app,端口 8080"存成一条,结果检索"端口"时把无关的 "uv" 也带出来了。分开存,每条召回都干净。

第二,善用标签路由。在内容里带@tag,比如@deployment、@database,召回时用--tag参数限定范围,噪声立刻减少。标签相当于记忆的索引字段,越规范,检索越准。

第三,别把会变的信息存进 memories。"正在排查 502""马上切换数据库"这类内容应该进 notes,memories 是长期稳定的。临时信息进了长期层,过两周被召回时就会以过期状态污染判断。

第四,定期清理过期记忆。我每月跑一次cmm search,把明显过时或者已经被推翻的条目删掉。记忆质量永远比数量重要,一个错误的旧记忆比没有记忆更有害。

第五,提问时带上项目内的约定叫法。问问题用"按 EE 的网关规范处理",就比"按我们之前定的方式处理"更容易触发精确匹配。让关键名词在对话里不断出现,召回系统才能持续命中。

4.3 数据规模大了怎么办

关于性能,纯文本记忆的量级其实非常小。每条记忆平均几百字节,一万条也就几 MB,SQLite 单表查几万行毫无压力。我跟踪了三个月的项目,数据库体积不到 8 MB,操作完全无感知。但需要关注的是注入阶段,召回条目过多会挤占对话空间,max_contexts是硬防线,超过上限的部分即使匹配上也不会注入,这一条是保对话质量的关键机制。

如果确实遇到检索慢,可以自己加索引。不过 claude-mem 默认已经给常用字段建好了索引,常规场景不需要手动干预。数据备份也很方便,SQLite 是单文件,直接复制.db文件就完成了整个记忆库的备份,这种开放格式带来的自由度,是你用任何 SaaS 记忆服务都享受不到的。

5. 常见问题与排查技巧实录

5.1 典型问题速查表

问题可能原因检查与解决
记忆保存了但 Claude 像没看到会话未重新加载 context新开会话;用claude-mem context确认注入内容
自动学习完全不工作hooks 没注册成功重跑claude-mem install;检查 Claude Code 配置里的 hooks 段
召回结果全是无关内容标签或关键词匹配不上改用cmm search全量检索;给关键记忆补标签
上下文提示词过长召回条目超限调低max_contexts;清理过期记忆
多项目记忆串场未做 session 隔离显式指定--project-name和--project-root
无法启动或初始化失败Python 版本过低或权限问题确认 Python 3.9+;检查~/.claude-mem/写权限

5.2 我踩过的三个坑,写出来给你们排雷

第一个坑,hooks 装完当前会话不生效。Claude Code 的 hooks 配置基本是在会话启动时加载的,你在旧会话里跑claude-mem install,当前会话并不会热更新。很多人反馈"装了没用",九成是没重新开窗口。记住,装完 hooks 必须新开一个会话窗口。

第二个坑,自动学习的触发时机选错。我第一次把小工具的 hook 绑定在 PostToolUse 上,一个句子引发十几次工具调用,每次调用都触发记忆写入,库里瞬间全是中间态废条目。后来改成 Stop 事件配合 Notification,自动保存的质量才正常。自动化不是越勤越好,触发时机选不准,存下来的全是垃圾。

第三个坑,把临时状态存进长期记忆。有一阵我把"后端正在迁移到新数据库"存进 memories,结果两周后项目早迁移完了,Claude 还拿着旧配置回答连接问题。后来我定了条规矩:带"正在""马上""临时"这类状态词的内容一律进 notes。notes 召回权重低,不会误导长期判断,等状态稳定后再把结论升级成 memories。

5.3 性能表现与隐私边界

性能方面已经说过,本地 SQLite 读写完全不是瓶颈,我这里想重点聊聊隐私。claude-mem 所有数据都在本地,不经第三方服务器,这是很好的基础。但当 hooks 把记忆注入上下文时,记忆内容会随请求发送给模型服务商,这一点任何记忆层工具都无法回避。所以我给自己定了三条规矩:不在记忆库里存密钥、密码、个人信息明文;敏感项目的记忆库单独放加密目录;对敏感项目干脆关闭自动学习。把记忆工具本身当成需要维护的资产,定期备份整个~/.claude-mem/目录,这一点经常被忽略,直到数据库文件损坏或者换电脑时才追悔莫及。

6. 扩展用法:从个人记忆到团队协作的想象空间

6.1 共享记忆库的小团队玩法

虽然 claude-mem 是个人工具,但它的数据库是单文件 SQLite,天然支持共享。小团队可以把记忆库文件放进同步盘,或者定期导出 glossary 和 facts 文本合并到公共目录,形成团队记忆库。具体做法是:成员各自维护个人记忆,团队公共库只放架构决策、术语表、通用规范这类稳定内容,导出后用工具合并入库。合并时一定要指定专人做去重审核,我吃过一次亏,两个人各存了一条含义一致的术语,表述完全不同,召回时 Claude 的理解反而混乱了。这种玩法透明可控,比把组织知识塞给第三方协作平台放心得多。

6.2 把 claude-mem 当通用知识管理工具

用得越深我越觉得,claude-mem 不只是给 Claude 用的,它的 CLI 结构天然适合当个人知识库。我后来会直接用cmm notes add记待办、记灵感,再用cmm search检索,因为四类分层结构比平铺的笔记文件更容易找回目标内容。给 Claude API 的自定义应用接记忆也是这个思路:脚本处理前调用cmm recall拿记忆,处理后再调cmm remember沉淀新结论。等于白嫖一个现成的记忆层,不需要自己从零搭检索系统。做个人 AI 助理类项目时,这个方法能省下大量底层的脏活。

6.3 值得动手的后续扩展方向

对想深入研究的人来说,读一读它的源码,看看 SQLite 表结构怎么设计,能学到不少东西。几个值得动手的方向:给记忆条目加过期时间字段,实现临时记忆自动衰减;把cmm recall输出改成 JSON 格式,方便其他程序消费;监听指定的 Markdown 文件,自动同步文档内容进记忆库,实现"文档驱动记忆"。这些扩展都建立在 claude-mem 清晰的分层设计和开放的数据格式上,改起来并不费劲。

最后说点个人体会。我从第一天把它当成"给 Claude 加记忆的小工具",到现在已经把它用成了每个项目的"会话沉淀档案"。以前过两周就忘得干干净净的技术决策,现在通过cmm search随时能翻出原始记录。我现在每天工作结束前会扫一眼cmm stats,把自动学习生成的条目过一遍,该删的删、该补标签的补标签。工具能替你记住,但替你筛选和判断这件事,最终还是得自己做。如果你也被 AI 失忆折磨过,我建议从手动cmm remember开始,熟悉之后再开启 hooks 自动学习,很快你就会发现,AI 协作的连续感,完全变了一个档次。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询