实验

工作空间记忆研究

目标:Clawd 风格的工作空间 (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 格式,无需繁重的模式工作。
  • 渐进式:仅使用 FTS 的 v1 版本就很有用;语义/向量和图是可选的升级项。
  • 智能体友好:使“在令牌预算内回忆”变得容易(返回少量事实包)。

北极星模型 (Hindsight × Letta)

需要融合的两个部分:

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

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

规范存储(git 友好)

保持 ~/.openclaw/workspace 作为规范的人类可读记忆。建议的工作空间布局:

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

说明:

  • 每日日志保持为每日日志。无需将其转换为 JSON。
  • bank/ 中的文件是经过整理的,由反思作业生成,并且仍然可以手动编辑。
  • memory.md 保持“小型 + 核心性质”:你希望 Clawd 在每个会话中看到的内容。

派生存储(机器回忆)

在工作空间下添加一个派生索引(不一定需要 git 跟踪):

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

支持:

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

索引始终可以从 Markdown 重建

保留 / 回忆 / 反思(操作循环)

保留:将每日日志规范化为“事实”

Hindsight 在此相关的关键见解:存储叙述性、自包含的事实,而非微小的片段。对于 memory/YYYY-MM-DD.md 的实用规则:

  • 在一天结束时(或期间),添加一个 ## Retain 部分,包含 2–5 个要点,这些要点:
    • 是叙述性的(保留跨轮次上下文)
    • 是自包含的(以后能独立理解)
    • 带有类型标签和实体提及

示例:

## Retain
- W @Peter: Currently in Marrakech (Nov 27–Dec 1, 2025) for Andy’s birthday.
- B @warelay: I fixed the Baileys WS crash by wrapping connection.update handlers in try/catch (see memory/2025-11-27.md).
- O(c=0.95) @Peter: Prefers concise replies (<1500 chars) on WhatsApp; long content goes into files.

最小化解析:

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

如果你不希望作者考虑这些:反思作业可以从日志的其余部分推断出这些要点,但拥有显式的 ## Retain 部分是最简单的“质量杠杆”。

回忆:对派生索引进行查询

回忆应支持:

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

返回格式应智能体友好并引用来源:

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

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

反思是一个定时作业(每日或心跳 ultrathink),它:

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

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

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

CLI 集成:独立 vs 深度集成

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

为何集成到 OpenClaw?

  • OpenClaw 已经知道:
    • 工作空间路径 (agents.defaults.workspace)
    • 会话模型 + 心跳
    • 日志记录 + 故障排除模式
  • 你希望智能体本身调用工具:
    • openclaw memory recall "…" --k 25 --since 30d
    • openclaw memory reflect --since 7d

为何仍要拆分一个库?

  • 保持记忆逻辑无需网关/运行时即可测试
  • 在其他上下文中重用(本地脚本、未来的桌面应用等)

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

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

如果“S-Collide”指的是 SuCo (Subspace Collision):它是一种 ANN 检索方法,通过使用子空间中的学习/结构化碰撞来瞄准强召回率/延迟权衡(论文:arXiv 2411.14754, 2024)。对于 ~/.openclaw/workspace 的实用建议:

  • 不要从 SuCo 开始。
  • 从 SQLite FTS +(可选的)简单嵌入开始;你将立即获得大部分用户体验提升。
  • 仅在以下情况下考虑 SuCo/HNSW/ScaNN 类解决方案:
    • 语料库很大(数万/数十万个块)
    • 暴力嵌入搜索变得太慢
    • 召回质量受到词汇搜索的显著瓶颈

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

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

开放性问题:

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

最小可用试点

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

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

参考文献

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

会话绑定通道无关计划模型配置探索