块魂式架构
LLM agent 像《块魂》一样把功能滚成一团粘在一起,形成 katamari 架构。作者认为技能退化、可见性缺失与变更成本才是主因,并追问非生成式应用能否破局。
中文
复制

或者说,如何用泥巴造出一颗星星
lobste.rs 上的用户 marginalia[1] 把指挥不当的软件开发 LLM agent 的输出比作《块魂》里的“katamari”:在那个游戏里,你滚动一团杂七杂八的东西,把能找到的一切都粘在外层。这个类比很贴切;agent 式开发倾向于不断加功能,却不顾整体构成——它们走的是完成 prompt 的最短路径。人类工程师如果薪水太低、时间又不够,最糟糕的毛病它全有。不过,我觉得这个类比对《块魂》不太公平!那团魂球是精心打造的(当然是用算法,但算法本身是精心设计的),目的就是让它_看起来_像随手拼凑、毫无规划,可他们让球自然变圆的方法复杂到足以去申请专利。相比之下,LLM 没有那种判断力,不知道该怎样恰当地加入提示者想要的新功能,只是随机地往上粘(顶多服从某个概率分布)。尽管如此,katamari 架构这个说法已经够抓耳,我希望它能“粘”住不走!
Katamari 架构已经来了,但这不是无解的问题。看看能不能从以往的工作里学到点什么。
最明显的对照是 Big Ball of Mud 架构。Foote 和 Yoder 认为,有几种“力量……合谋”造就了 BBoM——时间、成本、经验、技能、可见性、复杂度和规模。考察驱动力是理解一种现象的好办法:先steelman切斯特顿,再去诋毁他的栅栏。LLM 当然把这套比喻踩得稀烂,因为它们会毫无道理地把栅栏甩到广阔天地各处,在你满腹狐疑地追问时,它们一边谄媚地给出胡说八道的回答,一边把栅栏随机挪来挪去。不过跑题了;同样的冲动能造出泥球,也能造出 katamari 吗?
-
时间:LLM 时间多得是。表面上,它们能比任何人类开发者快得多地工作,全天候、周末、假期都不停。时间不是问题。
-
成本:很多公司 token 预算无限,于是就有了 tokenmaxing。如果 LLM 真擅长架构,成本根本不是障碍。LLM 的全部卖点就是用比人更低的成本做同样的活;成本不是问题。
-
经验:前沿 LLM 的训练数据(或多或少)涵盖了有史以来写下的全部软件,外加所有书籍、博客和论坛帖子。没有什么架构流程是 LLM 不熟悉的,尽管这种造物的本性决定了,除非你,呃,去 prompt 它,否则它不会提出中规中矩、最大公约数之外的任何想法。经验不是问题。
-
技能:有争议。LLM 表现出非人的“尖刺式”[2]智能,和其他自动化系统类似。有些任务它们强得不可思议(在大型文本语料里做欠约束搜索),有些则烂得好笑(公开报道过的 LLM 史诗级翻车要多少有多少,比如草莓综合征、洗车要开车去、认为自动售货机在形而上学上不可能)。靠审 LLM 输出吃饭的人都知道,它们犯的错不是人类会犯的错,而且难发现得多。技能不足很可能也是 katamari 架构的成因之一。
-
可见性[3]:LLM 擅长生成一眼望不到头的大片代码——而这正是问题的一部分。没人会去逐行细读一个 +6,000/-400 sloc 的 PR——太累人,而且读了也改变不了什么。代码库中 LLM 生成的比例越高,可见性就越差。Andrej Karpathy 已经根本不看代码了。正如 Foote 和 Yoder 所说:“[如]果系统能跑,能发布,谁在乎它内部长什么样?”这正是现代 vibecoder 的信条。干脆交出你的认知,拥抱这团烂泥吧!
-
复杂性:大多数软件的本质复杂度相当低,在这个规模上康威定律也不适用。复杂性或许能解释一部分 BBoM,但解释不了 LLM 生成的团子。我猜,真正复杂的领域里,多数软件仍然主要是手写的,不过照现在这个势头,这是个恶性循环。
-
变更:人力是变更速度的天然刹车。自动编码会加速变更;LLM 让实现一个新变更变得像提个需求一样简单(附带若干相当沉重的星号)。但与人类做出的变更不同,LLM 带来的变更倾向于堆积在现有架构(如果那算架构的话)之上,而不是直切要害。一个深受 LLM 影响的团子代码库,往往有一个设计良好的核心(通常是人设计的),却被一层层风格化的家居杂物盖住。Agent 可能会决定重新设计整个系统,但很少具备这个能力;重设计或重写被软件匠人理所当然地视为复杂、痛苦且没完没了的事。LLM 自作主张去搞重设计,注定失败。
-
规模:Foote 和 Yoder 的观点(除非我理解错了——原文对我来说有点含糊)是,本来水平不错的设计师面对庞大项目时,也很难找到优雅的方案。我觉得这不太适用于 agent,它们在小规模上表现都平平。不过,它们在大规模上也不会变得更好。
这份清单里的主要因素有:技能、可见性和变更。比起熟练的人类,LLM 写代码就是不行;它们是一种全新的隐形代码,而且它们砍掉了那股空气阻力——正是这股阻力,让本来一团乱麻的项目不至于塌成一坨屎,一次十个 15,000 sloc 的 PR。
可见性这一条让我如鲠在喉。用户看不到应用内部那堆可怕的烂泥还不够糟,现在连开发者都不读代码了?我们完蛋了 chat
那该怎么办?
LLM 是加速主义梦想的实现。烧煤,投毒水井,杀死开放网络,黑掉这颗星球(从雨林开始)。清除任何有潜在精神分裂倾向的人。让信任过时。用不可名状之物淹没互联网。指望我们从另一头走出来时,拥有无限可再生能源、无限算力、安全且高性能的软件、废除版权和普遍闲暇。顺便把所有疾病都治好。不过,只要亿万富翁还攥着钥匙,我的无政府主义乌托邦就绝不会实现。如果 jyn 说的话靠谱,几年内我们手机上都会跑着 Astra 级模型。乍看之下不太可能。
信不信由你,我不是末日论者。Vibecoder 们大错特错,但用这些该死的球体来构建更好的软件显然是可能的。我也不声称自己有一道能把这些冥府实体扭转为我们所用的魔法,但非生成式应用最有前途。LLM 显然有能力在精心编写的代码里找到真正的 bug。和 fuzzing 一样,为了这份特权它要烧掉海量算力;也和 fuzzing 一样,超大规模厂商乐意施舍一些免费算力,让自己宠爱的 OSS 保持无 bug。
我见过的一个想法是 slopmeisters 和软件维护者之间的军备竞赛:“你不能用 LLM 向这个代码库贡献代码,除非我看不出你用了 LLM。”我喜欢这个——首先,它让不堪重负的维护者可以全权把任何草率的 PR 打入影界;其次,用 Eliza 的话说,“把模型生成的代码重写到不再长成那样,这个过程迫使生成它的人真正彻底地阅读并理解它。”
Foote 和 Yoder 最终得出结论:BBoM 是一种冷血的理性选择——软件在我们脚下变化得太快,“权宜、砍烧、用完即弃的编程方式,实际上正是最先进的策略”。我不同意他们的看法,并且我认为 katamari 架构也好不到哪里去。BBoM 和 katamari 架构都是应对机制,源自那些幻想破灭的从业者所受的创伤——他们被迫交付无穷无尽的虚荣功能,同时一再冲过交付的那些装点门面的截止日期。软件吞噬了世界,现在它正在吞噬我们。我们不需要那种不顾一切、全速狂飙的节奏,我们需要的是用心与专注。
我想要更小的软件,bug 更少,由那些拿更多钱、干更少活的人做出来[4],而且我不是在开玩笑!
- 出色的 smallweb 搜索引擎 marginalia 的作者 ↩
- 尖峰是相对于“人类标准”而言的,这意味着神经多样性(尤其是自闭症和 ADHD)常常被归类为尖峰型。我绝不是在说 LLM 的智能类似于自闭症智能——两者的尖峰并不对齐。正常只有一种方式,异常却有多种方式。↩
- 一个更深的可见性问题,与这篇檄文的其余部分并不合拍——LLM 多多少少是黑箱(尽管有一些引人入胜的尝试性脑部手术)。我们完全不知道里面在发生什么。可解释 AI 如今依然是白日梦,和 SOPHIE(推荐收听)那个年代没什么两样。↩
- 工人所有的合作社或许会有帮助。↩