在《福尔摩斯探案集》里面,柯南道尔用一篇非常经典的“study”——《血字的研究》(A study in Scarlet),宣告了传奇侦探的出场。今天推荐的论文 A Study on Robustness and Reliability of Large Language Model Code Generation 则是对最近几年来比气温还热的大语言模型(LLM)的研究,来自 UCSD 的研究人员系统性评估了大语言模型生成的代码的健壮性(robustness)和可靠性(reliability),结果如何呢?请看今天阅读推荐的细节。
先插播一则新闻:
Meta 发布了它的代码生成 AI 模型 Code Llama。类似 GitHub Copilot 和 Amazon CodeWhisperer,以及 StarCoder、StableCode 和 PolyCoder 等开源 AI 代码生成模型,Code Llama 支持为 Pytho、C++、Java、 PHP、Typescript (Javascript)、C# 和 Bash 等编程语言补完代码和调试。Code Llama 是 Llama 2 的编程专用版本,有 7B、13B 和 34B 参数三个版本,使用 500B tokens 的代码和代码相关数据进行训练。其中 7B 参数的版本可以单张 GPU 上运行,7B 和 13B 参数版本更适合实时代码补完之类的任务,而 34B 参数版本更适合作为编程助手使用。Code Llama 采用和 Llama 2 相同的许可证,可作为研究和商业使用。
https://about.fb.com/news/2023/08/code-llama-ai-for-coding/
不知道从什么时候开始,大语言模型在舆论上展现出来都是“史诗级”的表现——什么非凡的自然语言理解和代码生成能力,取代人类码农不在话下。甚至连知名的问答网站 StackOverflow 都要被 GPT 搞得倒闭掉了。但是这个繁荣的背后,可能又一次表现出了我们人类群体中的大部分个体在语文上的弱势(话说高考什么时候语文增加到600分?)。尽管如此,人类语言这种具有巨大包容性的表现形式,能够催生出“看上去很美,实际上很糟”的文本的概率,远大于计算机语言。而本文的研究进一步指出,大语言模型生成的计算机代码,用来欺骗人类可能还行,但是在实际的使用中出错的概率很大。
本文作者针对开发者使用程序语言的标准 API 的情况(嗯,我们初学 C 语言的时候也会去翻手册看看fopen
是怎么调用的)进行了调查,特别针对那些通过询问大语言模型来生成代码的“新一代”开发者,看看到底这些 LLM generated code 里面的 API 调用有多正确。作者首先基于2018年 ICSE 论文 Are code examples on an online q&a forum reliable? a study of api misuse on stack overfl ow 中提出的一个测试集ExampleCheck
进行了升级,建立了自己的RobustAPI
数据集,里面包含了23个 JAVA API 以及和涉及这些 API 相关的1208个开发相关问题(从 StackOverflow 上收集)。特别注意这1208个问题的某些答案都包含了 API misuse 的情况(嗯,给 LLM 挖坑)。
接下来,作者为每个 API 及相关编程任务设计了一套标准化的 prompt 模板,生成特定的 prompt 并把它丢给不同的大语言模型,让它们回答。
由于RobustAPI
数据集是自己精心设计的,所以作者可以方便地判定一个代码用例是否存在对特定 API 的误用(在论文的附录中有详细的40条规则,解释了如何判定误用)。而作者设计的 API checker 按照下图的流程来测试 AI 生成代码的可靠性和健壮性。
作者针对 GPT-3.5、GPT-4、Llama-2 和 Vicuna-1.5 这四个能够辅助代码开发的大语言模型进行了测试,在对它们提问时,还有三个不同的测试级别:
结果如何呢?下图展示了整体的测试结果:
在 zero-shot 测试(不给 LLM 特别的例子进行提示)中,Llama-2 表现特别糟糕,很多时候生成的代码都没法运行,Vicuna-1.5 稍微好点,而两代 GPT 虽然有较高的 API 误用,但是代码能执行的概率还是很高的;
在 one-shot 测试(给一个实际的代码范例作为提示)中,所有的四家 LLM 都能以较高的成功率生成出来可以运行的代码,但是 API 误用的比例并没有什么改善;
在 one-shot relevant 测试(给一个实际的代码范例作为提示,且这个范例和问题是相关的)中,除了 Llama-2 以外,其他三个 LLM 的 API 误用的比例下降了,但是 Vicuna-1.5 产生不能运行的代码的比例反而又升高了……
针对不同的 API,各家模型的表现也不尽相同:
总结一下,所有的大语言模型里面,GPT-4 在生成代码方面表现最好的(生成代码可运行的比例是最高的),但是大家都非常“擅长”生产出 API misuse,这一点可能和一个编程初学者类似?而且下面的例子展示出 LLM 的进化能力:
总之,研究人员试图去指出 LLM 的不足之处,但是编辑部觉得,这篇论文展示出了一个当前 LLM 的水平线,如果你现在的编程开发水平还达不到这个水准,考虑到 LLM 那种007的工作效率,那可能转行去(开滴滴、送外卖好像也要被取代了)搞安全研究是不是更好一些?
论文:https://arxiv.org/pdf/2308.10335.pdf