编程 claude-mem 深度拆解:给 AI Agent 装上「海马体」,59K Stars 的持久记忆系统如何终结上下文失忆

2026-07-28 02:46:56 +0800 CST views 5

claude-mem 深度拆解:给 AI Agent 装上「海马体」,59K Stars 的持久记忆系统如何终结上下文失忆

一、背景:AI Agent 的「顺行性遗忘症」

如果你重度使用 Claude Code、Codex 或者任何 AI 编程助手,一定经历过这样的场景:

昨天下午你和 Agent 一起排查了一个诡异的认证 Bug——花了两个小时,翻了七八个文件,最后定位到是 JWT 刷新逻辑里一个时区处理问题。Agent 全程参与,甚至是它先发现线索的。

今天早上你打开新会话,问它:「昨天那个认证 Bug 最后怎么修的来着?」

它一脸茫然:「抱歉,我没有关于之前会话的记忆。能否提供更多上下文?」

这就是当前几乎所有 AI 编程工具的通病——顺行性遗忘症。每个会话都是一次「重生」,之前积累的所有项目认知、排障经验、架构决策,随着会话结束全部归零。你只能靠手动维护 CLAUDE.md、AGENTS.md 这类「便签纸」,把关键信息一遍遍粘贴给它。

在医学上,海马体受损的病人无法形成新的长期记忆,每天醒来都是陌生的世界。而 AI Agent 天生就没有海马体。

claude-mem 要做的,就是给 Agent 装上这个海马体。

这个由 Alex Newman(@thedotmack)开发的开源项目,在 GitHub 上已经拿下约 5.9 万 Stars,登上过 Trendshift 热榜,还入选了 Vercel OSS Program。它的定位很清晰:一个持久化记忆压缩系统(Persistent Memory Compression System),自动捕获 Agent 在会话中做的每一件事,用 AI 压缩成语义摘要,并在未来的会话中把相关上下文注入回去。

它支持的宿主也不只是 Claude Code——OpenClaw、Codex、Gemini CLI、Copilot、OpenCode、Antigravity CLI 等主流 Agent 工具都能接入。换句话说,它想成为 Agent 生态的通用记忆层

这篇文章我们从架构原理、数据管线、检索设计到生产实战,把这个项目拆个通透。读完你不仅能上手用它,还能理解一套可以复用到自己系统里的「Agent 记忆工程范式」。

二、核心概念:记忆不是「存日志」,而是「观察-压缩-注入」

很多人第一反应是:这不就是把聊天记录存下来吗?拿个数据库存 transcript,下次启动时全塞回去不就完了?

天真。我们算笔账:一个中等强度的 Claude Code 会话,transcript 轻松超过 10 万 token。假设你每天工作产生 3 个会话,一周就是 200 万+ token 的原始记录。把这些全塞回上下文窗口?且不说 200K 的窗口根本装不下,就算装得下,按当前主流模型的输入价格,每次会话启动光「回忆」就要烧掉几美元——还没开始干活,钱包先爆了。

更致命的是信噪比。原始 transcript 里 90% 是工具调用的中间输出、失败的尝试、无关的探索。把这些噪音喂给模型,不仅浪费预算,还会稀释真正重要的信息,反而降低回答质量。这在 RAG 领域有个专门的说法叫上下文污染(context pollution)

claude-mem 的核心洞察是:记忆的本质是压缩,而不是存储

人类也是这么干的。你不会记得昨天排障时敲的每一条命令,但你记得「JWT 刷新有时区坑,修复方案在 auth/refresh.ts」这个结论。原始经历被海马体压缩成语义化的长期记忆,需要时再按线索检索、按需展开细节。

claude-mem 把这个过程工程化成了一条三段式管线:

┌──────────┐    ┌──────────────┐    ┌───────────────┐
│  观察捕获  │ →  │  AI 语义压缩   │ →  │   上下文注入   │
│ (Hooks)  │    │  (Worker)     │    │ (SessionStart) │
└──────────┘    └──────────────┘    └───────────────┘
     ↓                 ↓                    ↑
  工具调用等原始事件   observations +        按相关性检索
                    summaries → SQLite    (FTS5 + 向量)

