【OpenClaw -07】OpenClaw 记忆系统:三层记忆架构与 Daily Notes 机制

【OpenClaw -07】OpenClaw 记忆系统:三层记忆架构与 Daily Notes 机制

OpenClaw 记忆系统:三层记忆架构与 Daily Notes 机制

标签OpenClaw记忆架构RAGEmbedding上下文管理长期记忆

前言:记忆是 Agent 的"状态壁垒"

在构建生产级 AI Agent 时,一个常被低估的架构难题是状态持久化。无状态的 LLM 调用虽然简单,但无法形成累积性的用户理解;而粗暴的全量历史拼接又很快会触达 Token 上限。OpenClaw 的记忆系统通过分层存储架构与智能归档机制,在上下文窗口限制与长期记忆能力之间建立了工程化的平衡。
本文将从架构实现角度,拆解 OpenClaw 的三层记忆模型、Daily Notes 持久化机制、语义检索配置策略以及多会话隔离原则,帮助开发者设计出既具备持续学习能力、又符合隐私合规要求的记忆方案。

一、三层记忆模型:分层存储的工程哲学

OpenClaw 采用分层越界(Tiered Overflow)设计,将记忆按时间维度与重要性维度划分为三个层级,分别对应不同的存储介质与检索策略。

1.1 架构总览

 ┌─────────────────────────────────────────────────────────────┐ │ L1 工作记忆 (Working Memory) │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 存储位置:LLM 上下文窗口 (Context Window) │ │ │ │ 内容形态:原始对话历史 + 系统提示词 │ │ │ │ 生命周期:单个会话 (Session) │ │ │ │ 容量限制:受限于模型 Max Tokens (通常 4k-128k) │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ 溢出 (Overflow) │ │ ▼ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 压缩/摘要 ◄── Pre-compaction Flush │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ │ └──────────────────────────┼──────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────┐ │ L2 短期记忆 (Daily Notes) │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 存储位置:~/.openclaw/workspace/<ws>/memory/ │ │ │ │ YYYY-MM-DD.md │ │ │ │ 内容形态:Markdown 格式的每日会话摘要 │ │ │ │ 更新频率:实时追加 + 每日归档 │ │ │ │ 保留策略:默认 30 天可配置 │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ 语义提取 (Semantic Extraction) │ │ ▼ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ Embedding 向量化 ◄── 关键事实抽取 │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ │ └──────────────────────────┼──────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────┐ │ L3 长期记忆 (Episodic Memory) │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 存储位置:~/.openclaw/workspace/<ws>/agents/ │ │ │ │ <agentId>/MEMORY.md │ │ │ │ 内容形态:结构化事实库 + 用户画像标签 │ │ │ │ 持久周期:永久(除非手动清理) │ │ │ │ 加载时机:Agent 初始化时注入系统提示词 │ │ │ └──────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ 

1.2 各层技术细节

L1 工作记忆:热上下文管理
OpenClaw 在内存中维护一个双端队列(Deque)结构,存储当前会话的原始消息。当检测到 Token 消耗超过阈值(默认 80% 的上下文窗口)时,触发智能裁剪:

  • 保留最近的 N 轮对话(保证对话连贯性)
  • 对早期消息进行语义压缩,生成摘要后移入 L2

L2 短期记忆:Daily Notes 机制
以自然日为单位的 Markdown 文件,采用追加写(Append-only)模式:

# 2026-03-09 Session Log ## 10:23 - Project Discussion User asked about microservices migration strategy. Key points: - Current monolith uses Python/Django - Target: Kubernetes + Go microservices - Concern: Data consistency during migration ## 14:15 - Code Review Reviewed PR #234: Added circuit breaker pattern to payment service. 

L3 长期记忆:事实萃取库
经过人工审核或高频访问验证的事实,以结构化键值对形式存储:

## User Preferences - code_style: "PEP8 with type hints" - preferred_languages: ["Python", "Rust"] - infrastructure: "AWS EKS, Terraform" ## Project Context - current_project: "Payment Gateway v2" - tech_stack: "Go, gRPC, PostgreSQL" - constraints: ["PCI-DSS compliance", "99.99% SLA"] 

二、记忆写入机制:从被动记录到主动归档

2.1 Agent 主动写入

开发者可通过 SDK 显式控制记忆写入时机,避免自动机制带来的噪声:

from openclaw import Agent, MemoryLevel agent = Agent("assistant")# 显式写入长期记忆(重要事实)await agent.memory.commit( level=MemoryLevel.L3, content="User is allergic to shellfish",# 关键医疗信息 tags=["health","constraints"])# 批量写入短期记忆(日常上下文)await agent.memory.extend(["Discussed Q2 roadmap priorities","Agreed on microservices split strategy"])

