夜雨聆风学习资料网

ARTICLE · 1222948

AI 助手自学的手艺也能反悔:OpenClaw 2026.10.5 给技能加上版本与撤销

AI 助手自学的手艺也能反悔:OpenClaw 2026.10.5 给技能加上版本与撤销

自学习技能 · 版本快照 · Undo · 后台学习开关 · openclaw/openclaw · v2026.10.5

这一版把「助手自己写技能」从一次落盘,改成有历史、能比对、可回滚的流程; 同时给后台学习配上了明确的开关和计费提示。 同版还重做了侧栏、让已发布的对话能用普通聊天链接只读访问, 而自学习这条线,是改动最深的一处。

常驻的个人助手

OpenClaw 是 MIT 许可的开源个人 AI 助手运行时,主体用 TypeScript 写成。 它不是一个聊天窗口,而是一套常驻网关:同一个进程接入 Discord、Slack、Telegram、 WhatsApp 等二十多个渠道,外面套着 Control UI 和 CLI。 模型与 agent harness 以插件方式替换,状态、记忆和凭证都留在自己的机器上。 架构上它把「可信网关」和「不可信执行」分开,策略由代码执行而不是靠提示词自觉。 截至 v2026.10.5,仓库接近 39 万 star、8 万 fork, 这个版本汇总了 2250 个 PR 与 2700 余次提交。 它和终端里的编码 agent 重心不同:那些工具围绕单个仓库的编辑循环, OpenClaw 围绕长期在线、多入口、能持续积累的个人助理。 技能系统就是「积累」那一半——除了手写技能目录,助手还能在完成一段难任务后, 自己写一份 SKILL.md,下次遇到同类任务直接照着做。 手写技能、项目技能、插件技能各有来源,自学习产生的这一批叫 learned skills, 它们属于单个 agent,绕过技能白名单,只放在自己的工作目录里。 发布节奏按日期打版本,安装走 npm 包或安装脚本,升级时由 doctor 处理状态迁移。 这次更新动的正是这条自学链路。

审批疲劳与旧副本

旧版把自学习做成提案制:后台复习产出草稿,等人批准,未批准的草稿不加载。 听起来稳妥,实际用起来是两难。 一边是审批疲劳,列表里多出几条待办,点通过更像仪式,很少有人逐字读完整份技能; 另一边是能力断档,写着「已学会」的东西因为没被批准,从未真正生效。 真正麻烦的是事后无从追查:助手在某个长任务里改了技能里的一步, 后续同类任务开始出错,用户只看到结果不对,看不到是哪次改动引入的,也没有旧副本可退。 比改错更难发现的是学错。一次成功的临时操作会被固化成流程, 用户随口说的偏好会被写进技能,而不是记忆; 一个仓库的构建约定被存成通用技能,换一个项目就处处别扭。 具体到一次故障:夜间部署脚本第一次跑通后,回滚顺序被写成技能; 后来某次镜像拉取失败,助手临时加了一步跳过校验,那次部署顺利结束, 这一步却留在了技能里,之后每次部署都少一道检查。 后台复习还会把对话与工具输出发给配置的模型供应商,产生额外用量, 开关含糊时,用户并不清楚自己付的是什么钱。 技能本身也会越攒越多,一次性的旧流程长期留在列表里,和新技能抢注意力。 不可追溯、不可回退、成本不透明,这三件事在「助手替你积累经验」的模式里会被放大, 因为改动不是人做的,频率还高。

可撤销的自学习

2026.10.5 把学习结果直接落盘,并在每次改动前保存上一份,动作与入口都摆到了明面上:

• 撤掉一次复习:聊天里出现 Learned 行,点 Undo,或直接说「undo」,或发送 /learn undo <id>

• 按版本恢复:openclaw skills workshop restore <name> --version <version-id>

• 看差异再决定:Control UI 的历史页能比对旧版与当前版本,也能在 Active 与 Archived 之间切换

• 关掉后台学习:openclaw config set skills.workshop.autonomous.mode off,同时停用闲置技能清理

