人工智能和编程的终章

转载
402 天前
8436
AIcore

文章转载来源:AIcore

原文来源:CSDN

图片来源:由无界 AI生成

今年早些时候,Matt Welsh 宣布编程正在步入终结。他在 ACM Communications 中写道:

我相信 “编写程序” 的传统想法正在走向消亡,事实上,对于除非常专业的应用程序之外的所有应用程序,正如我们所知,大多数软件编程都将被经过训练的人工智能系统所取代。在一些只需要 “简单” 程序的情况下(毕竟,并不是所有东西都需要在 GPU 集群上运行的数千亿个参数的模型),这些程序本身将直接由人工智能生成,而不是手工编码 。

几周后,在一次演讲中,威尔士扩大了他的死亡观察范围。走向坟墓的不仅仅是编程艺术,还有整个计算机科学。所有计算机科学都 “注定要失败” 。(下图是演讲的屏幕截图。)

这些悲伤消息的传递者似乎并没有悲痛欲绝。尽管 Welsh 已经成为一名计算机科学教师和实践者(在哈佛、谷歌、苹果和其他地方),但他似乎渴望继续下一步。“无论如何,写代码很糟糕!” 他宣称。

我自己对后编程未来的前景并不那么乐观。首先,我持怀疑态度。我认为我们还没有跨过机器学会自己解决有趣的计算问题的门槛。我认为我们还没有接近这一点,或者正朝着正确的方向前进。此外,如果事实证明我的观点是错误的,我的冲动不是默许而是抵制。一方面,我不欢迎我们的新人工智能霸主。即使他们被证明是比我更好的程序员,我仍然会继续使用我的代码编辑器和编译器,谢谢。“编程很糟糕?” 对我来说,它长期以来一直是我快乐和启迪的源泉。我发现它也是理解世界的一个有价值的工具。在我能够将一个想法简化为代码之前,我永远不确定我是否理解了它。为了从这种学习经验中受益,我必须实际编写程序,而不仅仅是说一些魔法词并从阿拉丁的人工智能灯中召唤一个精灵。

大型语言模型

可编程机器可以编写自己的程序的想法深深植根于计算历史。Charles Babbage 早在 1836 年讨论他的分析机计划时就暗示了这种可能性。当 Fortran 于 1957 年推出时,它的正式名称是“FORTRAN 自动编码系统”。它的既定目标是让计算机“为自己编码问题并生成与人类编码员一样好的程序(但没有错误)”。

Fortran 并没有消除编程技巧(或错误),但它使过程变得不那么乏味。后来的语言和其他工具带来了进一步的改进。而全自动编程的梦想从未破灭。机器似乎比大多数人更适合编程。计算机有条不紊、受规则约束、挑剔且注重字面意思——所有这些特征(无论正确与否)都与高手程序员联系在一起。

但讽刺的是,现在准备承担编程任务的人工智能系统却奇怪地不像计算机。他们的性格更像Deanna Troi,而不是 Commander Data。逻辑一致性、因果推理和对细节的仔细关注并不是他们的强项。当他们似乎在思考深刻的想法时,他们有不可思议的辉煌时刻,但他们也有可能遭遇惊人的失败——公然、厚颜无耻的理性失误。他们让我想起一句古老的俏皮话:人都会犯错,而真正把事情搞砸则需要计算机。

最新的人工智能系统被称为大语言模型(LLM)。与大多数其他近期人工智能发明一样,它们建立在人工神经网络之上,这是一种受大脑结构启发的多层结构。网络的节点类似于生物神经元,节点之间的连接起着突触的作用,突触是信号从一个神经元传递到另一个神经元的连接点。训练网络可以调整连接的强度或权重。在语言模型中,训练是通过向网络强制输入大量文本来完成的。该过程完成后,连接权重会对训练文本的语言特征的详细统计数据进行编码。在最大的模型中,权重数量为 1000 亿个或更多。

在这种情况下,模型一词可能会产生误导。这个词并不是指比例模型或微型模型,如模型飞机。相反,它指的是预测模型,就像科学中常见的数学模型一样。正如大气模型预测明天的天气一样,语言模型预测句子中的下一个单词。

最著名的大型语言模型是 ChatGPT,它于去年秋天向公众发布,引起了极大的关注。缩写 GPT Gee Pee Tee:我的舌头不断地被这三个押韵的音节绊倒。其他 AI 产品的名字很可爱,比如Bart、Claude、Llama;我希望我能以同样的精神重命名 GPT。我会把它称为 Geppetto,它与辅音的模式相呼应。GPT 代表 Generative Pre-Trained Transformer (生成式预训练变压器);系统的聊天版本配备了对话式人机界面。ChatGPT 由 OpenAI 开发,该公司成立于 2015 年,旨在将人工智能从少数富有的科技公司的控制中解放出来。OpenAI 成功地完成了这一使命,以至于它已经成为一家富有的科技公司。

