Workspace Memory v2(离线):研究笔记
目标:Clawd 风格工作区(agents.defaults.workspace,默认 ~/.openclaw/workspace),将“memory”存为按日 Markdown 文件(memory/YYYY-MM-DD.md)+ 少量稳定文件(如 memory.md、SOUL.md)。
本文提出离线优先的 memory 架构:Markdown 仍是可审阅的事实来源,但通过派生索引提供结构化 recall(搜索、实体摘要、置信度更新)。
为什么要改?
现有方案(每天一个文件)擅长:- “只追加”日志
- 人工编辑
- git 支撑的持久性 + 可审计
- 低摩擦捕获(“直接写下来”)
- 高召回检索(“我们对 X 的结论是什么?”、“上次尝试 Y 是何时?”)
- 实体中心问答(“说说 Alice / The Castle / warelay”)而无需翻许多文件
- 观点/偏好的稳定性(及其变化的证据)
- 时间约束(“2025 年 11 月时哪些为真?”)与冲突消解
设计目标
- 离线:无网络即可运行;可在 laptop/Castle 上运行;无云依赖。
- 可解释:检索项可归因(文件 + 位置),推断与事实分离。
- 低仪式感:日常记录仍是 Markdown,不引入重 schema。
- 可增量:v1 仅 FTS 也有价值;向量/图谱为可选升级。
- Agent 友好:便于“在 token 预算内 recall”(返回小包事实)。
北极星模型(Hindsight × Letta)
融合两部分:- Letta/MemGPT 风格控制循环
- 保持一个小“核心”始终在上下文(persona + 关键用户事实)
- 其他内容在上下文外,通过工具检索
- 记忆写入是显式工具调用(append/replace/insert),持久化后再注入下一回合
- Hindsight 风格 memory 基座
- 区分观察、信念与摘要
- 支持 retain/recall/reflect
- 观点带置信度,可随证据演化
- 实体感知检索 + 时间查询(即使没有完整图谱)
架构提议(Markdown 事实来源 + 派生索引)
规范存储(git 友好)
保持~/.openclaw/workspace 为人类可读的记忆主仓。
建议布局:
- 每日日志仍是每日日志,不必改成 JSON。
bank/文件为整理产物,由反思任务生成,仍可手工编辑。memory.md保持“小而核心”:希望 Clawd 每次会话都看到的内容。
派生存储(机器 recall)
在工作区添加派生索引(不一定纳入 git):- SQLite schema 存事实 + 实体链接 + 观点元数据
- SQLite FTS5 提供词法检索(快、小、离线)
- 可选 embeddings 表用于语义检索(仍离线)
Retain / Recall / Reflect(运行循环)
Retain:将每日日志规范为“事实”
Hindsight 的关键洞见:存储叙事、可自洽的事实,而不是细碎片段。 对memory/YYYY-MM-DD.md 的实用规则:
- 每日结束(或过程中)添加
## Retain小节,包含 2–5 条:- 叙事化(保留跨回合上下文)
- 自包含(单独拿出来也讲得通)
- 带类型 + 实体标注
- 类型前缀:
W(world)、B(experience/biographical)、O(opinion)、S(observation/summary;通常生成) - 实体:
@Peter、@warelay等(slug 映射到bank/entities/*.md) - 观点置信度:
O(c=0.0..1.0)可选
## Retain 是最简单的质量杠杆。
Recall:基于派生索引的查询
Recall 应支持:- 词法:精确词/名称/命令(FTS5)
- 实体:“告诉我 X”(实体页 + 实体关联事实)
- 时间:“11 月 27 日左右发生了什么”/“最近一周”
- 观点:“Peter 的偏好是什么”(带置信度 + 证据)
kind(world|experience|opinion|observation)timestamp(来源日期或抽取时间范围)entities(["Peter","warelay"])content(叙事事实)source(memory/2025-11-27.md#L12等)
Reflect:生成稳定页面 + 更新信念
反思是定时任务(每日或 heartbeatultrathink):
- 用近期事实更新
bank/entities/*.md(实体摘要) - 基于强化/反证更新
bank/opinions.md的置信度 - 可选:向
memory.md提议编辑(“核心事实”)
- 每条观点包含:
- statement
- 置信度
c ∈ [0,1] - last_updated
- 证据链接(支持/反对的 fact IDs)
- 新事实到来:
- 按实体重叠 + 相似性找候选观点(先 FTS,后 embeddings)
- 用小步长调整置信度;大幅变化需强反证 + 重复证据
CLI 集成:独立 vs 深度集成
建议:深度集成到 OpenClaw,但保留可分离核心库。为什么集成进 OpenClaw?
- OpenClaw 已知:
- workspace 路径(
agents.defaults.workspace) - 会话模型 + heartbeats
- 日志 + 排障习惯
- workspace 路径(
- 希望 agent 直接调用工具:
openclaw memory recall "…" --k 25 --since 30dopenclaw memory reflect --since 7d
为什么仍要拆库?
- 让 memory 逻辑可在无 gateway/runtime 下测试
- 可复用到其他场景(本地脚本、未来桌面应用等)
“S-Collide” / SuCo:何时使用(研究)
如果 “S-Collide” 指 SuCo (Subspace Collision):它是一种 ANN 检索方法,通过子空间碰撞实现较强的召回/延迟权衡(论文:arXiv 2411.14754, 2024)。 对~/.openclaw/workspace 的务实结论:
- 不要一开始就用 SuCo。
- 先用 SQLite FTS +(可选)简单 embeddings;立刻获得大部分 UX 提升。
- 只有在以下条件满足时再考虑 SuCo/HNSW/ScaNN 类方案:
- 语料很大(数万/数十万 chunks)
- 粗暴的 embedding 搜索太慢
- 词法检索成为明显瓶颈
- SQLite FTS5 + 元数据过滤(零 ML)
- Embeddings + 全量扫描(chunk 少时惊人有效)
- HNSW 索引(常见、稳健;需要库绑定)
- SuCo(研究级;需可嵌入的稳定实现)
- 在你的机器(laptop + desktop)上,“个人助手 memory”的最佳离线 embedding 模型是什么?
- 若已用 Ollama:用本地模型 embedding;否则在工具链中携带小模型。
最小可用试点
如果想要一个最小但有用的版本:- 添加
bank/实体页与每日日志的## Retain。 - 用 SQLite FTS 做带引用的 recall(路径 + 行号)。
- 仅当召回质量或规模需要时再加 embeddings。
参考
- Letta / MemGPT 概念:“core memory blocks” + “archival memory” + 工具驱动自编辑记忆。
- Hindsight Technical Report:retain/recall/reflect、四网络记忆、叙事事实抽取、观点置信度演化。
- SuCo:arXiv 2411.14754 (2024):Subspace Collision 近似近邻检索。