导语

最近调研到一篇NL2Code范畴比较全面的综述文章,是上个月挂到Arxiv的,总结了许多最新的内容,这篇论文触及的方面还算是比较广,但是文章稍有冗余,给人感觉像是在凑字数撑篇幅,许多要害的当地又是浅尝辄止。不过,全体而言,仍是能够拓宽视野的综述文章。

  • 会议:Arxiv
  • 链接:arxiv.org/abs/2212.09…
  • 项目网站:nl2code.github.io

1 简介

自然言语到代码(NL2Code)使命的提出是为了点评人工智能编程的才能,其目的是生成针对给定自然言语的代码。在实际编程中,怎么用NL2Code的NL描绘自己的需求并不是唯一的,它或许是极其多样的。例如,关于一个需求,NL能够用不同的言语(英语、中文等);不同的办法(代码注释、编程比赛问题等);不同的粒度来描绘(即用户能够根据其背景常识、功用、算法进程等来描绘需求)。此外,NL需求需求一些编程束缚,例如编程言语、代码库、时空杂乱性等。如上所示,NL2Code使命自身就具有高度的通用性、多样性和杂乱性,本文在2022年底对NL2Code的开展进行了查询。

本文首先为NL2Code使命总结了一个全体结构,然后将现有的论文合并到结构中。NL2Code使命最初是在软件工程(software engineering,SE)和编程言语(programming language,PL)范畴提出的。最近,神经网络(NN)凭借其令人形象深刻的代码生成才能在NL2Code中赢得了广泛的关注。本文首要研讨NN怎么求解NL2Code。本文发现这些根据神经网络的办法一般根据SE和PL范畴的见地运用神经网络进行建模。本文从穿插范畴的视点对这些办法进行了深化的查询。除了办法,NL2Code还涵盖了许多模型、产品、数据集和方针。本文也分别查询了它们并总结了NL2Code的结构,如图1所示。该结构能够覆盖一切NL2Code论文,便于研讨者快速把握一篇新的NL2Code论文并定位其创新思维。根据此结构,本文对现有的NL2Code论文进行了解析。此外,本文还建立了一个在线网站来展现剖析成果,进一步方便研讨人员。

论文笔记:When Neural Model Meets NL2Code: A Survey

本文贡献如下:

  • 本文首次在使命输入和输出(I/O)、办法、数据集、点评方针、模型和产品方面为NL2Code供给了一个全面的结构。
  • 根据该结构,本文对很多NL2Code论文进行了深化查询,并开发了一个在线网站来展现查询成果,以便随时了解NL2Code的最新进展。
  • 根据结构和查询成果,本文列出了现有的应战,以及NL2Code未来的研讨方向。

2 结构

结构如图1所示,本文首先介绍了NL2Code(3,即第三章,下同),这是软件工程(SE)和编程言语(PL)中长时间具有应战性的使命。在这项使命下,发生了许多办法。本文特别关注这些根据神经网络(NN)的办法(4),这些办法一般用作NL2Code使命的首要办法。因而,该结构结合了来自SE和PL的见地来研讨根据NN的办法。除了办法,本文还包含NL2Code的模型(5)、产品(6)、数据集(7)以及点评方针(8)。图1描绘了上述每个模块之间的相关性,而图2为每个模块供给了更详细的信息。

论文笔记:When Neural Model Meets NL2Code: A Survey

3 何为NL2Code?

给定一种描绘用户需求的自然言语(NL), NL2Code的方针是生成处理需求的代码。在本文中,咱们重点研讨了神经网络(NN)办法来面临NL2Code。因而,这个使命能够办法化为:Code=M(NL)Code = \textbf{M} (NL),其间M\textbf{M} 表明NN模型。在NL2Code界说之上,如图2的上半部分所示,有两个要害点需求清晰:

  1. 用户怎么运用NL描绘他们的需求?
  2. 用户对代码的编程束缚包含什么?

关于第一个问题,咱们提出了几个维度来衡量怎么描绘需求。具体而言,这些维度包含NL运用的自然言语(如英语、中文)、描绘格式(如代码注释、比赛问题)和描绘粒度(如功用、算法进程)。此外,NL2Code使命的输入,除了需求的描绘之外,有时还有额定的信息,例如代码上下文、类、文件和存储库。这也模拟了人类在编程时也或许引用这些附加信息。