ChatGPT 因其用词方式、能说会道、流利的英语和其他语言而既令人钦佩又令人震惊。该聊天机器人可以模仿著名作家、讲笑话、写情书、翻译诗歌、写垃圾邮件、“帮助”学生完成家庭作业,以及编造错误信息以进行政治恶作剧。无论好坏,这些语言能力代表了惊人的技术进步。曾经难以构建一个可理解的句子的计算机突然变成了能说会道的文字大师。GPT 所说的可能是真的,也可能不是,但它几乎总是措辞得体。

ChatGPT 发布后不久,我惊讶地发现它的语言掌握扩展到了编程语言。该模型的训练集似乎不仅包括多种自然语言,还包括来自 GitHub 等公共存储库的大量程序源代码。基于此资源,GPT 能够根据命令编写新程序。我发现这很令人惊讶,因为计算机对它们的输入是如此挑剔和无情。尽管电脑有时存在诸如拼写错误之类的小错误,人类阅读者仍会努力理解一句话。但如果计算机得到的输入,哪怕只有一个逗号或不匹配的括号,它就会呕吐乱码。具有潜在统计或概率性质的语言模型似乎不太可能维持超过几行所需的精度。

我在这件事上又错了。大型语言模型的一项关键创新,即注意力机制,解决了这个问题。当我开始自己使用 ChatGPT 进行实验时,我很快发现它确实可以生成没有粗心语法错误的程序。

但其他问题也随之出现。

攀登单词阶梯

当你坐下来与机器聊天时,你立即会面临一个尴尬的问题:“我们该聊什么?” 我正在寻找一个可以公平衡量 ChatGPT 编程能力的主题。我想要一个可以通过计算手段解决的问题,但这不需要做太多算术,而这被认为是大型语言模型的弱点之一。我选择了 Lewis Carroll 150 年前发明的字谜游戏,并由 Donald E. Knuth 在 20 世纪 90 年代进行了深入分析。

在下面的文字记录中,我这边的每次交换都被标记为 BR;玫瑰花结是 OpenAI 徽标,指定 ChatGPT 的响应。

当我看到这些句子在屏幕上展开时——聊天机器人逐字逐句地打出它们,有点不稳定,好像在停下来整理思绪——我立即被系统的英语能力所震惊。GPT 以简单、有力的散文形式列出了单词梯子的所有基本特征:这是一个游戏或谜题,你通过一次更改一个字母从一个单词到另一个单词,梯子的每个梯级必须是一个英文单词,目标 就是找到从起始词到目标词的最短可能序列。我自己无法更好地解释它。最有帮助的是 COLD -> WARM 的工作示例。

给人留下语言能力印象的不仅仅是单个句子。句子按段落组织,段落串在一起形成连贯的话语。太棒了!

同样值得注意的是机器人处理模糊和草率输入的能力。我最初的查询被表述为是或否问题,但 ChatGPT 正确地将其解释为请求:“告诉我你对单词阶梯的了解。” 我的第二条指令忽略了任何印刷提示,表明 LEAD 和 GOLD 应被理解为文字,而不是金属。聊天机器人本来有权向我提供炼金配方,但它却提供了缺少的引号。

然而,抛开所有这些语言和修辞的复杂性,我真正想测试的是该程序解决单词阶梯问题的能力。上面文字记录中的两个示例都可以在网络上找到,因此它们很可能出现在 ChatGPT 的训练数据中。换句话说,大型语言模型可能只是记住了解决方案,而不是构建它们。于是我提交了一个更艰巨的作业:

乍一看,ChatGPT 似乎再次取得了胜利,解决了我确信它以前从未遇到过的难题。但仔细看看。MARSH -> MARIS 需要两个字母替换,PARIL -> APRIL 也是如此。MARIS 和 PARIL 作为“有效词”的地位也可能受到质疑。我已投诉:

哇!该机器人提供了油腔滑调的忏悔和道歉,但“更正”的词梯比以往任何时候都更加疯狂。看起来我们正在和鹅妈妈童谣中的矮胖子玩拼字游戏,并且还宣称 “我说 APRCHI 是一个词,他就是一个词!” 然后分散所有的瓷砖。

这并不是一次单独的、独一无二的失败。我用 ChatGPT 解决字梯的所有尝试都偏离了轨道,尽管并不总是以同样的方式。在一个案例中,我要求提供从 REACH 到 GRASP 的阶梯。AI专家提出了这个解决方案:

REACH -> TEACH -> PEACH -> PEACE -> PACES -> PARES -> PARSE -> PARSE -> PARSE -> PARSE -> PARKS -> PARKS -> PARKS -> PARKS -> PARES -> GRASP.

