如果你用过 Claude 一段时间,大概都经历过这种尴尬:前一天晚上聊得热火朝天,把项目背景、技术栈、个人偏好、踩过的坑交代得清清楚楚,第二天打开新会话,Claude 彬彬有礼地问候“你好,很高兴认识你”,然后一切归零——之前那些对话细节,全被模型机制清空了。刚开始我还能自我安慰,这是上下文窗口的限制,没办法。直到我在 GitHub 上翻到 claude-mem 这个开源项目,才发现“给 Claude 装长期记忆”这件事,其实早就有人给出了可落地的解法。
简单说,claude-mem 是一个基于 MCP(Model Context Protocol)的本地记忆服务端。它能把你的对话历史自动存到本地,并在新一轮对话里按需把相关记忆重新“喂”给 Claude。装上之后,Claude 会记得你的名字、你的项目进度、你讨厌哪种回答风格,甚至能跨天、跨项目地保持上下文连贯。这篇文章我会从痛点背景、架构原理、安装配置、日常玩法、存储选型和踩坑避雷六个角度,把 claude-mem 完整拆一遍,希望能帮你省下那些反复自我介绍的时间。
1. 为什么我迫切需要给 Claude 装上“记忆”——先说说痛点
1.1 Claude 的“金鱼记忆”到底有多痛
先说个最典型的场景。我平时用 Claude 写代码比较多,经常是白天把某个模块的设计思路聊清楚,晚上关电脑,第二天早上想接着聊。结果新会话一开,Claude 对昨天的讨论毫无印象。我甚至遇到过更崩溃的:我明确说过“这个项目用 FastAPI,不要引入 Django”,结果第二天它依然是给出一个 Django 的目录结构。不是它不听话,而是模型本身在每次新会话里就是一张白纸,这也被大家调侃为“金鱼记忆”。
这个问题在个人使用场景下只是浪费时间,但在长期项目里简直是灾难。你想想,如果每次开工都要把项目背景、代码风格、约定规范、技术选型重新打一遍,那对话效率至少打了五折。我试着把这些资料写进系统提示词(System Prompt),但项目一多,提示词越来越长,上下文预算越占越狠,真用到实际对话的时候,系统反而变笨了。也试过把重要信息复制到自定义指令里,但这是一个纯手动的方案,只要忘了整理,记忆就断了。
1.2 claude-mem 是怎么解决这个问题的
claude-mem 的思路和“把资料写进提示词”完全不同。它做了一层独立的记忆层:所有对话内容在本地落盘,存储成结构化的记忆条目;然后在对话过程中,通过 MCP 工具让 Claude 自己去检索、调取相关记忆。用一句大白话说,它不是在后台帮你把历史记录偷偷塞给模型,而是给模型提供了一个“查旧档案”的工具——模型自己决定,什么时候翻档案、翻哪一份档案。
MCP 这个名字听起来唬人,但本质很好理解。你可以把它想成一个标准的 USB-C 接口:以前每个外设都要接专用接口,现在大家统一成一个协议,鼠标、键盘、硬盘都能插同一个口。MCP 就是给 AI 应用定义了一个统一的“外设接口”,claude-mem 就是其中一个“硬盘外设”。Claude 通过 MCP 接口访问 claude-mem,就像电脑通过 USB 读取移动硬盘,自然就能读到“上一轮对话写了什么”。
这套设计有一个很大的好处:记忆不是一股脑全塞进去,而是按需读取。不会因为历史太长而把上下文撑爆,也不用担心无关的旧话题干扰当前对话。我第一次跑通的时候,最直观的感受是:第二天再问 Claude“还记得我们昨天定的技术方案吗”,它真的能回忆出准确的细节,那一刻确实有点惊喜。
2. claude-mem 的架构拆解:记忆到底存在哪、怎么被想起来
2.1 三个核心组件:MCP Server、存储层、用户档案
claude-mem 的架构不复杂,拆开看就是三块各司其职:MCP Server、存储层、用户档案(User Profile)。
MCP Server 是入口,负责和 Claude 通信。Claude 调用工具时,它会收到请求、执行检索、把结果返回给 Claude。存储层是记忆的物理载体,可以是 SQLite 数据库、JSON 文件,也可以是你自己搭的 PostgreSQL。用户档案则是一份长期稳定的身份与偏好说明,Claude 每次启动对话都会优先读取这份档案,相当于给它一份“关于这个用户的基本人设”。
这三者叠加以后的效果,和我们人类的记忆模型很像:短期记忆(当前对话内容)靠上下文窗口,长期记忆(历史事实、偏好)靠 claude-mem,而用户档案则是我们自我介绍时说的那句“我是谁、我在干嘛”。我一开始只顾着装记忆,没细看用户档案的作用,后来把个人背景写进 user.md,Claude 的回答质量明显上了一个台阶,因为它从一开始就在用“了解你的口吻”而不是“初次见面的陌生人”口吻。
2.2 记忆的写入、压缩和检索
来看 claude-mem 处理记忆的完整流水线,我按“写入 → 压缩 → 检索”三步拆解。
写入是自动的。每次对话结束,MCP Server 会把这段对话内容写入存储层。如果你用的是 SQLite,记录就落在本地数据库里。这个过程不需要手动干预,属于“闭眼自动记账”。但要注意,它保存的是对话内容本身,并不是只有摘要,所以长时间使用以后,数据库会越来越大。
压缩是节流阀。记忆太大,Claude 的上下文窗口吃不下,也可能检索到一堆不相关的噪音。claude-mem 默认开了压缩(compression)机制,会把长段记忆摘要化处理,控制最终进入上下文的 token 数量。这个阈值是可以调的,默认值相对保守,就我之前实测,500 到 1000 之间是比较平衡的区间。设太小,记忆太笼统,比如“我们讨论过项目”,设太大,又可能把无关细节也带进来。
检索是灵魂。当你在对话里说“还记得我们上次聊的方案吗”,Claude 会调用 claude-mem 的检索工具,在本地存储里做相关度匹配,把最相关的历史记录捞出来。检索是基于相似度计算的,不是简单关键词匹配,所以哪怕你的说法和原文不完全一致,它也能找到对应内容。第一次实测的时候,我说了一句“上次那个布丁的做法”,而原对话里写的是“焦糖布丁配方”,它依然准确捞出了记录,当时我对这套机制的稳定性就有了底。
2.3 和 Claude 原生功能、Artifacts 的区别
有人可能会问,Claude 新版本不是也支持记忆了吗,为什么还要用第三方工具?这个区别很关键。
Claude 平台上的原生记忆,更多是“账号级别”的偏好记忆,它是跟着账号走的,由官方服务端维护,你看不到底层内容,也很难主动控制哪些该记、哪些不该记。而 claude-mem 是本地、透明、可控的:记忆存哪、怎么检索、哪些能进上下文、哪些该删,都是你说了算。Artifacts(代码/文档工件)则是“产出物”的交互容器,负责实时展示代码和文档,跟“记住过去”完全是两码事。
对我来说,选 claude-mem 的核心理由是数据主权。我可以在自己机器上随时翻阅记忆库,导出备份甚至迁移,而不用依赖官方账号体系。这种感觉就像在本地写笔记和存在别人的云笔记里,安全感完全不一样。
3. 从零安装到接入 Claude Desktop:完整配置过程
3.1 环境准备与 npm 安装
claude-mem 是 Node.js 写的,所以第一步是确认 Node.js 环境。实测下来 Node.js 20 及以上版本最稳妥,低于 18 会遇到模块解析问题。检查版本的方法:
node -v npm -v环境没问题后,直接 npm 全局安装:
npm install -g claude-mem装完后验证一下:
claude-mem --help这一步如果提示“command not found”,大概率是 npm 全局路径没进系统 PATH。可用npm config get prefix查全局安装路径,比如返回/usr/local,那命令就在/usr/local/bin/claude-mem,把它补充进 PATH 再重开终端即可。
3.2 初始化与首次记忆测试
安装只是第一步,之后要先初始化,让 claude-mem 生成默认配置和目录结构:
claude-mem init初始化完成后,默认会创建~/.claude-mem/目录,里面包含配置文件、用户档案文件和存储数据。你可以直接编辑配置文件做个性化调整,比如改存储后端、调压缩参数。第一次启动不用急着改设置,先用默认配置跑一轮对话,确认基础流程通顺,再慢慢调优。
想快速检验记忆是否生效,最直接的方法是让 Claude 记住一句话,然后在新会话里追问。我当时是让 Claude“记住我不吃香菜”,然后新开一个会话问它“我吃香菜吗?”。第一次测的时候,它回答得有点犹豫,我检查了下会话,发现 MCP 配置生效但记忆检索没有在每轮自动触发,需要在对话里显式提到“记住”相关语义才会触发回忆。这个细节我会在第 4 部分详细展开。
3.3 接入 Claude Desktop 的 MCP 配置
现在主流的接入方式是把 claude-mem 作为 MCP 服务器注册进 Claude Desktop。配置文件路径因系统而异:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
在配置文件里的mcpServers字段下新增一项:
{ "mcpServers": { "claude-mem": { "command": "claude-mem", "args": ["--mcp"] } } }保存后必须彻底退出 Claude Desktop 再重新打开,不是关闭窗口那么简单,是退出进程。这一步很多人踩坑——改完配置发现没生效,就是因为只把窗口关了,进程还在后台。重启后再确认对话界面里能看到 MCP 连接状态,如果没出现,优先检查 JSON 格式是否合法(多余逗号都能害死人),再看 command 路径是否正确。
3.4 接入 Claude Code
如果你用的是 Claude Code 命令行工具,配置更简洁,一条命令搞定:
claude mcp add claude-mem -- claude-mem --mcp这条命令的本质,是把 claude-mem 注册为 Claude Code 的 MCP 服务端。接入后,在 Claude Code 会话里也能用@claude-mem触发记忆检索。我日常写代码更依赖 Claude Code,所以这个通道我用得比 Desktop 还频繁。两种接入方式可以同时存在,互不干扰,记忆库也是共享的,因为数据都落在同一台机器的同一存储后端。
4. 日常使用心得:@claude-mem 的触发哲学与玩法
4.1 显式触发:“@claude-mem”到底怎么用
claude-mem 最常见的用法,是在对话里写@claude-mem,然后跟上你的问题。比如:
@claude-mem 我们上次讨论过的数据库选型结论是什么?Claude 看到这个指令,就会调用记忆检索工具,把相关的历史记录翻出来回答。这种方式的好处是“按需调用”,不会每轮对话都占用检索资源和上下文空间。我习惯在开启一个新话题、或者遇到明显需要旧上下文的问题时,才会显式打上@claude-mem。相当于你跟助手说:“去翻一下档案再回答我。”
有些版本支持给@claude-mem加参数,比如指定搜索范围、按时间过滤、按项目搜索。虽然不同版本的可用参数略有差异,但核心逻辑是一致的:给你一个可控的检索旋钮,而不是让 Claude 盲目地满库搜索。
4.2 自动回忆的触发时机
除了显式触发,claude-mem 还会在某些情况下自动触发回忆。比如你在新会话里提到了一个人名、一个项目代号、或者一句明显和过去相关的话,MCP Server 会尝试做一次隐含检索。这个机制让体验连贯很多,但也有个需要注意的地方:自动触发不是每次都能命中。
我踩过的一个典型情况是:我在新对话里只说“那个 app 怎么样了”,因为这句话太泛、没有足够关键词,检索出来的结果可能完全和当前话题无关。后来我把项目代号说得更具体一些,比如“记账 App”,命中率就直线上升。经验是:别指望 Claude 能像人一样从一句话里猜出全部意图,给它一两个准确的实体词,自动回忆的成功率会高很多。
4.3 用户档案文件该怎么写:user.md / user.yaml
记忆库负责“发生过什么”,而用户档案负责“我是谁、我的偏好是什么”。这是两个不同层次的东西,别混在一起。
初始化后,~/.claude-mem/user.md(也可能是 user.yaml,取决于版本)就是你的长期人设配置文件。我强烈建议认真写这份档案。我的写法参考如下:
# 关于我 - 职业:独立开发者,主要做 RAG 应用 - 技术栈:Python、TypeScript、Supabase、FastAPI # 沟通偏好 - 回答要直接,不要绕弯子 - 如果方案有更简单的替代,先说简单方案 - 代码示例优先用 Python # 当前项目 - 正在做一个基于向量数据库的文档问答工具 - 主要关注:检索质量和延迟写完后,Claude 每次新会话都会把这些信息当作背景来用。实测下来,回答风格真的会变得更贴合:它知道我偏好 Python 后,给代码示例时基本不会再默认用 Java 或 Go。如果看不上官方默认的提示模板,你也可以完全自定义 user.md 的格式,它就是一份纯文本档案,Claude 只取内容,不依赖固定结构。
4.4 多项目隔离与多用户切换
做多个项目的人要注意:claude-mem 支持按项目/目录隔离记忆空间。在哪个目录下工作,它就默认锁定哪个项目的记忆。这样 A 项目的上下文不会被 B 项目污染。我第一次用的时候没注意目录切换,导致在两个项目之间混乱,后来养成了“开工前确认当前目录”的习惯,这个问题就再没出现过。
如果你的电脑有多个人共用,比如同事也登了同一台机器的 Claude,这就需要给每个人分配独立的用户配置和存储空间。实现方式很简单:用不同的系统用户目录来运行 claude-mem,或者通过配置文件里的多用户开关切换。不过对我这种一人一机的场景,默认单用户配置已经足够。
5. 存储后端怎么选:SQLite、JSON、PostgreSQL 的实际对比
5.1 三种后端的核心差异
claude-mem 从设计上就支持可插拔的存储后端,目前最常用的是 SQLite、JSON 和 PostgreSQL。我分别跑过一段时间的实测,它们的性格差异很明显。
| 特性 | SQLite | JSON | PostgreSQL |
|---|---|---|---|
| 性能 | 高,适合日常 | 低,适合调试 | 高,适合服务化 |
| 数据可读性 | 一般,需工具 | 极佳,直接打开 | 一般,需客户端 |
| 安装复杂度 | 内置,零配置 | 内置,零配置 | 需自建服务 |
| 多设备同步 | 不方便 | 可手动拷贝 | 原生支持 |
| 适用场景 | 单机个人默认 | 调试、开发 | 团队协作、多机部署 |
我最初的默认选择是 SQLite,它的读写性能足够好,而且不需要额外搭服务。JSON 后端更像是给人看的:每个记忆条目都是独立 JSON 文件,直接打开就能读,你能很清楚地看到 Claude 记住了什么,但文件多了以后查询速度会明显下降,适合开发调试期,不适合长期生产。至于 PostgreSQL,如果你只有一台电脑、一个人用,属实有点杀鸡用牛刀;但如果你的工作流是家里台式机和笔记本都要访问同一份记忆,那 Postgres 的远程访问能力就值回票价了。
5.2 切换存储后端的实际操作
切换后端不需要重新初始化,只需要改配置文件。以 SQLite 切到 JSON 为例,配置大致如下:
storage: backend: json json: path: ~/.claude-mem/memory/我建议改配置之前先备份。claude-mem 目前没有内置一键迁移工具,所以从 SQLite 切到 JSON,老数据不会自动跟着过去,需要你手动导出/导入。我的做法是:在旧后端里使用claude-mem view或导出功能把重要记忆批量拉出来,再手动导入新后端。如果你只想“从今天开始用新后端”,旧数据也可以直接放着不管,新记忆会从零累积,只是旧记忆在查询时会丢失。
5.3 备份与迁移的防坑经验
记忆数据说贵不贵,但丢了真的会肉疼。我有一次清理磁盘时,顺手把~/.claude-mem目录给删了,结果整个对话记忆库清空,之前积累的用户偏好、项目上下文全部归零。从那以后我养成了每周备份的习惯,最简单的方式就是打包目录:
tar -czf claude-mem-backup.tar.gz ~/.claude-mem因为 claude-mem 的数据就是普通文件,不做加密处理,所以你有完全的控制权:可以定期备份到移动硬盘,可以同步到私有网盘,甚至写个 cron 定时备份。我自己现在用 crontab 每天凌晨自动执行一次备份,成本几乎为零,但安全感提升了一个档。
6. 踩坑记录与避坑建议:把能踩的坑提前替你踩一遍
6.1 Node 版本与 npm 全局路径
最常见的问题有两个:一是 Node 版本过低导致安装失败或命令异常,二是全局安装后命令找不到。前者好解决,升级 Node 即可;后者本质是系统 PATH 配置问题,这里给一个通用的排查命令组合:
npm config get prefix ls -l $(npm config get prefix)/bin/claude-mem如果第一条命令执行后返回的路径不在你的 PATH 中,手动导出一下就好(macOS/Linux 为例):
export PATH="$(npm config get prefix)/bin:$PATH"把这个写进~/.zshrc或~/.bashrc,一劳永逸。涉及 Windows 的用户,需要在系统环境变量里把 npm 的全局 bin 目录加到 PATH。
6.2 记忆泛滥:压缩阈值怎么调才不伤细节
记忆库越积越大以后,会出现一个奇怪的现象:Claude 确实能回忆,但回忆出来的内容特别“概括”,细节全丢了。比如问“上次讨论的方案三个备选是什么”,它回答“我们讨论过多个方案”,但具体列不出来。这通常就是压缩参数设得太激进了。
max_token和压缩开关都在配置文件里。我的调参经验是:
- 日常语聊、想法记录:
max_token可以设小一点,300 左右,因为不需要太精确的细节 - 项目开发、写代码:
max_token至少 500,否则代码思路、关键决策会被摘要抹平 - 知识整理、精细回顾:
max_token设到 1000 以上,牺牲一点上下文空间换取细节完整度
另外别忘了,压缩是对写入端生效的,改完配置后,老记忆不会自动重新压缩。所以如果之前用激进压缩存下了模糊的摘要,新配置只能影响之后的记忆条目。真遇到特别关键的历史内容,手动重存一遍才是最快的解决方式。
6.3 隐私边界:本地明文存储并不是绝对安全
这个必须单独说。claude-mem 的所有记忆都是明文落盘。它不加密,不混淆,就是纯文本。这意味着任何能读取你硬盘的人、程序,都能直接翻看你和 Claude 的对话记录。
所以我的建议很明确:不要在对话里透露密码、API Key、身份证信息、支付信息等真正敏感的内容。即便是本地存储,防不住的是恶意软件和物理接触。如果你确实需要在对话里涉及机密信息,建议不要开启记忆功能,或者至少定期手动清理敏感对话记录。我现在的做法是把 claude-mem 当成“工作记忆”用,只记录项目相关的非敏感信息,涉及到真实凭证的部分,全部走环境变量或密钥管理器,绝不打进对话里。
6.4 与 CLAUDE.md 的配合用法
如果你既用 claude-mem,又在项目里维护 CLAUDE.md(Claude Code 的项目指令文件),这两者天然适合配合:CLAUDE.md 放的是“稳定、通用、需要每次载入”的项目规则,claude-mem 放的是“动态、按需、跨会话”的历史记忆。规则放前者,事实射后者,各司其职。
举个例子,CLAUDE.md 里写下“本项目的代码风格遵循 PEP8,函数必须有 docstring”,这是框架性的;claude-mem 里则记住“上周我们把登录模块重构为 JWT 认证,Kevin 负责前端部分”,这是按需检索的动态事实。如果全塞进 CLAUDE.md,文件会越来越臃肿,甚至触发上下文截断;分散到两处后,静态规则稳定存在,动态记忆按需加载,整体体验会从容很多。
我在实际使用中还发现一个有意思的交互:我习惯在 CLAUDE.md 里写一行“如果对话需要回忆历史,请主动调用 @claude-mem”,相当于给 Claude 一个明确的指令信号。这样做之后,它在新会话遇到跨天话题时,会更主动地去翻档案,而不是等我自己想起来才触发。
最后分享一个小技巧。很多人以为 claude-mem 只能靠@claude-mem这一个入口,其实它自带命令行交互能力。直接在终端里运行claude-mem,可以快速浏览记忆库、搜索关键词、查看统计信息,甚至手动删除某些记忆条目。我每周会抽几分钟,用命令行过一遍记忆库,把过时、错误或者不想保留的片段清掉,保持记忆的新鲜度。Claude 再怎么聪明,也是“垃圾进垃圾出”,记忆质量高,回答质量才会稳。这套工具我已经用了大半年,不敢说它让我的工作流脱胎换骨,但至少从“每天重新认识一遍”变成了“老朋友接着聊”,这个体验差距,用过的人都知道。