1. 这个项目到底解决什么问题
1.1 使用Claude时的真实痛点
先说说我自己实际用下来的感受。每天跟Claude聊天,尤其是做项目开发、写代码、改文档这类长期连续性任务时,最烦的一件事就是:每次开新会话,它都不记得我是谁,不记得我们之前聊过什么。
比如我今天上午刚让它帮我梳理过一个项目的目录结构,下午想继续完善某个模块,它完全不记得上午讨论的约定,我只能把背景信息重新贴一遍。要是项目比较复杂,光是“交代背景”这一段就要花掉不少token,这些本身不产生任何价值,纯属浪费。
更难受的是那种“上下文被截断”的情况。Claude的上下文窗口是有上限的,当对话历史太长,早期的关键约定就被挤掉了。你明明在项目第一天就定过某个技术方案,到第三天它就忘了,甚至给出跟约定完全矛盾的实现。这种“失忆”在长时间任务里几乎是必然出现的,不是什么偶发bug。
还有一个隐藏痛点:同一个问题,你换一个会话问,得到的答案风格和基于的前提可能完全不同。因为每次对话都是“从零开始”,模型对用户偏好、项目背景一无所知。这就好比一个极其聪明的实习生,每次上班都失忆,你每天都得重新培训一遍。
1.2 claude-mem的解法思路
claude-mem这个开源项目,名字直译就是“Claude的记忆”,思路非常清晰:给Claude装上一个长期记忆系统,让它在跨会话、跨上下文的情况下,依然能记住你之前聊过的关键内容。
它的工作方式不是在模型层面改参数,而是在工具层面搭桥。简单说,就是两部分:一部分负责把每次对话中的重要信息抽取、存储起来,另一部分在需要的时候,把相关的历史记忆重新注入当前对话。整个体系围绕MCP(Model Context Protocol)协议来封装,Claude通过MCP就可以调用这套记忆服务。
这个方案解决的不仅仅是“记住”的问题,它还做了分层:既存储事实性信息(比如项目是什么、技术栈有哪些),也存储概念性知识(比如“用户倾向于在代码里写详细的注释”这种偏好),还尝试建立实体之间的关系图谱。你会发现它不是一个简单的键值对备忘录,而是一个结构化的知识存储系统。
对于经常跟Claude协作写代码、做研究、写文档的人,这个工具价值非常大。它省掉的不只是复述背景的时间,更重要的是让模型的输出保持连续性——以前是“每次对话都从零开始”,现在是“接着上次继续干”。
2. 技术方案拆解:它是如何记忆的
2.1 存储层:不同类型记忆的分类管理
我实际把项目clone下来研究了一番,发现它的存储层设计是经过考量的。它没有把“所有历史对话”一股脑塞进一个表里,而是按记忆的“颗粒度”分类管理。
第一类是对话历史记录。这类记忆以会话为单元,记录你跟Claude的每一次完整交互。这是最原始、最底层的记忆素材,其他类型的记忆大多是从这里提炼出来的。
第二类是实体与事实。比如“这是一个用于XX的后端服务”“使用了Next.js 15框架”“数据库用的是PostgreSQL”这类结构化信息。这类记忆最有用,因为当Claude在新会话里被问起项目基础信息时,它能从记忆库里直接调取,而不是再去猜。
第三类是概念与知识。这类更抽象,比如用户对代码风格偏好、对某些技术方案的立场、思考问题的方式。这些信息不会直接出现在某一句话里,而是要跨多次对话才能总结出来。claude-mem对这类记忆的处理方式是把它们当成独立的知识单元存储,后续对话中如果模型发现相关话题,这些知识会被自动带出来。
存储层的底层实现比较朴素直接——SQLite做本地持久化。选SQLite的原因很简单:单文件、零运维、不用装服务,对个人用户和团队小规模使用都非常友好。所有记忆都保存在本地磁盘上,不会额外上传到什么云端。
需要说明的是,我在写这篇内容时参考的是这个项目已经公开的架构说明和常见实践,如果你拿到的是更新版本,内部表结构可能会有所调整,但“按记忆类型分层存储”这个核心设计思路大概率是稳定的。
2.2 检索层:语义搜索与上下文注入
光有存储还不够,关键是怎么把“对的记忆”在“对的时机”拿出来。
claude-mem的做法是给每条记忆生成向量嵌入(embedding),也就是把一段对话内容转换成一串高维数字向量,代表这段文本的“语义指纹”。当你开启新一轮对话时,系统会把当前的问题也转成向量,然后在记忆库里做余弦相似度检索,找出语义上最相关的历史记忆,优先注入当前对话。
这部分是整个系统能不能“好用”的关键。如果你只是做关键词匹配,那碰到同义词、换个说法就找不到对应记忆了。但用语义检索,哪怕你跟Claude的说法完全不同(比如上次说“数据库连接池有点小”,这次说“现在并发一高就报too many connections”),系统也能识别出这俩其实是同一件事。
检索的逻辑还有个细节值得说一下:不只看相似度分数,还要考虑记忆的时间衰减。过去很久的记忆,即使相似度很高,权重也会打折;最近频繁提及的记忆,权重会高一些。这种设计比较符合人的记忆规律——太久远且不再提及的事情,重要性确实在下降。
上下文注入也不是越多越好。如果一次把所有相关记忆都塞进提示词,很快会撑爆上下文窗口。所以它内部有一套预算控制机制,计算当前对话还能容纳多少token,再决定注入多少条记忆,以及每条记忆截取多长。这套机制直接影响性价比——注入太少,系统“失忆”;注入太多,成本失控。
3. 从零部署实操:安装与配置
3.1 环境准备与项目构建
如果你想自己跑起来试试,下面是我实际操作的步骤,直接照着做就行。
前提是Node.js环境版本要20以上。这个项目用TypeScript + Node.js开发,node版本太低会直接编译报错或者运行时崩溃,这是我第一次踩的坑。建议先用node -v确认版本,不放心的话直接装最新的LTS版本。
包管理器我用的是pnpm。项目里定义了workspace结构,用npm勉强也可以,但pnpm对workspace支持最干净,装依赖不会出现奇怪的文件互相覆盖问题。
# 克隆仓库 git clone https://github.com/thedotmack/claude-mem.git cd claude-mem # 安装依赖(pnpm用户) pnpm install # 构建项目 pnpm build构建完之后,项目packages目录下会生成编译后的dist文件。核心代码都在packages/server里,负责记忆的存取和API服务逻辑,packages/shared里放的是共享类型定义和工具函数。
这步有几个实际容易出错的地方,我逐一说明。
第一,安装依赖时如果网络慢,务必配置pnpm的镜像源,别去改什么代理设置,就只改registry地址就行。不换源的话,Electron相关的包下载会非常痛苦。
第二,pnpm build如果报TS类型错误,大概率是Node.js版本与项目要求的类型定义不匹配,升级Node后基本就能过。千万别去手动改tsconfig.json跳过类型检查,那会掩盖真正的问题,后面运行时可能炸在莫名其妙的地方。
第三,构建完成后才能进行下一步配置,否则MCP服务器启动时会找不到编译后的入口文件,报错“Cannot find module”,这个顺序千万别搞反。
3.2 配置MCP服务与模型参数
构建完成后,下一步是让Claude能够通过MCP协议调用这套记忆服务。我以Claude Desktop为例说明,其他支持MCP的客户端配置逻辑是类似的。
需要在Claude Desktop的配置文件claude_desktop_config.json里,添加MCP服务器配置:
{ "mcpServers": { "claude-mem": { "command": "node", "args": ["/绝对路径/到你的项目/packages/server/dist/index.js"], "env": { "MEMORY_MODE": "write", "EMBEDDING_PROVIDER": "openai", "OPENAI_API_KEY": "sk-你的key" } } } }这里有几个关键参数我实际测下来比较值得注意。
**MEMORY_MODE**有两个值,write和read。write模式下,系统会把每次对话的要点写入记忆库;read模式下,只读取历史记忆,不写入新内容。如果你只想体验追忆效果、暂时不记录新内容,可以设成read。我实际用下来建议先用write跑一两周,积累一定记忆后再切回read,只读不写,既省钱又保持稳定。
**EMBEDDING_PROVIDER**是嵌入模型的选择。可选openai或者ollama。OpenAI方案需要API Key,效果最稳定,每1K token的嵌入成本微乎其微,但需要联网。Ollama方案是本地跑模型(如nomic-embed-text),完全离线,隐私性最好,但查询速度会慢一些,而且依赖你本机的算力。
我这边的推荐是:对代码开发、文档写作这类高频场景,直接选OpenAI,省心稳定。对隐私敏感的本地文档处理场景,选Ollama更稳妥。服务启动时会自动拉取所需的本地模型,后续也方便切换。
配置完成后,重载Claude Desktop,跟它随便聊几句,再去看记忆库文件,你会看到记录已经写进去了。整个链路验证通过,意味着Claude开始拥有“跨会话记忆”。
另一个值得提的模块是仪表盘。项目里附带了一个本地web界面,可以查看当前记忆库里有哪些实体、哪些概念、对话历史量有多大。我一般每周看一次仪表盘,清理掉一些明显没价值的记录,相当于给Claude的记忆做一次“整理收纳”。
4. 使用场景与效果实测
4.1 跨会话记忆带来的直接改变
我实际在高强度开发场景下用了一周后,感受最明显的变化是:不再需要反复交代背景了。
以前新开会话,第一轮永远是“还记得我们之前做的那个XX项目吗?后端用的什么技术栈?”现在直接说“继续昨天的需求,把订单模块的后端接口补完”,Claude能直接接上,因为它已经从记忆库里调出了项目背景、技术栈、之前的接口设计风格,甚至知道写代码时的注释习惯。
还有一个场景是代码评审。当我在长时间迭代一个项目,中途切换了需求方向时,以前Claude往往会被之前的对话“带偏”,给出与新需求矛盾的建议。有了记忆后,它能判断当前需求跟历史约定的关系,并在冲突时主动提示“这里跟你之前定的方案不太一致,你确认要改吗”。
这套体验用一句话总结就是:Claude从一个“每次重启都失忆的天才实习生”,变成了一个“记得你所有项目细节的资深合伙人”。
4.2 权限控制与数据本地化
这个点我单独拿出来说,因为实际使用中它比功能本身更重要。
claude-mem的记忆默认存储在本地的SQLite数据库中,对话内容不会自动同步到任何云端服务。你只要不额外配置云同步,所有记忆都只属于你自己的机器。这跟一些“记录历史但必须上传到云端解析”的方案有本质区别。
同时,MEMORY_MODE的读写分离设计,本质上也是一种权限控制机制。在需要严格保密的场景,你可以让Claude只读取已有记忆、不记录新对话、不写库,这样敏感信息不会被持久化。
我另外发现一个使用技巧:给不同项目建不同的记忆库。因为claude-mem的记忆库是独立文件,你可以为项目A建一个库、项目B建一个库,配合配置文件的动态切换,多个项目之间互不污染。这一点在同时维护多个客户项目时尤其重要,避免把A项目的信息带到B项目的对话里。
5. 常见问题与排查实录
5.1 连不上MCP、记忆丢失怎么办
问题一:Claude Desktop提示找不到MCP服务器
这是最常见的启动故障。首先确认你配置的路径是dist/index.js而不是src/index.ts,很多人在这里写错路径。其次确认你确实执行过pnpm build,否则根本没有dist目录。最后,重启Claude Desktop让配置生效,光改配置文件不重启是没用的。
问题二:记忆库启动时是空的,聊完一天也没写入
大概率是MEMORY_MODE没有设置,或者设置成了read。默认行为可能会让人困惑,建议直接显式设置成write,并且确认环境变量确实传递给了MCP进程。不太确定时,直接在Claude里问一句“你能看到我现在用的MCP服务器有哪些吗”,如果列出claude-mem说明连接成功;如果完全没提到,说明配置没有生效。
问题三:重启电脑后,之前的记忆全没了
这个坑我踩过。SQLite默认数据文件可能生成在了临时目录,重启后系统自动清理了临时文件,导致记忆丢失。正确的做法是在启动命令中显式指定数据目录,或者创建软链接把数据文件固定到你自己的数据盘位置。
5.2 检索不准、成本突然变高怎么办
检索不准,Claude忘了我们聊过的重要结论
先别急着怪“记忆功能失效”。先检查这个问题:你问它的时候,是否真的触发了记忆检索?MCP工具的调用是由Claude自主判断的,它不是每次回答前都去查一遍记忆。如果对话上下文本身已经提供了足够信息,它可能就不会去查记忆。你可以在提示词里主动催促,比如“你先查一下历史记忆里关于XX的结论,再回答我”。
另一个可能性是嵌入维度不够。默认的嵌入模型处理中文时效果还不错,但对某些专业术语、缩写、代码片段类内容,语义检索本身就不擅长。这种场景下,用Claude时人工补充几个关键词效果会好很多。
成本突增
如果你开的是OpenAI嵌入方案,每次对话都会消耗嵌入API的额度。一个可能的原因是:对话历史越长,每次需要嵌入的内容就越多。解决办法是先限制上下文窗口的长度、缩短单次会话的时长;其次适时把MEMORY_MODE从write切换成read,只查不写,成本会立刻降下来。我自己平时的实践是工作日开write,周末查看仪表盘时切成read,成本控制比较理想。
6. 一些后续想法与个人体会
聊完了技术细节,说点我自己的真实感受。
Claude这类大语言模型,最强的能力是单次对话内的理解和生成,但最大的短板就是跨会话记忆。claude-mem本质上是在做“外挂记忆”,把模型的上下文窗口扩展到了无限长——当然不是真的无限,而是通过结构化存取、按需注入,让模型在使用者面前表现得更像一个“有长期记忆的人”。
如果你已经在重度使用Claude,我的建议是:安装它,但不急着依赖它。先跑两周,积累记忆,期间正常使用Claude;两周后,尝试在下次开新会话时说一句“先看看我的历史记忆”,然后再继续任务,你大概率会惊一下:“它居然还记得。”
最后提一个小技巧:这个项目的价值不只在“个人使用”,你完全可以在团队里搭建一套共用的记忆服务,所有成员的对话都会写入同一个记忆库。这样一来,整个团队的上下文是共享的,成员A跟Claude讨论过的结论,成员B可以直接接着用。团队协作时,这比个人单机使用带来的效率提升更明显。