claude-mem:为Claude Code构建长期记忆,告别AI编程上下文丢失
1. 项目概述与定位先说结论claude-mem是给 Claude Code 用户的第二大脑它的核心功能是在你使用 Claude Code 写代码时自动记录对话上下文、关键决策、项目约束和代码模式把这些信息持久化到本地存储里让 Claude 在后续对话中能想起你之前说过什么、做过什么、为什么这么做。我用这个工具已经有一段时间了最初只是抱着试试看的心态因为当时遇到一个很现实的痛点用 Claude Code 干一个中大型项目时会话一长它经常会把早期聊过的技术选型、接口约定、踩过的坑忘得一干二净。我不得不反复在对话里粘贴背景资料甚至开一个新的会话后又要重新解释一遍项目背景。这种重复劳动非常消耗耐心而claude-mem就是冲着解决这个问题来的。它的适用人群很明确日常重度使用 Claude Code/Claude CLI 的开发者。不管你是做前端、后端、DevOps 还是数据工程只要你在一个项目里和 Claude 有超过十几个来回的深度协作就会体会到记忆断层的折磨。claude-mem做的事情就是把这些断层补上它监听你和 Claude 的交互把有价值的上下文自动归档再通过一个/mem命令让 Claude 在需要的时候主动去检索这些历史记忆。从定位上说这个工具不是又一个笔记软件也不是单纯的日志记录器。它的设计目标很具体做 LLM 编程助手的上下文管理层。你可以把它理解成一个记忆持久化层放在 Claude 和你的项目之间。没有它的时候Claude 的上下文窗口就是它的全部记忆窗口关了就忘了有了它记忆被沉淀到本地文件甚至向量数据库里成为跨会话、可查询、可检索的长期资产。2. 技术架构与核心设计2.1 三个组件的分工方式claude-mem并不是一个单体程序它拆成了三个各自独立的组件这在我看是它最值得学习的地方。第一个组件是采集器用 Rust 写的。它监听 Claude Code 的会话输出流把对话中的关键内容——比如用户的需求描述、Claude 给出的方案、执行过的命令、修改过的文件列表——筛选后写入本地状态目录。用 Rust 来做采集器的原因很实际它需要一个常驻进程级别的性能和稳定性同时启动快、内存占用低不会给你的开发环境添堵。第二个组件是后端服务用 Go 写的。这层负责更重的活儿把采集到的原始记录做结构化整理生成摘要、计算嵌入向量、写入 SQLite 数据库同时暴露一个 HTTP 接口供客户端查询。Go 在这里的定位是内存和并发的管家因为摘要生成和向量化是需要并发的稍有规模的日志量下单线程逐个处理会明显拖慢 Claude 的响应Go 的 goroutine 模型非常适合这种 I/O 密集又带点 CPU 计算的任务。第三个组件是 CLI 客户端用 Python 写的。它负责你直接打交道的所有操作查询历史记忆、手动添加记忆、查看记忆桶列表、和 Claude Code 的 MCP 集成。Python 在这里选得没什么悬念——生态成熟、写交互式 CLI 快而且 MCP 协议相关的 SDK 对 Python 的支持最完善。三个组件独立部署、各管一摊好处是显而易见的如果你只想用记忆查询功能可以只跑 CLI 和数据库不启动采集器如果你想自己写采集逻辑后端提供了 API不需要动 Rust 那边。这种分层设计让每个组件都保持简单降低了单点故障的风险。2.2 记忆持久化与语义检索的原理claude-mem默认把记忆存在本地的 SQLite 数据库里路径通常在~/.claude-mem/下面。SQLite 的选择很务实它不需要额外跑一个数据库服务文件即库、备份即拷贝对单机开发场景足够可靠。但光有 SQLite 成不了记忆系统它只解决存储问题不解决检索问题。claude-mem真正的核心是语义检索层它会在写入记忆时计算嵌入向量embedding把文本转成高维向量然后在查询时用向量相似度找出语义上最接近的历史记录。嵌入向量怎么算它给了你灵活的选择优先是 OpenAI 的text-embedding-3-small在本地没有 API key 的情况下也可以用OLLAMA_HOST配上本地跑 Ollama 服务的 nomic-embed-text 模型完全离线这一点对注重隐私的场景特别友好。默认使用 ChromaDB 作为向量存储后端配合 SQLite 存元数据。查询时做语义相似度匹配再结合时间过滤和星级权重把最相关的记忆排在前面。这里有个细节值得注意claude-mem不只是无脑记录所有对话内容它会先做一轮摘要。每次的原始对话记录会被压缩成几条要点式的记忆条目比如用户决定采用 PostgreSQL 而非 MySQL理由是事务一致性需求高然后是代码模式所有数据库访问都通过 repository 层。这种摘要式记忆的好处是即使原始上下文窗口早已滚动掉关键决策依然以结构化形式保留后续检索时信噪比高得多。2.3 记忆桶的设计按主题分类的底层逻辑claude-mem引入了记忆桶memory buckets的概念。用大白话说就是把记忆分门别类放好不全部塞进一个大池子里。默认有几个桶决策记录decisions、代码模式patterns、项目上下文project_context、用户偏好preferences。为什么需要分桶因为不同性质的记忆有不同的生命周期和检索频率。技术选型决策可能在半年后还会被问到具体某段代码的写法可能两周后就过时了用户偏好则基本是长期稳定的。如果混在一起检索向量相似度很容易被高频出现的短期内容带偏导致你要的关键信息被噪音淹没。桶的设计还带来一个操作上的好处手动管理记忆时只用在/mem remember 内容 --bucket decisions这样的命令里指定目标桶比让 AI 自动归档分类要可控得多。自动归档经常分错类但手动分桶给了你一个明确的干预入口。我自己的习惯是自动采集进来的记忆先不动等需要手动补充时再精确指定桶。3. 安装部署与基础使用3.1 环境要求与安装步骤claude-mem对环境的依赖很克制实测下来基本是装完就能用的体验。安装前你需要准备Python 3.10 或更高版本这是 CLI 客户端和安装脚本的运行时。Rust 工具链用于编译采集器组件如果不想装 Rust可以直接下载预编译的二进制。网络环境能访问模型 API 或本地 Ollama 服务具体取决于你选哪种嵌入向量方案。安装过程官方推荐用 pip 装 Python 包再通过一行命令完成后端和采集器的部署。我在 macOS 和 Ubuntu 两套环境都试过没有遇到过编译阻塞。唯一要注意的是如果你之前用过旧版本升级后要把旧的 SQLite 数据库备份再做迁移官方在 0.3 之后的版本改过数据库 schema直接覆盖会有兼容问题。装完之后第一件事是本地跑一下claude-mem --version确认三个组件都在线。接着你需要初始化配置目录生成一个config.toml里面可以指定默认的记忆桶、嵌入模型、数据库路径等。我的建议是嵌入模型在本地有 Ollama 就直接选本地模型省去 API 费用和网络延迟如果追求更高检索精度再切到 OpenAI 模型。3.2 CLI 常用命令与日常操作CLI 的命令设计很直白用过一次基本就能记住。我最常碰的几个命令claude-mem list查看当前库里所有记忆条目支持按桶过滤和按时间排序。claude-mem search 关键词用语义检索查找相关记忆。claude-mem remember 内容 --bucket decisions主动把一条决策写入记忆库适合记录我刚才和 Claude 讨论出来的约定。claude-mem select进入交互式选择模式从检索结果里挑出几条作为当前对话的上下文注入。claude-mem tail查看最近写入的原始记录用来确认采集器有没有正常工作。实际操作中最惊艳我的是search的召回质量。有一次我搜索加密方式crypto返回的结果里不仅有 AES-GCM 加密方案 那天的决策记录还带出了更早的一条用户提到不要用自研加密算法的偏好。这种跨时间、跨桶的语义关联是传统 grep 方案完全做不到的。3.3 和 Claude Code 集成的 MCP 方式claude-mem和 Claude Code 的集成走的是 MCPModel Context Protocol模型上下文协议。简单说这条协议让 Claude Code 在运行时可以调用claude-mem提供的工具就像调用函数一样。集成后你可以在对话里直接输入/mem开头的命令实现让 Claude 自己查记忆的效果。配置 MCP 的常规做法是把claude-mem的 MCP server 声明加到 Claude Code 的配置文件里。Windows 上路径一般是%USERPROFILE%\.claude.jsonmacOS/Linux 则是~/.claude.json或项目目录下的.mcp.json。声明内容大致是让 Claude Code 知道怎么启动这个 MCP server并允许它调用search_memories、save_memory、list_buckets这几个工具。集成之后的体验会有一个质的飞跃以前是我发现 Claude 忘了背景手动把上下文粘贴给它现在是 Claude 在遇到不确定的领域时主动去查记忆库。比如你在新会话里说继续昨天的用户认证模块Claude 会通过 MCP 搜索到昨天关于认证方案的决策记录直接基于当时的约定继续写代码而不是再问你一遍需求和背景。提示MCP 配置关闭再开启后Claude Code 需要重启会话才能识别新的工具。别在会话中途改配置然后抱怨没生效这是我踩过的坑。4. 实操过程部署一个可用的记忆系统4.1 从零到一一次完整的部署实录拿我最近接手的一个小型 Web 服务项目当例子完整走一遍部署和配置流程。项目背景是一个 Python FastAPI 应用我在用 Claude Code 做迭代开发。由于这个项目会横跨好几周、涉及多次重构我预判记忆断层会非常影响效率所以决定引入claude-mem。第一步安装 Python 包。我建了一个虚拟环境避免污染全局 Pythonpython3 -m venv ~/.venvs/claude-mem source ~/.venvs/claude-mem/bin/activate pip install claude-mem第二步初始化配置。运行claude-mem init后它在~/.claude-mem/config.toml生成了默认配置。我改了三处db_path从默认的memory.db改成~/.claude-mem/projects/web-service/memory.db按项目隔离记忆库避免多个项目的语义互相干扰。embedding.provider设为ollamaollama.base_url指向http://localhost:11434模型用nomic-embed-text。这样完全离线数据不出本机。collection_interval_ms设置为 5000采集器每 5 秒从 Claude Code 的会话中拉取一次新内容。太低会增加 CPU 开销太高会漏掉短对话实测 5 秒在响应性和资源占用之间比较平衡。第三步启动后端服务和采集器。在项目根目录下分别执行claude-mem serve --db-path ~/.claude-mem/projects/web-service/memory.db claude-mem watch --output jsonserve启动 Go 后端监听默认端口watch启动 Rust 采集器实时捕获 Claude Code 的输出。如果你用的是 Claude Code 的 headless 模式或非交互模式采集器也能通过解析输出日志工作。第四步验证采集是否正常。我在 Claude Code 里和 Claude 讨论了十几轮关于数据库选型的内容——最终决定用 PostgreSQL原因是需要复杂事务和全文检索能力。然后我在终端执行claude-mem list --bucket decisions输出里能看到 Claude Code 自动归档的数据库选型决策记录且内容摘要足够精确。那就是采集链路正常工作了。4.2 参数调优的经验心得在部署过程中我试过几组不同的参数组合分享几个真实体会。嵌入模型的选择直接决定检索质量。Ollama 的nomic-embed-text在本地跑速度快、免费、离线可用但它的语义能力相比 OpenAI 的text-embedding-3-small还是有差距。实测下来在代码关键词联想场景中两者都够用但在模糊意图查询场景比如搜上次讨论的性能问题OpenAI 模型的召回明显更准。我的方案是开发阶段用 Ollama攒了大量历史记忆后切到 OpenAI 模型跑一次全量重索引平时查询继续用本地模型。当然这个方案适合个人开发者的低成本场景。max_memory_size参数我遇到过坑。默认值是 500意思是单个记忆条目最多 500 字符。一旦你的对话摘要超过这个长度多出的部分会被截断。在某些关键决策里截断掉的可能恰恰是选型理由。我的建议是把它调大到 2000 左右代价是存储空间多占一些但语义完整性显著提升。4.3 手动管理记忆的正确姿势自动采集解决记录问题但记什么、怎么记的主动权还是要握在自己手里。我的经验是定期做一次手动记忆整理效率比完全依赖自动分析高得多。每次项目做到一个里程碑比如完成一轮重构、确定一个架构方案我会手动执行几条命令补充记忆claude-mem remember 当前项目使用三层架构API 层 - 服务层 - 仓储层禁止在 API 层直接操作数据库 --bucket patterns claude-mem remember 用户要求所有接口返回统一格式 {code, message, data} --bucket project_context这样做的价值在于自动采集只能从已有的对话中提炼但有些隐含约定从未在对话里明确说过——比如你在项目初期就默默定了所有异常必须从服务层抛出这类信息只有你自己知道。手动写入能把这些隐性知识固化下来以后 Claude 在写代码时就能参考到。配合claude-mem select我还能在开新会话前主动选择几条关键记忆注入上下文让 Claude 一开始就带着背景工作。这个动作比在对话开头粘贴大段说明文档优雅得多也不污染对话记录。5. 常见问题与排查技巧实录5.1 采集器静默失效的排查用了大约一周后我发现claude-mem list --recent一直是空的新对话完全没有被记录。一开始怀疑采集器进程挂了后来排查发现是输出格式问题。我在.claude/settings.json里给 Claude Code 设置了 JSON 输出模式而 JSON 输出默认走的是结构化流采集器 Rust 组件实际上是通过解析文本输出来捕获上下文的对 JSON 流的解析兼容性不是很好导致内容被静默丢弃。解决办法是在 Claude Code 的配置里关闭 JSON 模式或者使用采集器的--format json参数去对接。如果你的使用场景必须用 JSON 输出比如自动化脚本里建议在命令里显式指定输出格式来匹配采集器的期望。另一个常见的静默失效原因是权限问题。claude-mem会写~/.claude-mem目录如果你用sudo启动了 Claude Code采集器进程就变成了 root 身份访问不到你普通用户目录下的记忆库反过来也一样。权限错乱导致的写不进去和读不出来往往是这类工具最隐蔽的坑。5.2 查询结果不准确的应对策略语义检索偶尔会给出让人哭笑不得的结果。比如我搜数据库连接池调优返回的第一条居然是用 Redis 做缓存的记录。这类噪音让我明白了一个道理向量相似度擅长找语义相近但不擅长理解意图完全不同但词汇重叠的内容。应对策略有三层第一层精确限定检索范围。搜索时指定--bucket project_context或--time-filter last_30d能大幅减少不相关桶的干扰。第二层主动给记忆条目做洗白。如果某条自动采集的摘要质量太差——比如把多个决策揉在了一条 500 字符的摘要里——我会直接用claude-mem update修改这条记录把它拆成更细、更明确的条目。这里花了点时间但在后续查询时收益非常明显。第三层重建向量索引。更新claude-mem版本或发现搜索结果异常后我会执行claude-mem reindex这个命令会重新计算库里所有记忆条目的嵌入向量。在切换嵌入模型之后必须执行这一步否则旧条目还带着旧模型生成的向量和新条目混在一起检索相似度会失真。5.3 数据库体积膨胀的处理使用半年后我的memory.db涨到了差不多 200MB查询速度明显下降。排查发现采集器把大量原始对话文本也存进了数据库表里这些原文是向量化前的基础数据但每条几千字符累计起来非常占空间。处理方法是定期做记忆清理。我按月归档把超过 90 天、且没有标记为重要星级低于 3的原始记录删除保留摘要表和向量索引。这样数据库体积可以压到 50MB 以内查询响应速度明显恢复。清理前记得备份数据库。我吃过一次亏直接删了原始记录表结果摘要里引用到的关键细节没法回溯原文了。现在我的规矩是不删原文把原文移动到归档库archive.db活动库只保留几个月的数据。6. 使用心得与扩展方向6.1 让记忆工具真正提升效率的三个习惯工具装好、命令会用只算入门真正让claude-mem发挥作用靠的是三个使用习惯。第一个习惯是开新会话前先查记忆。每次开工前我会执行claude-mem search 本次任务的关键词 --limit 5花一两分钟浏览历史相关决策然后挑出一条最重要的记忆注入到对话里。这样 Claude 从第一轮对话开始就基于上下文工作而不是猜。第二个习惯是每次重要决定后主动落一条记忆。不用等自动采集讨论完一个技术方案后我立刻用claude-mem remember写一条结构化摘要。这样即使自动采集漏掉或摘要质量差至少有一条人工把关的高质量记录。第三个习惯是定期给记忆做体检。我每两周花十分钟浏览claude-mem list --all删除过时条目、修正错误条目、合并重复条目。记忆库是活资产放任不管就会积灰定期维护才能保持检索质量。6.2 可以扩展的方向claude-mem目前的功能已经解决了我的核心痛点但它还有不少可以往上叠加的能力。一个是团队协作场景。现在记忆库是本地单机存储如果能支持共享存储或同步机制整个团队的历史决策、架构约定就能沉淀为团队的集体记忆。新人也通过检索记忆来了解项目脉络降低交接成本。另一个是自动摘要的增强。目前摘要生成依赖 LLM而 LLM 的摘要粒度有时候不够理想。如果能在摘要层加入规则比如把变更的文件路径、关联的 Issue 编号、提交 hash这类结构化字段单独提取出来记忆的查询和回溯价值会提升很多。已经有用户在仓库的 issue 区提了类似需求后续版本的看点会集中在这里。再有一个方向是把记忆库接入更多 AI 编程工具。虽然官方主攻 Claude Code但底层 MCP 协议是通用的理论上兼容支持 MCP 的 Cursor、Cline 等工具。只要配置好 MCP server多工具共享同一个记忆库使用者就能在跨工具的工作流里维持统一的上下文。这是很让人期待的方向。7. 写在最后一点个人的评价用claude-mem这段时间最深的感受是它解决的不是多存一点的问题而是让 AI 更懂上下文的问题。AI 编程助手在单次会话内的表现已经足够好真正让人烦躁的是跨会话的失忆——你上星期跟它确认好的架构约定、接口返回格式、数据库命名规范一周后被忘得一干二净。claude-mem把这个问题从能不能记住变成了你的项目背景有没有沉淀下来这才是它最大的价值。如果你已经重度依赖 Claude Code 做开发我强烈建议花半小时装一个试试先跑一个完整的小型任务体验一遍采集、检索、注入的闭环再决定是否持续使用。工具本身的上手成本很低但要把记忆系统用好需要你养成主动维护的习惯。这个投入在项目周期变长、团队协作变复杂之后会换来相当丰厚的回报。