ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Claude Code 装不上记忆?用 claude-mem 打造 AI 第二大脑

Claude Code 装不上记忆?用 claude-mem 打造 AI 第二大脑

如果你跟我一样,每天都泡在 Claude Code 里写代码、看代码、让 AI 帮忙改 bug,那你一定经历过这种崩溃:上一个会话里明明刚约好“这个项目的测试统一用 vitest,别用 jest”,结果新开一个会话,它一脸无辜地反问“你说的测试命令是指哪个?”。说实话,我被这种“金鱼记忆”折腾了快两个月,直到我翻到一个叫 claude-mem 的开源项目才算解脱。

claude-mem 简单来说,是给 Claude 生态加装一个“持久化记忆层”。它不是一个模型,也不是普通插件,而是以 MCP 服务器的形态运行在你的机器上,自动把对话里的用户偏好、项目约定、常用命令、关键决策提取出来,存进本地数据库;下次开新会话,再通过语义检索,把跟当前任务相关的历史记忆拉回来。听起来就很“第二大脑”对不对?这篇文章我就围绕 claude-mem 讲清楚三件事:它到底解决了什么痛点、内部是怎么工作的、以及我实际接入工作流时的完整步骤和踩坑记录。

不管你是被 AI 助手的“失忆”折磨到无语的开发者,还是刚接触 MCP 生态想看看“模型 + 工具”到底能玩出什么花样的新人,这篇文章应该都能给你一些可以直接照抄的参考。

1. 先搞清楚:claude-mem 到底解决什么问题

1.1 真实痛点:上下文窗口不是记忆库

很多人有个误解,觉得 Claude 的上下文窗口很大,所以它应该“记得住”东西。但上下文窗口本质上是临时工作台,不是硬盘。会话一旦关闭,这个工作台就被清空了。哪怕你的对话历史还在客户端里显示,模型在新会话里依然无法主动访问这些内容。

这就导致了一个非常低效的工作模式:每天开工先粘贴项目背景、说明代码结构、重申测试命令、强调别碰哪个目录……等这些事情讲完,上午就过去一半了。更难受的是多项目并行,我经常在同一天里切换两三个仓库,每个项目都要重新“调教”一次 AI。有时候约定特别复杂,比如“prisma schema 改了必须同步 migration”、“提交信息按 conventional commits 写”,这种规则靠人肉重复交代,漏一次就会得到完全跑偏的回答。

claude-mem 的切入角度很有意思:它不去试图扩大上下文窗口,而是把“记忆”做成一个独立的外部系统。对话中已经讲过的规则、偏好、决策,自动沉淀到本地数据库;下次会话需要的时候,再把相关的历史片段作为辅助信息提供给模型。这样 Claude 不需要记住所有事情,只要在需要时“查得到”就够了。

1.2 项目定位:给 AI 助手装一个“第二大脑”

如果你从架构角度看,claude-mem 的定位非常清晰:记忆中间件。它夹在 Claude 和本地数据之间,一边监听/接收对话内容,一边把有价值的信息抽象成结构化记忆。

它做的工作可以拆成三块。第一是“捕获”:从对话流里识别出哪些句子算长期信息,比如“以后项目里都用 pnpm”、“后端接口统一走 /api/v1”、“我们决定不用 Redis 改用内存缓存”。第二是“存储”:把这些信息分类、清洗、去重,写入本地数据库,并生成向量索引。第三是“检索”:在新会话产生时,根据当前问题从记忆库里找出最相关的那几段,交还给 Claude 做参考。

什么样的场景最适合用这套方案?我列一下我的判断:

  • 重度使用 Claude Code 写代码、做 code review、跑自动化任务的人;
  • 在 Claude Desktop 里做资料整理、写作,希望 AI 保持你个人风格和习惯的人;
  • 对 MCP 生态好奇,想把“模型应用 + 外部能力”做成一套可复用架构的工程师;
  • 一个人维护多个项目,每次切换上下文都痛苦不堪的开发者。

如果你的使用场景只是偶尔在网页版聊几句,那 claude-mem 对你来说有点大材小用,普通对话历史基本够用了。但只要你开始依赖 AI 做持续性工作,它就会变成一个“用了就回不去”的组件。

2. 核心原理拆解:记忆是怎么被记住的

2.1 从“听”到“存”再到“用”:记忆的三段流水线