三个关键词:

  1. 观察(Observation):Agent 每次调用工具(读文件、跑命令、改代码),都是一次可捕获的「行为事件」。claude-mem 通过生命周期 Hook 拦截这些事件,这一步是确定性的——不依赖模型「记得去记」。
  2. 压缩(Compression):原始事件交给一个后台 Worker,由 AI 生成结构化的语义摘要——不是全文备份,而是「发生了什么、为什么、结论是什么」。这一步是智能的——由模型判断什么值得留下。
  3. 注入(Injection):新会话启动时,SessionStart Hook 从记忆库里捞出与当前项目相关的记忆摘要,注入到 Agent 的初始上下文里。这一步是选择性的——只注入相关的,不搞全量倾倒。

这套设计的妙处在于:记忆的写入和读取都是异步、自动的,开发者全程无感。你不需要「请帮我记住这件事」,也不需要手动粘贴历史——它就像真正的记忆一样在后台默默工作。官方文档把这套哲学叫做 Context Engineering(上下文工程),配套还有一篇 Progressive Disclosure(渐进式披露)的设计说明,都值得一读。

三、架构分析:五个 Hook、一个 Worker、两个数据库

3.1 生命周期 Hook:记忆系统的「感觉神经」

claude-mem 的事件捕获建立在 Claude Code 的插件 Hook 机制上,共挂了 5 个生命周期 Hook(对应 6 个 hook 脚本):

Hook触发时机claude-mem 用它做什么
SessionStart会话启动检索相关记忆,注入初始上下文
UserPromptSubmit用户提交提示词记录用户意图,作为观察的语义锚点
PostToolUse每次工具调用完成捕获工具调用的输入输出,生成观察事件
StopAgent 回合结束触发阶段性摘要
SessionEnd会话结束生成会话级总结,落库归档

这个设计非常值得逐条品味。对比一下市面上常见的三种「记忆」实现路径:

路径 A:靠 LLM 主动调用 save_memory 工具。 这是最直觉的方案,也是最不可靠的方案。模型经常「忘了记」——你让它记住偏好,它答应得好好的,三轮对话之后就抛之脑后。重要信息漏存率极高,因为「是否值得记忆」这个判断被放在了模型繁忙的推理主线上,注意力根本分配不过来。

路径 B:全量 transcript 落盘。 可靠但不可用。所有东西都在,等于所有东西都找不到。检索时信噪比太低,前面已经算过账了。

路径 C:Hook 拦截 + 异步压缩(claude-mem 方案)。 捕获是确定性的——每次工具调用必然触发 PostToolUse,物理上不存在「忘了记」;压缩是智能的——由专门的 AI 流程离线判断什么值得留下,不占用主会话的注意力。两头都占住了。

其中 UserPromptSubmit 这个 Hook 的作用容易被忽视但很关键:它捕获的是用户意图。同样一次「读取 auth.ts」的工具调用,发生在「排查登录 Bug」的语境下和发生在「重构目录结构」的语境下,语义完全不同。把用户提示词作为观察的语义锚点,压缩出来的记忆才有正确的「因果叙事」。

另外还有一个「Smart Install」前置脚本(不算生命周期 Hook),负责带缓存的依赖检查——确保 Bun、uv 这些运行时依赖就位,避免每次 Hook 触发都做全量环境检测。这种细节能看出项目的工程成熟度:Hook 是高频路径,任何多余的开销都会被放大几百倍。

3.2 Worker Service:不阻塞主流程的「后台海马体」

思考一个问题:如果压缩摘要放在 Hook 里同步做,会发生什么?

每次工具调用都要等一次 LLM 请求。假设压缩调用平均耗时 2 秒,一个会话 50 次工具调用,你就凭空多等了 100 秒——Agent 会卡成 PPT,这个插件第二天就会被卸载。

claude-mem 的答案是一个由 Bun 管理的本地 HTTP Worker 服务

  • Hook 只做一件事:把原始事件 POST 给 Worker,立即返回。主流程几乎零感知,同步路径上的开销压缩到一次本地 HTTP 请求。
  • Worker 在后台排队处理:调用 AI 模型生成语义观察、写入 SQLite、更新向量索引。压缩慢一点无所谓,反正是异步的。
  • Worker 同时暴露搜索 API 和一个 Web Viewer UI——启动时会打印 URL,打开浏览器就能实时看到记忆流的形成过程。每条观察都有 ID 可引用(citations),Agent 回答「我记得上次……」时可以精确指向证据。

这是典型的生产者-消费者解耦:Hook 是生产者,Worker 是消费者,中间用队列缓冲。数据库领域的 WAL、消息系统的 broker,都是同一个思想的变体。

