OpenClaw 8.1(官方叫 OpenClaw 2.0)发布快一个月了,这个版本改动大到离谱——16977 个 PR、987 个贡献者,基本上把整个项目重写了一遍。我从 RC 阶段就开始跟,踩了不少坑,尤其是记忆系统从 memory-lancedb-pro 迁移到 memory-core 这件事,记录一下。

OpenClaw2.0

8.1 到底改了什么

先说大面上的变化。

Session 存储迁移到 SQLite

最大的底层改动:会话和 transcript 从文件存储迁移到了 SQLite。官方专门加了降级警告——如果你从 8.1 回滚到旧版本,之前创建的 session 在旧版里看不到。升级前务必备份。

全新的引导式 Onboarding

以前配 OpenClaw 得手动填 API key、选模型、配渠道,现在 Guided Setup 能自动检测你机器上已有的 Codex/ChatGPT/Claude CLI 登录状态,直接复用。Ollama 和 LM Studio 也能自动发现本地模型。 setup 完成后直接进第一个对话,不用再手动开终端。

Mac 用户的体验改善最明显——应用从 Downloads 打开后会提示移到 Applications,更新和登录自启才正常工作。

Control UI 大改

Web UI 重做了。现在 New Session 可以后台启动,不用等它加载完才能干别的。消息队列、中断恢复、跨 session 消息来源显示都做了。iPhone 上加了模型选择、权限控制、上下文管理这些 composer 控件。四种新主题可选。

实际用下来最明显的感受是稳定性好了很多。旧版 WebUI 聊天时间一长就卡,长对话渲染慢、消息偶尔丢失,现在这些问题基本没了。SQLite 存储session之后,刷新页面不再丢上下文,切换 tab 也不用担心正在跑的请求断掉。

配置项也多了不少。以前很多高级设置只能手动改 JSON,现在 WebUI 里直接能调——模型参数、权限控制、agent 配置、插件管理都有对应的界面。操作逻辑变了,比如 Settings 的布局重新组织过,Connection、Agent Identity、Plugins、Channels 这些原来散落在各处的功能现在归拢到一起了。刚上手会有点不适应,但找东西确实比以前快。

配图

Memory 系统重构

8.1 把 QMD(Quick Memory Database)正式退役,内置的 Memory Core 接管了核心搜索和召回路径。LanceDB、Memory Wiki、外部 embedding 服务、MEMORY.md、USER.md 各有分工,但核心检索逻辑统一了。

新功能方面:个人 agent 默认开启跨对话记忆召回——你跟 agent 聊的内容,下次重置 session 后它还能想起来。前提是同一个 agent 的私聊,群聊和共享场景不受影响。Session 还支持 rewind 和 fork,可以从任意用户消息处回退,或者分叉出新对话分支。

系统重构

为什么从 LanceDB Pro 迁走

