【智能体框架的“苦涩教训”:你写的一万行抽象代码,可能正在拖累AI】
一个智能体本质上就是一个消息循环。它唯一需要的状态是:持续运行,直到模型停止调用工具。你不需要什么智能体框架,不需要别的花里胡哨的东西,就是一个工具调用的循环而已。
我们最初的Browser Use智能体有数千行抽象代码,确实能跑,但每次想改点东西都是噩梦。每次实验都在跟框架较劲。智能体失败不是因为模型蠢,而是因为我们自己在添乱。
抽象的本质问题在于:它固化了你对智能应该如何运作的假设,而强化学习恰恰会打破这些假设。每当你在模型行为外面套一层“聪明的”包装——规划模块、验证层、输出解析器——你就是在编码你认为模型“应该”怎么做。但模型是在数百万样本上训练的,它见过的模式远超你的想象。你的抽象反而成了枷锁,阻止模型发挥它学到的东西。
机器学习研究中的“苦涩教训(bitter lesson)”说得很清楚:利用算力的通用方法,每次都能击败精心设计的人类知识。智能体框架不过是这个老错误的最新版本。
真相是:99%的工作都在模型内部完成了,我们根本不需要在外面套一层高度抽象的框架。现在的Claude Code可以直接写AppleScript。它需要从某个冷门的Spotify播放器获取信息?不需要什么Spotify专用工具,它直接在macOS上写AppleScript就行了,有完美的上下文,在这方面训练得很好。你预判不了所有用例,但模型已经知道了。
这让我们得出一个关键洞察:智能体框架失败,不是因为模型弱,而是因为它们的动作空间不完整。
与其预先定义每一个可能的动作,不如从相反的假设出发:模型几乎什么都能做,然后再做限制。给大语言模型尽可能多的自由,然后根据评估结果凭感觉收紧。
所以我们退后一步,问了一个更根本的问题:大语言模型实际上被训练成擅长什么?随着模型变强,什么会保持不变?
我们扔掉了整个智能体,从零开始。为了理解“极简”到底能意味着什么,我们逆向工程了Claude Code和Gemini CLI。它们的底层理念很简单:不要过度规定智能,让模型自己推理。
我们把这个理念融入了BU Agent。它不是暴露一小组脆弱的“点击/输入/滚动”原语,而是让模型直接访问浏览器的原始控制面——发出纯CDP指令,调用浏览器扩展API。这两者各有盲区,但组合起来形成了近乎完整的动作空间。
当模型拥有这种自由时,有趣的事情发生了:如果一种方法失败,它会绕过去;如果一个工具坏了,它会找到另一条路。只要原则上一切皆可能,大语言模型就极其擅长临场自我修复。
简单的循环要做得健壮并不容易:指数退避重试、速率限制处理、连接恢复、上下文压缩、token追踪。这是运维层面的事,是已解决的问题,但别把它跟智能体本身混为一谈。
每一层抽象都是负债,每一个“帮手”都是潜在的故障点。模型已经变强了,真的很强。它们经过了计算机使用、编程、浏览的强化学习训练,不需要你的护栏。
苦涩的真相是:你构建得越少,它反而工作得越好。
x.com/gregpr07/status/1932445608842649746