关于第二个问题,即Code的编程束缚,作为一个特定的用户需求,也能够包含许多维度。具体来说,咱们能够运用不同的编程言语(如Python、Java)和代码库(如pandas、NumPy)来实现面向不同范畴(如通用、数据科学)的不同等级的代码(如行、函数)。

4 办法

4.1 现存办法的概述

在NL2Code研讨之初,出现了很多根据强规矩或专家系统的办法。例如,范畴特定言语(DSL)引导办法要求专家灌注深化的范畴常识,如抽象语法树或语法规矩,以发生咱们想要的结构化代码,这极大地限制了他们的灵活性。此外,根据概率语法的办法能够生成高质量的程序。但是,这种办法严峻依靠于预界说的规矩,因而它们的可伸缩性也较差。

除了上述根据规矩的办法外,还有其他运用静态言语模型的办法,如n-gram和Hidden Markov。尽管它们不需求范畴常识和杂乱的规矩,但它们不能建模长时间依靠联系,并且它们的向量表明是稀少的。

与上述静态言语模型需求显式核算每个token的概率不同,根据神经网络(NN)的办法首先将每个token编码为中心向量,然后解码。整个进程是端到端的学习,不依靠于任何特征工程。跟着练习语料库核算才能和规划的添加,神经网络的参数越来越多,这使得其代码生成才能日益强壮。

4.2 根据神经网络的办法

与其他类型的办法比较,神经网络(NN)在NL2Code使命中表现出惊人的才能,并且能够在实践中部署以进步编码功率。

论文笔记:When Neural Model Meets NL2Code: A Survey

4.2.1 NN的视角

自然言语处理(NLP)范畴提出了许多运用NN的办法,被广泛应用于各种其他范畴,如NL2Code。本文总结了几种常见的神经网络视角,并确保这些视角能够覆盖一切的神经网络办法。更多的细节能够在图2的左下角找到。从这些视点动身,根据作者剖析了2016年至2022年在尖端会议上运用相关办法、技术的NL2Code出版物数量的趋势,作者提出了一些见地:

  • 神经网络体系结构。这种视角将NL2Code办法分为以下几个方面:CNN,RNN ,LSTM,GAN,Transformer等等。如图3 (a)所示,Transformer在提出后迅速应用于NL2Code,并且呈指数级增加。而CNN和RNN/LSTM均有下降趋势。这表明Transformer在建模代码方面优于其他架构。
  • 模型学习办法。NL2Code的学习办法分为有监督学习,无监督学习,强化学习(RL),多使命学习(MTL),对比学习(CL) ,根据检索的学习等。如图3的(b)和(c)所示,与有监督学习比较,无监督学习在处理NL2Code问题上的增加趋势。与此一起,越来越多的尽力会集在利用人类反应(如RL)、额定的常识和额定的使命(如MTL、CL、根据检索的学习)等来进步生成代码的可靠性。
  • 模型范式。它们包含非预练习,预练习-微调,Zero-shot学习,Few-shot学习,Prompt tuning,In-Context learning等。如图3 (d)所示,跟着神经网络言语模型变得越来越强壮,Zero-shot,Few-shot、In-Context learning遭到越来越多的关注。此外,它们正逐步超越预练习-微调,成为主导范式。
  • 社会偏见、模型紧缩和模型可解说性。研讨者们对NL2Code的方针是逐步将其应用于实际场景,而不只仅是玩具场景。

4.2.2 SE&PL视角

NN办法根据SE和PL的见地求解NL2Code。本文也从SE和PL的视点考察了NL2Code办法。

软件工程(SE)是一门运用工程实践研讨软件开发和保护的学科。所以它首要包含以下几个维度:软件开发、软件保护、集成开发环境(IDE)。NL2Code的方针是经过规划更好的IDE来进步软件开发和保护的功率。