选 Bun 而不是 Node 做 Worker 运行时也有讲究:Bun 内置 SQLite 驱动(bun:sqlite,零 native 依赖编译问题)、冷启动快、单文件部署简单,对一个要常驻后台、随宿主频繁重启的轻量服务来说刚刚好。项目对 Bun 的依赖是自动安装的,用户无感。

3.3 存储层:SQLite + FTS5 + Chroma 的混合检索

claude-mem 的存储设计是「双库并行」:

SQLite 作为主存储,承载三类核心数据:

  • sessions:会话元数据(项目、时间、宿主工具)
  • observations:观察事件(类型、内容、关联文件、token 成本)
  • summaries:会话级语义总结

全文检索走 SQLite 的 FTS5 扩展。FTS5 是 SQLite 内置的全文索引引擎,本质是倒排索引,查询毫秒级返回,且零额外部署依赖——不需要 Elasticsearch,不需要任何外部服务。对「关键词精确召回」场景(函数名、报错字符串、文件路径)绰绰有余:

-- FTS5 虚拟表的典型用法(示意)
CREATE VIRTUAL TABLE observations_fts USING fts5(
  content, type, project,
  content='observations', content_rowid='id'
);

-- 毫秒级全文检索
SELECT * FROM observations_fts
WHERE observations_fts MATCH 'jwt AND timezone'
ORDER BY rank LIMIT 10;

Chroma 作为向量库,负责语义检索。「上次那个登录相关的坑」这种模糊查询,关键词检索会漏——记忆里写的可能是「JWT 刷新时区问题」,一个「登录」都没提。这时 embedding 相似度才能把语义相近的记忆捞回来。

最终检索是 Hybrid Search(混合检索):FTS5 关键词 + Chroma 语义向量双路召回,再做融合排序。这和当前 RAG 领域的最佳实践完全一致——大量评测已经证明,纯向量检索对代码标识符、报错信息、版本号这类「精确字符串」的召回反而不如老old-school的倒排索引,BM25/FTS 与向量互补才是正解。在自己的 RAG 系统里无脑上纯向量检索的同学,建议重新想想。

一个跨语言粘合的细节:向量检索依赖的 Python 环境用 uv 管理(当前 Python 生态最快的包管理器),同样自动安装。TypeScript 主体 + Python 向量生态,整个安装链路对用户完全透明。

3.4 检索层:三层渐进式披露,省 10 倍 token

这是我认为 claude-mem 全项目最值得抄作业的设计——Progressive Disclosure(渐进式披露)

问题场景:Agent 检索记忆时,如果每条结果都返回全文,10 条结果轻松吃掉上万 token,而其中 8 条可能压根不相关。这不是记忆,这是上下文污染的另一种形式。

claude-mem 把检索拆成三层 MCP 工具,形成一个 token 漏斗:

// 第 1 层:search —— 只返回紧凑索引(约 50-100 token/条)
search(query="authentication bug", type="bugfix", limit=10)
// → 返回: [#123 "修复 JWT 时区问题" 2026-07-25,
//          #456 "OAuth 回调排查" 2026-07-24, ...]

// 第 2 层:timeline —— 查看某条观察前后的时间线上下文
timeline(observation_id=123)
// → 返回: #123 前后发生了什么,帮助判断相关性

// 第 3 层:get_observations —— 只对筛选后的 ID 拉全文(约 500-1000 token/条)
get_observations(ids=[123, 456])   // 官方建议:多个 ID 一定要批量拉取
// → 返回: 完整的观察详情

工作流是:先拿索引 → Agent 扫一遍锁定目标 → 只对目标 ID 拉详情。官方给的数据是约 10 倍 token 节省

这个模式眼熟吗?这就是数据库「先查索引再回表」的思路,也是 Unix grep → less 工作流的 Agent 版,甚至和 HTTP 的 HEAD → GET 语义异曲同工。抽象成一条设计原则就是:

给 Agent 设计工具时,永远不要让单次调用返回不可控体积的数据。先给目录,再按需给正文。

这条原则值得写进所有 MCP Server 的设计规范。我见过太多 MCP 工具一把梭返回几万 token 的 JSON,然后抱怨「模型上下文不够用」——不是模型不行,是工具设计有病。

配套的 mem-search Skill 把这套流程包装成自然语言接口:直接问「我们上周对数据库 schema 做了什么改动?」,Agent 自己走完三层漏斗,最后带着引用 ID 给你答案。

