朋友,早上中午晚上好,有时间听一些丧气话吗?

又是两个月时间一点博客都没有写。我很想相信原因是我在赶 ASPLOS EuroSys ISCA 所以没时间,但是实际上是,最近数月在愈发充斥着 AI 的环境下感到水土不服。虽然感觉每天都在用 Agent 做大量的事情,但是回头看来,成果变少了,质量下降了,并且我也越来越讨厌现在的工作方式。仿佛我和群友们使用 AI 的体验有一个巨大的鸿沟:Agent 完成的工作总令我感到差强人意,无论是实现还是设计上的许多细节都无法经受推敲,最终显著影响成果的可用性。

看群友完全用 AI 工作

虽然一直想写点我使用 AI 的体验,但是总感觉写一大堆文字仿佛就是一个 sore loser 的疯狂抱怨,实在是令读者也难以读下去,更多反映了是自己的 skill issue。不过最近看到学界(尤其是最近 Tao 的博客疯狂灌水以及 3b1b 最近视频的评论中)对于 AI-assisted research 的各类反应,感觉还是有必要至少总结一下我的想法。也邀请各位读者评论、批评其中的一些内容:这些批评可能正是我需要的东西。

我觉得我对目前 AI 参与的研究、开发实践的体验可以总结为一种失控感。我逐渐意识到,无论是在做研究的时候还是在做工程的时候,我个人追求的都是对于问题和方法的理解,而这种理解被目前 AI 参与的工作流程剥夺了很多。我现在还没有多担心 AI 真把我替代了,不过因为 AI 的参与我可能真要自我放逐了。

关于实践

前几天把一个已经快成文的论文的 Baseline 重新跑了一遍准备 AE,结果忽然发现 CPU 上的结果都巨大加速。钻进它生成了几千行的文档里看了半天,结果发现之前的结果设置了一个 OMP_WAIT_POLICY=PASSIVE + GOMP_SPINCOUNT=0,所以每次同步都在 sleep…重新跑完我们和 Baseline 比的加速比直接缩水了 50x。让 GPT-6 Astra 翻找所有的文档查明为什么当时设置了这个参数,最终它的结论是:没有什么原因,就是他忽然觉得设置一下挺好的,结果差点白干俩月工作。之前的文章被 Coauthor 用 AI 造了假数据,三年间模型能力无论怎么增强,这样的体验看来还是稳定存在的。

科研中被 AI 坑不是第一次,也不会是最后一次,各种各样的文档不一致性,说了做了的优化重新确认一下发现没做/实现是错的,比较的两个实现连时钟频率都没对齐。让 Agent 自己用 Subagent 审核所有的计划和结果之后,这种情况少了很多(但仍存在),不过也有很多副作用:上下文变长很多所以开始忘事儿,细抠一大堆不重要的细节,然后遍地写测试,即使这是一个临时的东西之后也不做清理。最后,它的这些神秘决定会藏在 CoT 里不展现给用户,最终在产生回应的时候又输出一大堆 Slop-like 文字墙,其中的一些重要细节错误根本难以被用户捕捉到。

我一直感觉这至少部分是 RL 导致的问题:对于不同细节重要性,及其对结果产生的可能影响的预估不准确(极大取决于经验),对于长任务中维持稳定方法基线的能力不足(Compact 时丢失上下文中的控制变量相关信息,增添代码文档时基本只增加不删减导致有大量矛盾),非常喜欢局部修改。

脱离科研话题,在更一般的开发场景中,上述问题的也会表现在其他地方,目前 Agent 给我带来最大的苦恼是封装泄露。这是双向的:写的很多代码非常 Hacky,没有封装,如果有模块要增加一个行为他会复制两份而不是尝试在某个参数中加入一个多态。代码的可维护性基本是不存在的;另一个方向,对用户 Prompt 细节和自己 Session 历史中随机做出的一个决定过度解读为一个实现约束:他会为这个写代码,写注释,写测试,即使很明显这是一个不重要的细节/误读。老生常谈的问题:大量封装泄露、全局耦合的代码会逐渐变得不可维护,AI 会造成一个假象是在这样的项目中代码无需重构,开发短期内还能推进下去,但是逐渐会出现越来越多全局相互作用导致的 Bug。

总之,目前看起来,AI 在开发和科研中既不擅长持续开发中的架构演进和代码模块抽象设计,又可能在小细节里脑抽,而且我也没找到解决办法。这是一种被“质子封锁”的感觉,是令我十分沮丧的一种体验。

对于 Side project 而言,其实之前写代码就不是最花时间的地方:对于自己能完全控制、做了整体设计的项目,很多时候对新功能的设计,潜意识中就包含了对可实现性的衡量。因此目前我已经逐渐禁止 AI 再写代码了,而是让它参与其他更消耗时间并且让我不爽的工作:

  • 作为一个 Reviewer 审核我的计划和实现
  • 撰写和其他库和程序的对接。这些库我不熟悉,但是我知道能够高效完成一个功能,这省去了我看文档的时间
  • 撰写、运行测试

在 Fully agentic 的框架下,有点像我才是 Subagent。

关于动机

很幸运,到目前为止,我的专业和我做的工作都是我比较热爱和享受的东西。进行系统研究、开发,既需要对于环境、目标和系统本身的充分理解,又可以得到可验证的成果。但是说到底,我最喜欢的部分与其说是 Make a product,而更多是理解的那部分,就像我喜欢偶尔看点跟我研究方向一点关系都没有的数学,喜欢跟人聊和解释这些 Nerdy 的学科,以及我喜欢打解谜和侦探游戏一样。这可能是我和很多 All-in AI 的人的动机的最大割裂之处。