还有这个:

SWORD -> SWARD -> REWARD -> REDRAW -> REDREW -> REDREW -> REDREW -> REDREW -> REDRAW -> REPAID -> REPAIR -> PEACE

现在我们像刚学数数的小孩子一样胡言乱语:“一,二,三,四,三,四,四,四,七,蓝,十!”

到目前为止我展示的所有结果都是用 ChatGPT 3.5 版本记录的。我还尝试了 3 月份推出的新改进版本 4.0。更新后的机器人散发出同样和蔼可亲的自信,但我担心它也有同样的倾向,陷入不经意的语无伦次:

梯子一开始很好,有四个步骤,遵循所有规则。但随后人工智能就会走神。从 PLAGE 到 PAGES 需要四个字母替换。然后是 PASES,它不是一个单词(据我所知),并且无论如何这里都不需要,因为序列可以直接从 PAGES 转到 PARES。更多的愚蠢随之而来。尽管如此,我还是很欣赏关于 PLAGE 的信息说明。

最近我也有机会尝试 Llama 2,一个由 Meta(Facebook 人)出版的 LLM。尽管这个模型是独立于 GPT 开发的,但它似乎有一些相同的心理怪癖,例如制定规则然后无视它们。当我要求一个连接 REACH 和 GRASP 的阶梯时,Llama 2 提出了这样的建议:

REACH -> TEACH -> DEACH -> LEACH -> SPEECH -> SEAT -> FEET -> GRASP

预言和代码猴子

Matt Welsh 提到了构建在大型语言模型之上的计算系统的两种操作模式。到目前为止,我们一直在我所说的预言模式下工作,在这种模式下,你提出一个问题,计算机就会返回一个答案。你提供一对单词,系统会找到一个连接它们的梯子,并执行到达那里所需的任何计算。您交付一个装满财务记录的鞋盒,计算机填写您的 1040 表格。您编译历史气候数据,计算机预测 2050 年的全球平均气温。

人工智能预言机的替代品是人工智能代码猴子。在第二种模式下,机器不会直接回答你的问题或执行你的计算;相反,它会创建一个可以在传统计算机上运行的程序。您从机器人返回的不是字梯,而是生成字梯的程序,用您选择的编程语言编写。您无需填写完整的纳税申报表,而是获得报税软件;气候模型代替了温度预测。

让我们用 ChatGPT 3.5 来尝试一下:

您可以使用 wordLadder 功能来解决字梯谜题。这是一个用法示例:

它的输出为:

请注意,这是一个基本演示,对于更大的字梯或更复杂的场景,可能需要额外的优化或算法,例如广度优先搜索。

同样,粗略地浏览一下输出表明性能是成功的。ChatGPT 的 JavaScript 似乎和英语一样流利。它知道 if、while 和 for 语句的语法,以及所有挑剔的标点符号和括号规则。机器生成的程序似乎将所有这些组件组合在一起以完成指定的任务。还要注意大量的解释性评论,这肯定是为了我们的利益,而不是为了它。同样,描述性变量名称(currentWord、newWord、ladder)。

ChatGPT 还主动包含了在特定示例( MARCH 到 APRIL )上运行程序的说明,并且它打印出了结果,该结果与我们之前的交流中给出的答案相匹配。该输出是通过实际运行程序生成的吗?ChatGPT 并没有明确说明,但它确实声称,如果您按照指示运行该程序,您将得到显示的结果(在所有荒谬的荣耀中)。

我们可以通过将程序加载到 Web 浏览器或其他 JavaScript 执行环境中来测试这一说法。结论是:被抓!程序确实运行了,但没有产生指定的结果。该程序的真实输出是:MARCH -> AARCH -> APRCH -> APRIH -> APRIL。这个序列没有那么奇怪,因为它遵循一次只改变一个字母的规则,并且所有“单词”都恰好有五个字母。另一方面,在英语词典中找不到任何中间“单词”。

有一个简单的算法可以生成序列 MARCH -> AARCH -> APRCH -> APRIH -> APRIL。只需从左到右逐步浏览起始单词,更改每个位置的字母,使其与目标单词中相应的字母匹配即可。遵循此规则,任何一对五个字母的单词都可以在不超过五个步骤内进行阶梯排列。MARCH -> APRIL 只需四步,因为中间的 R 不需要改变。我无法想象有一种更简单的方法来制作单词阶梯——当然,假设你愿意让任何字母的混杂都算作一个单词。

