基于Claude Code源码 与 OpenClaw 记忆机制对比分析及 OpenClaw 记忆系统优化设计
基于 Claude Code 源码分析,深度对比记忆架构,探讨记忆设计与自我进化路线
一、引言
记忆系统是 Agentic AI 的核心能力之一。好的记忆系统让 Agent 能在长周期任务中保持一致性,能从历史经验中学习,能自我进化。本文基于对 Claude Code 源码的深度分析,对比 OpenClaw 当前记忆机制,提出系统性优化建议。
二、Claude Code 记忆机制深度剖析
2.1 Claude Code 记忆分层架构
从源码 src/memdir/ 可以看出,Claude Code 采用多层级记忆架构:
┌─────────────────────────────────────────────────────────────────────┐│ User Message / Assistant Response ││(Short-term memory) │└────────────────────────────────────┬────────────────────────────────┘ │ ┌─────────────────────▼─────────────────────┐ │ In-session Context(RAM) │ │ - Full message history │ │ - Token budget tracking │ │ - Automatic compaction when exceeded │ └─────────────────────┬─────────────────────┘ │ ┌─────────────────────▼─────────────────────┐ │ Persistent Session │ │ - Transcript saved to disk │ │ - Can resume via /resume │ │ - Versioned history │ └─────────────────────┬─────────────────────┘ │ ┌─────────────────────▼─────────────────────┐ │ Nested Memory(CLAUDE.md) │ │ - Project-level instructions │ │ - Auto-injected every turn │ │ - Local override:CLAUDE.local.md │ └─────────────────────┬─────────────────────┘ │ ┌─────────────────────▼─────────────────────┐ │ ExtractMemories(Automatic) │ │ - Post-compact memory extraction │ │ - Persist to memdir/ │ │ - Auto-inject in future sessions │ └─────────────────────┬─────────────────────┘ │ ┌─────────────────────▼─────────────────────┐ │ Team Memory Sync │ │ - Multi-agent shared memory │ │ - Sync across team members │ └──────────────────────────────────────────┘
2.2 各层记忆详解
(1) 会话内记忆(Short-term)
-
存储位置:内存 + 对话历史数组
-
容量管理:token 预算,超出自动触发压缩
-
压缩策略:
-
Micro-compaction:API 层面轻量压缩
-
Full compaction:调用子 Agent 总结历史,保留关键决策,丢弃细节
-
边界标记:
SystemCompactBoundaryMessage保持可追溯
源码片段(src/services/compact/compact.ts):
// 当 token 超出预算,触发压缩if(currentTokens >COMPACT_THRESHOLD){// 1. pre-compact hooksawaitexecutePreCompactHooks(...)// 2. fork 子 Agent 做压缩const compacted =awaitrunForkedAgent("Summarize the conversation history, preserving key decisions")// 3. 替换历史 messages =[ systemPrompt,...projectContexts, compactedSummary,...recentNMessages]// 4. 自动提取记忆awaitextractMemories(messages)// 5. post-compact hooksawaitexecutePostCompactHooks(...)}
关键设计点:
-
压缩在子 Agent 中做,不影响主会话状态
-
保留最近 N 轮不压缩,保持当前上下文连贯性
-
自动提取长期记忆存入
memdir/
(2) 持久化会话记忆
-
存储:
~/.claude/sessions/<session-id>/transcript.json -
恢复:
/resume <session-id>完全恢复会话 -
版本化:每轮保存新版本,支持回溯
设计思想:会话是有生命周期的,可以暂停,可以恢复,可以分享。
(3) 嵌套记忆(CLAUDE.md)
这是 Claude Code 非常巧妙的设计:
-
项目级:
CLAUDE.md放在项目根目录 -
内容:项目约定、架构决策、编码规范、TODO
-
注入:每次查询自动注入到系统提示
-
本地覆盖:
CLAUDE.local.md个人配置,加入.gitignore
为什么巧妙:
-
让 Agent “记住” 项目特定规则,不需要用户每次重复说
-
协作:团队成员共享
CLAUDE.md,Agent 行为一致 -
进化:项目演进,
CLAUDE.md同步演进
源码片段(src/memdir/memdir.ts):
exportasyncfunctionloadMemoryPrompt(cwd: string): Promise<SystemMessage[]>{// 查找 CLAUDE.md 从当前目录向上const claudeMd =findUp("CLAUDE.md",{ cwd })constmessages: SystemMessage[]=[]if(claudeMd){ messages.push(createNestedMemoryAttachment(await fs.readFile(claudeMd,"utf-8"),"CLAUDE.md"))}// 加载本地覆盖const claudeLocalMd =findUp("CLAUDE.local.md",{ cwd })if(claudeLocalMd){ messages.push(createNestedMemoryAttachment(await fs.readFile(claudeLocalMd,"utf-8"),"CLAUDE.local.md"))}return messages}
(4) 自动记忆提取(ExtractMemories)
这是 Claude Code 最接近”自我进化”的机制:
触发时机:每次压缩后触发
做什么:
-
调用大模型从对话历史中提取有用的长期记忆
-
分类记忆:
-
决策记忆:为什么这么做决定
-
技术记忆:学到的技术技巧
-
项目记忆:项目结构、约定
-
个人偏好:用户喜欢的风格
-
持久化到
memdir/目录 -
未来会话自动注入这些记忆
源码思路:
exportasyncfunctionextractMemories(messages: Message[]): Promise<MemoryEntry[]>{const extracted =await llm.extractMemories(messages)for(const memory of extracted){awaitsaveMemoryToDisk(memory)}return extracted}
设计思想:让 Agent 自己从对话中发现值得记住的东西,自动持久化。不需要用户手动整理。
(5) 团队记忆同步
-
多 Agent 团队共享记忆
-
支持同步到远程存储
-
团队成员获得一致上下文
2.3 Claude Code 记忆设计总结
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
核心优点:
-
✅ 分层清晰,不同生命周期放不同层
-
✅ 自动压缩,token 预算可控
-
✅ 自动提取,从对话中学习
-
✅ 项目级上下文,每个项目可以有不同”性格”
-
✅ 可恢复,会话不丢失
局限性:
-
⚠️ 记忆提取是离线异步,不是实时增量
-
⚠️ 记忆检索是全注入,没有语义检索(都给模型,模型自己找)
-
⚠️ 记忆遗忘机制不明显,旧记忆不会自动清理
三、OpenClaw 当前记忆机制分析
3.1 当前架构
OpenClaw 当前记忆主要分布在:
┌──────────────────────────────────────────────────────────┐│ 会话级记忆: ││ - Session 会话历史 ││ - 轮转机制:长对话开启新会话 │├──────────────────────────────────────────────────────────┤│ 工作区注入: ││ -AGENTS.md /SOUL.md /TOOLS.md /USER.md ││ - 启动时一次性注入 │├──────────────────────────────────────────────────────────┤│ 技能级: ││ -~/.openclaw/workspace/skills/<skill>/SKILL.md ││ - 加载技能时注入 │├──────────────────────────────────────────────────────────┤│ 持久化: ││ -~/.openclaw/ 配置 credentials ││ - 会话状态持久化到磁盘 │└──────────────────────────────────────────────────────────┘
3.2 现有优点
✅ 多 workspace 隔离 —— 不同 agent 工作区完全隔离,符合多 agent 设计✅ 技能化记忆 —— 技能自带 SKILL.md,很好的模块化✅ 启动注入 —— AGENTS/SOUL/TOOLS 保证 agent 行为一致性
3.3 改进空间
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
四、OpenClaw 记忆机制优化设计
4.1 设计目标
-
分层记忆 —— 不同生命周期放不同层
-
自动管理 —— token 预算自动压缩,不需要用户干预
-
持续学习 —— 从历史对话自动提取有用记忆,下次自动使用
-
项目隔离 —— 每个项目可以有自己的上下文和记忆
-
语义检索 —— 大记忆不全注入,只检索相关的
-
自我进化 —— 记忆系统本身能随着使用不断改进
4.2 推荐分层架构
┌─────────────────────────────────────────────────────────────────────┐│ Layer 1:即时会话记忆(In-memory) ││ - 完整对话历史 ││ - token 预算追踪 ││ - 超出自动压缩 │├─────────────────────────────────────────────────────────────────────┤│ Layer 2: 项目嵌套记忆 ││ -<workspace>/.openclaw/context.md 项目级上下文 ││ -<workspace>/.openclaw/local.md 个人本地覆盖 ││ - 每次查询自动注入 │├─────────────────────────────────────────────────────────────────────┤│ Layer 3: 持久化会话 ││ -~/.openclaw/sessions/<id>/transcript.jsonl ││ - 支持 /resume 恢复 │├─────────────────────────────────────────────────────────────────────┤│ Layer 4: 向量长期记忆 ││ - 自动提取:压缩后/任务完成后提取记忆 ││ - 存储:sqlite-vec / lancedb ││ - 检索:用户提问 → 检索相关记忆 → 注入上下文 ││ - 分类:project/decision/technique/preference │├─────────────────────────────────────────────────────────────────────┤│ Layer 5: 团队/跨会话同步 ││ - 可选远程同步 ││ - 多 agent 共享记忆 │└─────────────────────────────────────────────────────────────────────┘
4.3 各层详细设计
Layer 1: 即时会话记忆 + 自动压缩
设计:
interfaceSessionMemoryConfig{maxTotalTokens: number // 总预算maxCompactionOutputTokens: number // 压缩后输出上限compressWhenExceedPercent: number // e.g., 0.8 → 80% 触发压缩keepRecentRounds: number // 压缩后保留最近 N 轮不压缩}// 每轮后检查asyncfunctionafterTurnCompaction(session: Session): Promise<CompactionResult>{const currentTokens =estimateTotalTokens(session.messages)if(currentTokens < config.maxTotalTokens * config.compressWhenExceedPercent){return{compressed:false}}// 触发压缩 → 在子 Agent 中做const compressedSummary =awaitforkAgentAndSummarize( session.messages, config.maxCompactionOutputTokens)// 替换历史const newMessages =[...session.systemMessages,...session.projectContextMessages,createCompactBoundaryMessage(compressedSummary),...tail(session.messages, config.keepRecentRounds)]// 自动提取长期记忆awaitextractLongTermMemories(session.messages) session.replaceMessages(newMessages)return{compressed:true,summary: compressedSummary }}
改进点:
-
相比当前”轮转开新会话”,保留历史连续性
-
用户不需要手动
/reset -
token 预算始终可控
Layer 2: 项目级嵌套记忆
设计:
在每个工作目录,OpenClaw 自动查找:
./.openclaw/context.md # 项目级上下文(可以提交 git)./.openclaw/local.md # 个人覆盖(加入 .gitignore)./.openclaw/instructions/*.md # 按任务分类的指令
注入时机:每轮查询前注入到系统提示。
使用场景:
-
项目编码规范
-
架构决策记录
-
测试构建命令约定
-
个人偏好(比如”给我中文输出,结论前置”)
对比 Claude Code:兼容 CLAUDE.md → 可以自动检测并加载,平滑迁移。
Layer 3: 持久化会话
设计:
-
每个会话保存完整 transcript 到
~/.openclaw/sessions/<session-id>/ -
元数据:开始时间、结束时间、token 使用、成本
-
openclaw session list列出所有会话 -
openclaw session resume <id>恢复会话
收益:
-
会话可以暂停,可以恢复
-
可以复盘历史会话
-
可以作为记忆提取数据源
Layer 4: 向量长期记忆(自我进化核心)
这是自我进化的关键。Claude Code 只做了文件存储全注入,OpenClaw 可以更进一步:语义向量检索。
工作流程:
1. 触发提取:- 会话压缩后- 任务完成后- 用户主动 /extract2. 大模型提取:- 从对话历史中提取有用的记忆条目- 每个条目:{"type":"decision"|"technique"|"preference"|"bugfix","content":"文本内容","tags":["tag1","tag2"],"source":"session-id","timestamp":ISO}3. 向量化存入向量数据库:- sqlite-vec 轻量,不需要额外服务- 或者 lancedb 更强大4. 检索:- 用户新提问 → 向量化- 检索 top-K 相关记忆- 注入到上下文:"以下是相关历史记忆:..."5. 遗忘:-LRU 淘汰旧记忆- 用户可以 /forget <id> 删除- 低分数记忆自动清理
为什么这是自我进化:
-
Agent 每次完成任务,都会提取学到的东西存入长期记忆
-
下次遇到类似问题,自动召回相关记忆
-
随着使用,记忆越来越多,Agent 越来越”聪明”
-
不需要人工整理,全自动
4.4 自我进化机制设计
什么是”自我进化”?
让 Agent 能从自身运行历史中学习,持续改进自身行为,不需要人工重构代码。
Claude Code 有初步的自动提取,但还不够。OpenClaw 可以走得更远:
分层自我进化
┌─────────────────────────────────────────────────────────────────────┐│ Level 1: 记忆提取 ││ - 自动从对话提取有用经验 ││ - 向量存储 + 检索复用 │├─────────────────────────────────────────────────────────────────────┤│ Level 2: Skill 进化 ││ - 优秀的对话流程 → 提取 → 重构为新 Skill ││ - 用户点赞/踩 → 反馈 → 调整 Skill 提示 │├─────────────────────────────────────────────────────────────────────┤│ Level 3: 工作流改进 ││ - 分析哪些任务经常失败 ││ - 自动建议改进工具/流程 │├─────────────────────────────────────────────────────────────────────┤│ Level 4: 元认知 ││ - 自己分析自己思考过程 ││ - 发现反复犯同样错误 → 提出改进 │└─────────────────────────────────────────────────────────────────────┘
Level 1:记忆级进化(P0 实现)
已在 Layer 4 向量记忆中描述:
-
自动提取 → 存储 → 检索
-
每次遇到类似问题都能吃到之前的经验
Level 2:Skill 级进化(P1)
工作流程:
1. 用户执行 Skill 成功/失败2. 完成后,Agent 分析:- 哪些步骤顺利,哪些卡了- 技能提示需要补充什么- 有没有可复用的新模式3. 如果发现可复用的新模式:- 自动提取为新 Skill 骨架- 生成 SKILL.md- 提示用户审查保存4. 如果已有 Skill 多次失败:- 自动分析失败原因- 建议修改 SKILL.md- 用户确认后应用
示例:
-
用户多次让”分析 Claude Code 架构并给 OpenClaw 建议” → 自动提取出
architecture-analysis skill,下次直接用 -
某个数据预处理步骤总是错 → 自动发现问题,建议改进 Skill 提示
Level 3:工作流改进(P2)
思路:
-
定期(每天/每周)分析会话日志
-
统计:
-
哪些工具调用成功率低
-
哪些任务需要多轮才能解决
-
用户经常纠正什么错误
-
自动生成改进报告 → 给人看,或者自动尝试改进
Level 4:元认知(P3 探索)
更进一步,让 Agent 能”思考自己的思考”:
-
回顾:刚才解决这个问题,我的思考路径对吗?
-
发现:我反复查同一个文件,说明我哪里理解错了?
-
改进:下次应该先做什么?
这是更前沿的方向,可以探索。
4.5 遗忘机制设计
只有存入没有遗忘,记忆会爆炸。必须有健康的遗忘机制:
interfaceForgettingConfig{// LRU 淘汰:最少访问的先淘汰enableLRU: booleanmaxMemoryEntries: number// 分数衰减:很久不用的记忆分数自动降低decayFactor: number // e.g., 0.99 每天// 低分数清理:分数低于阈值自动清理cleanupThreshold: number// 用户显式遗忘:/forget <query> 移除相关记忆}
设计原则:
-
常用记忆保留,不用的淘汰
-
错误/废弃记忆可以用户显式删除
-
向量数据库本身支持增量删除,容易实现
五、对比总结
5.1 记忆机制对比表
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5.2 Claude Code 值得我们学习的点
-
CLAUDE.md 项目级上下文 —— 非常简单但非常有效,一定要抄作业
-
预算驱动自动压缩 —— 长对话不需要用户干预,体验好很多
-
压缩后自动提取记忆 —— 抓住压缩这个自然触发点,不增加用户负担
-
可恢复会话 —— 用户体验好,断线/重启不丢失工作
5.3 OpenClaw 可以超越的点
-
语义向量检索 —— Claude Code 是全注入,OpenClaw 只检索相关记忆,token 效率更高2** 结构化记忆分类 **—— 更好的检索精度
-
Skill 级自我进化 —— 从记忆到技能,更进一步
-
健康遗忘机制 —— 避免记忆爆炸
六、工程落地路线图
Phase 1:基础层(2-3 周)P0
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
.openclaw/context.md
CLAUDE.md |
|
|
|
|
Phase 2:向量记忆(2 周)P1
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Phase 3:自我进化(2-3 周)P2
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
七、风险与考虑
7.1 token 成本
-
自动提取需要额外调用 LLM → 但成本不大,压缩已经触发,提取是附加
-
向量检索只注入相关记忆 → token 节省 > 提取额外成本 → 整体节省
7.2 存储
-
向量存储在本地,sqlite-vec 体积很小 → 百万条记录也没问题
-
原始会话 transcript 占用也不大,可配置保留天数
7.3 错误记忆
-
提取到错误/过时记忆怎么办?
-
方案:
-
记忆带上时间戳,新记忆优先
-
用户可以
/forget删除 -
分数衰减,很久不用的低分数自动淘汰
-
检索返回多个,模型自己判断哪个有用
7.4 兼容性
-
现有的 Skill 系统、会话系统完全兼容
-
新功能是增量添加,不改变现有接口
八、结论
Claude Code 的记忆设计已经相当成熟,特别是分层架构 + 自动压缩 + CLAUDE.md 项目上下文 + 自动提取这几点非常值得 OpenClaw 借鉴。
OpenClaw 在 Claude Code 基础上,可以更进一步:
-
加入向量检索 —— 解决全注入 token 浪费问题
-
加入健康遗忘—— 解决记忆膨胀问题
-
加入多层自我进化—— 从记忆提取到 Skill 进化到工作流改进,实现真正的持续自我改进
这样设计出来的记忆系统,会比 Claude Code 更灵活、更高效、更能自我进化。
夜雨聆风