【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

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
Python_进阶_浮点型(float)不可避免的误差产生原因,float类型在所有计算机中的储存方式——获得图灵奖的天才设计:IEEE754 标准

Python_进阶_浮点型(float)不可避免的误差产生原因,float类型在所有计算机中的储存方式——获得图灵奖的天才设计:IEEE754 标准

目录 说明 一、前言 二、理论 2.1 Bug 2.2 十进制小数转换为二进制小数 2.3 IEEE754标准 2.4 IEEE754标准实际储存的格式 2.4.1 通用情况 2.4.2 特殊情况 2.4.3 规格化浮点数与非规格化浮点数 2.4.4 通用储存格式 2.5 二进制舍入原理 三、计算结果验证 3.1 验证 3.2 误差消除方法 四、整体代码及注释 五、结语 五、

By Ne0inhk