ChatGPT 创建的程序可以使用这个快速而肮脏的例程,但它会做一些更加乏味的事情:它构建所有可能的梯子,其第一个梯级是起始词,并继续扩展这些梯子,直到它偶然发现一个包含 目标词。这是一种浪费惊人的蛮力算法。起始词的每个字母都可以以 25 种方式进行更改。因此,一个 5 个字母的单词有 125 个可能的后继者。当你到达五级梯子时,就有 1.9 亿种可能性。(我在这里提供的示例,例如 MARCH -> APRIL 和 REACH -> GRASP,有一个不变的字母,因此解决方案只需要四个步骤。尝试计算完整的五步解决方案耗尽了我的耐心。)

第 4 代代码猴子

让我们尝试使用 ChatGPT 4 进行相同的代码编写练习。给出相同的提示,新机器人的响应方式如下:

该程序具有相同的整体结构(一个 while 循环,内部有两个嵌套的 for 循环),并且采用相同的算法策略(在一个位置生成与给定单词不同的所有字符串)。但 GPT-4 版本有一个很大的新颖之处:承认单词列表是必不可少的。通过这种改变,我们终于有希望生成一个由真实单词组成的阶梯。

尽管 GPT-4 认识到需要一个列表,但它仅提供一个占位符,即它为上面给出的 REACH -> GRASP 示例配置的 10 个单词序列。这个单词列表的存根没有多大用处,甚至对于重新生成虚假的“REACH-to-GRASP”阶梯也没有什么用处。如果您尝试这样做,程序将报告不存在梯子。这个结果并没有错,因为给定的 10 个单词并不能形成每一步仅更改一个字母的有效路径。

