loading image

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路

前阵子翻 GitHub 的时候,偶然看到一个叫 Memento的项目。

Posted by Enovace on March 26, 2026

一个会“反省”的 Agent!

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 1

前阵子翻 GitHub 的时候,偶然看到一个叫 Memento的项目。

一开始没当回事,以为又是个 Skill 管理框架。但点进去一看,发现它做了一件很有意思的事:Agent 每执行完一个步骤,都会停下来“反省”:刚才做对了什么?做错了什么?下次怎么改?

它的核心机制很简单:

执行步骤 → 检测结果 → 反思分析 → 修复 skill → 重试

每次执行后,Agent 都会调用 LLM 分析刚才的执行结果。如果发现问题,它会尝试修改 skill 的定义文件(SKILL.md),然后重新执行。这个循环可以持续多轮,直到成功或达到重试上限。

关键在于,Memento 把“反思”作为执行流程的一部分。失败不是终点,而是学习的起点。每次失败都会触发一次自我诊断,系统会问自己:

  • 是参数传错了吗?
  • 是依赖没装吗?
  • 是路径变了吗?
  • 还是 API 限流了?

然后根据诊断结果,自动修改 skill 配置,再试一次。

看完之后我就在想:我们的 OpenClaw 能不能也这样?

Skill 的尴尬现状

说实话,OpenClaw 的 Skill 系统现在就是个“一次性选手”。

跑一个数据爬取的 Skill,路径找不到:失败。参数传错了:失败。依赖没装:还是失败。然后呢?没有然后了。你得自己去翻 session 日志,一行一行看是哪出了问题,手动改完再跑一遍。

每次失败都是孤立事件。上周踩的坑,这周还会再踩一遍。系统不记得,也学不会。

这就是我们想改的:让 Skill 不再“执行完就忘”,而是能从失败里学到东西。

切入点:Hook

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 2

要让 Skill 学会反思,首先得有个“观察点”——在它执行的时候,能看到它做了什么、成功还是失败、花了多长时间。

OpenClaw 正好有这个东西:Hook 系统。而且不止一套,是两套。

第一套:Internal Hooks

这套 Hook 管的是“大事件”。用户敲了 /new、Agent 启动了、Gateway 上线了、消息收发了——这些节点都能挂钩子。

每个 Hook 就是一个目录,里面放一个 HOOK.md 描述它是干嘛的,再放一个 handler.ts 写具体逻辑。系统启动时会自动扫描三个位置:先看 workspace 里有没有,再看全局目录,最后看内置的。

OpenClaw 自带了几个挺实用的:session-memory 在你开新会话时自动保存上一轮的上下文;command-logger 把所有命令记到审计日志;boot-md 在 Gateway 启动时跑一段初始化脚本。

但这套 Hook 的粒度太粗了。它能告诉你“Agent 启动了”,但没法告诉你“某个工具调用失败了”。

第二套:Plugin Hooks

这才是真正深入到执行细节的那套。

Plugin Hooks 运行在 Agent 循环内部,能拦截到几乎所有关键节点。OpenClaw 定义了 20+ 个生命周期钩子,覆盖了从模型选择到工具调用、从会话管理到消息收发的完整流程。

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 3

这 20+ 个钩子构成了一个完整的观察网络。每个关键节点都能被拦截、被记录、被修改。

而对于反思系统来说,after_tool_call是最核心的那个。它能拿到这些信息:

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 4

工具名、参数、结果、错误信息、耗时——全都有。成功了能看到返回值,失败了能看到错误原因。这就是我们要的“观察点”。

意外发现

本来只是想用 after_tool_call 来监控 Skill 的执行情况。但写着写着发现,这个 Hook 监听的是所有工具调用,不只是 Skill。

这一下子打开了思路。

回头看我们踩过的那些坑:

3 月 22 号,生产脚本改了没做端到端测试,全天输出垃圾数据,当时还以为是 Nitter 限流,折腾了一整天才发现是参数验证的问题。

3 月 21 号更离谱,一个端口配错了,4 个 Agent 全部瘫痪,停了 几个小时。还有 Twitter 爬虫用的 tweety-ns 库,三天两头失效,每次都是出了问题才去救火。

如果当时有 after_tool_call 在默默记录,这些问题本可以更早被发现。

方案:记录→分析→修复→沉淀

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 5

想清楚之后,方案其实很直接。但在动手之前,我们先要回答一个问题:实时反思还是延迟分析?

Memento 选的是实时反思——每次失败立刻调用 LLM 分析、修复、重试。这在演示场景下很酷,但放到生产环境就有问题了:

  • 成本高:每次工具调用失败都要调 LLM,一天下来可能几十次
  • 阻塞主流程:分析需要时间,用户得等
  • 视角窄:单次失败可能是偶发,看不到跨 session 的模式

我们选了延迟分析:失败时只记录,凌晨批量分析。这样做的好处是:

  • 成本低:批量分析比单次便宜 10 倍
  • 不阻塞:记录是异步的,不影响响应速度
  • 模式发现:能看到“这个 API 今天失败了 10 次”这种系统性问题

架构长这样:

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 6

第一步:记录失败

Hook 的实现很简单,核心就是“检测失败 → 写日志”:

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 7

关键点:

  • 异步写入:不阻塞主流程
  • 按日期分片:方便批量分析
  • 参数脱敏:移除 token、密码等敏感信息

第二步:批量分析

凌晨 Cron 任务读取昨天的失败记录,先做聚合统计:

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 8

然后把这些数据喂给 LLM:

分析这些失败记录,找出:

  1. 最常见的失败模式
  2. 可能的根本原因
  3. 具体的修复建议

失败记录:
[昨天的 JSONL 数据]

LLM 会返回类似这样的分析:

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 9

第三步:生成报告

把统计数据和 LLM 分析整合成一份报告:

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 10

第四步:沉淀经验

修复后的经验写入 shared-knowledge(我们的工蜂共享知识库):

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 11

下次遇到类似问题,系统能直接调用这条经验。

这样就形成了一个闭环:失败 → 记录 → 分析 → 修复 → 沉淀 → 下次避免。每次失败都不再是白费的,它会变成系统的一部分智慧。

下一步

踩过的坑为什么还要再踩?我们给 Agent 加了个反思系统,OpenClaw走向反思进化之路 配图 12

从 Memento 的一个简单想法出发,我们找到了 Hook 这个切入点,又意外发现它的能力远超预期。

OpenClaw 正在从一个执行工具,变成一个会从错误中学习的系统。

下一篇,我们会放出反思系统上线后第一周的真实数据。到时候再看,这套东西到底有没有用。