编程言语(PL)是一种用于界说核算机程序的办法言语。此外,NL2Code让NN办法学习怎么运用PL来构建用户想要的软件。因而,就像人类相同,NN办法需求学习PL所触及的内容,如果他们期望正确编程。因而,本文将PL划分为PL特性、PL资源和代码托管渠道等多个维度。

  • 神经网络办法能够运用PL特征进行学习,例如可履行、动态/静态、进程/对象/面向方面。但跟着模型参数数量呈指数级添加,模型对这些精心规划的特征的依靠程度逐步下降,如图3 (e)所示。这或许是因为模型能够从很多的代码文件中学习PL特征。
  • 练习NL2Code模型需求一个大规划的语料库。语料库能够是代码文件、测验用例、NL-代码对、存储库、API文档,乃至抽象语法树(AST)、数据流(DF)或控制流(CF)。如图3的(f)和(g)所示,近年来,代码文件作为PL的重要资源,越来越多地用于以无监督的办法练习模型。此外,因为无监督办法不需求手动符号NL-代码对,这些对显示出下降趋势。最近提出的办法利用了额定的资源来进步代码质量。例如,Li等人运用测验用例来发生更好的代码;Shrivastava等人利用存储库信息来进步API的准确性;Zhou等人运用API文档生成私有API;Paik等人利用AST、DF、CF来建模更稳健的向量。
  • 很多的代码语料库存在于各种渠道上,GitHub作为最大的代码托管渠道,为练习神经网络模型贡献了很多的代码语料库。此外,图3的(h)中观察到,StackOverFlow中的问答帖子正在逐步被挖掘出来以练习神经网络模型。此外,编程比赛网站(如CodeForces和LeetCode)上的语料库被用于练习模型,期望它们能够自动生成任何编程问题的处理方案。

5 预练习模型

表1比较全面的总结了近几年的一些NL2Code模型。

论文笔记:When Neural Model Meets NL2Code: A Survey

NLP中生成模型由两种首要的神经网络架构组成:Encoder-decoder结构,如T5,BART和Decoder-only,如GPT。这些体系结构应用于NL2Code后的工作有PyMT5、CodeT5、PLBART、GPT-C、CodeGPT和ERNIE-Code。因为上述模型相对较小(百万级参数),它们在生成代码方面没有表现出强壮的才能。

Codex是一个具有十亿级参数的大型言语模型,经过在大规划和高质量的代码语料库上进行练习,它显示出惊人的功能。不幸的是,Codex仅经过OpenAI的API供给拜访,而不发布其数据、代码和模型。DeepMind也很快提出了AlphaCode,它的功能与Codex适当,但同样不可用。

后续的许多工作如CodeClippy, CodeParrot和PolyCode都致力于练习一个揭露可用的模型。尽管这些模型是完全可用的,乃至包含它们的练习数据,但它们的功能仍然不如Codex和AlphaCode。随后,CodeGen、PyCodeGPT、PanGuCoder、CodeRL等模型的表现令人形象深刻,但他们只发布他们的模型,而不揭露他们的练习数据。以上是NL2Code预练习模型的路线图。

此外,研讨者还提出了一些模型来处理NL2Code中的更多场景。例如,CodeGeeX经过练习,能够支撑多种自然言语和编程言语;InCoder和FIM不只支撑从左到右的代码预测,并且还支撑填充代码的恣意区域。

6 产品

预练习模型作为底层技术,被包装到产品中,进步用户的编程功率。2021年,GitHub和OpenAI联合推出了Copilot ,这是一种编程辅助工具,运用Codex实时供给主张,方便代码补全。它支撑多种编程言语和集成开发环境(ide)。它能够协助程序员运用一种新的编程言语,乃至处理bug。表2列出了现在流行的产品。大多数商业产品逐一支撑更多的编程言语和ide,这反映了商业比赛仍然激烈的实际。这些产品一般是由大公司推出的,这意味着人工智能驱动的编程产品在核算才能、核心技术等方面具有极高的门槛。

论文笔记:When Neural Model Meets NL2Code: A Survey

最近的研讨对这些产品的实用性进行了深化查询,研讨发现这些产品也有一系列缺点,即使它们能够推荐用户无法编写的代码。例如,产品生成的一大块代码或许包含一些小错误,这使得用户很难发现。这或许会导致调试代码比从头编程花费更多的时间。因而,在运用这些产品时,应该完全查询其长处和缺点。产品开发人员不只要进步模型的功能和速度,还要考虑怎么规划出好的产品,比如怎么利用用户反应进行继续学习。

7 数据集

一些数据集供给了练习集和测验集,其间模型需求在练习集上学习,然后在测验集上验证。跟着模型的强壮,它能够在不需求任何额定练习集的情况下很好地工作。因而,许多后续数据集只供给了测验集而没有练习集。

前期提出的数据集,如Django、CoNaLa、CONCODE和CodeSearchNet,往往是经过BLEU和准确性等硬性方针来点评的,而不是经过在测验用例上履行。这是因为前期的模型不能生成经过任何测验用例的代码,所以它们必须用前者进行点评。比较之下,最近的数据集,如HumanEval、MBPP、APPS、P3、CodeContests和DS-1000,其间一般每个编程问题都装备了多个测验用例。与没有测验用例的数据集比较,这些装备了测验用例的数据集一般包含相对较少的实例,因为为编程问题编写测验用例极具应战性。

