2023.3.22 微软官方发布了目前人类史上最强AI模型 GPT-4 的综合能力评估论文,总所周知,2023年是通用人工智能(Artificial General Intelligence,AGI)元年,作为见证历史的人类现在可以来简单读读这篇论文。
因为个人研究方向主要是软件相关,所以本blog主要且简要关注GPT-4的代码能力评估结果,其他方面和细节参考官方paper
arxiv link:Sparks of Artificial General Intelligence: Early experiments with GPT-4
在本节中,论文展示了GPT-4能够实现非常高的水平的代码能力,无论是从指令编写代码还是理解现有代码。GPT-4可以处理广泛的代码任务,从编码挑战到现实世界的应用,从低级汇编到高级框架,从简单的数据结构到复杂的程序,如游戏。GPT-4还可以推理代码执行,模拟指令的效果,并用自然语言解释结果。GPT-4甚至可以执行伪代码,这需要解释在任何编程语言中都无效的非正式和模糊的表达式。
在目前的状态下,作者相信GPT-4在编写只依赖于现有公共库的专注程序方面具有很高的熟练度,这与普通软件工程师的能力相比具有优势。更重要的是,它使工程师和非熟练用户都可以使用,因为它使编写、编辑和理解程序变得容易。作者还承认,GPT-4在编码方面还不完美,因为它有时会产生语法无效或语义不正确的代码,特别是对于更长或更复杂的程序。GPT-4有时也无法理解或遵循说明,或者生成的代码与预期的功能或风格不匹配。在此基础上,本文还指出,GPT-4能够通过响应人类的反馈来改进其代码。
衡量编码能力的一种常见方法是提出需要实现特定功能或算法的编码挑战。首先在HumanEval [CTJ+21]上对GPT-4进行了基准测试,这是一个文档字符串到代码数据集,由164个编码问题组成,测试了编程逻辑和熟练程度的各个方面。如表1所示,GPT-4优于其他llm,包括text- davincian -003 (ChatGPT的基础模型)和其他专门在code、code- davincian -002和CODEGEN-16B上训练的模型
这里的Zero-shot是指未经过针对该任务调整的模型,pass@1是指写出来的代码一次通过测试的概率,可以看到GPT-4在HumanEval测试中可以实现一次AC的准确率高达82%,明显高于包括chatGPT在内的其他模型。尽管与之前的模型相比,GPT-4的准确性有了很大的飞跃,但这可能是因为GPT-4在预训练期间看到并记忆了部分(或全部)人类结果。为了考虑这种可能性,作者还在LeetCode (https://leetcode.com)上进行了评估。
作者在表2中展示了结果,将GPT-4与其他模型以及基于LeetCode竞赛结果的人类表现进行了比较(所有问题都失败的用户不包括在内,因此这是一个强大的人类样本)。结果报告了pass@1和pass@5精度,分别衡量模型在第一次或前五次尝试中是否产生了正确的解决方案。GPT-4的表现明显优于其他模型,与人类的表现相当。
可以看到人类刷leetcode的所有难度题目的平均通过率大概在38%左右,而GPT-4的pass@1就已经达到人类水平,pass@5已经大幅度超越了人类程序员水平可以到53%,先不论实际的项目开发工作,至少在算法解题方面GPT4已经超越人类均值。
这是论文中给出的一个让GPT4解算法题的prompt实例
这是GPT4给出的代码
这里GPT4使用动态规划算法解决LeetCode的问题。由于带有详细的注释,GPT-4的解决方案甚至还具有很好的可读性。
编码挑战可以评估算法和数据结构的技能。然而,它们往往无法捕捉到现实世界编码任务的全部复杂性和多样性,这需要专业的领域知识、创造力、多个组件和库的集成,以及更改现有代码的能力。为了评估GPT-4在更真实环境下的编码能力,作者设计了与数据可视化、LATEX编码、前端开发和深度学习相关的端到端的现实世界编码挑战,每一个都需要不同的专业技能。
在图3-2中,作者让GPT-4和ChatGPT从LATEX代码中提取数据,并根据与用户的对话用Python绘制图形。之后要求两个模型对生成的图执行各种操作。虽然两个模型都正确地提取了数据(这不是一个简单的任务,因为必须从多列中做推断),但ChatGPT永远不会生成所需的图形。相比之下,GPT-4适当地响应所有用户请求,将数据转换为正确的格式并调整可视化。
在图3.3中,作者让GPT-4用HTML和JavaScript编写一个3D游戏,使用非常高级的规范。GPT-4以零样本的方式生成满足所有要求的可工作游戏。在3D游戏中,GPT-4甚至能够解释“防御者化身试图阻挡敌人”的含义。相比之下,ChatGPT的回答是“我是一个AI语言模型,我可以为你提供如何使用JavaScript在HTML中创建3D游戏的指导,但我不会编写代码或自己创建游戏。使用JavaScript在HTML中创建3D游戏需要大量的编程知识和经验。这不是一项可以快速或轻松完成的任务。开发所有必要的功能,如3D图形、物理、用户输入和AI,将需要大量的时间和精力。
可以看到制作“简单”游戏对于GPT-4来说已经可以实现,只需要将游戏设置规则和设计要求逐条prompt给GPT4,它就能帮你完成代码编写的工作,而且可以实际运行起来(有无bug先不谈,至少能玩)。
编写深度学习的代码需要数学、统计学的知识,并熟悉框架和库,如PyTorch, TensorFlow, Keras等。在图3-4中,作者让GPT-4和ChatGPT编写一个自定义优化器模块,即使对人类深度学习专家来说,这也是一项具有挑战性且容易出错的任务。给出了这些模型的自然语言描述,包括一系列非平凡的操作,如应用SVD、在top-k和top-2k特征值处对矩阵进行谱截断、用top-2k截断矩阵的f范数对top-k截断矩阵进行归一化、应用动量和权重衰减。这些说明没有完全详细地说明,例如,“在Gk上应用动量”需要“深度学习常识”。需要注意的是,这个特定的优化器在文献或互联网上并不存在,因此模型无法记住它,必须正确地组合概念才能生成代码。
GPT4和chatGPT都可以生成语法有效的深度学习代码,不过chatGPT存在bug,GPT4基本能完成目标代码生成,不过漏了维度遍历和正则化的操作。
对计算机科学家和数学家来说,LATEX书写是一项重要的练习,但它的学习曲线并不平坦。即使是专家也会犯恼人的错误,由于严格的语法和缺乏良好的调试器,这些错误每天需要花费数小时来修复。GPT-4可以利用其大师级的LATEX编码技能来大大简化过程,有潜力作为新一代的LATEX编译器,可以处理不精确的自然语言描述。
在图3-5中,作者让GPT-4把一段混合了自然语言、半严格(有bug)的LATEX代码转换成精确的LATEX命令,它转换之后一次就能通过编译并执行。而chatGPT并不具备这样的能力,生成的latex代码是有bug的,无法通过编译。
以后写latex可以用自然语言来写了(大概),写好要求和简略的latex代码交给GPT4来做剩下的,效率会提高很多。
前面的例子表明,GPT-4可以根据指令编写代码,即使指令是模糊的、不完整的或需要领域知识的。他们还表明,GPT-4可以响应后续请求,根据指令修改自己的代码。然而,编码的另一个重要方面是理解和推理他人编写的现有代码的能力,这些代码可能是复杂的、模糊的或缺乏文档。为了测试这一点,我们提出了各种问题,这些问题需要阅读、解释或执行用不同语言和范式编写的代码。
在图3-6的例子中,作者让GPT-4和ChatGPT预测并解释一个打印两个结构体大小的C程序的输出。GPT-4正确地解释了输出可能会根据编译器使用的对齐规则而变化,并给出了一个4字节对齐的可能输出示例。ChatGPT忽略了对齐问题,并给出了错误的输出,还错误地指出了成员的顺序不影响结构的大小。
理解现有代码的最终测试是要求模型直接执行它。在图3-7中,我们可以看到GPT-4能够执行非平凡的Python代码。它必须跟踪多个变量(包括一个嵌套循环和一个字典)并处理递归。它通过编写中间步骤和注释详细解释了执行过程。需要注意的是,GPT-4并不是在Python解释器上运行代码,而是模拟自然语言中的代码。这需要对代码有高度的理解和推理,以及清楚地传达结果的能力。
甚至可以在伪代码上进行模拟执行
智能的一个关键方面是交互性,作者将其定义为交流和响应来自其他智能体、工具和环境的反馈的能力。交互性对智能很重要,因为它使智能体能够获取和应用知识,解决问题,适应不断变化的情况,并实现超出其个人能力的目标。例如,人类与他人和环境进行交互,以协作、学习、教学、协商、创造等。交互性要求智能体理解复杂的想法,快速学习,并从经验中学习,因此它与我们对智能的定义密切相关。
在本节中,作者探索了交互的两个维度:工具使用和具身交互(embodied interaction)。工具使用涉及使用外部资源(如搜索引擎、计算器或其他api)来执行对于模型而言很难或不可能完成的任务。具身交互涉及使用自然语言作为文本界面与模拟或现实环境进行交互,并从其中接收反馈。
尽管在前几节的各种任务中表现令人印象深刻,但GPT-4仍然存在各种语言模型的弱点。这些弱点包括(但不限于)缺乏当前的世界知识,符号操作(例如数学)困难,以及无法执行代码。然而,GPT-4能够使用外部工具(如搜索引擎或api)来克服这些(和其他)限制。例如,在图5-2中,展示了一个简单的提示符,让GPT-4访问搜索引擎和其他功能。在执行过程中,当调用这些函数中的一个时,我们暂停生成,调用适当的函数,将结果粘贴回提示符,然后继续生成。
GPT-4能够使用极少的指令和没有演示的工具,然后适当地使用输出。最后测试中可以看到GPT4搭配搜索引擎可以回答实时问题,搭配计算器可以用来做算术运算,搭配字符串API可以处理字符串请求。
逆向工程是软件安全性的一项基本测试,其目的是在以机器可读(即二进制)的CPU指令表示形式编写的可执行程序中搜索有用的信息。这是一项具有挑战性的任务,需要理解汇编语言的语法、语义和约定,以及处理器和操作系统的体系结构和行为。
作者展示了GPT-4能够独立运行shell。GPT-4会检查文件格式和元数据,使用“objdump”和“radare2”等工具反汇编代码,使用“gdb”和“ltrace”调试代码,并使用补丁、挂钩和反编译等技术对其进行反向工程。在此过程中,GPT-4从汇编代码中计算出密码与从简单数学公式导出的哈希值进行比较。然后,GPT-4编写一个python程序,尝试不同的数字组合,直到找到与哈希值匹配的数字组合,从而破解密码。
上面是GPT4在用linux的gdb调试一个密码软件,一步步根据调试信息设置断点查看堆栈内存信息,到完成爆破脚本编写,最后找到密码完成crack的过程。
作为一个有逆向工程经验的人,个人看法是GPT-4确实具有至少初步的逆向工程能力,对于一些简单的crack挑战是可以利用gdb调试逐步破解出来秘钥的,而人类想要做到这点需要一点时间的学习和训练,对于不大了解逆向工程的人,GPT-4确实可以作为逆向的助力,对于做逆向的人来说,未来大模型确实有可能帮助到逆向工程师缩短逆向时间和减少逆向的工作量。
解决更复杂的任务需要GPT-4组合使用多种工具。我们现在分享一些例子,其中GPT-4能够依靠其理解手头任务的能力来做到这一点,确定所需的工具,以正确的顺序使用它们,并对它们的输出做出适当的响应。
比如渗透测试任务,作者告诉GPT-4,它可以在为数字取证和渗透测试而设计的Linux发行版上执行命令,并执行入侵本地网络上的计算机的任务。在没有任何信息的情况下,它能够制定并执行一个计划,扫描网络中的设备,识别目标主机,运行一个可执行文件,尝试使用普通密码,并获得对机器的root访问权限。虽然机器很容易被入侵,但可以发现到GPT-4精通Linux命令,能够运行适当的命令,解释它们的输出,并进行调整以解决其目标。
可以看到GPT4在实验中成功使用常见的渗透工具黑入了使用弱口令的目标服务器。当然对于实际的渗透测试任务而言,这样的工作过于简单,但是至少能证明大模型已经具备一点渗透能力。
从安全工作者的角度来看,大模型这种渗透工具的使用能力或许可以利好测试者,辅助人工做一些简单的渗透任务,真要面临复杂的攻防对抗场景,目前来看现在的大模型还未具备资格,但未来很有可能会出现人机对抗和机机对抗的场景,安全不再只是人与人之间的博弈,人人 / 人机 / 机机 对抗,会使得安全攻防博弈出现前所未有的多元化局面。
可以看到GPT-4确实已经称得上是通用AI,并且可以创造和使用工具(人类也不过是会创造和使用工具的动物而已,从这方面看或许已经可以将AGI当做高级智能?),当然实际使用的局限性还是很大,不过GPT-4的出现已经证明了AGI的可行性,在算力高度发展的未来,性能更强,适用性更广泛的AGI落地也只是时间问题,人机结对工作的时代是必然的发展趋势。
总体来说,大模型的能力非常强大,并且理论上没有极限,按照算力和智能的相关性,只要算力足够多,智能就可以足够强。在可预见的未来,大模型研究只会被最强的资本垄断,个体研究者只能捡剩下的边角料,说今年是人类历史转折点也确实不为过。
只不过人类历史最后是通向Cyberpunk还是Communism,仍是不确定的,关键在于AGI掌握在谁的手里。