资讯详情

claude-mem:给Claude外挂持久记忆的开源工具,让AI记住你的每次对话

📅 2026/10/28 15:22:59 | 华诺云谱 👁 阅读
claude-mem:给Claude外挂持久记忆的开源工具,让AI记住你的每次对话
用Claude用得越久越能感觉到一个尴尬它在单次对话里聪明得吓人可一旦你关掉终端第二天重新打开一个新会话它就像完全忘了你是谁。这不是错觉而是Claude这类大模型天生的无状态属性。Claude API本身没有“跨会话记忆”的概念每一次对话都是独立的、从零开始的。对普通闲聊用户来说这没什么影响但对那些把Claude当成日常开发伙伴、项目顾问、内容创作搭子的人来说这就是实打实的痛点你昨天跟它讨论过的架构方案、已经确认过的命名规范、踩过的坑今天全部要重新交代一遍。于是就有了今天要聊的开源项目——claude-mem。一句话概括它是一个给Claude系工具外挂持久记忆的命令行层通过自动记录历史对话、抽取关键信息、语义检索并按需注入上下文让Claude在下一次会话里“记得”你上次聊过什么。适合三类人重度使用Claude Code做开发的人想搭一套跨对话延续上下文的AI工作流的人以及想低成本理解“记忆系统加RAG检索”这套工程组合怎么落地的人。1. 项目解剖claude-mem到底在解决什么问题1.1 Claude“没记忆”背后的技术原因大模型的“无状态”设计不是缺陷而是工程上的主动选择。OpenAI、Anthropic、Google几家在做API服务时都采用了无状态请求-响应模型你发一段消息模型根据这段消息做一次推理然后返回结果服务器不保留任何关于你的历史信息。这样做的好处是服务端可以水平扩展——哪个节点收到请求都能独立处理不用同步什么会话状态代价也很明显——上下文完全靠调用方自己维护。Claude Code这类工具为了解决这个问题会在单次会话内部维护一份“上下文窗口”。你把整个项目的文件、之前的对话一股脑塞进去模型读一遍然后基于这些内容生成回复。但这份上下文只存在于一个进程的生命周期里会话结束就没了。更麻烦的是很多项目规模一大内容根本塞不满上下文窗口最后模型只能“看到”最近的一小段对话前面的细节全被挤出去了。这带来两个后果一是重复劳动你今天跟Claude确认的变量命名、接口约定、文件组织方式下周一它完全不记得二是项目语境断裂前天聊到一半的技术方案今天继续搞的时候模型已经不知道前因后果。过去不少人靠“把总结复制进新会话”来勉强应对而claude-mem这类工具想解决的就是这件事让记忆从“会话级”上升为“项目级”。1.2 记忆系统的四段式工作流claude-mem整体设计可以拆成四个核心环节外加一条横切面会话记录层捕获你和Claude之间的完整对话包括你的输入、Claude的回复、工具调用结果按时间顺序落盘保存。记忆构建层对原始对话做加工——抽取关键结论、生成摘要、按主题拆分然后转成向量并写入记忆库。语义检索层新会话开启时把用户当前的问题转成向量在记忆库里做相似度匹配找出最相关的历史记录。上下文注入层把检索结果拼装成一段结构化内容以“系统提示”或参考材料形式注入Claude的上下文窗口。那条横切面是隐私控制层。项目允许你配置排除规则让某些目录、文件类型或关键词压根不进记忆系统。这个放在后面详细说。设计上有一点值得单独拿出来讲claude-mem没有把原始终端输出直接丢进向量库而是先落盘保存为结构化文件再异步抽取生成记忆。这样做的好处是数据可审计——任何时候你都能打开记忆目录看它到底存了什么出了问题可以手动删改也方便重新构建——哪天你想换个embedding模型直接重新跑一遍抽取就行不用翻窗口聊天记录。2. 快速部署与核心参数配置2.1 前置环境与安装安装claude-mem之前先确认机器上有Node.js 18或更高版本npm能正常访问registry。装完直接执行npm install -g claude-mem装完跑一下claude-mem --help能看到子命令列表就说明安装成功。注意如果你同时装了多个Claude相关的命令行工具别把名字缩写带来的命令冲突搞混了——我一开始就因为这玩意儿和另一个项目管理工具有命令名冲突卡了半天才发现是zsh alias的问题。接下来初始化记忆目录claude-mem init这个命令会在你的用户目录下创建一个默认的记忆数据目录Linux和macOS一般在~/.claude-mem/Windows在%USERPROFILE%\.claude-mem\里面预置了配置文件模板和SQLite数据库文件。Windows用户如果遇到找不到数据库的报错多半是PowerShell把路径展开方式搞出了花样去配置里改成绝对路径就行。2.2 几个必须看懂的环境变量初始化完成之后建议手动打开配置文件逐个确认这些参数而不是直接开跑环境变量 / 配置项作用我的建议值MEMORY_SESSIONS_DIR原始会话记录的保存目录~/.claude-mem/sessionsMEMORY_DB_PATHSQLite数据库文件路径~/.claude-mem/memory.dbMEMORY_DB_MAX_AGE_DAYS多数据库模式下的保留时效90OPENAI_API_KEY用于调用embedding模型生成向量自己的OpenAI keyMAX_MEMORY_TOKENS注入上下文时记忆部分的最大token预算1200COMPACTION_THRESHOLD触发历史压缩的上下文占比阈值70CLAUDE_MODEL指定使用的Claude模型名称claude-sonnet-4-0CLAUDE_CODE_USE_BEDROCK是否走Bedrock通道false这里面最容易踩坑的是OPENAI_API_KEY。当时候我第一反应是“Claude的记忆工具为什么要用OpenAI的key”后来看了文档才明白——工具本身不需要调用Claude生成回复发回复的是Claude Code而记忆系统需要用embedding模型把文本变成向量项目默认用了OpenAI的text-embedding-3-small所以这个key是给向量化这一步用的。如果你不想用OpenAI的服务后面第5节会讲怎么换成兼容OpenAI接口的本地模型。MAX_MEMORY_TOKENS需要根据自己的实际模型窗口大小来调。上下文窗口大的模型可以给到2000小一点的给800到1000就合适了。给多了会挤占正常对话空间给少了检索结果又不够用。按个人经验先设1200跑个两三天看看对话质量有没有明显下降再决定增减。2.3 与新版Claude Code的集成方式claude-mem支持两种方式接入Claude Code。第一种是插件模式在Claude Code里直接输入/plugin install claude-mem也可以把插件库拉下来在plugin.json里指到本地路径{ name: claude-mem, version: 0.1.0, description: Persistent memory for Claude Code, main: dist/index.js }第二种是直接设环境变量在shell配置里指定插件路径export CLAUDE_CODE_PLUGINS$HOME/.claude-mem/plugin两种方式的效果一样区别只在于插件管理的粒度。我自己倾向用/plugin install这种方式因为插件列表可以直接在Claude Code里看哪天不想用了也能一键卸载环境变量方案反而容易残留配置。需要注意一点项目版本更新后插件入口文件的位置可能变。升级后如果发现记忆没写入先检查plugin配置文件里的main字段指向的路径是否还存在。3. 记忆系统的核心内部机制3.1 记忆数据结构两类记忆的分工打开记忆系统的数据库你会发现记忆不是简单地把对话记录堆在一起而是按类型拆分的。数据库表memory_entries里有几个核心字段id、entry_type、content、conversation_id、claude_model、session_context、tokens、created_at、updated_at。其中entry_type是记忆类型的关键标识整套系统把记忆分成两类类型含义典型内容保存策略episodic情景记忆一次会话中发生了什么一次具体的重构讨论、某个bug的排查过程随会话自动生成semantic语义记忆跨会话的抽象结论项目约定的命名规则、选型结论、用户偏好由episodic沉淀生成这个设计的思路很清晰你不需要让Claude记住三天前的每一次具体对话但需要它记住“这个项目的测试框架是Vitest”这类结论。episodic记忆负责具体、近期的细节semantic记忆负责抽象、长期的共识。会话结束后系统会定时做一次“沉淀”把近期episodic记忆里反复出现的结论压缩成semantic记忆写一条新的记录。还有一个字段值得注意session_context它记录了这条记忆是来自普通会话还是多会话模式。比如你用claude -p做非交互式调用时每条命令的上下文是独立的记忆系统会额外标记。3.2 语义检索不是靠搜关键词claude-mem的检索环节用的是向量相似度不是传统的关键词全文搜索。也就是说你问它“上次我们是怎么解决内存泄漏的”它不会匹配“内存泄漏”这个词本身而是把你这句话转成向量在记忆库里找语义上最接近的记录。实际检索时系统会执行三步把用户当前问题转成embedding向量在向量索引里做近似最近邻搜索取回top结果按照相关度分数对结果排序再做一次过滤——相关度低于阈值的记录直接丢弃。那为什么不直接用SQL的LIKE查询或全文索引两个原因。第一关键词搜索要求查询词和目标文本字面重合而日常聊天的说法千变万化同一件事前一次说“装个Redis当缓存”后一次问“缓存方案当时怎么定的”字面完全不同但语义一致全文搜索在这种场景下几乎失效。第二向量检索天然支持“模糊”匹配这是会话类记忆检索最重要的能力——需要记的不是哪个文件改了几行而是背后那个决定。向量检索在数据量只有几百条时体现不出优势但坚持用几天之后记忆库能积累几千条记录这时候关键词搜索的结果质量会断崖式下跌向量检索基本不受影响。当然代价也存在每次查询要走一次embedding依赖网络和第三方接口这个延迟通常在一百毫秒以内体感上可以忽略。3.3 上下文注入与token预算控制记忆检索出来后如何塞进模型对话里是这个项目里最考验工程细节的地方。默认策略是“按需注入、总量限制”。系统会把检索到的记忆组装成一块独立的提示词内容作为一个补充模块附加到你的会话请求里但整体token数不超过MAX_MEMORY_TOKENS设定的上限。组装时不是简单把所有结果全堆上去而是先估算每条记忆的token数再按相关度从高到低逐条拼装拼到预算上限为止。这个过程分两个动作。如果当前对话的上下文占比接近窗口上限COMPACTION_THRESHOLD参数就会触发压缩逻辑——先自动生成一条当前讨论重点的摘要作为新的记忆存档然后把旧的详细记录从注入列表里替换掉。这套逻辑解决了一个常见问题记忆注入和当前对话内容争抢上下文窗口。我给个参考配置思路总窗口按context-window算记忆部分占15%-25%比较合理。窗口200k时给到2000到3000token不心疼窗口100k以下时给到1000左右就够用了。3.4 隐私过滤与权限控制记忆系统默认记录所有会话所以隐私控制不是一个加分项而是必需品。claude-mem支持配置排除规则规则类型有两类一类是路径规则匹配文件系统的目录和文件以CLAUDE_MEM_EXCLUDE_GLOBS为前缀配置格式是一组glob模式另一类是内容规则用关键词过滤包含触发词的内容直接跳过不记录。操作上需要注意CLAUDE_MEM_EXCLUDE_GLOBS的匹配范围。举个例子如果你只想排除某个子目录写**/node_modules/**比写node_modules更稳妥否则规则可能匹配到错误层级。我自己遇到过因为规则写的太宽把记忆库搞成“半瘫痪”——所有会话都被过滤器拦掉了后续排查花了不少时间。还有个经验排除规则要在一开始就建立而不是等到有敏感信息被记录了再补。记忆库一旦写入了敏感内容及时删除该条记录是不难但事后清理远没有事前隔离来得稳。4. 实操记录把claude-mem跑起来的完整过程4.1 初始化到第一次会话下面按实际使用流程走一遍。装好工具后先初始化claude-mem init看到类似Initialized claude-mem at ~/.claude-mem的输出就对了。然后打开Claude Code正常开始开发。假设你现在正在改一个支付服务的超时逻辑和Claude讨论了几轮最终敲定了“用Redis分布式锁加指数退避重试”的方案。整个过程不需要额外操作claude-mem会在后台自动记录。结束会话之后手动跑一下归档命令让记忆库把刚才的讨论沉淀进去claude-mem archive这个命令会把新产生的会话记录进行摘要、抽取并写入SQLite数据库。它通常会返回给你一个列表每条包含记忆类型、内容摘要、所属会话、token数episodic | 2025-01-12 | 支付服务超时方案改为Redis锁加指数退避重试 | 4.2k tokens semantic | 2025-01-12 | 支付服务约定所有分布式锁统一走Redis封装 | 0.3k tokens看到这两条出现说明记忆已经落库。4.2 检索效果验证记忆到底有没有起作用验证记忆是否真的生效要开启一个新会话直接抛一个跨会话的问题而不是那种马上能从当前项目文件里找到答案的问题。像我这样问昨天我们讨论支付超时方案时是怎么定的重点说下锁机制的设计。然后留意Claude的回答。如果它能准确说出“Redis分布式锁、指数退避、重试上限”这几个关键点说明检索到正确记录了如果它开始泛泛而谈说一些“分布式锁是一种常见方案”之类的套话那无非两种可能——没检索到合适的记忆或者检索到了但记忆内容本身信息量不够。想确认到底是哪种情况可以启用调试模式claude-mem --debug --session它会打印出经过组装后的最终请求内容记忆部分是否注入、注入了哪几条、每条被注入时排除了多少token一目了然。我自己多次排查下来的经验是大部分检索失败的原因不在于向量匹配而在于那几条对话从来没有被归档过。这种情况多出现在开了很久的会话上这时候手动执行一次claude-mem archive --force可以解决问题。4.3 对日常AI工作流的具体改变跑了两周之后这个工具带来的变化都是实际工作流层面的。第一个感知是项目语境稳定。以前每次开新会话都要花三五句话把项目背景重新交代一遍现在Claude会主动带着上次的结论进入工作状态。一个典型场景我在一个项目里和Claude讨论了数据库分区方案两天后再次开新会话说“继续昨天的分区问题”它能直接接着之前确定的“按月分区、保留三个月”方案聊细节不需要重新铺垫。第二个感知是决策记录不再靠四处找聊天记录。以前要翻聊天历史查找好几天前的一个讨论非常烦躁现在直接在记忆库目录里按时间搜索claude-mem search 为什么决定用Redis锁结果会直接列出相关的semantic记忆和episodic记忆包括当时的会话上下文和最终结论比翻终端记录高效得多。第三个感知是数据增长后的稳定性。两周的会话量不算大但记忆库里的记录数也在千条级别。检索延迟没什么变化注入的token量也被控制在预算内——这要归功于token预算控制没有出现“上下文爆炸”导致会话质量崩掉的情况。5. 进阶玩法多客户端共享、自定义模型、SDK化5.1 用MCP方式让更多客户端接入同一份记忆如果你不只用Claude Code还有别的MCP兼容的客户端比如某些桌面AI工具、IDE插件可以让它们共享同一份记忆库。先在配置里确认MCP服务已启用然后设置好MEMORY_SESSIONS_DIR和MEMORY_DB_PATH保证各客户端读取的都是同一份数据。再在客户端里配置MCP服务地址比如{ mcpServers: { claude-mem: { command: claude-mem, args: [--mcp], env: { MEMORY_SESSIONS_DIR: ~/.claude-mem/sessions, MEMORY_DB_PATH: ~/.claude-mem/memory.db } } } }配好之后所有接入了这同一个MCP服务的客户端都可以调用记忆查询和归档工具。好处是记忆只存一份任何入口都能继承同一套记忆副作用同样存在——多个客户端并发写入时SQLite可能出现锁冲突报错信息像database is locked。如果你有多个客户端同时高频使用建议把SQLite换成Postgres版本的记忆存储项目配置里提供了对应的存储模式选项。5.2 更换自定义embedding模型和离线部署默认用OpenAI的embedding接口但这不是唯一选择。在环境变量里修改OPENAI_API_BASE_URL指向任何兼容OpenAI接口的本地服务比如Ollama、LocalAI之类的都有对应兼容端点。我的配置示例如下export OPENAI_API_BASE_URLhttp://localhost:11434/v1 export OPENAI_API_KEYollama # 本地服务通常不校验key改完之后跑一次重建索引来让记忆重新向量化claude-mem rebuild自定义embedding模型时最关键的是要和查询阶段用同一个模型如果先前用了text-embedding-3-small之后换成bge-m3新旧向量分布的差异会导致检索结果混乱。正确方式是直接rebuild重建会清空原有向量重新生成避免两套向量混存。5.3 把claude-mem-core当SDK接入自己的工具链如果你不满足于命令行工具可以将其核心库作为依赖嵌入自己的Node.js项目。先安装core包npm install claude-mem-core然后在代码里调用const { ClaudeMem } require(claude-mem-core); const mem new ClaudeMem({ dbPath: ~/.claude-mem/memory.db, sessionsDir: ~/.claude-mem/sessions, }); await mem.saveSession({ sessionId: 2025-01-12-payment-service, content: 支付超时方案确定为Redis锁加指数退避重试, }); const results await mem.search(支付服务分布式锁方案回顾, { topK: 5 }); console.log(results);这层封装适合做自动化流水线。比如你写了一个定时任务每天把当天的会话结论归档或者你做一个自动生成周报的工具直接从记忆库里检索本周所有semantic记忆。核心库的API覆盖面不多但覆盖了基本关键的职责保存会话、检索记忆、归档历史——内部处理了向量生成、相似度计算和token估算不需要自己维护复杂度。6. 常见问题与故障排查实录6.1 安装与权限类问题报错现象可能原因处理办法EACCES: permission deniednpm全局安装无写权限检查npm前缀目录权限或使用sudo npm install -g claude-memcommand not found: claude-mem安装目录没加入PATH找到构建产物所在路径手动加入shell的PATHDatabase is locked多个进程同时写入SQLite关闭多余客户端进程或将存储切换到Postgres模式Cannot find module插件路径配置错误检查plugin.json的main字段指向的入口文件是否存在6.2 检索引擎效果不理想这一类问题的规律性很强。第一种是相关但偏旧——前几天聊过的话题检索到了、但排得太靠后被截断。调低相关度阈值或者调大MAX_MEMORY_TOKENS让它能放更多条进去。第二种是很明确的记录存在但怎么都查不到排查重点放在“这条记录有没有被archive过”说实话这是一个高度常见的盲点。第三个常见的坑是“记录全被隐私过滤器拦掉”。检查一下配置文件里的排除规则是不是无意中写了太宽泛的关键词把正常讨论也过滤掉了。这类规则请记录在~/.claude-mem/config.json里排查时直接打开看就好。6.3 记忆库日常维护记忆库文件本身占用空间不大一个中等规模的会话大概几十到几百KB跑一个月也就几MB到几十MB。需要维护的不是空间而是内容质量。我建议每周抽时间做一次检查。几个检查方向看归档结果里有没有出现大量内容重复的episodic记忆——说明某些会话没被正确压缩看semantic记忆条数是否增长合理——如果涨得飞快可能是相似结论重复消费建议手动合并几条看是否有不该被记录的敏感内容漏进来——有就用CLI命令删除对应的整段会话记录。删除会话的正确姿势是这样的先查会话ID再删记忆最后把原始会话文件也清掉防止下次archive时又被重新入库。claude-mem list --session claude-mem delete --session-id 2025-01-12-payment-service rm -rf ~/.claude-mem/sessions/2025-01-12-payment-service6.4 升级与数据结构变更工具迭代比较快升级后有时会改数据库结构。升级后如果出现奇怪的查询报错优先检查版本变更日志。多数情况下工具会自动迁移数据库但个别大版本需要手动跑claude-mem migrate。保险起见升级前把memory.db和整个sessions目录备份一份。我自己踩过最深的坑是升级后忘记重建向量索引导致新旧向量混存、检索结果里出现大量完全不相关的内容。所以每次升级大版本后我会统一执行一次claude-mem rebuild这一过程会消耗一点时间但能消除大部分“升级后变笨”的问。别贪省这一步。最后分享几个实际体会用了claude-mem一段时间下来最明显的变化是“跟AI协作的连续性”上了一个台阶。以前开新会话总有一种强行重新上路的感觉现在更像带着一本笔记去开会——它能记起讨论过的细节和关键结论我也能从记忆库里快速检索到当时的决策逻辑。这和“每次都从零开始”的体验完全不同。如果让我给第一次用的人一个建议先把隐私排除规则建好再开始正常使用。记忆系统跑起来之后它会像是“第二个你”在记录所有工作内容建立一个可控的边界比后续清理要省无数事。另外每周花几分钟过一遍归档结果能帮你发现自己经常聊什么、哪些内容反复被提起这些东西本身就是很有价值的自我复盘素材。这类外挂记忆工具的实际效果取决于Claude的模型能力更取决于使用者的纪律——定期归档、合理筛选、及时清理。工具本身做对了“记录”和“检索”这两件事剩下的看你希望让它记住什么。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