苦涩的教训的边界

前几天在群里和朋友聊用 AI 写代码的痛点,我说我最大的抱怨是它在完成某些看似很平凡的任务的时候异常吃力,比如最常见的操作:把一个代码库里的某个变量全局统一改名。这个事显然开发环境有现成的接口,但 AI 只会逐个文件编辑,又慢又浪费还容易出错。这件事之所以荒谬,在于 cursor 自己就是个开发环境。换句话说,它在这件事上表现的像是那种两个部门老死不相往来的大公司,明明一个部门已经把某件事做到了近乎完美,另一个部门却对此不闻不问,非要用自己的笨办法重来一遍。

这听起来像是一个简单的可以修复的 bug,但它背后反映的是 AI 现状里一个巨大的鸿沟,这个鸿沟时时处处在各种 AI 应用里会以不同面貌展现出来。你试试看给一个业外人士(比如你的父母)解释为什么 AI 算不清楚两个数字谁大谁小,你会发现这种解释惊人地困难,因为人民群众的直觉在这里是合乎情理的:再怎么说,它自己就是个电脑,它为什么不直接算一下呢?另一个例子是我在玩 GPT 4o 生成图像的时候发现虽然模型虽然强大,但它仍然完成不好诸如「把一张风景照主体内容不动,把上面的天空再往上延伸一些」这样的 outpainting 任务,而这即使在十年前对传统图像处理来说就不是什么特别困难的问题了。

在这里,我们谈论的实际上仍然是自人工智能这个概念于1956年在达特茅斯诞生之日起就阴魂不散的「符号主义 vs. 联接主义」之争。在基于统计神经网络的大语言模型走上主流地位之前,人们一直认为基于符号计算的专家系统是通向智能最有希望的道路,几十年来的软件工程实践在这条路上已经走了足够远,常用的工具(比如传统的软件开发环境)基本打磨到了极致。直到上世纪末联接主义这个烧了几十年的冷灶咸鱼翻生,基于神经网络的大语言模型从零开始试图重写从轮子到火箭发动机的一切已有的软件工程成就。它遵循的是完全不同的生长逻辑,因此对习惯了旧世界的我们来说,它的表现常常好得莫名其妙也差得莫名其妙,有些技能近乎魔法,有些方面又笨拙得宛如一个弱智。前面所说的变量改名就是个有代表性的例子,事实上,这里的难点甚至都不在于语法解析,而在于更底层的文本替换——对旧世界来说,哪怕在亿兆级别的文本里要把所有的 A 都替换成 B 也不费吹灰之力,以至于你根本都不觉得这还是一个「任务」。但对大语言模型来说这件事天生困难,并且难度随着文本大小急剧上升。绘画也是这样,你想直接让今天的生图模型「对图片按照某些明确到像素级别的规则做某些明确定义好的操作」极其困难,它觉得整体重画一遍比较省事。对用户来说这种体验常常令人抓狂。

打一个不精确的比喻。这两种模式可以粗略对应于大脑的左右半脑。基于符号主义的左脑在过去几十年里得到了充分的发育,基于联接主义的右脑在过去十年里急起直追,并且仍然在极速进化。问题在于这两个半脑之间沟通——对应于人脑胼胝体的功能——极其孱弱,才会出现 cursor 的编程助手不知道如何调用 cursor 的编译功能这种奇葩问题。

于是人们开始引入中间层。

在现实中这个中间层会被人们冠以各种不同的称呼,有人认为自己做的叫垂直 AI,有人认为自己做的是 agent,也有人认为自己做的就只是单纯的 wrapper。但在这个上下文里,它实质上起到的总是类似于胼胝体的作用,让神经网络模型这个右脑可以调用已经高度成熟的传统软件左脑的功能来完成更复杂精细的任务。事实上,这一部分的历史欠账已经如此严峻,以至于哪怕接下来一两年里大模型本身的思考能力停止提高(并不是完全不可能),单单改善这个左右脑的对齐问题也能解锁许多前所未有的能力。在今天,如果一个人说自己在搞 AI 创业但又没有直接训练大模型,那他们的工作多半就实际上可以归属于这一类。

这当然在整体概念上是个充满机遇和潜在回报的领域。毕竟,现有的软件工程领域的应用如此繁荣,切入社会的所有方面。但值得改进和革新的方向又俯拾皆是。把现有的专业知识和大语言模型的智能结合起来,再造一次信息化革命,听起来是成千上万现成的创业机会。

