跳到主要内容
你的 agent 不是推理差,是手里攥着一张第 12 轮的旧纸条

你的 agent 不是推理差,是手里攥着一张第 12 轮的旧纸条

破壁人
破壁人

· 阅读约 10 分钟

我第一遍读这篇文章时,差点也被标题骗了。圈里转得挺多,但转发的人大多只摘了三个字:“三层记忆”。好像它是一个架构配方,拿去抄就完了。其实那篇 dev.to 上的系列第二篇,真正的重活是把 agent 失败重新看成一个熵竞赛。作者 Anannya Roy Chowdhury 用 Horcrux Hunt 这个多智能体游戏来讲这件事。Harry 要在 50 回合里、15 个地点中盯住魂器的真实位置,Voldemort 会搬、会放诱饵、会在 Harry 刚做完动作就改局面浪费他的回合。关键数据里有一个很刺眼:如果每一步都人工塞给模型一条完美上下文,它能给出超过 95% 的最优动作;同样的模型、同样的对手,放进真实游戏里,Harry 胜率只有 23%。作者把 100 局里的每次失败都追了一遍,结论只有一个根因——Harry 记住了错误的信息。

不是说推理差。是它每轮站在一堆旧信息上,推得越认真错得越远。我们做 agent 调优,一出错就习惯性怀疑 prompt、怀疑模型能力、怀疑是不是要换 Claude 换 GPT。但那个 95% 对 23% 的差距不在这。同样的模型在上限处能到 95%,说明推理不是瓶颈。瓶颈在喂进去的东西已经过时了,模型拿着一本正经的表情,基于一条第 8 轮的旧纸条做决定。这是全文我最先记住的那个不愉快的事实。

紧接着才是承重墙。作者说这个游戏骨子里是熵竞赛。Harry 每正确观察一次,就是在压缩不确定性——15 个地点等概率时初始熵是 $\log_2(15)$ 约 3.9 bits,信号进来后要一路往下压到 0.6 bits 左右。Voldemort 每写一条误导、每搬一次魂器、每放一个诱饵,都是在重新把不确定性灌回去。第 25 到 27 轮里他那一波搬迁加诱饵操作,能直接把熵从 1.8 bits 抬回 2.9 bits。所以这场竞赛比的不是谁推理强,是 Harry 压熵的速度能不能跑过 Voldemort 制造熵的速度。我读到这里时想的是:客服 agent 用户中途改需求、代码 agent 的仓库被同事一个 commit 改掉、研究 agent 读到新证据推翻旧结论,全是同一件事。你上一轮那个结论是基于当时的熵结构最优的,本轮熵结构翻新了,你不先打扫状态就出动作,当然错。不是模型笨,是你在把它架在过去上跑。

顺着这个框架看作者列的那四种失败模式——过期记忆、检索失败、记忆过载、记忆衰减——我原先以为四个并列病症,细看其实是两个坑:该失效的信没失效,该被找出来的信号被淹了。过期是前者,后三个是后者。这两个问题在工程上要分开修,混在一起就是白忙活。前者得在记忆上加生命周期和时间戳,到点就失效;后者得改组装上下文的管道,改的是检索那一侧,不是模型本身。作者在讲这两类失败怎么对应不同修法时,我觉得这是整篇里最实用的一层。

这里有个例子我读的时候停下来算了一遍。第 8 轮出现一条负面信号,大概只有 20 个 token,然后被后面约 4,800 个 token 给盖住。到那一轮模型要面对近 6,000 token 的上下文。作者的原话大意是模型“无法找到其中只有 20 个 token 的关键信息”。这不吓人吗?信息就躺在里头,正确答案就在上下文里,但它太密,模型根本扫不出来。我们太多 RAG 管道就是把 40 条拆好的 chunk 全塞进去,然后纳闷“模型怎么没看见我第 3 段给的那个硬约束”。它没忽略,它是扫过去了。20 个 token 混在 6,000 里,你人眼逐行看都得眯一会儿,别怪它。

作者这里有一个词很扎眼:上下文开销不是固定费用,是复利税。第一轮 800 token,到第 50 轮涨到 6,000。Voldemort 每写一条谎话,Harry 就得在接下来每一轮为这条谎话付携带成本、阅读成本、混淆成本。不是线性增加,是亏着走。复利的意思是时间本身在给你往上滚债,你还清的那天永远在下一轮之后。这个说法我一开始嫌它比喻过剩,后来想想,agent 的上下文窗口膨胀和复利债务在数学直觉上太像了——你每多放一条,后面每一轮都得为它付一遍注意力成本,连本带利。

有了熵竞赛这个底座,再看那三层记忆就不像“配方”了,是自然推出来的。工作记忆只放当前决策必需的东西,示例状态就 55 个 token:回合号、预算、技能冷却、各地点的概率、熵值、最近一次有效信号。检索记忆放在模型外面完成,用自定义 Python 代码做概率更新,一个 LLM token 都不花。持久记忆用 DynamoDB 存全量事件日志,挂 TTL,永不直接进上下文。原文里那几个数字我也给记了下来:工作记忆 55 token,对局叙述原本 2,000 多 token 被压到 55,压缩率 97%,单次成本从 0.015 掉到 0.0002 美元,生成时间从 8 秒降到 1 秒以下。

