每次重启,它就把学过的东西忘得一干二净。教它认识一次故障,关掉笔记本,再回来,只剩四条硬编码的样例事故。这个智能体的记忆问题,比它的匹配算法更致命。

打开网易新闻 查看精彩图片

我把它叫 INFERON AI。输入一场正在发生的事故——标题、服务、症状、严重级别——它会召回相似的历史事故,返回一份五段式响应方案:可能原因、立即处置步骤、所依赖的记忆、如何验证修复、何时升级。模型跑在 Groq 上的 openai/gpt-oss-120b,前端是一个 Gradio 表单,浏览器里就能用。

第一版把事故存进 SQLite,用 TF-IDF 做匹配。在单次会话里它工作得很好:补一条复盘、加一条已解决事故,方案立刻变好,效果肉眼可见。然后会话结束了。Colab 在会话关闭时会删掉文件,数据库跟着一起没了。下一次会话只剩我硬编码的样例事故,教过的每一场故障、每一条复盘教训全部消失。智能体的水平只等于我敲进去的代码,而不是它学到的东西。

这才是真正的失败点。关键词匹配是次要问题。真正伤人的是,它什么都留不住。

把记忆搬到 Hindsight

我把存储和召回迁到了 Hindsight,一个带云 API 的记忆服务。每场事故变成记忆库 incident-memory 里的一条纯文本记录,由 Hindsight 自己从文本中抽取事实,我不再手动拆字段。召回时,向记忆库查询与当前事故最接近的事实,取前若干条。

一开始我把 top_k 设成 3,结果一次查询返回了 57 条事实——Hindsight 会把每场事故拆成好几条陈述,三条结果可能全来自同一场事故。于是我把上限提到 8。

跨会话的差别立刻显现。重启笔记本后,我没有重新加载种子数据,智能体依然召回了存过的事故。我又记录了一场已解决的支付事故和一份复盘,它们也留在了记忆里。这是第一次,它保住了我教它的东西。

路上踩的坑

事件循环把网页表单搞坏了。Hindsight 客户端与 Colab 的事件循环冲突,常见解法 nest_asyncio 让客户端能跑,却让 Gradio 服务器起不来。把原函数恢复也没用,因为服务器已经捕获了打过补丁的版本。最终有效的做法是停止打补丁,把所有 Hindsight 调用放进一个单工作线程里执行,那里没有正在运行的事件循环。

账户还得有余额。在这之前,连接直接返回 402 Payment Required——API 通着,账户没钱。在付费记忆服务上搭任何东西之前,先查这个。

Hindsight 目前还做不到的事

  • 重复记录挤占结果。测试时我把同样的种子事故加载了不止一次,一次查询里出现好几条同一场结账事故的记录,措辞略有不同。当头部结果都是副本,能塞进模型上下文的独立事故就变少了。
  • 模型在近似副本之间做选择。SEV1 那次,方案逐字引用了一条存储记录;SEV3 那次,它引用了同一场事故的另一条记录,里面带着"due to lack of entry eviction"这句话。这句话在记忆里,不是模型编的。模型从多个版本里挑了一个,输出里没有任何地方显示它做过选择。
  • 结果好坏不改变排序。SQLite 版本会把每条匹配的相似度乘以它的修复成功率,有效的修复能压过更接近但失败的匹配。Hindsight 版本里我把结果存成文本,它们不影响排序。记录了一次成功的支付回滚后,结账查询依然先返回结账记忆。提高上限能把支付结果带进前八,但它从没排到第一。
  • 模型会添加记忆里没有的细节。SEV1 方案建议了一个 POST /admin/clear-retry-cache 端点和一个 payment_retry_cache_entries 指标,两者都不在任何存储记录里。有些是合理的通用建议,有些是听起来像真的的发明,每一步都得对着真实系统核。
  • 模型会搞混版本。存储的修复是回滚到 v2.3,方案却推荐 v2.6——那是当前事故里的版本。输出没有标记这个差异。
  • 严重级别更多改变措辞而非动作。SEV1、SEV2、SEV3 的方案步骤几乎一样,只有升级文案不同。

接下来我会做什么

记忆现在能跨会话存活了,这是我最初的目的。接下来的问题是结果排序、去重,以及核查模型输出。

我会把成功率存在记忆系统之外,再与召回结果结合,就像 SQLite 版本那样。我会在存储时去重,让头部结果覆盖不同的事故。我还会在模型响应后跑一道检查,把每条引用与召回的记录比对,不匹配的引用直接拒绝。另外,我要让 SEV1 改变动作而不只是措辞,比如在任何其他步骤之前先呼叫值班负责人。

几条教训:先测持久化,再测智能。我的智能体在单次会话里看起来很聪明,跨会话就毫无用处,只有重启笔记本才能发现。存在笔记本文件里的记忆不算记忆,会话结束,本地磁盘上的一切都会消失。更多结果不等于更好的排序,提高上限把对的记忆带进了上下文,却没把它推到第一位。重复记录会改变模型看到的东西,重复条目挤掉其他事故,模型可能引用它先读到的那份副本。别让阻塞调用待在网页服务器的事件循环里,把它放进工作线程。

Hindsight 给了智能体一份能活过会话的记忆。决定哪些记忆该赢、去掉重复、核查模型对它们的说法,仍然是我的活。