即使列表中的单词经过精心挑选,10 的词汇量也是非常微不足道的。对于语言模型来说,生成更大的单词列表似乎是一项很容易的任务。毕竟,LLM 是在庞大的文本语料库上进行训练的,其中几乎所有英语单词都可能至少出现一次,而常见单词会出现数百万次。机器人不能提取这些单词的代表性样本吗?答案显然是否定的。尽管 GPT 可以说已经“阅读”了所有这些文本,但它并没有以任何易于访问的形式存储这些单词。(人类读者也是如此。你能通过回顾一生的阅读经历,列出你词汇量中最常见的 10 个五字母单词吗?

当我要求 ChatGPT 4 生成一个单词列表时,它抱歉地表示反对:“我很抱歉造成混乱,但作为 OpenAI 开发的人工智能,我无法直接访问单词数据库或获取数据的能力来自外部来源……” 所以我尝试了一些技巧,要求机器人写一个 1000 字的故事,然后按频率对故事的单词进行排序。这个诡计奏效了,但样本太小,没有多大用处。只要坚持下去,我也许可以从 GPT 中哄出一个可以接受的列表,但我却走了一条捷径。毕竟我不是OpenAI开发的AI,我可以访问外部资源。我挪用了 Knuth 为他的单词阶梯实验而整理的 5,757 个五个字母的英语单词列表。有了这个列表,GPT-4 编写的程序就会找到以下九步梯形图:

REACH -> PEACH -> PEACE -> PLACE -> PLANE -> PLANS -> GLANS -> GLASS -> GRASS -> GRASP

这个结果与 Knuth 自己的字梯程序的输出完全匹配,该程序是他 30 年前在斯坦福大学 Graphbase 上发表的。

在这一点上,我必须承认,在一点外部帮助下,ChatGPT 最终完成了我的要求。它编写了一个可以构造有效字梯的程序。但我还是持保留态度。尽管 GPT-4 和 Knuth 编写的程序产生相同的输出,但程序本身并不等效,甚至不相似。

Knuth 从相反的方向处理这个问题,不是从所有可能的五个字母字符串的集合开始(它们的数量还不到 1200 万),而是从他的 5,757 个常见英语单词的小得多的列表开始。然后,他构建一个图(或网络),其中每个单词都是一个节点,当且仅当对应的单词相差一个字母时,两个节点才通过边连接。下图显示了此类图的一个片段。

在图中,字梯是从起始节点到目标节点的一系列边。最佳梯子是最短的路径,遍历最少数量的边。例如,从 leash 到 retch 的最佳路径是 leash -> leach -> reach -> retch,但也有更长的路径,例如 leash -> leach -> beach -> peach -> reach -> retch。为了寻找最短路径,Knuth 采用了 Edsger W. Dijkstra 在 20 世纪 50 年代设计的算法。

Knuth 的单词阶梯程序需要预先投资才能将简单的单词列表转换为图表。另一方面,它避免了浪费地生成数千或数百万个五个字母的字符串,而这些字符串不可能是后者的元素。在解决 REACH -> GRASP 问题的过程中,GPT-4 程序产生了 219,180 个这样的字符串;其中只有 2,792 个(略多于 1%)是真实单词。

如果我所描述的各种单词阶梯程序是学生提交的,那么我会给没有单词列表的版本打不及格的分数。带有列表的 GPT-4 程序会通过,但出于效率和优雅的考虑,我只会给 Knuth 程序打最高分。

为什么聊天机器人偏爱劣质算法?您只需通过谷歌搜索“字梯程序”即可获得线索。几乎所有排名靠前的结果都来自 Leetcode、GeeksForGeeks 和 RosettaCode 等网站。这些网站显然是为了迎合求职者和编程竞赛的竞争对手,其解决方案要求生成每个单词的所有 125 个单字母变体,就像 GPT 程序一样。因为这样的网站数量众多——似乎有数百个——它们比其他来源更重要,例如 Knuth 的书(如果这些文本确实出现在训练集中的话)。这是否意味着我们应该将错误的算法选择归咎于 Leetcode,而不是 GPT?相反,我想指出协议不可避免的弱点,其中最常见的答案默认是正确的答案。

每当我想到大型语言模型正在编写我们所有的软件时,另一个相关的担忧就会困扰着我。新的算法从哪里来?大学语言模型可能会在重新混合现有项目的元素方面发挥创意,但我看不出它有什么方法可以发明全新的、更好的东西。

梯子这个词已经够了!

我承认我已经太过分了,用一个特殊(且无关紧要的)问题的太多变体来折磨 ChatGPT。也许大学语言模型在其他计算任务上表现得更好。我尝试过几种,结果好坏参半。我只想讨论其中之一,我发现 ChatGPT 的努力相当令人心酸。

使用 ChatGPT 3.5,我询问第 100 个斐波那契数的值。请注意,我的问题是在 Oracle 模式下提出的;我要求的是这个数字,而不是一个计算它的程序。尽管如此,ChatGPT 仍自愿编写一个斐波那契程序,然后呈现该程序的输出。

该程序实现的算法在数学上是正确的;它直接来自斐波那契数列的定义,斐波那契数列是从 {0, 1} 开始的序列的成员,每个后续元素都等于前两项之和。给出的答案也是正确的:354224848179261915075 确实是第100个斐波那契数。所以有什么问题?就是中间句:“当你运行这段代码时,它将输出第 100 个斐波那契数。” 这不是真的。如果运行代码,您将得到错误的值 354224848179262000000。最近版本的 JavaScript 提供了 BigInt 数据类型来解决此问题,但必须显式指定 BigInt,而 ChatGPT 程序不会这样做。这种异常现象的原因在JavaScript 使用浮点运算,即使是整数值。根据 IEEE 浮点标准,在不损失精度的情况下可以表示的最大整数是 253−1; 第 100 个斐波那契数大约是 268。这就是我所说的令人心酸的思:ChatGPT 给出了正确的答案,但它声称用来计算该答案的方法无法提供它。机器人一定是通过其他方式找到了正确的值,但具体方式并未透露。

将同样的任务交给 ChatGPT 4.0 会让我们踏上更加陌生的旅程。在接下来的交互中,我激活了 Code Interpreter,这是一个 ChatGPT 插件,允许系统测试和运行它编写的一些代码。显然,机器人利用了这一功能,首先提出了一个因未知原因而失败的程序:

这里 ChatGPT 是用 Python 编写的,Python 是 Code Interpreter 支持的主要编程语言。编写程序的第一次尝试是基于斐波那契矩阵的求幂:

这是一种众所周知且有效的方法,并且程序正确地实现了它。然而,由于神秘的原因,代码解释器无法执行该程序。(该代码在标准 Python 环境中运行良好,并返回正确的答案。)

此时,机器人将转向一个全新的方向并起飞,建议通过称为比奈公式的数学恒等式来计算所需的斐波那契值。它已经写出了数学表达式,但随后又改变了主意。它正确地预见了数值精度的问题:如果给定 5 的平方根的精确值,该公式将产生精确的结果,但这是不可行的。

因此,现在 ChatGPT 采取了另一种策略,采用与 3.5 版本相同的迭代算法。这次我们得到了正确的答案,因为 Python(与 JavaScript 不同)在处理大整数时没有任何问题。

这次的表现给我留下了深刻的印象,不仅仅是正确的答案,还有系统勇敢的坚持。尽管ChatGPT 陷入困境,但它仍然坚持不懈,对意想不到的困难感到困惑,但拒绝放弃。“嗯,那个矩阵法应该有效。但是,无论如何,我们还是试试比奈公式吧……哦,等等,我忘了……不管怎样,没必要对此这么花哨。让我们以显而易见的、缓慢的方式来做吧。” 我觉得这是一种非常人性化的解决问题的方法。在机器中看到这种行为很奇怪。

记录成功和失败的分数

我的小实验让我对人工智能神谕和人工智能代码猴子即将排挤人类程序员的说法表示怀疑。我看到了一些成功,但更多的是失败。这个惨淡的记录是在相对简单的计算任务上编制的,这些任务的解决方案是众所周知的并被广泛发布。

其他人对 LLM 代码生成进行了更广泛和更深入的评估。在本文末尾的参考书目中,我列出了五项此类研究。我想简要总结一下他们报告的一些结果。

两年前,Mark Chen 和 OpenAI 的 50 多名同事投入了大量精力来测量 Codex 的准确性,Codex 是 ChatGPT 3 的一个分支,专门用于编写程序代码。(Codex 自此成为驱动 GitHub Copilot(“程序员的助手”)的引擎。) 创建了一套包含 164 个任务的任务,可以通过编写 Python 程序来完成。这些任务主要是教科书练习、编程竞赛以及有关如何在编码工作面试中取得好成绩的(数量惊人的)文献中的类型。大多数任务只需几行代码即可完成。示例:计算给定单词中的元音数,确定整数是质数还是合数。

陈教授团队还对定义成功和失败的标准进行了一些思考。由于 LLM 过程是不确定的(单词选择基于概率),因此模型可能会在第一次尝试时生成有缺陷的程序,但如果允许继续尝试,最终会得出正确的响应。一个称为温度的参数控制不确定性的程度。在零温度下,模型在每一步总是选择最可能的单词;随着温度升高,随机性被引入,允许选择不太可能的单词。陈等人。通过采用三个成功基准来考虑这种变化的可能性:

pass@1:LLM 在第一次尝试时生成正确的程序

pass@10:生成的 10 个程序中至少有一个是正确的

pass@100:生成的 100 个程序中至少有一个是正确的

Pass@1 测试是在零温度下进行的,因此模型始终会给出最佳猜测结果。pass@10 和 pass@100 试验是在更高的温度下进行的,使系统能够探索更广泛的潜在解决方案。

作者在所有 164 项任务上评估了 Codex 的多个版本。对于最大、功能最强大的 Codex 版本,pass@1 率约为 29%,pass@10 率为 47%,pass@100 达到 72%。看到这些数字,我们应该感到印象深刻还是感到震惊?Codex 在几乎三分之一的时间(当温度设置为零时)第一次尝试就正确,这值得庆祝吗?或者,如果您愿意筛选 100 个提议的计划,寻找一个正确的计划,成功率会攀升至近四分之三?我个人的观点是:如果您将当前这一代 LLM 视为长期研究计划的开创性努力,那么结果是令人鼓舞的。但如果你认为这项技术可以立即替代手工编码的软件,那就没什么希望了。我们还远未达到必要的可靠性水平。

其他研究也得出了大致相似的结果。Fredrico Cassano 等人。评估多个 LLM 以各种编程语言生成代码的表现;他们报告的 pass@1 率范围很广,但只有两个超过 50%。Alessio Buscemi 在 40 项编码任务上测试了 ChatGPT 3.5,要求使用 10 种语言编写的程序,并将每个查询重复 10 次。在 4,000 次试验中,1,833 次产生了可以编译和执行的代码。Liu Zhijie 等人。他们对 ChatGPT 的评估基于 Leetcode 网站上发布的问题。通过将生成的代码提交给自动 Leetcode 评分流程来评判结果。所有问题的平均接受率范围从 C 语言编写的程序的 31% 到 Python 程序的 50%。Liu 等人。另一个有趣的观察是:ChatGPT 在 2021 年 9 月(GPT 训练集的截止日期)之后发布的问题上得分要差得多。他们推测机器人可能会更好地解决早期的问题,因为它在训练期间已经看到了解决方案。

Li Zhong 和 Zilong Wang 最近发表的一篇论文超越了程序正确性的基本问题,考虑了鲁棒性和可靠性。生成的程序能否正确响应格式错误的输入或外部错误,例如尝试打开不存在的文件时?即使 LLM 的提示中包含了一个展示如何正确处理此类问题的示例,Zhong 和 Wang 发现生成的代码在 30% 到 50% 的情况下都无法做到这一点。

除了这些令人沮丧的结果之外,我自己还有更多的疑虑。几乎所有测试都是通过简短的代码片段进行的。一个在编写 10 行程序时遇到困难的LLM 在编写 100 行或 1,000 行程序时可能会遇到更大的困难。此外,简单的通过/失败分级是对代码质量的非常粗略的衡量。考虑一下 Chen 小组基准测试套件中的素性测试。这是 Codex 编写的程序之一:

这段代码被评为正确——它应该是正确的,因为它永远不会将质数错误地分类为合数,反之亦然。然而,当 n 很大时,您可能没有耐心或寿命来等待判决。该算法尝试将 n 除以 2 到 n−1 之间的每个整数。

LLM 不符常规的实用性

对于大型语言模型来说,现在还处于早期阶段。ChatGPT 发布不到一年;底层技术只有大约六年的历史。虽然我非常肯定自己宣称 LLM 还没有准备好征服编码世界,但我不能如此自信地预测他们永远不会。这些模型肯定会改进,我们会更好地使用它们。已经有一个新兴行业提供 “即时工程” 指导,作为充分利用每个查询的方法。

提高 LLM 表现的另一种方法可能是与另一种计算系统形成混合体,该系统配备逻辑和推理工具,而不是纯粹的语言分析工具。Doug Lenat 在他最近去世前夕,提议将 LLM 与 Cyc 结合起来,Cyc 是他花费四十年努力建立的一个巨大的常识数据库。Stephen Wolfram 正在致力于将 ChatGPT 集成到 Wolfram|Alpha 中,Wolfram|Alpha 是一个精选数据和算法的在线集合。

尽管如此,一些阻碍 LLM 课程生成的障碍似乎很难克服。

语言模型通过简单的方式发挥其魔力:在撰写句子或段落的过程中,LLM 根据之前的单词选择下一个单词。这就像在手机上写短信一样:你输入“我会见你……”,软件会建议一些替代的延续:“明天”、“很快”、“稍后”。在 LLM 中,每个候选人都会被分配一个概率,该概率是根据模型训练集中所有文本的分析计算得出的。

一个多世纪前,俄罗斯数学家 A. A. Markov 首次探索了通过这种统计分析生成文本的想法。他的过程现在被称为 n-gram 模型,其中 n 是在选择序列的下一个元素时要考虑的单词(或字符或其他符号)的数量。长期以来,我一直对 n-gram 过程着迷,尽管主要是因为它的喜剧可能性。(在 40 年前发表的一篇文章中,我将其称为“将文学变成胡言乱语的艺术。”)

当然,ChatGPT 和其他最近的 LLM 不仅仅是 n 元模型。他们的神经网络捕获的语言统计特征远远超出了 n 个连续符号的序列。特别重要的是注意力机制,它能够跟踪任意距离处选定符号之间的依赖关系。在自然语言中,这种手段对于维持主语和动词的一致性,或者将代词与其所指对象相关联非常有用。在编程语言中,注意力机制确保了多部分语法结构的完整性,例如 if...then...else,并且它保持括号正确配对和嵌套。

ChatGPT 和其他 LLM 也受益于人类读者监督的强化学习。当读者评价模型输出的质量和准确性时,正面或负面的反馈有助于塑造未来的反应。

然而,即使有了这些改进,LLM 本质上仍然是一种根据现有文本中单词出现的概率构建新文本的工具。以我的思维方式,那不是思考。这是比较肤浅的东西,专注于文字而不是想法。鉴于这种粗糙的机制,我对 LLM 能够取得如此大的成就感到既惊讶又困惑。

几十年来,人工智能的建筑师相信真正的智能(无论是自然的还是人工的)需要一个世界的心理模型。为了理解你周围(和你内心)发生的事情,你需要对事物如何运作、它们如何组合在一起、接下来会发生什么、因果关系有直觉。莱纳特坚持认为,最重要的知识是你在开始读书之前很久就获得的知识。你通过跌倒来了解重力。当你发现一座积木塔很容易被推倒但很难重建时,你就了解了熵。在语言开始扎根之前,你会在婴儿期了解痛苦、恐惧、饥饿和爱。盒子里的大脑无法获得这种体验,因为无法直接进入物理或社会宇宙。

LLM 似乎是对这些想法的反驳。毕竟,它们是语言的模型,而不是世界的模型。他们没有具体化身,没有身体存在可以让他们通过艰苦的学习来学习。他们除了言语之外什么都不懂,怎么听起来那么聪明、那么世俗?

在这一点上人们意见不一。该技术的批评者表示,这都是虚假和幻觉。Emily Bender、Timnit Gebru 和其他人发表的一篇著名(或臭名昭著?)论文将这些模型称为“随机鹦鹉”。批评者说,虽然 LLM 可能会说得清楚、流利,但他不知道自己在说什么。不像孩子,孩子学习单词和事物之间的映射——看!一头牛、一只猫、一辆汽车—— LLM 只能将单词与其他单词联系起来。在训练过程中,它观察到雨伞经常出现在与下雨相同的环境中,但它没有被淋湿的经历。该模型的操作方式类似于数学中的形式主义方法,您可以在页面上随意移动符号,将它们从等式的一侧移动到另一侧,而无需询问这些符号代表什么。套用 Saul Gorn 的话:形式主义者无法理解一个理论,除非它毫无意义。

两百五十年前,瑞士制表师 Pierre Jacquet-Droz 制造了一台可以用羽毛笔书写的机械自动机。这个发条装置有数百个凸轮和齿轮,装扮成一个坐在凳子上的小男孩。激活后,男孩将笔浸入墨水中,写下一条简短的信息——最著名的是笛卡尔警句“我思故我在”。多么滑稽啊!但即使在 18 世纪,也没有人相信涂鸦娃娃真的会思考。LLM 怀疑论者会将 ChatGPT 归入同一类别。

OpenAI 首席科学家 Ilya Sutskever 在与 Nvidia 的 Jensen Huang 的对话中有力地阐述了这一点:

“当我们训练一个大型神经网络来准确预测来自互联网的许多不同文本中的下一个单词时,我们正在做的是我们正在学习一个世界模型......从表面上看,我们只是在学习统计相关性文本,但事实证明,为了学习文本中的统计相关性,并很好地压缩它们,神经网络学习的是生成文本的过程的某种表示。这段文字实际上是对世界的投影。那里有一个世界,它在这段文字上有一个投影。因此,神经网络正在学习越来越多的世界、人、人类条件、他们的希望、梦想和动机、他们的相互作用和我们所处的情境,并且神经网络学习一个压缩的、抽象的 ,可用的表示。”

我要告诉你这些对比鲜明的 LLM 心态理论中哪一个是正确的吗?我不是。这两种选择都不吸引我。如果 Bender 等人是对的,那么我们必须面对这样一个事实:一个没有推理或感觉能力、没有物质宇宙或社会互动经验、没有自我意识的小玩意儿,写大学论文、创作说唱歌曲、 给失恋者提供建议。知识、逻辑、情感都毫无价值;油嘴滑舌就是全部。这是一个颠覆性的主张。如果 ChatGPT 能用这种无意识的表演来愚弄我们,也许我们也是骗子,他们的声音和愤怒毫无意义。

另一方面,如果 Sutskever 是对的,那么我们所珍视的人类经验的大部分内容——随着我们的成长和生活而慢慢演变的人格意识——可以通过互联网阅读这些文字就了解到。如果真是这样,那我其实就不用忍受初中那种难以言表的痛苦了, 我不必犯下所有那些导致如此心痛和困难的愚蠢错误;没有必要因与世界的碰撞而伤害我的自尊。我本可以在舒适的扶手椅上阅读所有这些内容;仅仅言语就能使我达到一种头脑清醒的成熟状态,而不会在塑造灵魂的山谷中经历所有的绊脚石和痛苦。

LLM 的批评者和捍卫者都倾向于关注机器和人类对话伙伴之间的自然语言通信——ChatGPT 的聊天部分。在试图弄清楚神经网络内部发生了什么时,更多地关注 LLM 作为程序员的角色可能会有所帮助,其中对话的双方都是计算机。我可以提供三个论据来支持这一建议。首先,人们太容易被愚弄。我们会体谅、填补空白、默默地纠正错误、提供缺失的上下文,并且通常会竭尽全力去理解某句话的含义,即使它毫无意义。相比之下,计算机是严厉的法官,不能容忍胡说八道。

其次,如果我们正在寻找机器内部心理模型的证据,值得注意的是数字计算机的模型应该比整个宇宙的模型更简单。因为计算机是我们根据自己的规格设计和构建的人工制品,所以关于它的工作原理并没有太多争议。相比之下,宇宙的心智模型则遍布地图上。其中一些是从大爆炸开始,然后是宇宙膨胀;有些是由神灵和恶魔统治的;有些以东方与西方、绝地与西斯、红与蓝、我们与他们之间的史诗般的战斗为特色。我们应该期望在 GPT 的权重矩阵中找到哪些模型?他们可能都在那里,随意地混合在一起。

第三,编程语言具有一种不寻常的语言属性,将它们与计算机内部的操作紧密地联系在一起。英国哲学家 J. L. Austin 提请人们注意一类特殊的词语,他将其称为述行词。这些词语不仅仅是宣告、描述或请求;当他们说出这些话时,他们实际上会做一些事情。奥斯汀的典型例子是“我愿意”这句话,如果在正确的背景下说出这句话,就会改变你的婚姻状况。在自然语言中,表演词非常罕见,但在计算机程序中却很常见。在正确的上下文中编写 x = x + 1 实际上会导致 x 的值递增。当您测试概念模型是否与现实相符时,言语和行动之间的直接联系可能会有所帮助。

关于大型语言模型对计算机科学的地位和影响,我仍然有两种看法(或者可能不止两种!)。人工智能爱好者可能是对的。这些模型可能会接管编程以及许多其他类型的工作和学习。或者它们可能会失败,就像其他有前途的人工智能创新一样。我认为我们不用等太久就能得到答案。