Workspace Memory v2(离线版):研究笔记

目标:Clawd 风格的 Workspace(agents.defaults.workspace,默认为 ~/.openclaw/workspace),其中”记忆”以每天一个 Markdown 文件(memory/YYYY-MM-DD.md)的形式存储,外加一小组稳定文件(如 memory.mdSOUL.md)。

本文档提出了一个离线优先的记忆架构,保持 Markdown 作为规范的、可审查的真实来源,但通过派生索引添加结构化召回功能(搜索、实体摘要、置信度更新)。

为什么要改变?

当前设置(每天一个文件)非常适合:

  • “仅追加”式日志记录
  • 人工编辑
  • 基于 git 的持久性 + 可审计性
  • 低摩擦捕获(“直接写下来”)

但它在以下方面较弱:

  • 高召回率检索(“我们对 X 做了什么决定?”、“上次我们尝试 Y 是什么时候?”)
  • 以实体为中心的回答(“告诉我关于 Alice / The Castle / warelay 的信息”)而无需重新阅读许多文件
  • 观点/偏好的稳定性(以及变化时的证据)
  • 时间约束(“2025 年 11 月期间什么是真的?“)和冲突解决

设计目标

  • 离线:无需网络即可工作;可在笔记本电脑/Castle 上运行;无云依赖。
  • 可解释:检索的项目应该可归因(文件 + 位置)并与推理分离。
  • 低仪式感:每日日志保持 Markdown 格式,无需繁重的模式工作。
  • 增量式:v1 仅使用 FTS 就很有用;语义/向量和图是可选升级。
  • Agent 友好:使”在 Token 预算内召回”变得容易(返回小的事实包)。

北极星模型(Hindsight × Letta)

要融合的两个部分:

  1. Letta/MemGPT 风格的控制循环
  • 保持一个小的”核心”始终在 Context 中(角色 + 关键用户事实)
  • 其他所有内容都在 Context 之外,通过工具检索
  • 记忆写入是显式的工具调用(追加/替换/插入),持久化后在下一轮重新注入
  1. Hindsight 风格的记忆基底
  • 分离观察到的、相信的和总结的内容
  • 支持 retain/recall/reflect
  • 带置信度的观点,可随证据演化
  • 实体感知检索 + 时间查询(即使没有完整的知识图谱)

提议的架构(Markdown 真实来源 + 派生索引)

规范存储(git 友好)

保持 ~/.openclaw/workspace 作为规范的人类可读记忆。

建议的 Workspace 布局:

~/.openclaw/workspace/
  memory.md                    # 小文件:持久事实 + 偏好(核心内容)
  memory/
    YYYY-MM-DD.md              # 每日日志(追加;叙述性)
  bank/                        # "类型化"记忆页面(稳定、可审查)
    world.md                   # 关于世界的客观事实
    experience.md              # Agent 做了什么(第一人称)
    opinions.md                # 主观偏好/判断 + 置信度 + 证据指针
    entities/
      Peter.md
      The-Castle.md
      warelay.md
      ...

注意:

  • 每日日志保持每日日志。无需将其转换为 JSON。
  • bank/ 文件是精心策划的,由反思任务生成,仍然可以手动编辑。
  • memory.md 保持”小而核心”:你希望 Clawd 在每个 Session 中看到的内容。

派生存储(机器召回)

在 Workspace 下添加派生索引(不一定需要 git 跟踪):

~/.openclaw/workspace/.memory/index.sqlite

支持:

  • SQLite 模式用于事实 + 实体链接 + 观点元数据
  • SQLite FTS5 用于词法召回(快速、小巧、离线)
  • 可选的 Embeddings 表用于语义召回(仍然离线)

索引始终可从 Markdown 重建

Retain / Recall / Reflect(操作循环)

Retain:将每日日志规范化为”事实”

Hindsight 的关键洞察:存储叙述性的、自包含的事实,而不是微小的片段。

memory/YYYY-MM-DD.md 的实用规则:

  • 在一天结束时(或期间),添加一个 ## Retain 部分,包含 2-5 个要点:
    • 叙述性(保留跨轮次的 Context)
    • 自包含(独立时也有意义)
    • 标记类型 + 实体提及

示例:

## Retain
- W @Peter: 目前在马拉喀什(2025 年 11 月 27 日至 12 月 1 日)参加 Andy 的生日。
- B @warelay: 我通过在 try/catch 中包装 connection.update 处理程序修复了 Baileys WS 崩溃(见 memory/2025-11-27.md)。
- O(c=0.95) @Peter: 更喜欢在 WhatsApp 上简洁的回复(<1500 字符);长内容放入文件。

