
如果你最近在用 Claude Code 写项目大概率遇到过这样的情况上午还和它聊得清清楚楚的架构方案下午新开一个会话它就像失忆一样把所有上下文清零你得把项目背景、技术栈、之前拍板定过的事重新讲一遍。尤其是一个跨了几周、动辄几百个文件的长期项目每次重开会话那段“身份自我介绍”最磨人。claude-mem 就是冲着这个问题来的它要给 Claude Code 补一层跨会话的持久记忆让 AI 助手记住你项目里的事实、偏好、决策和未完成事项。这篇文章我从头到尾讲清楚 claude-mem 是什么、它的记忆机制怎么运作、怎么接到 Claude Code 里以及我实际使用中踩过哪些坑。1. 先搞清楚 claude-mem 到底解决什么问题1.1 无状态会话带来的重复劳动Claude Code 默认是无状态的它每次对话都从一个干净的上下文开始。模型确实很强但它不会自动记住你上周说的“支付模块统一走第三方网关”这种话。你需要在每次会话里重新灌入背景或者在 CLAUDE.md 之类的文件里手工维护项目说明。短平快的脚本项目问题不大但一旦项目进入中期上下文信息会分成好几种项目结构、技术选型、代码风格、待办清单、被否决过的方案、客户偏好这些如果都靠人工维护很容易漏掉而且 Claude Code 在长会话里能记住的事一多上下文也会被撑爆。我一开始的解决办法是维护一个特别长的项目说明文件把每次重要对话的结论粘贴进去。但文件越写越长几千字之后 Claude Code 每次启动都要读一遍既费 token 又费时间而且我经常忘记更新。后来我意识到问题的本质不是“我懒得写”而是“没有一个好用的机制让 AI 自己积累记忆”。claude-mem 的定位正好是这一层它在 Claude Code 旁边挂一个持久化记忆服务跨会话保存重要信息并在合适的时候把相关记忆重新塞回对话里。1.2 记忆到底该存哪些内容用了一段时间之后我把值得交给 claude-mem 的内容分成四类。第一类是项目硬事实比如技术栈、目录职责、数据库类型、第三方服务的 API key 在哪个环境变量里。这类信息一旦确认基本不会变是每次会话都需要的基础背景。第二类是架构决策包括“选了 A 方案而不是 B 方案因为性能/成本/维护性原因”。这类信息最有价值因为 Claude Code 重新发起一个会话时很可能基于当前代码状态提出一个和之前相反的方案如果没有记忆它甚至会把自己推翻。第三类是个人偏好包括代码风格、缩进、命名规则、commit message 格式、测试怎么写。这些偏好通常不会写在文档里但每次新会话都得重新解释纯属浪费。第四类是进行中的工作状态比如正在重构某个模块、还有三个 TODO 没处理、下一步计划是什么。这类信息时效性强但对连续开发很有用。claude-mem 不是简单地把聊天记录全文保存它是把记忆做成可检索的记录每次只召回和当前任务相关的部分。这一点比“把所有历史对话都拼到上下文里”高效得多。1.3 为什么选择 claude-mem 而不是手写提示词有人可能会说我已经用 CLAUDE.md 加自定义系统提示词管理记忆了为什么还需要额外工具我的体会是手写提示词能解决“静态记忆”但解决不了“动态获取”。你可以让 Claude Code 每次读一个固定文件但文件内容需要人手工更新你忘记更新它就不知道。而 claude-mem 提供的是工具接口Claude Code 可以在对话过程中调用它的工具主动写入记忆也能在需要时搜索记忆。这种“由 AI 自己操作”的方式减轻了人的负担。而且 claude-mem 走的是 MCP 协议这套协议可以接入不只一个客户端。这意味着同一个记忆后端今天接 Claude Code明天接其他支持 MCP 的工具理论上都能复用。作为开发者我比较喜欢这种不绑定死一家的设计。2. claude-mem 的记忆原理一个本地 MCP 服务器做了什么2.1 它并不是一个普通插件很多人听到“记忆工具”第一反应以为是一个 Prompt 模板或 Chrome 插件但 claude-mem 的核心是一个 MCP Server。MCP 的全称是 Model Context Protocol它定义了一套可以让大模型客户端和外部工具通信的标准化接口。Claude Code 启动时会自动发现并连接 MCP 服务器之后模型就可以通过调用工具来读写记忆。也就是说claude-mem 不是靠提示词让模型“假装记得”而是给模型增加了一个真实的数据库接口。我在自己机器上跑的时候把 claude-mem 理解成一个本地服务进程它和 Claude Code 通过 stdout 或 HTTP 通信。模型在对话中想记住一个事实就调用类似 remember 的工具想查找相关记忆就调用类似 search 的工具。整个过程对用户来说几乎是透明的你正常跟 Claude Code 对话它在背后自动完成记忆的存取。2.2 存储层怎么设计SQLite 加向量索引claude-mem 的存储层设计并不复杂却非常实用。它通常使用一个本地数据库文件来保存结构化记忆SQLite 是首选因为单文件、零配置、跨平台对个人项目足够轻量。每一条记忆记录至少包含几个核心字段内容文本、所属项目、创建时间、最后访问时间、额外的元数据标签。这样一个库可以同时存多个项目的记忆查询时按项目隔离即可。只有文本还不够因为模型在对话中产生的需求是语义级的。比如你问 Claude Code “我们数据库选型定了吗”它搜索出来的不应该只是包含“数据库”字面的记忆还应该包含“PostgreSQL”“MongoDB”“ORM”这类语义相关的记录。所以 claude-mem 在写入每条记忆时会同时生成一个嵌入向量把文本转换成高维空间里的坐标。查询时把问题转成向量再通过向量相似度召回最相关的记忆。这个思路和 RAG检索增强生成基本一致。SQLite 存结构化数据向量索引负责语义召回两者结合的好处是既能用精确过滤条件比如按项目、按时间范围筛选又能做模糊语义匹配不至于因为关键词对不上就找不到记录。我在实际使用中明显感觉到这种混合检索比单纯用关键词 grep 靠谱很多。2.3 记忆如何被触发显式写入、自动摘要、相关性召回claude-mem 的记忆写入和读取不是只靠一条路。它至少支持三类机制。第一类是显式写入。你在对话里直接说“记住支付密钥统一从环境变量读取不要写死在代码里”Claude Code 调用 claude-mem 的工具把这条内容存入数据库。这类记忆通常带有明确的关键词和结论召回价值很高。第二类是自动摘要。claude-mem 可以在一次会话结束前或者在上下文超过一定长度时对当前对话生成摘要把讨论结论、未解决问题提炼出来写入记忆。这个功能我一开始不敢开怕摘要质量不稳定后来测试了几次发现只要对话主题集中摘要基本能用。第三类是相关性召回。新会话开始后Claude Code 会先向 claude-mem 搜索和当前任务相关的记忆把 top k 个结果注入本次上下文。这个召回可以发生在对话开始时也可以发生在每一轮用户输入之前。搜索时机越频繁记忆越新鲜但也会增加延迟需要根据自己的项目权衡。2.4 向量搜索为什么不神秘向量搜索这个概念听起来高大上其实可以这样理解你把每句话变成一个点聊“苹果”的句子和聊“水果”的句子离得近聊“苹果手机”的句子又是另一团点。claude-mem 把用户的问题也变成一个点然后在已经存储的点里找最近的那几个点再把对应文本交给 Claude Code。距离越近语义越接近。这个过程的计算量其实不大因为个人项目的记忆量通常只有几千条在本地跑一个嵌入模型完全够用。如果项目特别大还可以用独立的向量数据库但 claude-mem 的默认方案对绝大多数个人开发者已经足够了。我测试过一个持续三个月的中型项目记忆库大概两千条检索延迟几乎可以忽略。3. 安装并把 claude-mem 接进 Claude Code 的完整步骤3.1 安装前需要准备的运行环境在装 claude-mem 之前最好先确认两个东西一是 Claude Code 客户端已经能正常命令行使用二是 Python 环境版本满足要求。目前常见版本的 claude-mem 是基于 Python 的所以我以 Python 版为例说明其他语言版本的操作思路大同小异。我推荐使用虚拟环境不要直接装到系统级 Python。我一开始图省事直接 pip install后来因为系统里多个项目共用依赖版本冲突搞得头大。你可以在项目目录下创建一个虚拟环境之后再启动 claude-mem 时指定该环境的 Python 路径。还需要决定嵌入模型怎么跑。claude-mem 通常支持本地模型和远程 API 两种方式。本地模型一般通过 Ollama 加载比如常用的文本嵌入模型优点是免费、离线可用、数据不出本机缺点是要占几百 MB 内存。远程 API 则更省内存适合机器性能不足的开发者但需要网络且可能产生费用。我建议如果你有独立开发机优先用本地模型省事且隐私性更好。3.2 三步完成安装和初始化安装过程本身并不复杂我按实际操作顺序把它拆成三步。第一步安装 claude-mem 本体。在虚拟环境里执行 pip 安装命令把程序下载到当前环境。装完之后先不要急着启动先跑一下 claude-mem init它会检查路径并生成默认配置文件。初始化的目的是创建记忆数据库目录和配置文件模板避免后续启动时因为找不到路径而报错。第二步根据你选择的嵌入模型修改配置。默认配置一般指向本地 Ollama 服务。打开生成的配置文件确认模型名称是否和本地已拉取的模型一致。比如本地拉取的是 nomic-embed-text配置里也要写成这个名字。如果你用的是远程嵌入 API那你需要把 provider、endpoint、key 等字段填清楚建议先用环境变量引用 key别把密钥写在配置文件里。第三步启动 claude-mem 服务并注册 MCP。启动之前可以先手动跑一下 claude-mem serve确认进程能正常起来没有端口冲突或路径错误。确认没问题后在 Claude Code 里注册这个 MCP 服务器。具体路径有两种方式一是通过命令行交互注册二是直接编辑 MCP 配置文件。我更推荐编辑配置文件清晰可控方便团队共享。配置片段大概是这样的{ mcpServers: { claude-mem: { command: /path/to/venv/bin/claude-mem, args: [serve], env: {} } } }这里的关键是 command 路径一定要指向虚拟环境里的可执行文件而不是系统全局路径否则很可能出现找不到依赖的情况。注册完成后重启 Claude Code让它重新加载 MCP 配置。3.3 验证配置是否真正生效完成以上步骤后不要急着一头扎进项目对话先做一个轻量验证。你可以直接问 Claude Code“你有哪些记忆工具可以调用”正常情况下它应该能列出 claude-mem 提供的几个工具名。如果它什么都不列那就说明 MCP 注册没有成功。我自己的验证习惯是先故意让 Claude Code 记住一句很特别的话然后退出会话重新进一个新会话问它“我之前让你记过什么特殊句子”。如果它能把那句话准确复述出来说明整个链路已经通了。这里要特别注意别拿真实机密信息做测试因为一旦写入本地数据库后续跨会话都可能被检索到。3.4 关键配置项的含义与推荐值用了几次 claude-mem 之后我把最常用的几个配置项整理成了下面的表方便你对照调整。配置项作用推荐值storage_dir记忆数据库存储目录独立的项目数据目录不要用临时目录embedding_model文本转向量用的模型本地模型优先离线环境可用top_k召回时返回的记忆条数3 到 5 条比较合适太多会占上下文similarity_threshold语义相似度最低阈值0.4 左右低于该值的记忆不注入auto_summarize是否自动摘要会话内容根据是否需要跨会话延续决策决定project_filter是否按项目隔离记忆强烈建议开启top_k 这个值我试过调成 10结果每次会话前面呼啦啦塞进来一堆记忆有效信息被冲淡。3 到 5 条足够除非某个任务确实需要多个历史决策再临时让它搜索。similarity_threshold 太低会导致无关记忆混进来太高又会漏掉有价值的信息0.4 是我实践下来比较平衡的起点。4. 日常使用和召回调优的实操经验4.1 怎么让 Claude Code 主动记住关键决策不少人装上 claude-mem 之后的第一反应是我是不是得在每次对话里手动说“记住”这个词其实不需要那么机械但前期确实需要一些明确的提示。我个人做法是在做任何一个会影响后续工作的决定时直接补一句“这个决定很重要记录下来”。比如让 Claude Code 改某个模块的接口我会说“我们决定把用户状态接口改成只读这个记到项目记忆里。”Claude Code 会调用记忆写入工具。过了几天如果我再在另一会话里提到这个模块它就能把之前的决定重新拉回来。如果你想更省事也可以在项目说明里约定一套规则例如在 CLAUDE.md 中写“当你在对话中确定一个架构决策时使用记忆工具保存”这样 Claude Code 会自己在每次决策后主动保存。我试了两周这个方式的缺点是偶尔会把一些琐碎内容也存进去优点是基本不用我操心数据库里能形成比较连续的项目历史。我建议在日常使用中交叉使用两种方式重要节点显式要求保存零散信息交给自动规则。这样既不会漏掉关键决策也不会存太多垃圾记录。4.2 召回质量差怎么办从三个方向调优如果你发现 claude-mem 虽然存了记忆但每次新会话召回的都不够准确不要急着换工具先做三件事。第一检查记忆内容本身。很多召回失败是因为存进去的内容太粗糙比如“改掉对接问题”这种表述语义模糊后面搜“支付流程怎么对接”肯定匹配不上。记忆应该写成完整句子包含主体、决定、背景。比如“支付回调改为由订单服务统一处理对接方不再直接调第三方 SDK”这样的表述语义明确召回率会高很多。第二调整相似度阈值和召回条数。如果经常出现“有点相关但不够用”说明阈值太低把无关记忆也带进来了。如果经常一条相关记忆都没有说明阈值太高可以适当下调。配合 top_k 把候选范围控制在合适的数量一般能解决大部分问题。第三检查嵌入模型是否适合你的语料。如果项目里全是中文技术文档嵌入模型必须支持中文否则语义匹配会非常差。我踩过这个坑最开始用了一个主要为英文训练的模型中文技术词汇匹配得一塌糊涂后来换成一个对中文支持更好的模型召回效果立刻改善。4.3 多项目隔离别让一个项目的记忆串到另一个项目claude-mem 默认存储路径只有一个数据库文件如果多个项目都用同一个存储库记忆之间很容易串味。我在实践里强烈建议开启项目隔离也就是让数据库按项目名或仓库路径分目录或加标签。具体操作就是在初始化时给不同项目起不同的存储目录或者在提交记忆时带上项目名。这样你在 A 项目里问的问题绝不会把 B 项目的决策拉出来。否则你可能会遇到一个很魔幻的场面明明在做电商订单系统Claude 却把 CMS 项目里讨论过的缓存方案当成是这个项目的决策。我现在的习惯是每个仓库在首次使用 claude-mem 时都初始化一个独立的记忆空间记忆内容自动带上仓库名。这样既保证隔离也能在需要做跨项目对比时手动指定搜索范围。4.4 在 CI 和团队场景下怎么用claude-mem 的一个隐藏价值是它可以把整个团队的共同记忆沉淀下来。团队里几个人各自用 Claude Code 改同一个项目如果能共用一个记忆存储那大家做决定时就能参考同一个基础。我自己在小团队里试过做法是把 claude-mem 的存储目录指向一个共享网络盘或有同步机制的文件目录同时开启项目过滤。但这里要注意并发写的问题。SQLite 在多人同时写入时可能会出现锁竞争所以团队共享模式下频率很低的写入没问题高并发写入就要考虑迁移到真正的数据库后端。另外共享存储意味着所有参与者都能看到彼此的记忆有时候这会让写进去的内容变得太随意需要约法三章只记项目级事实不记针对个人的评价。这可能听起来有点过于严格但实际协作中很有必要。5. 常见问题与排查实录5.1 明明配置了但 Claude Code 就是找不到 claude-mem这个问题我遇到过不止一次原因是注册 MCP 的路径不对。Claude Code 启动时会按配置里的 command 去启动进程如果 command 指向的 Python 环境缺少依赖或者路径里带空格没有正确加引号进程就会启动失败。此时 Claude Code 可能不会直接报错而是默默少了几个工具。排查思路是先手动在终端里执行配置里的 command 和 args看看能不能正常启动。如果手动也失败说明依赖或路径有问题。如果手动成功但 Claude 里找不到就要看配置文件的格式特别是 JSON 里路径字符串是否合法。还有一个容易忽略的点修改了配置文件后必须重启 Claude Code它不会热加载 MCP。现象可能原因排查方向工具列表为空MCP 注册失败检查 command 路径和依赖服务进程反复退出存储目录不可写检查权限和目录是否存在记忆存取成功但重启丢失使用了临时存储目录把 storage_dir 改成持久目录模型能聊但不能搜索嵌入模型服务未启动检查本地的文本嵌入模型是否加载5.2 记忆存了不少但新会话还是“失忆”这往往不是 claude-mem 没工作而是召回时机和阈值设置不对。我最早以为只要存了记忆下次对话一定会自动带上后来发现并不是。默认情况下新会话会主动搜索一次但搜索的关键词由 Claude Code 根据用户第一句话判断。如果第一句话很简短比如“继续”它不知道该搜什么就召不回任何记忆。解决方法是开场多说几个关键词或者主动问 Claude 是否记得项目里某个约定。你也可以在项目配置里设置一个固定前缀让 Claude Code 每次开始前都先搜索最近更新的记忆把项目的当前状态作为背景带到上下文。另外检查一下 similarity_threshold 是否设置得太严格导致搜索出来的记忆都被过滤掉了。5.3 本地嵌入模型加载慢或内存占用过高本地嵌入模型的好处是免费可控但如果你用的模型比较大加载速度就会很慢内存也可能拉满。我第一周用了一个比较大的模型内存占用直接超过 2GB开发机风扇狂转严重影响了体验。后来我换了一个更轻量的文本嵌入模型速度提升非常明显。如果本地模型实在带不动可以用远程嵌入 API 替代把向量化部分外包出去。需要注意使用远程 API 时记忆文本会发送到第三方服务如果项目保密性高还是别这么干。5.4 数据库越滚越大记忆越来越脏项目持续几个月后记忆库会积累大量过时内容比如某个临时方案已经废弃但还留在库里。这时候每次召回都会把这些历史垃圾带进上下文既占空间又干扰判断。claude-mem 一般没有很智能的自动清理机制所以需要定期整理。我习惯每两个月删一次明显过时的记忆或者把所有记忆导出成可读文件人工审核一遍后只留精华。批量删除的时候要小心先用搜索确认针对某个项目的记忆范围再操作。如果你特别在意记忆的整洁度也可以在写记忆时利用标签系统给每条记忆标注“决定/偏好/待办/已过期”后续召回时通过元数据过滤。这样即使库里有一万条记忆活跃部分也始终是干净的一小撮。5.5 隐私和密码类信息要格外小心这是我最想提醒的一点。claude-mem 就像一个大笔记本它会忠实地保存一切你让它存的内容包括密码、密钥、客户私密信息。我之前见过有人把数据库密码和 API Key 直接丢在对话里然后让 Claude 记住结果这些敏感信息躺在了本地明文数据库里一旦文件泄露就是事故。我的建议是在 CLAUDE.md 或项目记忆规则里明确写一条不要记录任何密码、密钥、个人身份信息。如果确实需要让 Claude 知道某个环境变量存在可以只记变量名不记值。涉及生产系统的内部拓扑和安全控制的相关决策也尽量不要进入长期记忆。本地数据虽然比云端可控但还是那句话所有明文存储都有风险越少越好。另外如果要同步记忆库到备份盘或团队共享目录记得做加密。SQLite 文件本身是明文别人拿到文件就能读这一点和普通数据库文件没区别。加密或者用系统磁盘加密是更稳妥的做法。我的最终体会如果让我评价 claude-mem我会说它解决了一个很真实但容易被忽视的问题大模型对话的上下文不应该是一次性的项目开发过程中的知识和决策更不应该被浪费。装上 claude-mem 之后最明显的变化不是每一次对话都变得更聪明而是我不需要反复向 Claude Code 解释“我们之前是怎么定的”。这种体感在长期项目里非常舒服就像给团队新成员配了一本自动维护的交接文档。最后再分享一个小技巧别把记忆工具当成神它只是帮你降低上下文重建成本的组件。该在 CLAUDE.md 里写明的基础架构还是要写该在做复杂改动前自己梳理的逻辑还是要梳理。claude-mem 最适合承接的是那些“今天说了、明天还要用”的动态内容把这些内容从人脑和文档里解放出来它就已经物超所值了。