ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

终端的AI记忆引擎:用MCP+SQLite为Claude Code/Cursor实现长期上下文

终端的AI记忆引擎:用MCP+SQLite为Claude Code/Cursor实现长期上下文 你如果和我一样天天在 Claude Code、Codex、Cursor 这类终端 AI 工具里写代码一定遇到过这种崩溃时刻昨天刚和助手讨论清楚的架构方案今早一开新会话它就像被格式化过完全记不起上下文。这几乎是目前所有 CLI AI 工具的共性毛病——每段会话就是一段“金鱼记忆”关掉窗口就全部归零。claude-mem 就是专门为这个痛点设计的开源项目。它是一层架在 CLI 代理上的“长期记忆”系统通过 MCP模型上下文协议做中转自动归档每一次会话、抽取关键词、生成结构化摘要并在新会话启动时把最相关的历史记忆重新注入上下文。它适配 Claude Code、Codex、Cursor、Amber、OpenCode 等主流终端 AI 工具适合所有在终端里重度依赖 AI 编程助手的开发者。下面我会从架构原理、存储机制、安装接入到实际踩坑完整拆一遍这个工具。1. 先看它解决的痛点以及选型背后的思路1.1 为什么终端 AI 工具总是“失忆”先说背景。像 Claude Code 这类工具本质上是把一个大模型塞进一个终端会话里每次会话有独立的上下文窗口。当你输入命令的时候它会携带当前窗口内的对话历史去请求模型但窗口一关历史就没了。官方本身没提供“会话历史自动回灌”的能力于是每次新会话你都得手动把背景、约束、已确认的决策重新描述一遍。更要命的是项目越复杂这种“重新交代”的成本越高。我经常在一个中型项目里同时开几个独立会话一个做 API 设计一个查旧代码问题一个写测试。每个会话都以为自己是在从零开始但实际上它们面对的是同一套代码库、同一个业务背景。如果不做记忆共享每个窗口都是信息孤岛。1.2 claude-mem 的定位不是聊天记录备份是记忆引擎很多人第一反应是“这不就是个日志工具吗”真不是。claude-mem 更接近一个“记忆引擎”它的核心工作流是这样的监听你在 CLI 工具里的会话事件会话结束时自动做归档、压缩生成结构化摘要从摘要里抽取关键词建立可检索的索引下一次新会话启动时按相关性把历史记忆注入模型上下文。这套链路里最难的不是存储而是“新会话启动时该塞哪些记忆进去”。塞多了浪费 token塞少了等于没用。claude-mem 采用了关键词提取 全文搜索 语义搜索的组合方案兼顾精确匹配和模糊相关。后面我会逐个拆。1.3 为什么选 MCP 而不是直接写插件如果你用过早期的 AI 辅助工具一定知道各家插件系统互不相通。Claude Code 的插件、Codex 的插件、Cursor 的插件全都要单独开发。claude-mem 选择基于 MCP 做就是为了绕开生态割裂的问题。MCP 现在已经成了 AI 工具连接外部能力的公认标准相当于给 AI 助手和外部工具之间提供了一套统一的“USB 接口”。只要工具支持 MCP就能接入同一个记忆服务器跨工具共享记忆。你不需要为每个 CLI 工具写一套专属记忆逻辑。实际用的时候Claude Code 里加一行注册命令把 claude-mem 声明成一个 MCP server之后它就能自动读取会话、注入记忆。这种接入方式非常干净不需要 hack 任何工具的内部实现。2. 核心架构拆解Rust 内核 Python 控制面 MCP 通道2.1 两个执行体的分工claude-mem 不是一个单文件脚本它拆成了两个角色嵌入式内核用 Rust 实现记忆生命周期、SQLite 存储、FTS 索引、语义搜索控制面 CLI用 Python 实现安装引导、配置管理、日常交互命令。为什么要拆成两种语言我一开始也觉得费解后来想明白了。Rust 内核负责的是高频、低延迟、需要稳定性能的存储检索路径同时它提供了一个可嵌入的库级能力方便后续被其他 Agent SDK 调用。Python 控制面则负责写起来更快的业务逻辑和命令行交互Python 生态里也有 FastMCP 这类现成库很适合做 MCP 服务器外壳。这里有个非常实际的好处如果你只想在自己的工具里内嵌记忆能力可以直接用 Rust 内核不依赖 Python 运行环境。反之如果你想快速改命令行交互逻辑又不用重新编译 Rust。这种分层在工具类项目里很值得学习。2.2 MCP 服务器是连接器不是存储层很多人容易把 MCP server 理解成一个最终的数据存储服务其实这里 MCP 只是“通道层”。claude-mem 启动之后会提供一个 MCP server 进程曝光一些记忆相关的能力给 LLM 工具调用。比如说“写入一条记忆”“搜索相关记忆”“总结会话”这类 operation。而真正落盘的数据存在本地的 SQLite 数据库里和 MCP 进程无关。这里最关键的认知是MCP 只是门面SQLite 才是仓库。所以你可以随时关掉 MCP server数据不会丢也可以在同一台机器上跑多个工具都指向同一份 SQLite实现跨工具记忆共享。2.3 存储为什么选 SQLite 而不是向量数据库你看很多做 AI 记忆的工具一上来就搞个 ChromaDB 或 Milvus看着很唬人。claude-mem 用 SQLite 反而更实在。原因有几个本地工具场景下数据量远没到需要分布式向量库的程度SQLite 单文件备份、迁移都极其简单一个文件拖走就是全部记忆现代 SQLite 搭配扩展已经能同时搞定 FTS 全文搜索和向量检索没必要引入重依赖。配合 SQLite它还做了一套 FTS 语义搜索的组合索引。精确匹配关键词走 FTS相关语义匹配走向量检索。两条路径的结果再做合并排序。这比单纯用向量数据库更稳尤其在代码片段这类高频词、专有名词多的场景里FTS 的精确命中非常可靠。3. 记忆机制全链路从会话归档到上下文重注3.1 会话捕获与归档整个记忆生命周期从“会话结束”开始触发。claude-mem 监听到一段会话结束后会拿到原始对话内容然后做两件事把原始内容压缩成结构化摘要控制摘要长度从摘要里提取关键词作为后续检索的索引标签。这里不得不提压缩策略。如果直接把整段原始对话塞进记忆库那和记日志没区别每次检索还会消耗大量 token。所以它会使用 LLM 来做二次提炼把“用户的目标”“最终决策”“关键代码路径”“遗留问题”这类信息单独抽出来。我实际使用中体会到这个环节最值得自己配置的是摘要长度上限。默认值对着小型项目足够但如果你的会话特别长、技术决策特别多可以适当调大。太大则每次重注都会挤占上下文空间需要权衡。3.2 关键词与 FTS 索引归档完成后关键词会被写进 SQLite 的 FTS 表。FTSFull-Text Search做的是“精确/前缀匹配”它在超大量文本里找关键词非常快而且支持 SQL 语法直接查。举个例子你之前会话里讨论过restful-api的设计新会话你只要提到“restful”FTS 就能命中相关摘要。这种精确匹配在图数据库里可做不到但对代码开发场景恰恰最实用。3.3 语义搜索与向量化只靠 FTS 还不够因为你会换个说法表达同一个意思。比如上次说的是“接口鉴权”这次可能说“JWT 校验方案”字面上完全不重合但语义相关。这就需要向量化。claude-mem 会把摘要文本做嵌入生成向量存到数据库搜索时把你的当前上下文也做向量化再算相似度。这一步是“语义搜索”用于兜住 FTS 捡不到的模糊相关记忆。首次使用语义搜索时嵌入模型需要跑一次下载和初始化所以第一次启动会明显慢一点之后就正常了。这也是很多新手以为“卡死”的实际原因。3.4 上下文重注新会话怎么“想起来”新会话启动后claude-mem 会读取你当前对话里最开始的几句话然后执行一次检索把匹配到的历史记忆按相关性排序挑选最相关的一小段插入到上下文开头。这个重注动作是有策略的不是把所有记忆一股脑塞进去。它会设定一个“最大重注 token 数”超过上限就截断保证你新会话的开始处信息密度高但不臃肿。我这边观察到的效果是新会话里很多背景不用手动交代直接问基于上次讨论的进度继续推进它就能接上。3.5 数据落盘与跨工具共享说到这你大概理解 claude-mem 的存储模型了本地 SQLite 单文件记录结构化的摘要、FTS 索引、向量数据。因为数据不在云端所以存在隐私性方面的确定优势。你甚至可以把它理解为“本地优先的隐私记忆层”所有数据都在你自己的机器上。跨工具共享也因为这个设计变得非常简单。Claude Code、Codex、Cursor 都接入同一个 MCP server 后它们访问的是同一份 SQLite。这意味着你在 Claude Code 里讨论的方案切到 Cursor 里写代码时依然能查得到。4. 安装、配置与 Claude Code 接入实操4.1 环境要求先确认环境避免中途踩坑Python 3.10 或更高版本pip / uv 包管理器已安装 Claude Code或其他支持 MCP 的 CLI 工具能正常访问模型 API。我建议用 uv 来装速度比 pip 快很多。没有 uv 的话直接用系统 Python 的 pip 也没问题。4.2 安装 claude-mem安装非常简单一条命令pip install claude-mem或者用 uvuv tool install claude-mem装完之后检查一下版本与帮助信息claude-mem --help claude-mem-mcp --help如果两条命令都能正常输出帮助说明安装成功。claude-mem是控制面命令负责查看、管理记忆claude-mem-mcp是启动 MCP server 的入口供 AI 工具调用。4.3 在 Claude Code 中注册 MCP 服务器Claude Code 接入 MCP server 有两种方式一种通过交互命令一种直接改配置文件。交互命令方式claude mcp add mem -- claude-mem-mcp这条命令的意思是给 Claude Code 注册一个名为mem的 MCP server启动命令是claude-mem-mcp。再确认一下是否注册成功claude mcp list如果你用的是配置文件方式在 Claude Code 的配置文件里加上对应的 MCP server 声明效果一样。配好之后进入 Claude Code直接问一句“你还记得我们之前讨论过的缓存策略吗”如果它能引用出历史记忆说明整条链路已经通了。4.4 配置文件与管理命令claude-mem 的数据目录和配置信息都存在本地具体位置可以看claude-mem info的输出。它会告诉你数据库文件路径配置路径当前版本存储大小。日常最常用的维护命令大致这几类查看已保存的会话claude-mem sessions之类查看某个会话的具体记忆条目清空/删除不需要的会话记忆。具体子命令不同版本会有点差别最好的方式就是先claude-mem --help看当前版本的说明。别嫌这一步麻烦命令行工具升级太快README 永远是最新的。5. 实际工作流体验跨会话、跨工具、跨项目5.1 新会话自动续接我日常最多的使用场景就是“新会话续旧进度”。以前我开新会话说“继续优化用户模块”助手一脸茫然。现在用了 claude-mem新会话一上来它已经能带出上一轮关于“用户模块”的摘要、结论和待办相当于直接进门就开始干正事。这个体验上的提升是质变的。不是省了几百个 token 的问题而是你的 AI 助手终于像一个有记忆的协作者而不是一个自助问答机。5.2 跨工具共享记忆另一个让我印象深刻的场景是跨工具。我经常在 Claude Code 里做架构分析然后切到 Cursor 里写实现代码。以前两边的上下文完全割裂现在如果都接入同一个 claude-mem MCP server两边能互相“想起”对方的会话内容。这里有个使用上的建议给不同类型的工作开不同“主题”比如“架构设计”和“单元测试”分开检索的时候目标更精准。claude-mem 支持类似主题记忆的模式扩展你可以按项目阶段来规划存储结构。5.3 手动强制归档大会话某些特别长的会话可能持续了几个小时信息量爆炸。这些会话如果只用自动归档摘要可能不够精炼。我习惯在会话结束时手动触发一次归档操作让它立即做摘要和关键词提取而不是等后台自动跑。手动的好处是能把“最终结论”及时固化下来避免后续会话读到中间态、半成品结论被误导。这种“结论优先”的记忆在实际协作里非常关键。5.4 成本和性能控制记忆中最大的隐性成本是 token。每次重注都会消耗上下文窗口重注太多你新会话里留给实际任务的窗口就少了。我的经验是分两个档位控制低档日常小项目重注量控制在 1000~2000 token 以内高档大型迁移或架构设计可以适当放宽但不要超过总上下文的三分之一。另一个性能点是启动速度。如果你发现 Claude Code 启动变慢大概率是 MCP server 在初始化时加载了向量模型。这种慢通常只在第一次之后模型会缓存影响就小了。6. 常见问题与排查技巧实录6.1 MCP server 连接失败症状是 Claude Code 里报 MCP server error或者claude mcp list显示连接不上。排查顺序# 1. 先手动启动 MCP server看有没有报错 claude-mem-mcp # 2. 确认命令是否在 PATH 中 which claude-mem-mcp如果claude-mem-mcp手动能跑但在 Claude Code 里连不上多半是注册时命令路径不对。直接把注册命令改成绝对路径即可claude mcp add mem -- /你的Python环境/bin/claude-mem-mcp6.2 首次启动特别慢刚才提过首次会初始化嵌入模型。如果你在无网环境或代理环境下使用模型下载会卡住表现为进程一直挂在启动阶段。这种时候先确认网络是否能访问模型服务地址再确认本地模型缓存目录是否可写。正常情况下初始化完成后再启动就快了。6.3 记忆库膨胀怎么处理跑了几个月的项目SQLite 文件会越来越大。这是正常现象因为里面保存了原始摘要和向量数据。处理方式就是定期清理过期会话。我先看claude-mem info确认存储大小然后按项目阶段删掉那些已经完结、不再需要回看的会话记忆。建议保留“进行中的工作”和“核心架构决策”清理琐碎的临时讨论。6.4 重注内容不相关如果你发现新会话重注的历史记忆经常跟当前任务无关问题多半出在检索阈值设置上。阈值太低什么都往上下文里塞阈值太高什么都搜不到。我调阈值的方式是故意在新会话里说一个很模糊的需求看它搜出来的记忆相关性根据结果上浮或下调阈值直到“相关记忆能出来、噪音记忆被过滤”这个平衡点。这个调优过程没有标准答案和自己项目的命名规范、术语密度都有关花十几分钟调一次收益能持续很久。6.5 用完想卸载怎么办如果以后不打算用了想彻底清理pip uninstall claude-mem同时别忘了在 Claude Code 里移除注册的 MCP serverclaude mcp remove mem数据文件和配置如果也想删根据claude-mem info给出的路径手动删除就行。这里顺便提醒一句删除前先备份一下 SQLite 文件毕竟里面存的都是你自己项目的“记忆资产”万一删完后悔还能恢复。7. 一点个人体会claude-mem 这个项目给我的最大启发不是“给 AI 加记忆”这个功能本身而是它的设计取舍——用本地 SQLite 而不是云端数据库用 MCP 而不是私有协议用 Rust 内核加 Python 壳的分层而不是一套语言写到底。每个选择都指向同一个目标让开发者以极低的接入成本获得稳定、可控、可迁移的记忆能力。如果你和我一样已经把 AI 编程助手用成了主力工具那记忆层几乎是刚需。我见过太多人每天花大量时间重复描述背景然后一边抱怨“AI 怎么又忘了”一边又不去解决记忆问题。装上 claude-mem 之后哪怕你没有复杂的配置光是默认的自动会话归档和上下文重注就能让你明显感觉到助手更“懂”你在做什么。至少对我来说装完这个工具之后我再也没说过“你刚说过就忘了”。
RELATED READING

延伸阅读

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