乐于分享
好东西不私藏

基于Claude Code源码 与 OpenClaw 记忆机制对比分析及 OpenClaw 记忆系统优化设计

基于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 最接近”自我进化”的机制:

触发时机:每次压缩后触发

做什么

  1. 调用大模型从对话历史中提取有用的长期记忆

  2. 分类记忆:

    • 决策记忆:为什么这么做决定

    • 技术记忆:学到的技术技巧

    • 项目记忆:项目结构、约定

    • 个人偏好:用户喜欢的风格

  3. 持久化到 memdir/ 目录

  4. 未来会话自动注入这些记忆

源码思路:

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 记忆设计总结

层次
作用
技术
会话内
当前对话上下文
内存 + 自动压缩
会话持久化
暂停/恢复
磁盘保存完整 transcript
项目嵌套
项目级约定
CLAUDE.md 自动注入
自动提取
从历史学习
压缩后自动提取 → memdir
团队同步
多人生态协作
共享存储同步

核心优点

  • ✅ 分层清晰,不同生命周期放不同层

  • ✅ 自动压缩,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 改进空间

维度
Claude Code
OpenClaw 当前
差距
分层记忆
5 层(会话/持久化/项目/提取/团队)
2-3 层
缺少自动提取、项目嵌套、团队同步
上下文压缩
预算驱动自动压缩
会话轮转
长对话需要人工干预,token 不可控
项目级上下文
CLAUDE.md 自动注入
只有全局 AGENTS.md
不同项目无法有不同上下文
自动记忆提取
压缩后自动提取
需要手动记录到 tmp_tasks
无法自动从历史学习
语义检索
(Claude 也没做,但)
没有
大记忆全注入效率低
自我进化
自动提取 → 下次自动注入
需要人工整理
无法持续自我改进

四、OpenClaw 记忆机制优化设计

4.1 设计目标

  1. 分层记忆 —— 不同生命周期放不同层

  2. 自动管理 —— token 预算自动压缩,不需要用户干预

  3. 持续学习 —— 从历史对话自动提取有用记忆,下次自动使用

  4. 项目隔离 —— 每个项目可以有自己的上下文和记忆

  5. 语义检索 —— 大记忆不全注入,只检索相关的

  6. 自我进化 —— 记忆系统本身能随着使用不断改进

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 记忆机制对比表

维度
Claude Code
OpenClaw 当前
分层架构
5层
2-3层
自动压缩
✅ 预算驱动
⚠️ 会话轮转
项目级上下文
✅ CLAUDE.md
⚠️ 只有全局
会话持久化
✅ /resume
⚠️ 弱支持
自动记忆提取
✅ 压缩后
❌ 无
向量检索
❌ 全注入
❌ 无
遗忘机制
❌ 弱
❌ 无
自我进化
⚠️ 记忆级别
❌ 无

5.2 Claude Code 值得我们学习的点

  1. CLAUDE.md 项目级上下文 —— 非常简单但非常有效,一定要抄作业

  2. 预算驱动自动压缩 —— 长对话不需要用户干预,体验好很多

  3. 压缩后自动提取记忆 —— 抓住压缩这个自然触发点,不增加用户负担

  4. 可恢复会话 —— 用户体验好,断线/重启不丢失工作

5.3 OpenClaw 可以超越的点

  1. 语义向量检索 —— Claude Code 是全注入,OpenClaw 只检索相关记忆,token 效率更高2** 结构化记忆分类 **—— 更好的检索精度

  2. Skill 级自我进化 —— 从记忆到技能,更进一步

  3. 健康遗忘机制 —— 避免记忆爆炸

六、工程落地路线图

Phase 1:基础层(2-3 周)P0

任务
工作量
说明
实现预算驱动自动压缩
1 周
参考 Claude Code,子 Agent 压缩
实现项目级上下文注入
3 天
.openclaw/context.md

 + 兼容 CLAUDE.md
实现会话持久化 + /resume
1 周
保存 transcript,支持恢复

Phase 2:向量记忆(2 周)P1

任务
工作量
说明
集成 sqlite-vec / lancedb
3 天
轻量级向量存储,不需要额外服务
实现自动记忆提取
1 周
压缩后触发,提取分类存储
实现查询前检索注入
3 天
用户提问 → 检索 → 注入上下文
实现遗忘机制
3 天
LRU + 用户 /forget

Phase 3:自我进化(2-3 周)P2

任务
工作量
说明
Skill 自动提取骨架
1 周
从对话 → 生成 SKILL.md 骨架
反馈驱动 Skill 改进
1 周
用户点赞/踩 → 建议修改
定期分析改进报告
3 天
统计成功率,生成改进建议

七、风险与考虑

7.1 token 成本

  • 自动提取需要额外调用 LLM → 但成本不大,压缩已经触发,提取是附加

  • 向量检索只注入相关记忆 → token 节省 > 提取额外成本 → 整体节省

7.2 存储

  • 向量存储在本地,sqlite-vec 体积很小 → 百万条记录也没问题

  • 原始会话 transcript 占用也不大,可配置保留天数

7.3 错误记忆

  • 提取到错误/过时记忆怎么办?

  • 方案:

    1. 记忆带上时间戳,新记忆优先

    2. 用户可以 /forget 删除

    3. 分数衰减,很久不用的低分数自动淘汰

    4. 检索返回多个,模型自己判断哪个有用

7.4 兼容性

  • 现有的 Skill 系统、会话系统完全兼容

  • 新功能是增量添加,不改变现有接口

八、结论

Claude Code 的记忆设计已经相当成熟,特别是分层架构 + 自动压缩 + CLAUDE.md 项目上下文 + 自动提取这几点非常值得 OpenClaw 借鉴。

OpenClaw 在 Claude Code 基础上,可以更进一步:

  1. 加入向量检索 —— 解决全注入 token 浪费问题

  2. 加入健康遗忘—— 解决记忆膨胀问题

  3. 加入多层自我进化—— 从记忆提取到 Skill 进化到工作流改进,实现真正的持续自我改进

这样设计出来的记忆系统,会比 Claude Code 更灵活、更高效、更能自我进化。