• 手动学习照旧:/learn、/learn <材料> 与「Learn from history」不受开关影响

技能该怎么写也有了明确边界:可复用的流程进技能,关于人的事实进记忆, 关于某个仓库的约定进项目文档或 AGENTS.md。 这条分工直接减少「把偏好写成流程」的脏数据, 也让备份、恢复、归档这些操作对应到更单一的对象。

几个边界值得记住。每个技能保留最近 10 个版本,变更记录保留 500 条; 30 天没有活动的技能会被归档,归档不等于删除,最新版本随时能恢复; 「活动」按最近一次读取 SKILL.md、最近一次前台 view、最近一次改动三者取最大值, 所以刚建的技能不会被立刻扫走。 Codex 运行时无法把 shell 里的技能读取归因到具体技能,清理对它关闭,避免误伤在用的技能。 升级路径也换了:旧的待审草稿由 openclaw doctor --fix 导出为不加载的文件, 旧的提案设置与每周 curator 备份不再被读取; 已经设为 Auto 或未设置的自动学习保持原样,遗留的提案模式统一落到 Off。

想要的结果 用哪个入口
撤回刚发生的一次复习 通知上的 Undo、聊天里说 undo
退回某个具体版本 skills workshop restore --version
看清改了什么 Control UI 的历史与差异视图
停止后台学习与计费 skills.workshop.autonomous.mode = off

通知默认只进 Control UI,Slack 永远收不到渠道消息; 想让触发复习的那个会话也收到, 把 skills.workshop.autonomous.channelNotices 打开即可,打开后长这样:

💾 Learned: updated `deploy-staging` (tightened the rollback step).
Say "undo" to revert this skill change.

一句摘要说明改了什么,一句提示告诉你可以怎么退。 没改动时不会出现任何提示,这一点比「每次复习都报一条」更适合长期挂着。

先快照再替换

撤销能成立,靠的是写入顺序而不是事后补救。 每次 create、patch、write_file、remove_file、archive、restore 之前, 当前技能目录会被完整复制到 .archive/<name>/<versionId>/。 复制先写进临时目录,完成后再重命名,中途失去权限或进程退出,都不会留下一个「看似可撤销」的空版本。 版本号本身是时间戳加动作后缀,按字符串排序就是时间顺序, 所以不带参数的 restore 取到的必然是最新一份。 写入完成后顺手裁剪,只保留 10 份,磁盘占用有上界。 归档则把技能从活动目录移走,恢复时再用最新一份版本重建, 所以归档不是「删掉再从备份里翻」,而是同一套版本链上的一个状态。

变更账本放在状态数据库里,记录动作、actor(agent、review、curator、user)、一句摘要和 runId。 一次后台复习的多条改动共享同一个 runId, 整批撤销时按技能取「这次复习第一次改动之前」的快照,复习里新建的技能则直接归档。 恢复动作本身也会先保存当前副本,于是撤销可以再被撤销; 已经撤销过的复习再点一次,只会返回「已撤销」,不会把新改动一起带走。 撤销还会往原会话补一条系统事件,告诉助手这次改动已被用户回退,避免它照着旧通知再撤一遍。 账本按 agent 维护自增游标,客户端可以增量拉取,不必每次重读整份历史。 改动 skill 名称、描述这类元数据也进对比视图,不会出现「内容没变所以看起来没改」的错觉。

加载语义同样配合这套机制:编辑只对新会话生效,运行中的会话保持启动时的技能快照, 长任务执行到一半,规则不会被后台复习换掉。 落盘前还有一道校验:frontmatter 的 name 必须与目录一致,description 限 1024 字节, SKILL.md 受 maxSkillBytes 约束,支持文件只能落在 references、templates、scripts、assets 下且不超过 256 KiB; 绝对路径、目录穿越和符号链接一律拒绝,安全扫描命中字面密钥则整次写入不落盘。 这套校验加上「先快照、再替换、再裁剪」的顺序, 把「助手改自己」的爆炸半径,收在一个目录和十份版本历史之内。

相关学习资料