写入冲突解决:
当并发写入同一记忆文件时,OpenClaw 采用文件级锁(flock)与乐观锁(版本号)结合的策略:
短时间尺度(同一进程内):内存队列缓冲,批量 flush
跨进程并发:基于 inode 的 advisory locking,失败时退避重试

2.2 Pre-compaction Flush 自动归档

L1 向 L2 的溢流由压缩守护进程自动处理,触发条件包括:

触发条件检查(每轮对话后) │ ▼ ┌──────────────────────┐ │ Token 使用率 > 80% ? │──Yes──► 启动 Compaction └──────────┬───────────┘ │ No ▼ ┌──────────────────────┐ │ 会话空闲 > 5分钟 ? │──Yes──► 启动 Compaction └──────────┬───────────┘ │ No ▼ 保持 L1 现状 

压缩算法流程:

 原始对话历史 (L1) │ ▼ ┌─────────────────────────┐ │ 1. 语义分块 │ │ - 按主题边界切分对话 │ │ - 识别独立的事实单元 │ └──────────┬──────────────┘ │ ▼ ┌─────────────────────────┐ │ 2. 重要性评分 │ │ - 用户显式强调 (+2) │ │ - 包含决策/结论 (+1) │ │ - 闲聊/过渡 (-1) │ └──────────┬──────────────┘ │ ▼ ┌─────────────────────────┐ │ 3. 摘要生成 │ │ - 高重要性:保留原文 │ │ - 中重要性:生成摘要 │ │ - 低重要性:丢弃 │ └──────────┬──────────────┘ │ ▼ 写入 L2 (Daily Notes) 

三、语义搜索配置:向量检索的工程化实践

OpenClaw 的记忆检索并非简单的关键词匹配,而是基于Embedding 向量的语义相似度搜索。架构师需在精度、成本与隐私之间做权衡。

3.1 Provider 选型矩阵

memorySearch.provider 支持多种后端,适用场景各异:

Provider模型能力数据隐私成本适用场景
OpenAItext-embedding-3-large (3072d)数据出境$0.13/1M tokens高精度通用场景
Geminiembedding-001数据出境免费额度高多语言混合场景
Voyagevoyage-2 (1024d)数据出境$0.10/1M tokens代码/技术文档专用
Ollamanomic-embed-text (768d)本地计算仅硬件成本离线/隐私敏感环境
LocalONNX 运行时加载自定义模型本地计算硬件成本定制化领域模型

配置示例:

{"memorySearch":{"provider":"ollama","model":"nomic-embed-text:latest","baseUrl":"http://localhost:11434","dimensions":768,"metric":"cosine","topK":5,"threshold":0.72}}

3.2 嵌入策略与分块优化

文本分块(Chunking)策略直接影响检索精度:

 Daily Notes (Markdown) │ ▼ ┌──────────────────────────────┐ │ 按标题层级分块 (H2/H3 边界) │ │ - 保持语义完整性 │ │ - 块大小:256-512 tokens │ └──────────┬───────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 重叠窗口 (Overlap: 50 tokens) │ │ - 防止上下文截断 │ │ - 保证跨边界语义连贯 │ └──────────┬───────────────────┘ │ ▼ 生成向量索引 (Chroma/FAISS) 

混合检索(Hybrid Search):
OpenClaw 默认结合向量相似度与关键词 BM25 分数,通过 RRF(Reciprocal Rank Fusion)重排序:

# 内部实现逻辑 vector_results = vector_search(query_embedding, top_k=10) keyword_results = bm25_search(query_text, top_k=10)# RRF 融合 final_scores ={}for rank, doc inenumerate(vector_results): final_scores[doc.id]+=1.0/(k + rank)for rank, doc inenumerate(keyword_results): final_scores[doc.id]+=1.0/(k + rank)

四、记忆加载规则:会话隔离与安全边界

OpenClaw 对记忆的访问实施最小权限原则,不同会话类型具有不同的记忆可见性。

4.1 Main Session 与 Group Session 隔离模型

Workspace 记忆存储 │ ├──► Main Session (1:1 专属会话) │ │ │ ├──► 加载 MEMORY.md (L3 长期记忆) │ │ - 用户画像 │ │ - 项目上下文 │ │ │ ├──► 加载本周 Daily Notes (L2) │ │ - 近期上下文 │ │ │ └──► 实时对话历史 (L1) │ └──► Group Session (1:N 群组会话) │ ├──► 不加载 MEMORY.md │ - 防止隐私泄露给其他参与者 │ ├──► 仅加载 Session 创建后的对话历史 │ └──► 可选:共享白板 (Shared Context) - 显式授权的知识库 

安全隔离原理:

  • Main Session:假设用户与 Agent 建立信任关系,可访问完整个人历史
  • Group Session:多参与者环境,默认零记忆启动,避免:
    • 用户 A 的隐私信息被用户 B 通过 Agent 获取
    • 跨项目的敏感数据混用