四、代码实战:从安装到深度定制

4.1 一分钟接入

# Claude Code(推荐方式)
npx claude-mem install

# OpenCode
npx claude-mem install --ide opencode

# Antigravity CLI
npx claude-mem install --ide antigravity

或者在 Claude Code 内通过插件市场安装:

/plugin marketplace add thedotmack/claude-mem
/plugin install claude-mem

重启 Claude Code,前次会话的上下文就会自动出现在新会话里。验证是否生效很简单:干几件事、结束会话、开新会话问它「我们刚才在做什么」。

一个官方文档特别强调的坑npm install -g claude-mem 装的只是 SDK/库——它不会注册 Hook、不会拉起 Worker 服务。一定要走 npx claude-mem install/plugin 命令,安装器会完成 Hook 注册、Worker 配置、依赖检查(Node ≥ 20、Bun、uv、SQLite3)全套动作。很多 issue 都是这个原因。

4.2 OpenClaw 网关集成

如果你在跑 OpenClaw(2026 年 GitHub 星数狂飙的自托管 AI 助手网关),claude-mem 提供了一键安装:

curl -fsSL https://install.cmem.ai/openclaw.sh | bash

安装器会处理依赖、插件设置、AI Provider 配置、Worker 启动,甚至支持把实时观察流推送到 Telegram、Discord、Slack——相当于给你的 Agent 记忆装了个「直播间」,它在后台记住了什么,你在聊天软件里随时可见。对于把 OpenClaw 当 7×24 数字员工用的人,这个可观测性设计非常贴心。

4.3 配置:模式与语言

配置文件在 ~/.claude-mem/settings.json,首次运行自动生成,可配置 AI 模型、Worker 端口、数据目录、日志级别、上下文注入策略等。最有意思的配置项是 CLAUDE_MEM_MODE

{
  "CLAUDE_MEM_MODE": "code--zh"
}

这个配置同时控制工作流行为(code / chill / investigation 等模式)和记忆生成语言code--zh 是内置的简体中文模式——你的记忆摘要会直接用中文生成。语言模式遵循 code--[ISO 639-1 语言码] 命名,ja(日语)、es(西语)等都有。查看本地所有可用模式:

ls ~/.claude/plugins/marketplaces/thedotmack/plugin/modes/

对中文开发者,这个开关强烈建议打开。记忆是给「未来的 Agent」看的,但也是给你自己看的(Web Viewer 里全是记忆流),母语摘要的可读性和中文检索的召回质量都完全不同。改完配置重启 Claude Code 生效。

4.4 隐私控制与数据主权

「自动捕获一切」听起来有点慌?claude-mem 给了三道闸门:

  • <private> 标签:对话中被标记的内容不会进入存储,从源头排除敏感信息;
  • 上下文注入的细粒度配置:可以控制哪些类型的记忆允许被注入到新会话;
  • 本地优先架构:SQLite 和 Chroma 都跑在你自己的机器上,记忆默认不出本地。需要多机同步时才启用可选的 Cloud Sync(cmem.ai,worker 写入时顺带同步,无额外守护进程)。

对处理敏感代码库的团队,这三个开关是合规刚需。相比之下,托管型记忆服务(数据必须出域)在很多企业环境里直接就是不可选项。

4.5 排障与 Bug 反馈

遇到问题时有个很「Agent 时代」的设计:直接向 Claude 描述问题,内置的 troubleshoot Skill 会自动诊断并给出修复方案——用 Agent 修 Agent 的插件。也可以用自动化工具生成完整的 Bug 报告:

cd ~/.claude/plugins/marketplaces/thedotmack
npm run bug-report

五、性能与工程细节:值得抄的五份作业

作业一:捕获与压缩解耦。 Hook 同步路径上只做「事件转发」,所有耗时操作(LLM 调用、向量化、落库)全部丢给 Worker 异步完成。做 Agent 插件的人都该刻在脑门上:你的 Hook 每多 10ms,用户的每一次工具调用就多 10ms,一个会话就是几秒的体感延迟

作业二:分层数据模型。 observations(细粒度行为)→ summaries(会话粒度总结)两级结构,检索时先粗后细。这对应认知科学里「情景记忆 vs 语义记忆」的分层,工程上则让 token 预算严格可控。

作业三:混合检索而非单一方案。 FTS5 管精确(函数名、报错串、路径),向量管模糊(「那个登录的坑」),谁也替代不了谁。双路召回 + 融合排序,是 2026 年做检索系统的基本素养。