论文笔记:When Neural Model Meets NL2Code: A Survey

大多数现有数据集的自然言语是英语,编程言语是Python。为了测验模型面向多言语的代码生成才能,MCoNaLa将CoNaLa的英语扩展为西班牙语、日语和俄语等多种自然言语;MBXP扩展了MBPP,在多种编程言语中运用,如Java、JavaScript、TypeScript、c++和c#;HumanEval也已经从python版本扩展到多种编程言语的HumanEval-X和MultiPL-E。

这些数据集的另一个趋势是,它们越来越与实际场景相关,而不只仅是玩具场景。HumanEval和MBPP是人工标注的,并确保在练习期间不被看到。这样的设置契合实际情况。此外,还提出了APPS和CodeContests来点评实际的编程比赛场景。随后,面向范畴的数据集,如用于数据科学的DS-1000和用于数学的GSM8K-Python和MathQA-Python被提出。此外,还提出了PandasEval和NumpyEval来点评面向库的代码生成,因为咱们在实践中不只运用内置库来编码,并且常常运用第三方库。除了上面说到的内置库和公共库,咱们在日常编程中也会遇到私人库。因而Zan等人提出了三个名为TorchDataEval、MonkeyEval和BeatNumEval的私有库数据集。

上述一切数据集都将每个编程问题一次性输入到模型中,而MTPB则探索了是否能够将编程问题分解为多个子问题顺次向模型反应。这也被称为多回合程序组成。尽管大多数数据集专心于点评生成代码的准确性,但它们的安全性在实际编程中同样至关重要。为此SecurityEval数据集被提出用于点评代码的安全性。

8 点评方针

8.1 人工点评

如题,在小规划数据集上还行,但无法适用于大规划数据集,费时吃力。

8.2 机器翻译范畴的点评方针

因为该使命广泛意义上仍是Seq2seq使命,因而能够选用机器翻译范畴的一些方针,如:

  • BLEU
  • ROUGE
  • METEOR
  • chrF
  • Exact match (EM)

8.3 面向Code使命的修正方针

Tran等人提出了一种新的衡量规范RUBY,它考虑了程序依靠联系图和抽象语法树。此外,Ren等人还提出了一种名为CodeBLEU的复合方针,该方针不只最大极限地发挥了BLEU的优势,并且还经过AST和数据流考虑了代码语法和语义。

8.4 根据履行成果的方针

关于一种需求,存在各种处理方案。在这种情况下,机器翻译方针及其修正后的版本无法正确地点评生成的代码。许多根据履行的衡量,如pass@k, n@k等被提出。界说如下:

  • Pass@k由CodeX提出。关于每个测验实例,对n个生成的候选程序进行抽样,然后随机挑选其间的k个。如果k个中的任何一个经过了给定的测验用例,则该实例能够被视为已处理。pass@k是数据会集已处理实例的比例。
  • n@k类似于pass@k。它经过特定的策略从n个程序中挑选k个,而不是随机的。
  • Test case average由Hendrycks等人提出,它核算经过测验用例的平均百分比。

9 在线网站

发布和保护一个在线网站用于更新NL2Code资源,网址为:nl2code.github.io

10 应战和机会

总结以上内容,作者提出了若干后续面临的应战和急需处理的问题:

  1. 用户应该以何种办法提出需求;
  2. 怎么让模型更像人类相同学习;
  3. 怎么编辑大型言语模型内部的常识;
  4. 怎么使模型知道它能够正确回答哪些编程问题?哪些不能?
  5. 怎么解说生成的代码;
  6. 言语模型怎么与NL2Code中的常识图相结合?
  7. 模型怎么推广到其他编程言语?
  8. 怎么加速练习和推理速度?
  9. 将代码建模为纯文本是否合理?
  10. 怎么更好地点评生成的代码?
  11. 模型怎么处理长代码?
  12. Code LLM能够处理哪些场景?

11 总结

本文供给了NL2Code的结构,包含使命I/O、办法、模型、产品、数据集和点评方针。一起,建立了一个在线网站来记录查询成果。一起,根据结构和查询成果,作者总结了NL2Code现在面临的应战和未来的机会。期望本文能对NL2Code研讨人员的研讨工作有所协助。