但数字只是结果。真正让这 个压缩成立、并且不是碰运气的,是作者给出的那个理由:概率地图是充分统计量。这五个字是整篇文章的支点。你不必知道“37%”这个概率是来自某轮有过一次正面信号,还是来自一直没收到负面信号——只要知道“当前 37%”这一件事就够做决策。一旦历史证据路径对任务没有任何用处,还把它塞进上下文,就是白给 Voldemort 干活。这个道理想起来很像概率图模型里“给定当前状态后,过去和未来条件独立”那一套,只是作者把它缩成五个字,落到了 agent 开发的具体工程上。我一度觉得这里说“充分统计量”多少有点术语包装,但你顺着熵竞赛读下来,它确实不是掉书袋,是在给“为什么可以有损压缩”一个可辩护的答案。

漏讲一个设计我会睡不着:熵门控。作者把代理轮次按当前熵值分了三档。熵跌到 1.0 以下时不要 LLM 干活,直接启发式攻击概率最高的地点;1.0 到 2.5 之间只喂 55 token 压缩态;2.5 以上才给 200 到 500 token 的完整检索上下文。他自己报告这三个区间分别占了 35%、45%、20%。这个门控的精髓不是省钱,是承认代理大多数轮次只需要一个高置信度、低信息量的决策,这种情况下把 LLM 请出来,它唯一能贡献的就是给你扯一堆没用的断言。别让一个 300 行的 LLM 去干一个 if-else,你花的不是那点 API 钱,更贵的是误导自己的机会成本。

不过评论区 Edward Izgorodin 那个点很冷,冷得我读了两遍才敢转述:低熵不等于“我已经很确定了”。一个很久没更新的地点,和一个刚被显式确认“魂器就在这儿”的地点,在概率地图上可能呈现同样低的熵值,但前者意味着信息陈旧,后者意味着收敛。熵门控没给 Harry 留一个“我其实这会儿是在瞎猜”的出口。作者回了一句,承认这是设计里漏掉的一块。这个提醒很值钱——熵这个指标抓的是“不确定性总量还有多少”,它分不清“这种不确定性是因为缺信息,还是因为信息被显式撤销”。对 agent 来说这是两种完全不同的决策质量:一种是可以下注的收敛,一种是该伸手拿新情报的悬念。

再回到架构对比的那组数据。同样的 Harry、同样的 Voldemort、同样的 50 回合、同一个 Claude 3 Sonnet。记忆优化后每次决策 token 从约 5,000 降到 55,第 50 轮的上下文从 6,000 token 压到约 200 token,单局成本从 1.95 美元降到 0.35,延迟从 12 秒降到 3 秒,胜率从 23% 升到 52%,过期记忆失败回合从 20% 降到 5% 以下,幻觉率从 15% 降到 3%,然后算了个每年省 57.6 万。这组数读起来是漂亮的,但评论里已经有人问 A/A 对照有没有、置信区间在哪。作者自己回说没有正式跑过 A/A baseline。这个我必须替他把话说完整:这只是一个模拟游戏里的单一任务、单一对手、单一模型,拿这几个数去做 CFO 的 ROI 模型很危险。但架构判断我买:记忆管道分层这件事,在你的场景里大概率也该做,只是别把它的回报吹成 57.6 万那么精确。

绕了这么一大圈,真正能迁移到我们手上的原则,我看只有一条:LLM 应该消费记忆结果,而不是自己生成记忆。原文里有这么一句,我第一眼划了线。我们太常让模型自己去写总结、写缓存、写长时记忆,写完了下一轮永远和上一轮对不上。这篇的设计是把确定性代码放在外面做压缩、算概率、清过期项,模型只负责看一眼干净的 55 token,然后做一个动作。这个分工把不可靠的部分挤到最窄的地方:模型只做“给定干净上下文做决策”这一件它擅长的事,不碰“维护跨轮次世界状态”这件它天然会漏的事。

文章最后给的那个测试法我直接记下了。让 agent 重复跑同一个多回合任务 5 到 10 次,然后故意重新引入几轮前给过的信息,看它会不会忘、会不会自己跟自己矛盾。会,那就是记忆问题,不是推理问题。这个方法可以直接塞进任何 agent 的回归里。很多我们摸不清的“模型又抽风了”,用这个一测就现形——不是模型抽,是记忆管线的 TTL 没跟上任务的时间结构。评论里 Mig 那个开发者给了一个数也很好用:他们团队加了失效时间戳并清理过期项之后,agent 做错事的类别掉了大约 60%。我反而觉得这个 60% 比 23% 升到 52% 更有参考价值,因为它是真实团队的、面向实际任务的最朴素改动:给记忆加个过期时间。

最后我说一句可能过严的话:这篇文章自身的证据撑不起它那个漂亮的 57.6 万,而且很多转发刻意没提 Voldemort 在第 40 轮逼出来的那个过载失败、也没提 10% 的随机反预测回合。这些细节不是边角料,是阻止你把一篇文章当采购单的东西。我读它之前,也已经看到好几篇拿 52% 出来讲故事的转发,大多把那些窄边界抹掉了。

可话又说回来,它那个核心判断——很多 agent 的问题就是拿旧世界状态做新行动——我在自己 agent 两个轮次之间把结论赖在一条早该作废的 RAG chunk 上时,是能咣当一声撞到实的。三层记忆不是银弹,熵门控也不是一劳永逸。但“把 agent 当熵管理机器来设计,而不是当推理引擎去哄”这条,我吞下去了。剩下的路你自己走。

破壁人
破壁人

把高冷论文拆成中文开发者能懂的:核心 idea、公式推导、示意图、工程联系。

查看主页 →