说起来有点打脸——我之前还专门写过一篇文章推荐大家从 memory-core 换到 memory-lancedb-pro(https://blog.zhheo.com/p/0kl9erod.html)。当时推荐的理由很充分:

  • 混合检索更精准:纯向量搜索召回不准,Pro 版用向量 70% + BM25 30% 混合权重 + Cross-Encoder 重排序,搜”删除”能精确命中那条铁律
  • 智能提取和遗忘:LLM 自动分类六类记忆(profiles/preferences/entities/events/cases/patterns),Weibull 衰减让不重要记忆自然淡出
  • 可控数据导入:4243 条记忆一键迁移,canonicalCorpus 自动索引,会话记录也能导入

那篇文的结论是:”如果你想要更精准的语义检索、自动化的记忆管理、对记忆数据有完全控制权,memory-lancedb-pro 是目前最好的选择。”

现在回头看,当时说的没错——在 8.1 之前,Pro 确实是更好的选择。memory-core 的纯向量检索确实有召回问题,我自己就是受害者。

但 8.1 改变了整个游戏规则。

我的环境之前用的是 memory-lancedb-pro + memory-wiki 组合。LanceDB Pro 有 4051 条活动记忆,占了 4.2GB 磁盘空间,用 bge-m3 做向量化(走 SiliconFlow API)。

问题出在哪?

LanceDB Pro 是第三方插件,每次 OpenClaw 大版本更新都得确认兼容性。8.1 把记忆核心重写了,Pro 的配置和 allowlist 留下一堆残留警告,Doctor 每次跑都报错。而且 8.1 之后 memory-core 是官方唯一推荐的核心检索路径,继续用第三方插件意味着官方的跨对话召回、rewind 这些新功能全用不上。

再加上数据本身就很臃肿。导出一查重,2292 条跟 Markdown 文件重复,1196 条是库内互相重复,真正独有的只有 562 条。4GB 数据里六成是废的。

迁移过程

去重是第一步

直接迁移 4051 条记录到 memory-core 没意义,先把重复的干掉。

我的做法:全量导出 LanceDB 数据,跟现有的 Markdown 文件做比对。比对维度是内容哈希 + 语义相似度(阈值 0.92)。结果:

  • 2292 条完全匹配已有 Markdown 文件
  • 1196 条在 LanceDB 库内互相重复
  • 562 条 confirmed 独有记忆

这 562 条我按主题分了 6 个分类,整理成 Markdown 文件手动审核后并入 memory-core。有 1 条状态未知的记录,我没删,只保留在完整备份里。

验证必须做

迁移完不能直接跑。我的验证清单:

  • memory-core 索引:1202/1202 文件、8842 chunks、Dirty=no
  • 向量检索:抽 3 组迁移过来的记忆做召回测试,全部命中
  • FTS 全文搜索:正常
  • Embedding 服务:SiliconFlow bge-m3 连接正常
  • Wiki:259 个来源页,审计通过

回滚备份

备份放在单独的本地备份目录里,包含三样东西:完整配置备份、LanceDB 原始数据、全量导出的 JSON。万一迁移出问题,10 分钟能回滚。

配图

踩过的坑

QMD 残留配置

8.1 退役了 QMD,之前手动配过的参数会让 Doctor 报一堆警告。跑一遍 openclaw doctor --fix 能自动清理。但 QMD 独有的 reranking、query expansion、跨 agent transcript 搜索在新路径上没有替代,重度依赖的话迁移前得评估。

向量维度不兼容

LanceDB Pro 默认的向量维度跟 memory-core 不一样。自定义 embedding 配了非标准维度的话,迁移直接报错。我迁移前用 openclaw memory status --deep --agent main 确认了 embedding 配置,没踩这个坑。

索引冲突

我遇到过一次索引冲突——升级过程中旧的 Memory Core 索引文件跟新的打架了。表现是 Gateway 启动失败,日志里报 “legacy Memory Core index conflicts”。解决方法:删掉旧索引文件让 memory-core 重新从 Markdown 重建。这个 bug 在后续的 8.2 里修了(#108652),但 8.1 用户得手动处理。

Active Memory 时间戳格式

如果你之前开了 Active Memory,它的 timestamp 格式在迁移过程中可能不兼容。malformed 的时间戳会阻塞整个迁移流程。解决方法:升级前先跑一遍 openclaw memory index --force --agent main,确保索引是干净的。

跨对话记忆的隐私边界

新功能默认开启跨对话召回,但只限同一个 agent 的私聊。群聊、频道消息、其他 agent 的对话不会被召回。这个设计合理,但要注意:如果你在多个 agent 之间共享了 MEMORY.md 或 Wiki,recall 的边界是 agent 级别而不是文件级别。别以为关了某个 agent 的对话就等于记忆消失了。

Skill 白名单问题

升级后好几个 skill 不能用了,界面提示“需要设置”。查完发现不是缺依赖,是被 agent 白名单排除了。8.1 重构了 skill 加载逻辑,旧版白名单配置部分失效。zhheo-blog-manager 之前一直正常用,升级后直接变成 Excluded by agent allowlist。重新检查 main agent 的 skills 列表加回去就行。

明文凭据残留

升级体检发现配置里还有明文 API key,openclaw secrets audit --check 直接报 plaintext 警告。把明文凭据迁入 secret store 改成 SecretRef 就行。注意,模型配置文件是运行时生成物,不能手塞 SecretRef,会被审计判为 unresolved。旧的认证状态备份也可能含明文,需要一并检查和清理。

旧版插件兼容

memory-lancedb-pro 在 8.1 下还能跑,但配置残留和 allowlist 警告不断。我从 plugins.allow 移除了 memory-core(内置的不需要在 allow 列表里),给 memory-lancedb-pro 保留了 conversation hook 权限作为过渡。4GB 数据不能说丢就丢,先让旧插件跑着,等新环境稳定了再彻底清。

升级后的优化过程

迁移只是第一步。升完级之后,一堆优化要做。

开启跨对话记忆召回

迁移完默认不开跨对话召回,官方保守设计,怕隐私问题。手动给 main agent 加了 memory.search.rememberAcrossConversations。开了之后效果很明显,reset session 后 agent 不再是“失忆”状态,上一个 session 聊的规则和偏好都能想起来。

配置 Active Memory

active-memory 也要手动启用。我用的配置是 mode=escalate、仅 main agent、仅 direct 对话、persistTranscripts=false。escalate 模式下 agent 主动判断哪些记忆值得写入,不无脑全存。persistTranscripts 关掉是因为会话记录自动索引太吵了,手动管理更可控。

Dreaming 定时任务

Dreaming 是 memory-core 的后台索引维护。设成每天凌晨 3:00(Asia/Shanghai)跑一次,新版不用显式声明 light/rem/deep 的 enabled 属性了。迁移后第一次完整 Dreaming 跑完,索引数据量正常。

Git 仓库瘦身

升级后顺手跑了一遍 workspace 检查,发现 .git 里有一堆不该提交的东西——.venv.openclaw/state、备份文件。dirty 状态从 19653 降到 1291,主要靠 .gitignore 补规则和把大文件从索引撤出。剩下的多是 memory/skills 历史堆积,没批量清理,影响不大。

备份策略调整

旧的「每日备份」自动化用了 find ... -delete,违反删除铁律(必须进废纸篓),禁掉了。改用官方 Git 备份 + bundle:本机 openclaw backup 跑 Git 备份,再把 bundle 同步到远程存储。24 小时跑一次,已经验证过备份可以恢复,体积约 140M,不含 .venv 和敏感路径。

迁移后配置建议

如果你也准备迁,这几项配置建议参考:

  1. main agent 开启 memory.search.rememberAcrossConversations
  2. 启用 active-memory,用 mode=escalate、仅 main、仅 direct、persistTranscripts=false
  3. 清理已禁用的 memory-lancedb-pro 配置和 allowlist 残留
  4. Dreaming 设成每天 03:00(Asia/Shanghai)
  5. Wiki 按需选 isolated 或 bridge 模式
  6. tools.sessions.visibility=all 比默认宽,按需收紧

总结

OpenClaw 2.0 的记忆系统重构是一次迟早要来的收编。我之前推荐 LanceDB Pro 的理由——混合检索更精准、智能提取和遗忘、可控数据导入——在当时确实成立。但 8.1 把 QMD 退役、memory-core 接管核心路径之后,官方的跨对话召回、session rewind/fork 这些功能成了新的长期价值,第三方插件再好也追不上官方迭代节奏。

迁移过程不算复杂,但去重和验证一定要做扎实,别直接把 4000 条记忆倒进去——六成是重复的,没意义。升完级之后的优化才是大头:白名单修复、凭据迁移、Active Memory 配置、备份策略调整……一步步来,别急。

备份、验证、再验证。没了。