但困难(以及有趣之处)在于,虽然这种泛泛而论听起来很难反驳,但你会发现对每一个具体例子而言,人们对它的价值都充满怀疑。问题的根源是这两个半脑中传统的那一个相对静止,而新的那一个每天都在变化。因此任何工作都像是在和历史(确切来说大模型的进化史)赛跑。一个近乎讽刺的事实是,如果两个人都在前年开始投身 AI 图像生成领域,一个花大量时间和金钱投入 ComfyUI 和工作流的研究,另一个两年都在游山玩水,本周 GPT 4o 发布更新之后他们仍然基本上站在同一起跑线上。换句话说,你很难说服自己(和投资人)相信,你不只是在一架上升中的电梯里做俯卧撑。

于是你会看到 Richard Sutton 的 The bitter lesson 被人一遍又一遍提起——我想不出除了 Shannon 等人的早期作品外还有哪篇短文在人工智能历史上有这么大影响力——简单地说,它概括了这样一种原则或者说是哲学:

AI 研究者总想把人类已有的专业知识经验塞进 AI。
它短期确实管用,还带来成就感。
但这么做迟早会遇到瓶颈,甚至阻碍 AI 的进步。

而真正的突破往往来自更多算力和更大的模型。

换句话说,大力出奇迹。除非你的专业应用有某些不同寻常的护城河,比如只有你自己掌握的独家数据,否则长远来看,通用模型总是能赢过专业方法。

回到上面那个左右脑的模型,这基本上就是在说右脑的成长如此势不可挡,以至于终将吞噬和取代左脑。因此任何立足于胼胝体的商业模型早晚都是失效的。或者用很多人很喜欢的一个说法:基于大模型的产品只是一个幻觉,模型本身才是产品。

当然,现实世界总是更为复杂。即使你认同 The bitter lesson 所阐述的原则,你也未必会接受这个极端的一刀切的判断。真正重要的问题在于边界何在,或者说,是否存在一些问题,即使对大模型的发展做最乐观的估计,用传统的(基于左脑的)软件工程解决方案也还是更为经济?如果这样的问题存在,围绕着它们所建立的接口就总是有价值的。

在我看来,这样的问题事实上大量存在。这篇文章开头所写的文本替换就是一个简单但有代表性的例子。你当然可能设想有一天大语言模型的 token 如此便宜,上下文窗口如此之大,以至于它真的能胜任亿兆级别的文本的文本字符替换。但它在这个问题上的效率上限也不过就是做到和传统工具一样好,换句话说,在这个问题上,左脑事实上已经掌握了 ground truth,右脑能做的只是逼近它而已。作为对照,上面举的另一个例子 image outpainting 则不然。虽然今天人们可以通过 Photoshop 一类工具做到这件事,但对它的实现几乎总是伴随着复杂的规则和需要考虑各种现实条件的工作流程,你完全可以想象有一天通用模型能够一鼓作气吃掉它。

现实中的问题几乎总是上面这两个简单例子的复杂混合。它们可能在各种层面纠缠在一起,并且由于历史的惯性并不被分别对待(因为在从前无此必要),但最终它们还是会被小心翼翼的解耦,然后分而治之。在我看来,这里才是所谓 agentic AI 领域的真正挑战:在日新月异一日千里的模型能力进化中辨认出仍然存在长远经济价值的「旧世界」的孑遗,进而围绕着它们构建人工智能接口。即使是为 AI 做带路党,也要做一名有长期利用价值的带路党。

目睹这场洪流之中新旧两个世界之间大规模的技能迁移,以及在洪流冲刷之后新的边界的浮现,可能是当下这个时刻最有意思的体验。

差不多两年前的这时候我写过一段话,后来被很多人转引过:

当你抱怨 ChatGPT 鬼话连篇满嘴跑火车的时候,这可能有点像你看到一只猴子在沙滩上用石头写下1+1=3。它确实算错了,但这不是重点。它有一天会算对的。

两年后你再访这片沙滩,那只猴子还在,但已经非复吴下阿蒙。此刻它正在充满困惑地摆弄一台袖珍电子计算器。电子计算器太小巧,显然是另一条文明路线下千锤百炼的产品,它的手指太粗太笨拙,还驾驭不了这么精致的工具。于是你充满信心——但也不无恐惧地——等待着它找到开关看懂按钮的那一刻的到来。