作业四:token 成本可见化。 检索结果带 token 成本标注,Agent 和用户都能明确知道「拉这条记忆的详情要花多少预算」。把成本变成一等公民、在工具返回里显式暴露,是 Agent 工程和传统工程最大的思维差异之一。传统工程里我们标注时间复杂度,Agent 工程里我们标注 token 复杂度。

作业五:三分支发布策略。 main(稳定版,唯一发 npm 的分支)、core-dev(可靠性修复先行验证)、community-edge(社区集成实验田)。对一个迭代极快(版本号已经干到 v13.4)、宿主环境五花八门(七八种 IDE/CLI)的项目,这种分层发布把「尝鲜派」和「求稳派」用户干净地隔离开,值得所有基础设施型开源项目参考。

六、横向对比:Agent 记忆的三条路线

目前 Agent 记忆赛道大致三条路线:

路线代表优势短板
手工维护上下文文件CLAUDE.md / AGENTS.md / MEMORY.md简单可控、人类可审计、零依赖全靠自觉、不 scale、内容会过期
托管记忆服务Mem0、Zep 等开箱即用、跨端同步、免运维数据出域、按 API 计费、检索逻辑黑盒
本地自动记忆管线claude-mem全自动、数据本地、开源可魔改需本地跑 Worker,有安装与资源成本

三条路线不是互斥的。实践中比较舒服的组合是:手工文件放「宪法级」信息(架构原则、团队规范这类低频高价值内容),claude-mem 管「流水账级」信息(每天的排障、决策、代码变更叙事)——前者是你主动写的自传,后者是自动生成的日记。

claude-mem 选择 Apache-2.0 协议也值得一提——官方明确说选这个协议就是为了让「持久 Agent 记忆」能被轻松嵌入到开发工具、本地 Agent、MCP Server、企业系统甚至机器人栈里。野心不小:它不想只做一个 Claude Code 插件,而是想做 Agent 记忆层的基础设施标准件

需要提醒的一点:社区里有个第三方发行的 CMEM 代币蹭这个项目热度(作者表态「拥抱」但并非项目本体)。技术归技术,链上资产归链上资产,评估这个项目请只看工程价值,别把 Stars 数和币价扯上关系。

七、总结与展望

claude-mem 值得关注,不只因为它解决了「Agent 失忆」这个高频痛点,更因为它沉淀了一套完整的、可迁移的 Agent 记忆工程范式

  1. 确定性捕获(Hook 拦截)胜过依赖模型自觉记忆;
  2. 压缩是记忆的本质,原始日志不是记忆,是噪音;
  3. 异步化一切耗时操作,Hook 同步路径必须极轻;
  4. 混合检索 + 渐进式披露,把 token 预算当一等公民管理;
  5. 本地优先,隐私与成本都攥在自己手里。

即使你永远不用这个项目,这五条也可以直接搬进任何 Agent 系统的设计评审清单。

往前看,Agent 记忆层的竞争才刚开始。当 OpenClaw、Claude Code、Codex 们把「执行能力」卷到天花板之后,「谁的 Agent 更了解你的项目」会成为下一个分水岭——而这恰恰由记忆系统决定。可以预见的演化方向:

  • 跨项目知识迁移:在 A 项目学到的排障经验,泛化后用于 B 项目;
  • 团队共享记忆池:新成员的 Agent 直接继承团队三年的工程积累,onboarding 从两周变两小时;
  • 记忆的版本化与审计:记忆错了怎么回滚?谁改了 Agent 的记忆?这会催生「记忆 Git」类工具;
  • 记忆安全:提示注入攻击污染记忆库会是新的攻击面,记忆写入的可信验证会成为刚需。

如果你每天在 AI 编程工具里泡超过两小时,花五分钟装一个 claude-mem,一周后你会回来谢我——或者至少,你的 Agent 终于记得谢你。

项目地址:github.com/thedotmack/claude-mem(Apache-2.0 · TypeScript · Node ≥ 20 · 当前 v13.x)

推荐文章

Vue3 组件间通信的多种方式
2024-11-19 02:57:47 +0800 CST
你可能不知道的 18 个前端技巧
2025-06-12 13:15:26 +0800 CST
Vue3中如何处理路由和导航?
2024-11-18 16:56:14 +0800 CST
程序员茄子在线接单