MemoryLake
返回全部文章
Pain Point2026 年 5 月 22 日7 分钟阅读

为什么 OpenClaw 会忘记工具历史?

你观察 OpenClaw 完成一个任务。它调用一个搜索工具,打开一个文件,运行一个脚本。二十轮后,压缩触发,对话被总结。然后代理使用相同的查询调用相同的搜索工具,打开相同的文件,并运行类似的脚本,因为原始的工具调用现在变成了一行摘要,而不是可以检查的结构化记录。

这就是工具历史遗忘问题,且有一个干净的解决方案。

简短回答

OpenClaw 忘记工具历史是因为过去的工具调用存在于对话记录中,并在压缩运行时被压缩为 Markdown 摘要,失去了每个调用的结构形态。代理无法可靠地询问“我是否已经用这些参数调用过这个工具?”一个持久的记忆层保留了每个调用、其参数和结果的结构化账本。

为什么 OpenClaw 会忘记工具历史

OpenClaw 根据其 记忆文档 将记忆存储在普通的 Markdown 文件中,模型只记住保存到磁盘的内容。工具调用通过对话流动,而不是通过专用账本。三件事导致了遗失。

1. 工具调用存在于对话记录中。 每个调用及其观察在会话期间位于模型的上下文窗口中。随着新步骤的到来,旧的调用在压缩时被总结或推出窗口。具体内容如“我传递给搜索工具的确切参数集”变成了“之前运行了一些搜索。”

2. 压缩摘要失去调用结构。 当压缩触发时,代理将重要状态刷新到记忆文件中。一个好的摘要捕捉了工具所做的要点。它不保留一个可查询的“工具、参数、结果、时间戳”元组列表,规划者无法进行去重。

3. 记忆搜索按意义回忆,而不是按调用签名。 具有向量相似性加上关键词匹配的混合搜索在配置了嵌入提供者时会显示过去的笔记。它是为叙述检索而构建的,而不是为了“给我展示每个调用这个确切端点的调用及其确切参数。”

结果:代理重新运行它已经运行过的工具,支付相同的调用费用,有时得到略微不同的结果。

当 OpenClaw 忘记工具历史时你会失去什么

工具历史遗失是每个长任务中悄然增加成本的失效模式:

  • 重复调用和重复支出。 每次重新调用都需要支付模型推理加上工具调用。在速率限制的 API 上,你的预算消耗速度快于任务需求。
  • 不一致的观察。 在压缩过程中两次调用相同的端点,底层数据可能已经改变。代理最终在没有意识到的情况下对同一事实的两个版本进行推理。
  • 自主循环没有审计轨迹。 当长时间运行失败时,你无法准确重建哪些工具以什么顺序和什么参数触发。记录保留了最后几轮的详细信息;其他一切都是摘要。

Mem0 的 2026 年 AI 代理记忆状态 报告清楚地描述了生产约束:代理在 30 到 100 个工具步骤后失去线索,而工具调用去重是第一个失败的环节。

OpenClaw 的内置解决方法

OpenClaw 提供了几种有帮助的功能,但没有一种能完全解决工具调用回忆的问题。

压缩前保存轮次。 在压缩总结对话之前,OpenClaw 运行一个静默轮次,提醒代理将重要上下文保存到记忆文件中。对叙述状态有用。并非旨在生成结构化的调用账本。

带有混合检索的记忆搜索。 当你配置像 OpenAI、Gemini、Voyage 或 Mistral 这样的嵌入提供者时,代理可以通过相似性和确切关键词搜索过去的笔记。对于“我是否见过类似的东西?”很强,但对于“我是否用这些参数调用过这个工具?”则较弱。

技能记忆。 代理学到的可重用程序可以保存为技能并被回忆。这解决了“如何做 X”而不是“我做过什么”。两者相关但不相同。

这些功能使 OpenClaw 透明且可人工编辑。它们仍然使代理依赖于文本摘要来了解它已经做过的事情。

OpenClaw 的内置记忆不足之处

更深层次的问题是,Markdown 是叙述的优秀存储格式,但对于结构化事件流来说却是糟糕的存储格式。工具调用是事件,具有参数、时间戳和结果。它们希望是行,而不是段落。

没有结构化的工具账本,OpenClaw 的代理可以被告知“不要重复自己”,但无法强制执行该规则,因为检查所需的数据形状缺失。

MemoryLake 如何修复 OpenClaw 忘记工具历史

MemoryLake 在 OpenClaw 的 Markdown 文件旁边添加了一个结构化事件存储。每个工具调用都成为一个可查询的记录。

  • 结构化工具账本。 每个工具调用、其参数、完整输出及其时间戳作为事实记忆存储在项目中。代理可以在每次新调用之前询问“我今天是否已经用这些参数调用过这个工具?”并准确跳过重复调用,而不是凭猜测。
  • 完整保真观察存储。 原始工具输出以原始保真度持久化,而不是摘要。当规划者需要十轮前调用的确切结果时,它提取完整文本,而不是释义。
  • 跨代理共享账本。 两个在相关任务上工作的 OpenClaw 代理从同一个工具账本中读取。一个代理从另一个的调用中学习。相同的存储在通过 REST、MCP 或 Python SDK 连接的任何代理中都有效。

MemoryLake 在 LoCoMo 长上下文基准测试中得分 94.03%,截至 2026 年的最高已发布结果,具有毫秒级检索和 AES-256 端到端加密。

在 3 个步骤中将 MemoryLake 连接到 OpenClaw

  1. 创建项目并加载上下文。 登录 MemoryLake,打开项目管理,点击创建项目,并将其命名为“OpenClaw — 工具账本”。通过文档驱动上传任何参考文档(API 规范、允许列表、先前的 MEMORY.md 导出)。使用记忆选项卡为代理必须遵循的工具使用政策提供种子。
  2. 生成 MCP 服务器端点。 在项目内打开 MCP 服务器选项卡,点击添加 MCP 服务器,命名为“OpenClaw 工具”,然后点击生成。MemoryLake 返回 API 密钥 ID、密钥和端点 URL。立即复制密钥,它只显示一次。
  3. 连接 OpenClaw。 在 OpenClaw 的工具或服务器配置中,将 MemoryLake 添加为 MCP 兼容的记忆提供者,使用端点 URL 和 Bearer 令牌。或者,从自定义技能调用 REST API,记录每个工具调用并在执行新调用之前查询账本。

常见问题

OpenClaw 保留工具调用历史吗?

OpenClaw 将工具调用保留在对话记录中,该记录受模型上下文窗口的限制,并在压缩时被总结。长会话早期的调用仅以文本形式存活,而不是结构化账本。

我如何让 OpenClaw 记住它已经调用过哪些工具?

将每个工具调用记录到外部记忆存储中,并在每次新调用之前查询该存储。MemoryLake 提供带有参数和时间戳的事实记忆,以便去重准确。

为什么 OpenClaw 在一个任务中两次调用相同的工具?

因为在规划者选择下一个步骤时,早期的调用已经被总结或推出了活动上下文。没有结构化账本,代理无法看到它已经运行过。

我可以导出 OpenClaw 的工具历史以进行审计吗?

不能直接导出,除了实时记录和 Markdown 笔记。MemoryLake 将工具历史存储为结构化的事实记忆,你可以导出、审计或重放以进行合规审查。

OpenClaw 对工具调用的记忆限制是什么?

存储笔记没有固定上限,但实际回忆受到混合搜索所呈现的内容和加载的提示中适合的内容的限制。MemoryLake 通过检索可扩展到数十亿个标记来消除这一上限。