我最初以为 claude-mem 就是“把所有对话存下来,搜索关键词”,后来仔细看了它的设计才发现,远没那么简单。它内部是一个三段式流水线:捕获、存储、检索。

捕获阶段,claude-mem 作为 MCP server 接收来自 Claude Code 或 Claude Desktop 的交互事件。它不是把所有内容一股脑存起来,而是先做“信息筛选”:哪些句子值得长期保留?这句话是用户随口说的,还是一个明确的偏好?例如“这个函数有点问题”显然不值得记,但“以后所有新组件都用 Function Component,不要用 Class Component”就是一条高价值项目约定。这一过程通常会结合规则模式和分类模型,把原始文本切成短片段,再逐个判断类型。

存储阶段,筛选出的记忆片段会写入本地数据库。每条记忆不只存文本,还会附带元信息:记忆类型、所属项目、来源会话、创建时间、重要性权重等。与此同时,系统会对片段内容做向量化嵌入,生成一个高维向量,存进向量索引。这个嵌入向量是后面语义检索的基础。

检索阶段,当新对话需要记忆支撑时,claude-mem 会把当前任务的表述也做向量化,然后在历史记忆向量空间里做相似度搜索,找出 Top-K 条最相关的记录,再返回给 Claude。整个过程是按需抽取,而不是把整个记忆库倒进上下文,这一点非常关键——否则上下文窗口再大也会被历史记录塞满。

2.2 为什么是 SQLite + 向量检索,而不是普通数据库

我第一次在 README 里看到 SQLite 的时候,第一反应是“2025 年了还用 SQLite?”后来想明白了,对 claude-mem 这种个人工具来说,SQLite 几乎是完美选择。

首先是零运维。SQLite 就是一个单文件数据库,不需要装服务、配端口、管理账号。备份就是复制一个文件,迁移就是换个目录存放。这对本地工具来说太重要了,我不想为了一个记忆插件去维护 MySQL。其次是性能,单机场景下 SQLite 的读写速度完全够用,配合索引查个记忆,响应时间基本在毫秒级。最后是可移植性,记忆库文件可以随便复制、同步、归档。

但光有 SQLite 还不够,因为记忆的核心是“语义匹配”。想象你某天问 AI:“上次那个诡异的报错原因是什么?”如果用关键词检索,“诡异报错”这样的描述大概率匹配不到原始记录里的“UnhandledPromiseRejectionWarning”。向量检索解决的就是这个问题:把文本转换为向量后,语义相近的句子在向量空间里距离也近。所以 claude-mem 这类工具普遍采用“SQLite 存结构化数据 + 向量索引做语义召回”的组合,一个负责精确管理,一个负责模糊理解,各干各的活。

2.3 MCP 协议:让 Claude 用上“外挂记忆”的关键

要理解 claude-mem 为什么一定要用 MCP,得先说清楚 MCP 是干嘛的。MCP,全称 Model Context Protocol,是给 AI 应用和外部工具之间定义的一套标准接口。它的核心思想是客户端-服务器模型:Claude 这类应用作为 MCP 客户端,各种外部能力作为 MCP 服务器,两边通过标准 JSON-RPC 通信。

你可以把 MCP 理解成“AI 世界的 USB-C”。以前各家模型要接入外部工具,都是各写各的私有接口,每换一个模型就得重新适配;有了统一协议之后,只要你实现了 MCP server,任何支持 MCP 的客户端都能直接用。claude-mem 就是这样一个 server,它对外暴露读记忆、写记忆、搜记忆之类的工具。Claude 在对话过程中如果判断“这个问题可能需要历史记忆”,就会调这些工具,而不是靠上下文里躺着的一堆旧文本。

这种设计带来一个巨大好处:记忆是按需注入的。模型不会在每次请求里都背上几百条历史记录,而是在需要时才查到那两三条相关记忆。从 token 成本和回答准确性两个角度看,这都远比“把历史全塞进 prompt”要健康。

2.4 记忆的分类体系:不是倒垃圾,而是结构化沉淀

如果用久了你会慢慢体会到,claude-mem 对记忆的分类设计得很讲究。它大致会把记忆分成这么几类:

  • 用户偏好:你的代码风格、命名习惯、喜欢哪个框架、不喜欢哪种写法;
  • 项目约定:项目的目录结构、接口规范、环境变量约定、特殊约束;
  • 常用命令:测试命令、构建命令、部署命令、数据库迁移命令;
  • 关键决策:为什么选择 A 方案而不是 B 方案,当时权衡了哪些因素;
  • 架构信息:模块边界、数据流、依赖关系这类相对稳定的上下文。