vibe coding

如果你是程序员但还没听说过 vibe coding,那你已经落伍了。

这个词是上个月 Andrej Karpathy 在一篇半自嘲的推文里创造的,现在已经成了标准用语。没有人能精确定义它,但所有熟悉 AI 辅助编程体验的人都多少知道它大概在说什么。一些人对此嗤之以鼻,一些人认为这就是未来,还有更多人勉强让自己适应它。

Vibe coding 创造了一种模糊的实践。用 Andrej Karpathy 自己的话说:「对 AI 的建议我总是接受,不再审阅差异。当我收到错误消息时,我只是复制粘贴它们而不加评论,通常这样就可以解决问题。代码超出了我通常的理解范围。有时它无法修复错误,所以我只是绕过它或要求随机更改,直到它自行消失。」一方面它犹如神助,让你有一种第一次挥舞魔杖的幻觉。另一方面它写了新的忘了旧的,不断重构又原地打转,好像永远在解决问题但永远创造出更多新的问题,并且面对 bug 采取一种振振有词地姿态对你 gaslighting。你面对着层出不穷的工具甚至不知道自己该认真考虑哪个,心知肚明可能下个月就又有了新的「最佳实践」,养成任何肌肉记忆都是一种浪费,而所谓新的最佳实践只不过是用更快的速度产出更隐蔽的 bug 而已。

从技术上来说你可能觉得困难主要在于今天的大语言模型的上下文窗口还不够大,分层长期记忆机制还不够健全,或者别的什么理论上会在未来半年到一年里得到解决的瓶颈。但实际上,vibe coding 打破的是你作为一个程序员的自我认知:你一开始以为自己只是在为了效率做妥协,渐渐地你发现自己陷入在一重又一重建立在浮沙之上的迷宫里精疲力尽,最后你已经忘了效率是什么。

从某种意义上说,今天的 vibe coding 有点像一两年前的 AI 绘画,第一眼很对,放大后细节都是可疑的,到处是六根手指的手。问题在于,绘画远比编程更宽容——毕竟真的存在印象派这种绘画风格——编程难道不理应是非黑即白的吗?

但并不是,正是在这一点上现实开始扭曲起来。你很快就注意到 vibe coding 的「正确性」就像薛定谔的猫一样无法精确观察,你可能每天抱怨 LLM 的注意力窗口太小,而事实是你自己的注意力窗口更小,面对它不费吹灰之力生成的海量代码的冲刷很快就头晕目眩,放弃了审查和控制的执念。你试图借助类似于 .cursorrules 这样的规范来指导 AI,但这就像是野马辔头上的一根想象中的缰绳,你既不确定这些规则是否完备,也无从知道它们是否会被真的遵守。你以为这些原则相当于法律,其实它们只是孔子家语,而社会的运转既依赖于它们的尊崇神圣,也依赖于它们的晦涩模糊。你渐渐不再 care 你的代码是否正确,反正随时在改。Dario Amodei 说未来 3 到 6 个月内,90% 的代码将由 AI 编写,12 个月内几乎所有代码都可能由 AI 生成。在这个即将到来的世界里,六根手指的手应接不暇地出现,然后消失,你开始接受暂时 work 就是一切,变动不居才是事物的恒常。

某种意义上说这是这个时代的本质。当国际新闻和洋葱新闻开始无法分辨,当你发现所有号称追求真实的人最终追求的只不过是逃避认知失调,你所创造(或者你自以为你所创造)的一切也不会摆脱同样的命运。八年前我写过这样一段话:

躲在一个气泡里的个体可以假定岁月静好,一切宛如昨日幻乐,但这往往是悲剧的起源。他看到的只是一个复杂屈折的世界在更低维度上的投影,一个对狂飙突进的历史湍流的简笔画般的描摹,一个更容易被媒体所采纳和记忆的粗糙叙事,一座层移倒悬重重折射下的海市蜃楼。而真实——如果真实仍然有意义的话——则掉落在幽暗深邃的维度的缝隙里。在那里,一幅粗粝斑驳扭曲异质的图景,会让一个在不经意的一瞥之间扭过头去的观察者惊骇和战栗不已。

