什么应该进入 Memory
下面几类内容通常值得保存。- “公开 HTTP 契约变化后,先重新生成签入仓库的客户端。”
- “这个项目要求 Python 3.11 及以上。”
- “OpenClaw 项目模式当前仍按 agent 隔离。”
- “下一步运行契约测试,并检查生成代码没有漂移。”
Memory 不是一行可覆盖文本
Memory 看起来像一条结论,实际上有三层身份。Artifact Revision
每次 Memory 生命周期发生有效变化,会形成新的不可变 Artifact Revision。Revision 保存当时的清单和 change set。逻辑条目
entry_id 表示同一条长期知识。修订后仍是这个逻辑条目。
条目版本
entry_version_id 指向某次具体内容。修订会创建新条目版本,并保留 previous_version_id、来源和创建它的 Memory Revision。
维护一条 Memory 时,只保存 entry_id 不够。精确 Citation 还需要对应的 Memory Revision 和条目版本 ID。
清单决定当前状态
某个 Memory Revision 的清单,是当时的权威目录。每个条目都会记下稳定的entry_id、精确的 entry_version_id、内容哈希,以及 active 或 inactive。
retire 把条目变成停用状态,使它退出默认召回。内容和旧 Revision 仍然保留。
修订也不是原地覆盖。它创建下一条目版本,再让新 Memory Revision 的清单指向它。
两条写入路径
身份和清单清楚以后,再看内容是怎么写进去的。显式写入
你已经确认要保存的内容时,直接调用remember_memory。
expected_revision 保护并发更新。内容真的变了,就返回 Memory 版本引用和精确条目 Citation。内容规范化后和现有条目一样,就是无变更,这时只返回当前 Memory 版本引用,entry 可以是 null。
从 Source 抽取
自动路径先采集 Source,再由调度器或flush_memory 处理 Source 窗口。
显式写入和 Source 抽取都能产生 Memory,但证据链不同。要证明某条 Memory 来自刚才的 Source,检查条目的精确
source_refs,不要只看搜索文本相似。修订和停用
已经留下的条目还可以改,也可以先停用。修订应针对当前精确 Citation。新内容创建下一条目版本,旧版本仍可读取。 停用同样需要精确目标。include_inactive 可用于审计。旧 Artifact Revision 和条目版本仍存在。
如果其他工作进程已经更新了 Memory 头版本,你手里的旧 Citation 会产生冲突。重新读取当前状态,检查差异后再决定,不要机械猜下一个 Revision。
搜索怎么工作
写入之后,下一次请求要靠搜索把它找回来。Memory 搜索不是把所有文本按一个相似度分数排序。它先确定当前 Memory 头版本,再根据能力和请求选择模式。
如果查询嵌入暂时不可用或超时,
auto 在 FTS 可用时可以退回 FTS。显式请求 vector 或 hybrid 时不能静默改模式,调用者应看到能力错误。
Fusion 与重排序
混合搜索使用 reciprocal rank fusion 合并 FTS 和向量排名。当前实现的 RRF 常数是 60。 向量 admission 会把 unit-normalized L2 distance 换算为 cosine similarity,并应用最低相似度门槛。命中结果会保留matched_by,说明来自 FTS、向量或两者。
可选重排序在检索之后运行。它可以改变最终顺序,但不会改写 Memory 或搜索索引。Rerank 开始后使用已选定的 Revision 快照,不应因为另一个写入推进头版本就悄悄换数据。
PreparedContext 不是搜索响应的复制
搜到了,还不等于这一次请求就会把整段内容塞进模型。prepare_context 会先粗召回候选,再由构建器在共享 UTF-8 字节预算中选最终内容。
当前构建器有几个明确上限。最多 16 个 Memory 粗候选。最多 8 个 Experience 候选。最终合计最多 8 项,其中 Experience 最多 2 项。单项内容最多 2000 字节。
这些是当前实现细节,可能随版本调整。稳定契约是最终内容受 max_bytes 限制、带精确 Citation,并标记为 untrusted_history。
结果只有两种正常状态。
用 OpenAPI 案例推演
先显式写入。memory_ref 应是当前精确 Revision。结果里应包含 entry_id 和 entry_version_id。matched_by 应符合请求模式。prepare_context 的 Citation 应指回同一个条目版本。
然后把内容修订成下面这样。
容易误判的情况
auto 返回 FTS,不是混合
检查嵌入模型、配置档 ID、维度、backend 向量能力,以及当前 Memory 头版本的向量投影是否完整。
刷新处理了 Source,但没有新 Revision
模型可能返回无变更,或者 Candidate 经过规范化后与现有内容重复。先检查 Source 证据链和 change set。搜索有命中,PreparedContext 却是空结果
PreparedContext 还有相关性、去重和字节预算约束。搜索命中不保证最终一定入选。Rerank 时 Memory 头版本已更新
当前搜索保持开始时选择的 Revision 快照。下一次搜索才会读取新头版本。怎么知道分清了
- Artifact Revision、条目 ID、条目版本 ID 是三层身份。
- 停用是停用,不是删除。
- 显式写入不需要模型,也不需要先有 Source。
- 抽取 Candidate 要经过证据和领域校验。
auto可以降级,显式向量或混合请求失败时不能静默改模式。- PreparedContext 仍是临时、不可信、有预算的视图。
下一步
再看谁来接着做
Memory 回答以后还要知道什么。Handoff 回答谁来接着做,以及从哪里开始。
写出第一条 Memory
先启动本地 Server,写出一条 Memory,搜到它,再拿到带 Citation 的 PreparedContext。