这种分类的意义在于,不同类别的记忆在召回策略里权重是不一样的。比如你在写业务代码时,项目约定和用户偏好的优先级应该高于某次具体 bug 的排查记录。部分实现还会给记忆标上“重要性等级”或“置信度”,那些提取程序自己都不太确定的片段,往往会被标记为待确认,甚至直接丢弃。

我印象很深的一点是,claude-mem 的整体思路是“宁缺毋滥”。与其把几百条低质量笔记全存进去,不如只保留几十条高价值、高确定性记忆。记忆库一膨胀,检索噪声就会变大,最后模型反而被一堆不相关历史带偏。这个取舍很值得其他做 AI 工作流的人借鉴。

3. 实操记录:从安装到第一次被“记住”

3.1 准备环境:先看版本,再动手

在敲安装命令之前,得先确认两件事:Node.js 版本够不够,以及你本机是否已经装了 Claude 生态的客户端。claude-mem 是用 Node/TypeScript 那套技术栈写的,所以需要本机有一个较新的 Node 运行时。我目前用的版本是 Node 20,跑起来很顺;如果你还在用 Node 16,大概率会遇到语法或依赖兼容问题,建议先升级。

第二条是把 MCP 客户端准备好。对多数人来说,就是 Claude Code 或 Claude Desktop。claude-mem 本身不负责跟用户对话,它只是一个记忆服务;没有 Claude 客户端,它就没有用武之地。

准备工作做完后,安装一般走 npm 全局安装。不过要提醒你,这类开源项目迭代非常快,包名、命令、配置项可能隔几个月就变一次。我这里的示例是基于我实际使用时的版本,你动手的时候,一定先打开项目 README,以里面的安装命令为准。别嫌麻烦,这一步能省掉后面一堆“怎么装不上”的折腾。

3.2 接入 Claude Code:自动配置优先,手动配置兜底

装好之后,最省心的接入方式是跑 claude-mem 自带的安装向导。以我当时的使用经验,claude-mem --install这类命令会自动帮你把 MCP server 注册到 Claude 的配置文件里。运行完成后,重新启动 Claude Code,它会在工具列表里识别到 claude-mem 提供的记忆能力。

如果你的版本没有提供向导,或者你想手动干预,就需要在 Claude 的 MCP 配置里添加一条 server。配置文件本质是一个 JSON,大致长这样:

{ "mcpServers": { "claude-mem": { "command": "npx", "args": ["-y", "@devshah/claude-mem"], "env": { "MEMORY_DIR": "~/.claude-mem" } } } }

这里有几个点需要解释一下。用npx是为了让 Claude 在启动时自动拉取并运行 claude-mem,省去手动维护全局路径的麻烦。MEMORY_DIR是记忆库存放位置,我习惯把它指向用户目录下的隐藏文件夹,这样所有项目共享一套默认记忆空间。如果后面想做项目隔离,这个值可以换成各自项目的路径。配置完保存,重启客户端,应该就能看到 MCP server 状态变成已连接。如果没连上,多半是 npx 路径解析问题,或者 Node 版本不兼容,先别急着改配置,跑一下诊断命令看看输出。

3.3 快速验证:它是真的记住了,还是装装样子

装完东西,我最关心的只有一个问题:它到底能不能真的跨会话记住?我建议你按我下面的三步来验证,整个过程五分钟内搞定。

第一步:在一个新会话里,明确地跟 Claude 说一句带“记住”指令的话,比如“记住:这个项目的测试命令是 pnpm test:unit”。注意这里的关键词是“记住”,手动触发记忆写入比依赖 AI 自动判断要可靠得多。第二步:正常结束这个会话,然后新开一个会话,直接问“这个项目的测试命令是什么”。第三步:如果它准确回答出了pnpm test:unit,说明整条链路是通的。如果它没答上来,可以去记忆库里手动搜一下,用类似claude-mem search "test:unit"的命令,看这条记忆到底有没有写进去。写进去了但没召回,多半是检索权重问题;根本没写进去,那就是捕获环节出了问题。

我到现在都记得第一次验证通过时的感觉,虽然只是一个小小的命令,但它意味着“让 AI 长期记住我的习惯”这件事从理论变成了现实。后续我又试了项目结构、代码风格、API 约定几类信息,效果都很稳。