最小解析:

  • 类型前缀:W(世界)、B(经验/传记)、O(观点)、S(观察/摘要;通常生成)
  • 实体:@Peter@warelay 等(slug 映射到 bank/entities/*.md
  • 观点置信度:O(c=0.0..1.0) 可选

如果你不想让作者考虑这个:反思任务可以从日志的其余部分推断这些要点,但有一个显式的 ## Retain 部分是最简单的”质量杠杆”。

Recall:对派生索引的查询

Recall 应该支持:

  • 词法:“查找确切的术语/名称/命令”(FTS5)
  • 实体:“告诉我关于 X 的信息”(实体页面 + 实体链接的事实)
  • 时间:“11 月 27 日左右发生了什么”/“自上周以来”
  • 观点:“Peter 更喜欢什么?“(带置信度 + 证据)

返回格式应该是 Agent 友好的并引用来源:

  • kindworld|experience|opinion|observation
  • timestamp(来源日期,或提取的时间范围如果存在)
  • entities["Peter","warelay"]
  • content(叙述性事实)
  • sourcememory/2025-11-27.md#L12 等)

Reflect:生成稳定页面 + 更新信念

反思是一个计划任务(每日或 Heartbeat ultrathink):

  • 从最近的事实更新 bank/entities/*.md(实体摘要)
  • 根据强化/矛盾更新 bank/opinions.md 置信度
  • 可选地提议对 memory.md 的编辑(“核心”持久事实)

观点演化(简单、可解释):

  • 每个观点有:
    • 陈述
    • 置信度 c ∈ [0,1]
    • last_updated
    • 证据链接(支持 + 矛盾的事实 ID)
  • 当新事实到达时:
    • 通过实体重叠 + 相似性找到候选观点(首先 FTS,然后 Embeddings)
    • 通过小增量更新置信度;大跳跃需要强烈矛盾 + 重复证据

CLI 集成:独立 vs 深度集成

建议:深度集成到 OpenClaw,但保持可分离的核心库。

为什么集成到 OpenClaw?

  • OpenClaw 已经知道:
    • Workspace 路径(agents.defaults.workspace
    • Session 模型 + Heartbeat
    • 日志 + 故障排除模式
  • 你希望 Agent 本身调用工具:
    • openclaw memory recall "…" --k 25 --since 30d
    • openclaw memory reflect --since 7d

为什么仍然拆分库?

  • 保持记忆逻辑可测试,无需 Gateway/Runtime
  • 从其他 Context 重用(本地脚本、未来的桌面应用等)

形式: 记忆工具旨在成为一个小型 CLI + 库层,但这只是探索性的。

“S-Collide” / SuCo:何时使用它(研究)

如果”S-Collide”指的是 SuCo(Subspace Collision):这是一种 ANN 检索方法,通过在子空间中使用学习/结构化碰撞来实现强大的召回/延迟权衡(论文:arXiv 2411.14754,2024)。

~/.openclaw/workspace 的务实看法:

  • 不要从 SuCo 开始。
  • 从 SQLite FTS +(可选)简单 Embeddings 开始;你会立即获得大部分 UX 优势。
  • 仅在以下情况下考虑 SuCo/HNSW/ScaNN 类解决方案:
    • 语料库很大(数万/数十万个块)
    • 暴力 Embedding 搜索变得太慢
    • 召回质量明显受词法搜索瓶颈限制

离线友好的替代方案(按复杂度递增):

  • SQLite FTS5 + 元数据过滤器(零 ML)
  • Embeddings + 暴力搜索(如果块数量少,效果出奇地好)
  • HNSW 索引(常见、稳健;需要库绑定)
  • SuCo(研究级;如果有可嵌入的可靠实现则很有吸引力)

开放问题:

  • 在你的机器(笔记本电脑 + 桌面)上,“个人助理记忆”的最佳离线 Embedding 模型是什么?
    • 如果你已经有 Ollama:使用本地模型嵌入;否则在工具链中附带一个小型 Embedding 模型。

最小可用试点

如果你想要一个最小但仍然有用的版本:

  • 在每日日志中添加 bank/ 实体页面和 ## Retain 部分。
  • 使用 SQLite FTS 进行带引用的召回(路径 + 行号)。
  • 仅在召回质量或规模需要时添加 Embeddings。

参考文献

  • Letta / MemGPT 概念:“核心记忆块”+“档案记忆”+ 工具驱动的自编辑记忆。
  • Hindsight 技术报告:“retain / recall / reflect”、四网络记忆、叙述性事实提取、观点置信度演化。
  • SuCo:arXiv 2411.14754(2024):“子空间碰撞”近似最近邻检索。