对AI编程能力的一点看法
AI根据提示词与历史文章风格参与创作
记得几年前,确切地说是OpenAI那一波浪潮刚起的时候,山姆·奥特曼们就豪言壮语,说AI已经把人类迄今为止产生的所有知识都学完了。乍一听挺唬人,但仔细琢磨一下,实际情况远非如此。
那些被喂给AI用于训练的数据或知识,本质上是AI开发者“能够得到”的知识。其中就算不是绝大多数,至少有很大一部分是来自互联网的公开知识。而互联网数据的一大特色是什么?是良莠不齐,甚至可以说低质量的信息占了大多数。真正高质量的、经过深思熟虑的私有数据,往往并不在互联网上公开,AI开发者们无从获取。虽然不能绝对化,但通常来说,这些私有的核心数据质量要远高于网上的大路货。
这就引出了一个很有意思的话题:AI编程的“品味”问题。
如果是非工程类的问题,比如文学艺术、历史科学,大多有公论或者主观性极强,怎么生成都不算太离谱。但编程是个挺特殊的领域,它既有标准答案,又充满玄学。
对于特定的、边界清晰的问题,比如写个“快速排序算法”,判断优劣相对容易。有经典的教科书做标准,有LeetCode这样的平台做验证,没有太大的歧义。
但到了偏设计的、功能性的工程问题上,判断优劣就没那么容易了。我曾经问过AI一个问题:“开发者们是如何训练AI编程的?比如实现同一个功能有多种方法,开发者怎么告诉AI哪种是更好的?”
得到的答案很标准:首先通过“开源代码(GitHub、开源库)、技术文档、API示例、Stack Overflow问答”等进行预训练,然后再通过人类反馈强化学习(RLHF)来进行微调。这一套流程听起来很科学:精心准备“教材”,设计巧妙的“对比学习”任务,建立“奖励模型”当裁判,最后用全面的评估体系筛选。
但这其中存在两个明显的逻辑硬伤。
第一,在预训练阶段,筛选开源代码的标准往往基于星标(Stars)、Fork数、或者有没有详细注释。这种筛选机制选出来的代码相对“安全”,但绝对不能和“高质量”划等号。星标和Fork数这些指标,与代码质量之间只有相关性,没有因果性。对此我有切身体会,GitHub上一些著名的、拥有大量星标的开源库,其设计和实现水平其实并不高。原因很简单,随手点Star的人,编程能力本就参差不齐,很多时候Star只代表它“热门”,并不代表它“优秀”。
第二,在RLHF(人类反馈强化学习)阶段,人类的反馈既有主观性,又有能力的局限。因为在这个环节,人类是站在“上帝视角”告诉AI它生成的代码是好是坏。这对“上帝”本人的水平要求极高。而现实是,AI的开发者们(这里指广义的标注者和训练者)不可能对所有编程语言和软件工程领域都全知全能。
这就导致了一个结果:基于奖励模型,AI给出答案的准则并不是“什么是工程上最优的解”,而是“人类会不会喜欢这个回答?”或者“在什么上下文下,哪类方案更容易被人类认可?”。
在很多时候,AI的表现更接近一个“经验丰富”的老油条程序员,而不是一个架构大师。
当你尝试与AI深入交流编程设计类的问题时,会发现它给出的回答通常很平庸——也就是那些大多数人你抄我、我抄你,然后放到网络上的东西。这些代码能工作,逻辑也跑得通,但质量一般,缺乏灵气。可AI不知道啊,训练AI的人类也不见得知道,更不可能逐条审阅互联网上的亿万行代码。于是,我们训练出了一个比大多数普通人强,但是很难称得上“优秀”的“AI程序员”。
不过AI有一点好,它的肚子里确实也吞下了那些高质量的代码,只是被淹没在了平庸数据的海洋里。这就需要人类像淘金一样,不断地追问和引导,它才有可能吐出更好的答案。
回到开篇的话,AI虽然学习了过滤过的所有公开人类知识中的大部分,但对于缺乏标准答案的工程性问题,尤其是编程问题,由于预训练数据的质量天花板以及人类反馈的水平差异,导致AI的编程能力离真正的“优秀”还有相当一段距离。
如何填补这中间的鸿沟,让AI从“平庸的模仿者”进化为“有品位的创造者”,也许正是那些AI开发者们此刻头疼的课题吧。