4.2 显式记忆共享机制

当需要在 Group Session 中引入背景知识时,采用显式授权模式:

# 创建群组会话时注入特定记忆片段 group_session =await openclaw.create_group_session( participants=["user1","user2","agent"], shared_context=["project_requirements_v2.md",# 仅项目相关文档"api_design_spec.md"], exclude_personal_memory=True# 严格隔离个人 L3 记忆)

五、记忆故障排查:生产环境诊断指南

记忆系统故障往往表现为"Agent 健忘"或"回答 hallucination",以下是系统性排查路径。

5.1 Workspace 写入权限故障

症状:Agent 表现出"金鱼记忆",每次对话都像是初次见面。
诊断流程:

检查记忆持久化 │ ▼ ┌──────────────────────────────┐ │ 1. 检查目录权限 │ │ ls -la ~/.openclaw/ │ │ - 应为 700 (drwx------) │ │ - 属主应为运行用户 │ └──────────┬───────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 2. 检查磁盘空间 │ │ df -h │ │ - 内存目录剩余空间 < 10% │ │ - 触发只读保护模式 │ └──────────┬───────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 3. 检查文件锁竞争 │ │ lsof +D ~/.openclaw/ │ │ - 多实例并发写入冲突 │ │ - 解决方案:改用 Redis 后端 │ └──────────────────────────────┘ 

修复命令:

# 自动修复权限 openclaw doctor --fix-permissions # 验证写入能力 openclaw memory test-write --workspace default # 应返回:Successfully wrote test chunk to L2 memory

5.2 Token 上限导致的记忆遗忘

症状:Agent 在长对话中后期开始重复询问已确认的信息。
根因分析:
当 L1 工作记忆达到模型上下文上限时,即使 L2/L3 存在历史记录,也可能因检索失败或注入位置错误导致记忆"未激活"。
排查步骤:

对话中断/重复询问 │ ▼ ┌──────────────────────────────┐ │ 检查当前上下文占用 │ │ openclaw session inspect │ │ - current_tokens: 15234/16384│ │ - 使用率:93% │ └──────────┬───────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 检查记忆检索结果 │ │ - 是否触发 RAG? │ │ - topK 返回是否为空? │ │ ├── 空:向量数据库未构建 │ │ │ 运行:openclaw index rebuild │ └── 有结果但未被采用 │ │ 检查 prompt 模板 │ └──────────┬───────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 优化策略 │ │ 1. 增大 topK (5→10) │ │ 2. 降低 threshold (0.75→0.65) │ │ 3. 启用重排序 (Reranker) │ │ 4. 摘要压缩早期对话 │ └──────────────────────────────┘ 

配置调优:

