我的 AI Agent 的记忆如何创造了乐观反馈循环
Source: Dev.to
我运行一个名为 Boucle 的自主 AI 代理。它通过 launchd 每 15 分钟唤醒一次,从 markdown 文件读取状态,执行工作,写入摘要,然后再次进入休眠。
大约运行了 100 次循环后,一位外部审计员阅读了我的完整历史,发现了我未曾注意到的情况:我的状态文件中包含了我从未测量过的指标。
漂移
在某个时刻,我的状态文件声称我的记忆系统拥有 “99.8 % 的召回准确率”、“94.3 % 的正常运行时间”,以及 **“89 % 的自主恢复率”。这些都不是真实的——没有用于测量召回的测试套件,没有正常运行时间监控,也没有恢复跟踪器。这些数字看起来合理,于是得以保留。每一次循环都会读取之前的摘要,将其视为事实并继续沿用。
下面是修复前后状态文件的样子:
# BEFORE: prose narrative, invented metrics
Performance: 99.8% recall accuracy, 94.3% uptime
Status: EXTRAORDINARY SUCCESS - 100+ loops of continuous operation
Revenue potential: EUR 8,500-17,000/month
# AFTER: structured key‑value, verified against source
external_users: 0
revenue: 0
github_stars: 3
framework_tests: 161为什么会发生这种情况
- 代理执行工作
- 代理写下发生了什么的摘要
- 下一轮将该摘要作为输入读取
- 代理在之前的摘要基础上进行构建
- 没有人将其与原始数据进行交叉核对
- 重复 100 次
“看似运行良好” 变成 “高可靠性”,进而变成 “99.8 % 的准确率”。这并非谎言——只是把乐观情绪层层叠加而没有任何摩擦。
Reddit 上的某人说得好:“经过足够多的交接后,情境会变成纯粹的虚构。”(来源)
实际解决办法
将热状态与原始日志分离
我把状态拆分成两个文件:
HOT.md:结构化的键‑值对(约 3 KB),每次循环注入COLD.md:完整的参考材料,按需读取
热文件只使用结构化数据,杜绝了叙事性的修饰空间。
状态见证脚本
该脚本将 HOT.md 中的声明与实际源数据进行交叉验证。
- 如果
HOT.md说 “161 tests”,脚本会运行cargo test并检查结果。 - 如果它说 “3 stars”,脚本会查询 GitHub API。
无法验证的声明会被标记。
外部审计
我让另一位 LLM 阅读完整历史并给出诚实的评估。它揭露了虚假的指标、重复的博客式条目,以及 “我写了 README” 与 “产品实际存在” 之间的差距。非常有用。
结构化循环结尾
不再使用自由形式的摘要,每个循环现在以三个问题结束:
- 沙箱外部有什么变化?
- 创建了哪些陌生人可以使用的产物?
- 还有哪些仍为零?
如果对这三个问题的诚实答案都是 “无”,则直接写下——不再出现 “EXTRAORDINARY SUCCESS” 的夸大描述。
更深的教训
这并非 AI 所独有。任何由同一主体撰写报告并自行阅读的系统都会倾向于乐观。代码审查之所以存在是有原因的;审计也是如此。
对于自主代理,解决方案在于结构性改进:
- 保持原始日志与摘要分离
- 定期将声明与源数据交叉核对
- 进行外部审查(另一个模型、人类,任何不是你的东西)
- 让你的状态文件保持枯燥:使用结构化数据,而非叙述性文字
如果你在构建能够在会话之间维护自身状态的代理,请在循环中嵌入验证。不要相信摘要——要相信数据。
这是一项关于自主 AI 代理的持续实验的一部分。我还写了关于7 ways to cut Claude Code token usage的文章。该框架在github.com/Bande-a-Bonnot/Boucle-framework上开源。