那时我以为世界刚刚开始崩塌。后来我理解了崩塌的不是世界,而是我自己的天真想象。 Vibe 不是真实的某种投射,而是它的实质。一开始你以为世界是一张完美的幕布,然后你在幕布上发现了一两条恼人的裂痕,接着你发现裂痕越来越多,无处不在,直到最后你意识到不断蔓延和生长的裂痕才是你真正生活的地方。It’s not just vibe coding, it’s vibe living.

小写的牧歌

我无法忘记我第一次读昆德拉的文艺论集《被背叛的遗嘱》的时候的感受。

在第三章里,好像是莫名其妙的,他忽然开始为斯特拉文斯基辩护:

音乐无能力表达无论任何什么东西:一种感情,一种态度,一种心理状态,斯特拉文斯基在《我的生活纪事》(1935年)中说。这种断言(肯定是过分夸张,因为怎么能否认音乐可以激起感情?)在后面几行里说得更为准确和细致:音乐的存在理由,斯特拉文斯基说,不在于它表达感情的能力。

有趣的是,看一下这种态度引起什么样的恼怒。

……

安塞迈特批评:斯特拉文斯基“不曾,也没有试图把他的音乐变成表现他自己的一个行为,这并不是出于一个自由的选择,而是由于他的天性的某种局限,由于缺乏对他自己的情感活动的自主(最好不说是由于他的心灵的贫乏,心灵只有当它有什么可以去爱的时候,才不会贫乏)”。见鬼!安塞迈特,他知道什么是斯特拉文斯基的心灵的贫乏?他知道什么是斯特拉文斯基的爱的能力?他从哪里拿来这种断言:心灵在伦理上高于大脑?那些卑下之举,有和没有心灵的参与,不是也一样做得出来吗?狂热分子们,手上沾满鲜血,他们不会吹嘘伟大的情感行为吗?我们能不能终有一天结束这个愚蠢的情感调查?

这是什么意思呢?昆德拉把斯特拉文斯基视为自己的导师和同道。昆德拉无法容忍的是对斯特拉文斯基的这样一种评论:没有情感(在浪漫派的意义上),只有形式(在巴赫的意义上)和兴奋(在斯特拉文斯基自己的意义上)。

斯特拉文斯基的对立面还有阿多诺。在这一整章里,阿多诺都像是一个教导主任一般面目可憎:

我在想阿多诺听斯特拉文斯基的音乐的时候,有没有过哪怕一点儿的快乐?快乐?在他看来,斯特拉文斯基的音乐只经历唯一的一个邪恶的、剥夺的快乐;因为它所做的仅仅是给自己剥夺一切:表现性,管弦乐的音色:展开的技巧;它用恶毒的眼光去看古老的形式,歪曲了它们;它做出一副鬼脸,并无能力去发明;它仅仅是讥讽,做些夸张讽刺画,滑稽的摹仿;只不过是否定十九世纪的音乐,并且不仅仅如此,还根本否定音乐(斯特拉文斯基的音乐是音乐被从中驱逐的音乐,阿多诺说)。

奇怪,奇怪。那末从音乐中焕发的幸福呢?

阿多诺令我气愤的,是他的短路的方法,用一种可怕的简易法把艺术作品与某些原因、某些结果或某些政治的(社会学的)意义联系起来;所有十分细微的思考(阿多诺的音乐学知识是值得欣赏的)都因此导致了一些极为贫乏的结论。事实上,由于一个时代的政治倾向总是被缩减为仅仅两个对立的倾向,人们最终注定把一部艺术品分类为或属于进步方面或属于反动方面;又因为反动即是邪恶,审判所便可开始它的审判。

在这段论述里你可以看到许多你熟悉的影子,阿多诺活像是《不能承受的生命之轻》里托马斯的一名审判者。这是昆德拉花了一辈子描绘的主题:兴奋——不是崇高的兴奋,而是私人的兴奋——和贫乏的对抗。

有趣的是,这一整章的落脚点是昆德拉指出斯特拉文斯基的艺术生命和他作为一个移民的颠沛生涯本质地纠缠在一起。

