Claude-Mem 深度实战:从上下文碎片到持久化记忆——让 AI 编程助手拥有「永不遗忘」的超级大脑(2026 完全指南)
作者注:如果你曾经在使用 Claude Code 时感到沮丧——每次新会话都要重新解释项目背景、重复之前的决策、忘记上周修复的 Bug 细节——那么 Claude-Mem 就是为你准备的。这个拥有 56,844+ Star 的开源项目,正在重新定义 AI 辅助编程的边界。
目录
- 痛点篇:为什么 AI 编程助手都是「金鱼记忆」?
- 原理篇:Claude-Mem 是如何打破「会话墙」的?
- 架构篇:从 SQLite 到 Chroma 的双层记忆引擎
- 实战篇:5 分钟上手,让 Claude 记住你的项目
- 进阶篇:10 种搜索端点与智能上下文注入
- 性能篇:如何把 100K tokens 压缩到 500 tokens
- 生产篇:Web 可视化界面与多项目隔离
- 对比篇:Claude-Mem vs Claude.md vs MCP 记忆方案
- 源码篇:5 个生命周期钩子的精密协作
- 未来篇:Endless Mode 与 AI 记忆的终极形态
痛点篇:为什么 AI 编程助手都是「金鱼记忆」?
1.1 一个真实的场景
想象一下这个场景:
周一上午:你打开 Claude Code,花 20 分钟介绍项目背景、技术栈、代码规范。Claude 理解了,帮你重构了一个核心模块,修了两个 Bug。
周二早上:你继续开发,打开新的 Claude Code 会话。它又忘了。你又要重新介绍项目。你心里想:「昨天不是刚说过吗?」
一周后:你遇到一个之前修复过的 Bug,但 Claude 完全不记得了。你花了半天调试,最后在聊天记录里翻到了上周的解决方案。
这种「会话墙」问题,是每个 AI 编程助手用户的噩梦。
1.2 为什么会有这个问题?
根本原因是:当前的大语言模型(LLM)都是无状态的。
每次会话(session)都是全新的开始:
- 没有跨会话的持久化存储
- 上下文窗口(context window)有限(即使 200K tokens,也装不下长期积累的知识)
- 每次都要重新建立「共同语言」
传统解决方案的局限:
| 方案 | 优点 | 致命缺陷 |
|---|---|---|
| CLAUDE.md | 简单,项目级配置 | 静态文件,不会自动更新;内容多了反而干扰 |
| 复制粘贴聊天记录 | 灵活 | 手动操作,不可持续 |
| MCP 文件系统 | 可以读取文件 | 没有智能压缩,tokens 消耗巨大 |
| 人工写文档 | 精确 | 费时费力,容易过时 |
我们需要的是一个能够自动捕获、智能压缩、精准注入的系统——这就是 Claude-Mem 诞生的原因。
原理篇:Claude-Mem 是如何打破「会话墙」的?
2.1 核心设计哲学
Claude-Mem 的设计哲学可以总结为一句话:
「让 AI 自己管理自己的记忆」
它不是一个简单的「存储-检索」系统,而是一个完整的记忆生命周期管理器:
捕获(Capture) → 压缩(Compress) → 存储(Store) → 检索(Retrieve) → 注入(Inject)
2.2 技术栈概览
Claude-Mem 采用混合存储架构:
| 组件 | 技术选型 | 职责 |
|---|---|---|
| 关系型存储 | SQLite | 存储结构化数据:会话、观察记录、摘要 |
| 向量存储 | Chroma | 存储语义向量,支持相似度搜索 |
| AI 压缩 | Claude Agent SDK | 将冗长的工具输出压缩为精炼的摘要 |
| Web 界面 | 内置 HTTP API(端口 37777) | 可视化浏览和管理记忆 |
| 搜索索引 | SQLite FTS5 + Chroma 向量 | 支持全文搜索和语义搜索 |
2.3 记忆的三层结构
Claude-Mem 将记忆分为三个层次:
第一层:原始观察(Observations)
- 记录工具调用的输入/输出
- 保留完整的错误信息、堆栈跟踪
- 存储代码片段、文件内容
第二层:压缩摘要(Summaries)
- 使用 AI 将 10K+ tokens 压缩到 500 tokens
- 提取关键信息:决策、原因、副作用
- 打上概念标签(concept tags)
第三层:知识图谱(Knowledge Graph)
- 建立实体之间的关系(文件 A 引用了文件 B)
- 支持图谱遍历(graph traversal)
- 未来将支持 Ontology 推理
架构篇:从 SQLite 到 Chroma 的双层记忆引擎
3.1 SQLite:结构化记忆的基石
Claude-Mem 使用 SQLite 作为主存储,原因如下:
- 零依赖:单个文件,无需服务器
- 事务支持:保证记忆的一致性
- FTS5 扩展:内置全文搜索能力
- 跨平台:Windows/macOS/Linux 全支持
数据库 Schema 设计
-- 会话表:记录每次编码会话
CREATE TABLE sessions (
id INTEGER PRIMARY KEY,
project_path TEXT NOT NULL,
start_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
end_time TIMESTAMP,
summary TEXT -- AI 生成的会话总结
);
-- 观察表:记录工具调用的输入输出
CREATE TABLE observations (
id INTEGER PRIMARY KEY,
session_id INTEGER REFERENCES sessions(id),
tool_name TEXT NOT NULL,
input TEXT, -- JSON 格式
output TEXT, -- 原始输出,可能很长
compressed_output TEXT, -- AI 压缩后的版本
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
concepts TEXT -- 概念标签,如 "authentication", "bug-fix"
);
-- 摘要表:存储 AI 生成的摘要
CREATE TABLE summaries (
id INTEGER PRIMARY KEY,
observation_id INTEGER REFERENCES observations(id),
summary TEXT NOT NULL, -- 压缩后的摘要(约 500 tokens)
embedding BLOB, -- 向量表示(可选)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 全文搜索虚表(FTS5)
CREATE VIRTUAL TABLE observations_fts USING fts5(
input, output, compressed_output,
content=observations,
content_rowid=id
);
为什么不用 PostgreSQL/MySQL?
| 对比维度 | SQLite | PostgreSQL | MySQL |
|---|---|---|---|
| 部署复杂度 | 零配置 | 需要服务器 | 需要服务器 |
| 单用户场景性能 | 优秀 | 过剩 | 过剩 |
| 文件级备份 | ✅ 直接复制 | ❌ 需要 dump | ❌ 需要 dump |
| 跨进程并发 | 有限(WAL 模式可改善) | ✅ 优秀 | ✅ 优秀 |
结论:对于本地 AI 助手场景,SQLite 是最优选择。
3.2 Chroma:语义搜索的引擎
SQLite 擅长精确匹配(SQL 查询、全文搜索),但在语义搜索方面力不从心。
例如,你记得「上周讨论过关于身份验证的问题」,但你不记得具体的关键词。这时候就需要向量相似度搜索。
Chroma 的核心概念
# Chroma 的基本操作(Claude-Mem 内部使用类似逻辑)
import chromadb
# 初始化客户端(持久化模式)
client = chromadb.PersistentClient(path="~/.claude-mem/chroma")
# 获取或创建集合
collection = client.get_or_create_collection(
name="claude_memories",
metadata={"hnsw:space": "cosine"} # 使用余弦相似度
)
# 添加记忆(带向量嵌入)
collection.add(
embeddings=[[0.1, 0.2, ...]], # 由 AI 模型生成
documents=["Fixed authentication bug in user login flow..."],
metadatas=[{"session_id": 123, "concepts": "auth,security"}],
ids=["obs_456"]
)
# 语义搜索:找到与「登录问题」最相关的记忆
results = collection.query(
query_embeddings=[[0.15, 0.25, ...]],
n_results=5,
where={"session_id": {"$gte": 100}} # 可选过滤条件
)
混合搜索策略
Claude-Mem 采用两阶段检索:
第一阶段:粗筛
- 使用 SQLite FTS5 进行全文搜索
- 使用 Chroma 进行向量相似度搜索
- 取两个结果集的并集
第二阶段:精排
- 对候选结果进行重新排序(reranking)
- 考虑因素:
- 时间衰减(越近期的记忆权重越高)
- 概念匹配度
- 用户反馈(如果有的话)
实战篇:5 分钟上手,让 Claude 记住你的项目
4.1 安装 Claude-Mem
方式一:npm 全局安装(推荐)
# 安装
npm install -g @thedotmack/claude-mem
# 验证安装
claude-mem --version
# 输出: v10.6.3
方式二:从源码构建
# 克隆仓库
git clone https://github.com/thedotmack/claude-mem.git
cd claude-mem
# 安装依赖
npm install
# 构建
npm run build
# 链接到全局
npm link
4.2 初始化项目
# 进入你的项目目录
cd /path/to/your/project
# 初始化 Claude-Mem
claude-mem init
执行后,会在项目根目录生成 .claude-mem/ 目录:
your-project/
├── .claude-mem/
│ ├── db/
│ │ └── memories.db # SQLite 数据库
│ ├── chroma/
│ │ └── ... # Chroma 向量数据库
│ └── config.json # 配置文件
├── .claude/
│ └── settings.json # Claude Code 配置(自动修改)
└── CLAUDE.md # 项目配置(可选)
4.3 启动 Claude Code
# 正常启动 Claude Code
claude
Claude-Mem 会自动:
- 在后台启动 HTTP API 服务(端口 37777)
- 注入生命周期钩子(SessionStart、UserPromptSubmit 等)
- 开始捕获你的会话
4.4 验证记忆捕获
第一次会话:
你: 帮我看看这个项目的认证模块在哪里?
Claude: 我找到了认证模块在 src/auth/ 目录下,主要包含:
- login.js: 登录逻辑
- token.js: JWT token 管理
- middleware.js: 认证中间件
你: 好的,记住我们在用 JWT 而不是 Session。
Claude: 好的,我已记录:本项目使用 JWT 进行身份验证。
第二次会话(新开一个终端):
你: 我们项目用的是什么认证方式?
Claude: (自动从记忆中检索)
根据之前的会话记录,您的项目使用 JWT(JSON Web Token)进行身份验证,而不是传统的 Session 方式。
相关文件位于 src/auth/ 目录。
恭喜!Claude 现在拥有「记忆」了。
进阶篇:10 种搜索端点与智能上下文注入
5.1 搜索端点概览
Claude-Mem 提供 10 种搜索方式,适应不同场景:
| 端点 | 搜索类型 | 使用场景 |
|---|---|---|
/search/exact | 精确匹配 | 你知道确切的关键词 |
/search/fuzzy | 模糊匹配 | 只记得部分关键词 |
/search/semantic | 语义搜索 | 记得意思但不记得原话 |
/search/concept | 概念标签 | 按主题浏览(如 "auth") |
/search/file | 文件引用 | 找涉及某个文件的讨论 |
/search/type | 类型过滤 | 只搜 Bug 修复 / 只搜重构 |
/search/timeline | 时间线 | 查看某个时间段的所有活动 |
/search/related | 关联记忆 | 找到与当前上下文相关的记忆 |
/search/cluster | 聚类搜索 | 自动分组相似记忆 |
/search/graph | 图谱遍历 | 沿着关系链挖掘记忆 |
5.2 语义搜索实战
示例:忘记具体细节,但记得「那个 Bug」
// 调用语义搜索 API
fetch('http://localhost:37777/search/semantic', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: "用户登录后 token 过期的问题",
top_k: 5,
threshold: 0.7 // 相似度阈值
})
})
.then(res => res.json())
.then(results => {
results.forEach(r => {
console.log(`相关度: ${r.score}`);
console.log(`内容: ${r.summary}`);
console.log(`时间: ${r.timestamp}`);
console.log('---');
});
});
输出示例:
相关度: 0.89
内容: 发现 JWT token 过期时间设置错误,从 1h 改为 24h,修改文件 src/auth/token.js:45
时间: 2026-05-18 14:32:11
---
相关度: 0.76
内容: 用户反馈登录后经常掉线,排查发现是 token 刷新逻辑有问题,修复了 refreshToken() 函数
时间: 2026-05-17 09:15:22
---
5.3 智能上下文注入
Claude-Mem 最强大的功能之一是自动上下文注入。
工作原理
- 触发时机:在
SessionStart和UserPromptSubmit钩子中 - 检索相关记忆:根据你的输入,搜索最相关的 5-10 条记忆
- 压缩并注入:将检索到的记忆压缩为上下文,注入到当前提示词中
注入效果示例
没有 Claude-Mem:
你: 帮我优化一下登录性能。
Claude: 好的,我先看看登录相关的代码...
(Claude 开始从头分析代码,消耗大量 tokens)
有 Claude-Mem:
你: 帮我优化一下登录性能。
Claude: (自动获得以下上下文)
[记忆注入]
- 之前讨论过:登录模块在 src/auth/login.js,使用 JWT 认证
- 已知性能瓶颈:token 验证每次都查数据库,建议加 Redis 缓存
- 上次修复的 Bug:token 过期时间设置错误(已修复)
[/记忆注入]
根据之前的讨论,登录性能瓶颈主要在 token 验证环节。
我建议添加 Redis 缓存来优化,具体方案如下...
(Claude 直接给出精准建议,tokens 消耗减少 60%)
性能篇:如何把 100K tokens 压缩到 500 tokens
6.1 为什么需要压缩?
假设你的项目有 3 个月的历史记录:
- 每天 10 次工具调用
- 每次工具调用平均 500 tokens 输出
- 3 个月 = 90 天 × 10 × 500 = 450K tokens
这显然无法全部注入到每次会话中(即使 Claude 的 200K 上下文也装不下)。
6.2 AI 压缩流程
Claude-Mem 使用 Claude Agent SDK 进行压缩:
// 压缩伪代码
async function compressObservation(observation: Observation): Promise<string> {
const prompt = `
请将以下工具调用记录压缩为 100-200 字的摘要。
要求:
1. 保留关键决策和原因
2. 保留错误信息(如果有)
3. 保留文件路径和函数名
4. 删除冗余的输出细节
原始记录:
工具名称: ${observation.tool_name}
输入: ${observation.input}
输出: ${observation.output}
`;
const summary = await claudeAgentSDK.complete(prompt, {
maxTokens: 300,
temperature: 0.3 // 低温度,保证准确性
});
return summary;
}
6.3 压缩效果对比
压缩前(原始工具输出):
工具: read_file
输入: {"path": "src/auth/token.js"}
输出:
/**
* JWT Token 管理模块
* 作者: John
* 日期: 2026-03-15
*/
const jwt = require('jsonwebtoken');
const SECRET = process.env.JWT_SECRET || 'default-secret';
function generateToken(userId) {
const payload = {
sub: userId,
iat: Math.floor(Date.now() / 1000),
exp: Math.floor(Date.now() / 1000) + 3600 // 1 hour
};
return jwt.sign(payload, SECRET);
}
function verifyToken(token) {
try {
return jwt.verify(token, SECRET);
} catch (err) {
console.error('Token verification failed:', err.message);
return null;
}
}
module.exports = { generateToken, verifyToken };
(共计 1,245 tokens)
压缩后(AI 生成的摘要):
在 src/auth/token.js 中定义了 JWT token 管理模块。
- generateToken(userId): 生成 1 小时有效期的 JWT
- verifyToken(token): 验证 token,失败返回 null
- 使用环境变量 JWT_SECRET,缺少时使用默认值(安全风险!)
(共计 87 tokens,压缩率 93%)
6.4 节省 Token 的计算公式
节省的 Tokens = 原始 Tokens - 压缩后 Tokens
例如:
- 100 条观察记录,平均每条 1000 tokens = 100K tokens
- 压缩后平均每条 100 tokens = 10K tokens
- 节省: 90K tokens
- 按 Claude API 价格($3/1M tokens): 节省 $0.27 每会话
- 如果每天 10 次会话: 节省 $2.7/天 = $81/月
生产篇:Web 可视化界面与多项目隔离
7.1 Web 可视化界面
Claude-Mem 内置一个 Web Dashboard,方便浏览和管理记忆。
启动方式
# 手动启动 Web 服务
claude-mem serve --port 37777
功能特性
- 记忆时间线:按时间顺序展示所有会话和观察记录
- 概念云:可视化显示高频概念标签
- 搜索界面:提供图形化的搜索界面
- 统计分析:
- 最常用的工具
- 最频繁修改的文件
- 记忆库大小趋势
7.2 多项目隔离
如果你有多个项目,Claude-Mem 会自动隔离记忆:
# 项目 A
cd /path/to/project-a
claude-mem init
# 记忆存储在 /path/to/project-a/.claude-mem/
# 项目 B
cd /path/to/project-b
claude-mem init
# 记忆存储在 /path/to/project-b/.claude-mem/
好处:
- 项目 A 的记忆不会污染项目 B
- 可以针对不同项目定制压缩策略
- 支持同时打开多个项目(每个项目独立运行 Claude-Mem 服务)
对比篇:Claude-Mem vs CLAUDE.md vs MCP 记忆方案
8.1 三种方案对比
| 维度 | Claude-Mem | CLAUDE.md | MCP 文件系统 |
|---|---|---|---|
| 自动化程度 | ✅ 全自动 | ❌ 手动维护 | ⚠️ 半自动 |
| 智能压缩 | ✅ AI 压缩 | ❌ 无 | ❌ 无 |
| 语义搜索 | ✅ 支持 | ❌ 不支持 | ⚠️ 依赖文件搜索 |
| Token 效率 | ✅ 高(压缩后) | ⚠️ 中(文件可能很长) | ❌ 低(原始文件) |
| 学习曲线 | ✅ 低(安装即用) | ✅ 低 | ⚠️ 中(需要配置 MCP) |
| 多项目支持 | ✅ 原生支持 | ⚠️ 需要手动管理 | ✅ 支持 |
| 开源 | ✅ AGPL-3.0 | N/A | ✅ 取决于具体实现 |
8.2 什么时候用 CLAUDE.md?
CLAUDE.md 适合存储:
- 静态配置:项目规范、代码风格、命名约定
- 高频信息:项目概述、常用命令
- 人工精选内容:你觉得「这段必须每次都让 Claude 看到」
最佳实践:CLAUDE.md + Claude-Mem 组合使用。
CLAUDE.md: 项目的「宪法」(静态、精炼)
Claude-Mem: 项目的「日记」(动态、详细)
8.3 什么时候用 MCP?
MCP(Model Context Protocol)适合:
- 需要访问外部数据源(数据库、API)
- 需要团队协作(共享记忆)
- 需要复杂的权限控制
但 MCP 本身不提供「记忆压缩」功能,需要自己实现。
源码篇:5 个生命周期钩子的精密协作
9.1 钩子概述
Claude-Mem 通过 5 个生命周期钩子 实现对 Claude Code 的无缝集成:
| 钩子 | 触发时机 | 主要任务 |
|---|---|---|
| SessionStart | 会话开始时 | 检索相关记忆,注入上下文 |
| UserPromptSubmit | 用户提交提示词时 | 在注入记忆之前,预检索相关上下文 |
| PostToolUse | 工具调用完成后 | 捕获工具输入输出,压缩并存储 |
| Stop | Claude 生成完成时 | 更新会话摘要,清理临时数据 |
| SessionEnd | 会话结束时 | 生成会话总结,更新向量索引 |
9.2 SessionStart 钩子详解
// SessionStart 钩子伪代码
async function onSessionStart(context: SessionContext) {
// 1. 获取当前项目信息
const projectInfo = extractProjectInfo(context);
// 2. 检索相关记忆(基于项目路径和历史会话)
const relevantMemories = await searchMemories({
query: projectInfo.name,
top_k: 10,
includeRecent: true // 优先近期记忆
});
// 3. 压缩并注入上下文
const injectedContext = compressAndFormat(relevantMemories);
// 4. 注入到 Claude 的 system prompt
context.systemPrompt += `
[自动注入的历史记忆]
${injectedContext}
`;
// 5. 记录日志
log(`SessionStart: 注入了 ${relevantMemories.length} 条记忆`);
}
9.3 PostToolUse 钩子详解
// PostToolUse 钩子伪代码
async function onPostToolUse(event: ToolUseEvent) {
// 1. 捕获工具调用
const observation = {
tool_name: event.toolName,
input: JSON.stringify(event.input),
output: event.output,
timestamp: Date.now(),
session_id: event.sessionId
};
// 2. AI 压缩(异步,不阻塞用户操作)
compressAsync(observation).then(compressed => {
observation.compressed_output = compressed;
saveToDatabase(observation);
});
// 3. 提取概念标签
const concepts = extractConcepts(observation);
observation.concepts = concepts.join(',');
// 4. 存储到 SQLite
const obsId = await db.insert('observations', observation);
// 5. 异步生成向量并存储到 Chroma
generateEmbedding(observation.compressed_output)
.then(embedding => {
chromaClient.add({
id: `obs_${obsId}`,
embedding: embedding,
metadata: {
tool_name: observation.tool_name,
concepts: observation.concepts,
timestamp: observation.timestamp
}
});
});
log(`PostToolUse: 捕获了 ${event.toolName} 调用`);
}
未来篇:Endless Mode 与 AI 记忆的终极形态
10.1 Endless Mode 是什么?
Endless Mode 是 Claude-Mem 的实验性特性,目标是实现:
「让 Claude 拥有无限长的上下文」
工作原理
- 自动总结:当会话长度接近上下文窗口上限时,自动总结前面的内容
- 记忆压缩:将总结存储在长期记忆中
- 无缝切换:开始新的「篇章」,但保留对前面内容的访问能力
使用示例
# 启用 Endless Mode(实验性)
claude-mem enable-endless --max-tokens 150000
效果:
篇章 1(tokens 0-150K):
- 讨论项目架构
- 实现核心模块
- 当接近 150K 时,自动总结
篇章 2(tokens 0-150K,但能引用篇章 1):
- 自动获得篇章 1 的总结
- 可以继续深入讨论
- 真正实现「无限上下文」的感觉
10.2 记忆的终极形态:从「存储」到「理解」
当前的 Claude-Mem 还是被动存储(你让它记,它才记)。
未来的方向是主动理解:
自动发现模式:
- 「你总是在修改 auth 相关的文件,是不是这模块有问题?」
- 「你连续 3 次遇到了同样类型的 Bug,需要我帮你写一个防御性代码吗?」
预测性记忆:
- 在你提问之前,就准备好相关记忆
- 基于你的编辑模式,预判你可能需要什么
跨项目知识迁移:
- 「你在项目 A 用过的缓存策略,是不是也可以用到项目 B?」
总结与展望
关键要点回顾
Claude-Mem 解决了 AI 编程助手的「金鱼记忆」问题
- 通过自动捕获、智能压缩、精准注入,实现跨会话记忆
采用混合存储架构
- SQLite 负责结构化存储和全文搜索
- Chroma 负责语义搜索
- Claude Agent SDK 负责智能压缩
10 种搜索端点,覆盖各种检索场景
- 从精确匹配到语义搜索,从时间线到知识图谱
显著的 Token 节省
- 典型场景下可节省 60-80% 的 tokens 消耗
- 按 API 调用量计算,每月可节省数百美元
开源且可扩展
- AGPL-3.0 许可证
- 支持自定义压缩策略、搜索算法
适用场景
✅ 强烈推荐:
- 中大型项目(> 10 个文件)
- 长期维护的项目(> 1 个月)
- 团队协作项目(需要共享上下文)
⚠️ 谨慎评估:
- 超小型项目(< 5 个文件,记忆收益有限)
- 隐私极度敏感的项目(记忆数据存储在本地,但仍有风险)
未来展望
随着 AI 编程助手的发展,记忆系统将成为标配,而不仅仅是「可选插件」。
我们预测:
- IDE 原生集成:VS Code、JetBrains 等 IDE 将内置类似功能
- 云端同步:支持多设备同步记忆(当然,需要端到端加密)
- 团队协作:共享记忆库,新成员可以快速「继承」项目的集体智慧
参考资源
- GitHub 仓库: https://github.com/thedotmack/claude-mem
- 官方文档: https://docs.claude-mem.ai
- Web Dashboard: http://localhost:37777(本地启动后)
- 社区讨论: https://github.com/thedotmack/claude-mem/discussions
写在最后:Claude-Mem 不仅是一个工具,它代表了一种新的人机协作范式——AI 不再是「用完即忘」的工具,而是能够持续学习、不断进化的伙伴。这可能是通往 AGI(通用人工智能)路上的一块重要基石。
Happy Coding with Memory! 🧠