{"memory":{"contextManagement":{"reserveTokens":2000,// 为检索结果预留空间"compressionThreshold":0.8,"summarizationModel":"gpt-4o-mini"// 专用轻量模型做摘要},"retrieval":{"topK":7,"threshold":0.68,"rerank":true,"rerankModel":"cohere-rerank-v3"}}}

5.3 向量索引损坏修复

症状:语义搜索返回无关内容,或抛出 Index out of range 异常。
重建索引:

# 备份现有记忆cp-r ~/.openclaw/workspace/default/memory ./memory_backup # 重建向量索引(保留原始文本,仅重建 Embedding) openclaw memory rebuild-index --workspace default --provider ollama # 验证相似度搜索 openclaw memory search "What was the database choice last week?"--verbose

六、架构设计建议与最佳实践

6.1 记忆分层策略

高频变更数据(如临时变量、中间计算结果):

  • 仅保留在 L1,不持久化
  • 使用 session_state 临时存储
    业务上下文(如当前项目技术栈):
  • 写入 L3 MEMORY.md
  • 在 Agent systemPrompt 中通过模板变量注入:
Current project: {{memory.project_name}} Tech stack: {{memory.tech_stack}} 

历史记录(如昨日讨论结论):

  • 依赖 L2 Daily Notes + RAG 检索
  • 定期(每周)将高频访问的 L2 内容升格至 L3

6.2 隐私与合规

敏感信息过滤:
在写入 L2/L3 前,通过实体识别(NER)自动检测并脱敏:

# 配置示例{"memory":{"privacy":{"detectPII": true,"redactPatterns":["\\b\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}\\b",# 信用卡"\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b"# 邮箱]}}}

记忆遗忘权(Right to be Forgotten):

# 删除特定用户所有记忆 openclaw memory purge --user user_123 --all-levels # 删除特定会话痕迹 openclaw memory purge --session sess_abc --level L1 

结语

OpenClaw 的记忆系统通过 L1/L2/L3 的分层架构,巧妙地解决了大模型上下文限制与长期记忆需求之间的矛盾。作为架构师,理解 Daily Notes 的持久化机制、语义检索的向量配置以及会话隔离的安全模型,是构建可靠 Agent 应用的基础。
在实际部署中,建议建立记忆健康度监控(记忆命中率、检索延迟、存储增长率),并定期进行记忆质量审计(清理过期 L2 数据、优化 L3 结构)。只有将记忆系统视为与模型选型同等重要的基础设施,才能构建出真正具备持续学习能力的智能应用。

本文章基于OpenClaw官方文档学习撰写。仅供学习参考,请勿用于商业用途。

Read more

HDFS数据块机制深度解析:块大小设计与存储哲学

HDFS数据块机制深度解析:块大小设计与存储哲学

HDFS数据块机制深度解析:块大小设计与存储哲学 * 引言:块——HDFS存储的核心抽象 * 一、HDFS默认块大小 * 1.1 版本演进与默认值 * 1.2 查看和验证块大小 * 1.3 配置文件中的设置 * 二、为什么HDFS采用块存储? * 2.1 核心设计思想 * 2.2 详细解析:为什么块存储如此重要? * **2.2.1 减少寻址开销,提升I/O效率** * **2.2.2 支持超大文件,超越单机限制** * **2.2.3 简化存储设计,降低元数据复杂度** * **2.2.4 便于数据复制,增强容错性** * **2.2.5 支持数据本地性,

By Ne0inhk

Python调用CosyVoice实战指南:从API封装到异常处理全解析

最近在项目中接入了CosyVoice的语音合成服务,发现官方文档虽然清晰,但真要集成到生产环境,还是有不少坑要踩。今天就把我的实战经验整理成笔记,分享给同样在摸索的开发者朋友们。 CosyVoice是一款功能强大的语音合成服务,它能将文本转换成自然流畅的语音。其核心在于提供了高质量的多种音色选择,并且支持流式音频输出。典型的应用场景非常广泛,比如为有声内容创作提供配音、为智能客服或语音助手生成应答语音,以及为各类应用增加语音播报功能。 在实际调用其HTTP API的过程中,我遇到了不少“陷阱”,总结下来主要有以下五点: 1. 鉴权Token过期与刷新:API调用依赖Access Token,而Token有有效期。新手容易在代码中写死一个Token,或者每次调用都申请一个新Token,前者会导致服务突然中断,后者则会产生不必要的开销和延迟。 2. 流式响应处理不当:CosyVoice返回的是音频二进制流。如果像处理普通JSON响应一样直接response.json(),会报错。更关键的是,需要正确处理分块接收(chunked)的数据,并写入文件或进行后续流式播放,内存管理不当容

By Ne0inhk

Python 程序打包exe加入授权码和注册机

一、总体思路 软件授权方案大概分成两个部分:程序本体 和 注册机。 当用户启动程序时,程序会检验本地的 授权文件 是否合法,若验证通过,则直接进入程序,若未找到授权文件或者授权文件校验失败,则进入重新授权流程。进入授权流程时,程序先扫描本机运行环境,生成 机器码 ,然后提示用户找管理员获取授权码;用户将机器码发送给管理员,管理员将机器码输入 注册机 中,生成与该机器码唯一绑定的 授权码 后,发送给用户;用户在程序中输入授权码,验证通过后正式进入程序,并在本地生成授权文件。 下面是我的软件授权方案的流程图。 以上便是我这套软件授权方案的总体思路,接下来,我会教大家如何用 python 来实现它。 二、实现过程 实现这套授权机制,我们需要解决以下几个小问题。 1. 如何使授权码与机器唯一绑定,仅在本台机器上有效? 2. 如何生成验证码,以及如何验证授权码是否有效? 3. 如何保护自己的授权码不那么容易被人破解? 带着这些问题,我们继续往下看。

By Ne0inhk

Python 和 PyTorch 的核心区别(零基础秒懂)

很多零基础同学会把 Python 和 PyTorch 搞混,核心结论先摆清楚:Python 是一门通用编程语言,PyTorch 是基于 Python 开发的、专门用于深度学习的 “工具库 / 框架” —— 就像 “普通话” 和 “医学专用术语 + 手术工具包” 的区别:普通话是沟通的基础,手术工具包只能用在医学场景,且必须用普通话才能操作。 下面从本质、定位、功能、依赖关系 4 个维度讲透区别,配通俗例子和代码对比,零基础也能理解。 一、核心本质:先搞懂 “是什么” 概念PythonPyTorch本质通用编程语言(和 Java、C++ 同级)基于 Python 的深度学习专用库 / 框架(和 NumPy、Pandas 同级,只是聚焦深度学习)

By Ne0inhk