3.4 常用命令速查:日常维护就靠这几个

用了一段之后,有几个命令是我每天都会碰到的。整理成一张速查表,版本不同可能名字略有差异,但功能基本上大差不差:

命令作用我的用法
claude-mem ls列出当前记忆库里的所有记忆每周检查一次有没有过时条目
claude-mem search "关键词"手动执行语义搜索验证某条记忆是否已入库
claude-mem disable关闭当前会话的记忆写入聊敏感内容或临时讨论时用
claude-mem enable重新开启记忆写入配合上一条成对使用
claude-mem reset清空全部记忆记忆库太乱时推倒重来
claude-mem doctor检查环境与配置状态任何异常动作的第一步
claude-mem logs查看运行日志排查问题时翻后台日志

我特别推荐把doctor当成“重启试试”之外的第二个万能答案。MCP 工具没连上、记忆不写入、配置改了没生效,先跑一次 doctor,它通常会直接把问题指出来,比你对着文档猜要快得多。

4. 进阶玩法与使用心得:从“能用”到“好用”

4.1 按项目隔离记忆,避免“串味”

默认情况下,claude-mem 会把所有记忆放在同一个库里。听起来省事,但实际用下来你会发现一个大问题:项目 A 的约定会污染项目 B 的上下文。比如你在 React 项目里跟 AI 约定“组件文件用 .jsx 后缀”,转头切到 Vue 项目,这个记忆很可能被错误触发,导致 AI 给你推荐完全不合适的规范。

我的做法是给每个重要项目单独分配一个记忆目录,比如通过环境变量设置MEMORY_DIR指向/path/to/project/.claude-mem。这样每个项目都有独立的记忆空间,互不干扰。代价是每次切项目前要改配置,但习惯了也就两秒钟的事。如果你用同一个编辑器插件管理多项目,也可以写个脚本根据当前项目路径自动切换环境变量,体验会更好。

还有一点:如果你在团队里用 Claude 写代码,可以让所有人都把MEMORY_DIR指向同一个共享目录,比如公司网络硬盘。这样团队的项目约定、常用命令会被沉淀成一份“公共记忆”。不过要小心:多人同时写入同一个 SQLite 文件会有并发问题,偶尔会出现“锁库”报错。更稳的方案是定期把某个人整理好的记忆库同步给其他人,而不是几个人同时在线写同一个库。

4.2 记忆质量控制:别让 AI 变成什么都记的“垃圾桶”

用了一两周之后,我最大的体会是:claude-mem 的最大风险不是记不住,而是记太多。

自动捕获机制虽然智能,但无法完全理解人的意图。有时候你只是在讨论一个临时方案,说“要不我们试试把 Redis 换掉”,AI 可能就把“项目决定不用 Redis”存进去了。下次再聊缓存设计,它就会拿出一条根本没有最终确认的“决策”,导致回答建立在一个错误前提上。

控质量有两个比较实用的手段。第一个是在对话里区分“讨论”和“决定”:跟 AI 讨论时,加上“先别记,这只是讨论”;真正定下来之后,再说“记住:我们决定xx”。第二个是定期人工审查,用claude-mem ls把所有记忆列出来扫一遍,看到明显过时或者只是临时讨论的内容,直接删掉。我自己的频率是每周一次,每次大概花两三分钟,但换来的是记忆库长期保持高纯度,检索准确率一直在线。

4.3 不只是 Claude 专属:把 claude-mem 嵌进自动化流程

很多人以为 claude-mem 只能跟 Claude Code 搭配,其实它的核心是一个标准 MCP server,所以理论上所有支持 MCP 的客户端都能用。这意味着你可以把它当成一个通用的“记忆基础设施”来设计自己的 AI 工作流。

举个例子,我在项目里做了一个简单的脚本:每次 CI 构建失败时,自动把报错信息和修复过程通过 MCP 工具写进记忆库。下次 Claude 分析同类报错时,就能直接检索到“上次遇到这个问题时是怎么解决的”,相当于让 AI 拥有了项目的“踩坑经验史”。这个玩法本质上把记忆从“对话副产品”变成了“工程资产”,我觉得这才是 claude-mem 最值得挖掘的地方。