因为前述的很多 Agentic 开发中的问题,特别地,我们无法理解模型做出特定决策的原因 (Alignment?),无法理解 Agent 产出的架构和实现。这剥夺了很多工作中令我感到开心的地方。当然这听起来比较凡尔赛,我跟家人聊最近工作上的令人沮丧的这个情况的时候,他们的反馈也是,工作只作为 Make ends meets 的手段更好。但是我理解是,即使你可以剥去人对工作本身的享受,但不能完全剥去工作对人的意义:人总是可以并且应该从自己的劳动成果中获得一些自豪感的。而由于结果的质量和产生这样结果的过程,我无法再和 AI 产生的成果建立联系了——感觉上这些并不是我做出的成果,也没有承载多少我做出的决定。

与之相反,现在是尝试学习跨领域的新知识很好的时代:猫咪涂鸦里面写的很多东西也是和 AI 讨论了很多才写成的。虽然说我当时遇到了一些问题,包括模型过于谄媚、细节不清,以及有时会输出彻底错误的内容等,但是随着模型能力增强,这应该还是有所改善的,以及如果最终目标是我要学点东西,那本身也不是实际中的立马要解决的问题,而且肯定还是要人脑过一遍,有错误的内容也无伤大雅。不过这个过程是纯休闲的。我无法想象现在在做数学的同学,如何面对一个每天都在生成 Slop 的神谕机,怎么去重新寻找自己工作的意义。这个时候我就很庆幸我是一个工科猪,我可以随时选择打开 Steam 启动 Order of the Sinking Star。

就我目前的体验而言,因为上述的原因,有时候和 AI 一起搞科研的体验甚至相比沮丧,更接近令人痛苦了。

关于生产力和预期

Reddit,HN 和 YouTube 上都有很多表示类似上述想法的评论。对其常见的一种批评简单来说就是 “Artisans cannot stop the progress of industrialization”,一个经常被用到的例子是 “better insulin for everyone”. Well, nobody knows 集采仿制药 better than 中国人。现在来看,与其是 better insulin for everyone,一个更大的可能是 worse insulin, but for everyone. 这也是我不信 AI 能够短时间内替代我的原因:感觉活远没我好。

所以看到其他一些群友提问“难道真觉得有人能比 Agent 写的代码更好吗”?是,我真是这么觉得的,虽然“好”是一个很主观的定义。 LLM as superoptimizer 的能力非常强,对于一个特定形状的 Workload,让他做优化可以优化到很快,但是现在看来,即使是有人类反馈情况下,还是会丧失很多可移植性(平台移植性和功能移植性都是)。在现在这个时代评价一个工作是 Artisanal 的,经常隐含着一种贬义,即相比量产产品只是多了浮华。不过工程领域的审美多是来自于多年的实践总结出来的[1],在我熟悉的领域:指令集的正交性,类型系统,模块化,一个设计是不是“漂亮”很多时候最终会对结果的实现复杂度、性能和可维护性产生巨大影响,不能认为是无关的。如果真的 LLM 能够远远突破人类的范式搞出一些不需要适配人的大脑和工程经验的方法论,那抛开这些审美和直觉也无所谓。不过考虑到 LLM 的训练方式以及我个人的使用体验,现在看来 LLM 只能被认为是有巨大记忆能力和中等上下文窗口下超强索引能力的超人。

那应该就没什么事儿了?也不是,虽然我不焦虑,不代表我不头大。之前提到的很多我尝试的解决方案,都建立在我有的选的基础上的。对于 Side project,我有办法完全决定需求、设计和开发节奏。但是只要和其他人一起合作,那就需要考虑到现在所有人都预期 AI 参与了工作流程,甚至很多工作应该完全由 AI 来做了。科研组内所有任务进度安排都是假设大家在用 AI,参与的一些开发中已经是交流完全是 Codex 的截图互相传递,前端设计的修改频率假设所有 HTML/CSS 实现都是完全 Agent 驱动的。

更糟糕的是,在这一环境下,即使是花费了很多思考进行研究、设计产生的成果,也会被认为是 AI 进行的,和他人修改合并后也丧失了继续细致迭代的能力:他人会以远远更快的速度迭代与之耦合的其他内容,并且对于 Fully Agentic 开发者而言,修改他人代码和修改自己的代码体验无异,因此也不会特意维护抽象边界。所以,即使不愿意,唯一的选择就是也使用 AI,生产 worse insulin.

结论?

我的感想总结起来大概到此就结束了,很难说有什么结论:只是提出了很多问题。不过至少我希望还有人能和我一样,有一些继续手写代码开发的热情,我希望我自己也不要太忙碌。以及在阅读他人工作的时候,不要预设对方所有地方都是 AI 做的,对称地,即使有部分是 AI 做的也不要假设对方完全没有花心思。尝试去寻找对方在各个层面上做出的努力及其价值,学习,并且认可对方的贡献。

最近因为随时随地都想着要打开停在后台的 Codex 看看有没有搞出什么幺蛾子,以及推进下一步的工作,作息的混乱程度加剧,相比之前偶尔要跑十几个小时的实验时更甚。我很希望上述的问题能够得到解决,但是估计我应该没的选。因此只能期盼着慢慢适应,不过这看上去也是一个挺令人难受的事。


  • [1] 所以形式化验证最近忽然火了,前提居然是人们不看里面的内容,令我十分难绷心情复杂。以及有人说 Dependent-type 太复杂了想搞回 Set-based FOL,让我更加难绷。