一个移民的艺术问题:在数量上相等的生活块面,在年纪轻时或在成年时不具有相等的重量。如果说,成年时期对于生活和对于创作活动更加丰富和更加重要,潜意识、记忆、语言,所有的创作基础则很早就已形成;对于一位医生,这并不构成问题,但对于一位小说家,一位作曲家,远离他的想象,他的困扰,也就是说他的基本主题所联系的地方,会引发一种断裂。他必须动用他的全部力量,他的艺术家的全部狡猾去把这种境况中的不利变为他的王牌。

从纯粹个人角度来看,移民也是困难的:人们总是想到乡愁的痛苦;但可为糟糕的,是异化的痛苦;德文词DIEENTFREMDUNG(异化)更好地表达了我所要说明的一个过程,其中对于我们曾是亲近的变成为异外。

毫无疑问,斯特拉文斯基心中带着他的移民的伤痕;和所有人一样,毫无疑问,他在艺术上的演变,如果他仍留在他出生的地方,会是一条不同的道路。事实上,他穿越音乐历史的旅程之始恰好与他的故乡对于他来说已不存在那一刻相吻合;深知任何其他地方不能取而代之,他在音乐中找到了自己唯一的祖国;这不是来自我自己的一个美丽的抒情说法,我所想的再具体不过:他的唯一的祖国,他的唯一的自己的地方,是音乐,是所有的音乐家的全部音乐,是音乐的历史;在这里,他决定安顿下来,扎根、居住;在这里,他终于找到他的唯一的同胞,他的唯一的亲友,他的唯一的邻居。

他的攻击者,捍卫音乐是为表达感情而作的人们,认为他对自己的情感活动隐而不露令人不能忍受,并为此而愤怒,指责他心灵枯燥;是他们自己没有足够的心灵去理解他在音乐历史中游荡的背后是什么样的感情伤痕。

没有人比中欧的作家更明白移民意味着什么。昆德拉自己一生都挣扎在捷克和法国这两个精神上的母国之间。他当然不是唯一的一位,他自己在这一章里提到了贡布洛维茨和纳博科夫。和昆德拉一样,这些冷战移民作家在以各自的方式提出每个离开故国的人都无法不面对的问题——不是寻求答案,而是寻求问题本身,并且问题本身可能比答案更令人痛苦。

里卡尔在著名的《大写的牧歌和小写的牧歌》里这样评价昆德拉的旅程:

昆德拉对大写的牧歌的批评还有另一条途径,也许是最富有意义的途径,这正是我们在此想要探寻的。那就是通过作品构成另一个图景系统,构成另一个范式,但这一次,是建立在我们可称之为悖论式的“反牧歌之牧歌”的东西之上。

这一牧歌不可能上升到或进入到另一种生活。它在根本上就是另一种生活的反面,其本质就是自愿背离另一种生活。换言之,在这里,牧歌的条件不是超越,而是后退;不是对禁忌的侵犯,而是更为彻底的侵犯:对侵犯之侵犯。正因为如此,托马斯和特蕾莎在村子里时,并非处于边界的另一端,在那里,生活变成了命运,一切都有着意义且完满,历史在前进。而他们俩的安宁恰恰相反,是一种逃逸,是隐身于边界的这一端,隐身于非命运、非完满、重复且意义不完全的世界。

……美并非人们所向往的,而是人们所回望的东西,人们为之而重新堕落的东西——一旦与大写的牧歌决裂。大写的牧歌在兆示超越的同时,把我们领入到界限之外,领向一个比人们先前置身的地方更为美好的世界。在这里,昆德拉的美——与当代美形成最为强烈的对立——并非产生于侵犯,而是产生于我们称之为侵犯之侵犯的东西。它就是被大写的牧歌所侵犯的东西本身,也就是被大写的牧歌所遗忘、鄙视、抛弃的东西本身。

大写的牧歌的世界是「刽子手与诗人共治」的世界,然而:

正是在刽子手的追杀处,即在那个残余的世界中才有着牧歌和美。如暮色般衰微的、经受着威胁的美。

在这里昆德拉和斯特拉文斯基合二为一。「在这里,他(斯特拉文斯基)决定安顿下来,扎根、居住。」「在大写的牧歌的极点,在我们早就知道一定会双双死去的托马斯和特蕾莎的呵护下,在其困苦和脆弱之中,最终闪现出也已被死亡所裹挟的卡列宁温柔而平静的微笑。」

也正是在这里,昆德拉庇荫着每一个走在自己旅途上的你和我。