当然,换个角度,如果你用的 AI 编程工具支持 MCP,也可以把 claude-mem 指向它,让那些本来不带记忆功能的工具也能跨会话记住你的偏好。这种“一套记忆服务喂所有模型客户端”的架构,是我个人认为 MCP 生态里最有价值的场景之一。

4.4 和 CLAUDE.md 配合:静态规则 + 动态记忆的分工

Claude Code 本身支持一个叫CLAUDE.md的项目说明文件,你可以在里面写“永远不要修改 /generated 目录”、“接口请求必须做参数校验”这类静态规则。很多人的误区是把所有东西都写进 CLAUDE.md,结果文件越长,越容易被模型忽略关键信息。

我的实践是分一层工:静态、稳定、团队共识的内容放CLAUDE.md,因为它需要被所有人统一看到;动态、个性化、跟具体实践紧密结合的内容交给 claude-mem。比如“项目使用 pnpm”“线上环境变量在 .env.production”——这些放文件;“我习惯测试文件命名为 xxx.spec.ts”“上次你说这个模块用 TDD 写了几天”——这些放记忆。静态文件做基准,动态记忆做补充,两者配合起来才是完整的上下文体系。

5. 踩坑记录:常见问题与排查技巧实录

5.1 问题速查表:遇到过的问题和解决方向

用 claude-mem 这段时间,我在社区和自己的环境里遇到不少问题。我整理了一张速查表,按“症状 → 可能原因 → 解决建议”的方式排列,应该能覆盖 80% 的常见场景:

症状可能原因解决建议
MCP server 启动失败,报Cannot find moduleNode 版本过低,或全局包安装不完整升级 Node 到 20+,重新全局安装,再跑 doctor
Claude 工具列表里看不到 claude-memMCP 配置没注册成功,或配置 JSON 路径写错检查 mcpServers 配置段,确认 command 路径可用
对话里说了偏好,新会话完全不记得记忆捕获未触发,或当前会话被 disable在对话里显式说“记住:...”,确认记忆文件已生成
检索结果跟当前问题对不上记忆库太杂,向量召回噪声高清理低质量记忆,给记忆分类打标签,必要时直接 reset
启动后很卡,磁盘占用越来越大向量索引和日志膨胀定期 reset 旧数据,把日志输出级别调低
配置改了但没生效客户端缓存了旧配置重启客户端,或重新运行安装向导
多人共享记忆目录时报错SQLite 并发写入冲突不要多人同时写同一库,改为定期同步记忆文件

5.2 我的几个使用心得,都是真金白银换来的

最后聊几个比较主观的体验,这些是文档里不会写、但实际使用非常关键的点。

第一条:你想让它记住什么,最好直接说“记住”。虽然 claude-mem 号称自动提取,但 AI 再聪明也猜不透你哪句话是随口吐槽、哪句话是想长期生效。自从我养成“重要约定都以‘记住’开头”的习惯之后,记忆库里几乎再没出现过垃圾条目。这个小小的行为改变,比任何配置优化都管用。

第二条:敏感信息别进记忆库。因为记忆检索返回的片段会原样进入 Claude 的上下文,你如果在对话里说“我的数据库密码是 xxx,记住这句话”,那不光是存进本地文件的问题,还意味着这条敏感信息未来可能被随机检索出来、展示给模型。安全边界一定要自己守住。

第三条:每次升级前先备份记忆库。claude-mem 迭代很快,功能越来越强的同时也可能调整存储格式。我的习惯是升级前把MEMORY_DIR目录复制一份,升级后如果发现数据异常,随时可以回滚。这个操作十秒钟搞定,却能避免最坏情况下的重头再来。

第四条:记忆库也讲究“断舍离”。我最早用的时候,一周就存了几百条记忆,结果检索出来的东西经常让 Claude 逻辑混乱。后来狠心 reset 了一次,只保留真正稳定、反复出现的约定,效果反而好了几个档次。质量永远大于数量。

如果你打算上手 claude-mem,我建议你从“记住测试命令”这种最简单、最不容易出错的需求开始。跑通一遍之后,再逐步往里加项目约定、用户偏好、架构决策。这个东西的厉害之处不是它单个功能有多强,而是随着使用时间拉长,记忆库会成为你和 AI 之间越来越默契的“共同语言”。我现在每天开工第一件事,已经不需要重新交代背景了,直接说“开始干活”,它就知道该用哪套测试命令、遵守哪条代码规范。这种感觉,比“上下文窗口变大十倍”实在多了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进