A Survey of Neural Code Intelligence: Paradigms, Advances and Beyond
- 前言
- 摘要
- 代码模型的发展
- 神经语言建模
- 代码预训练模型
- 大型语言模型
- 学习范式的转移
- 数据集与评测基准
- 跨领域协同
- 应用与未来
- 资源
- 阅读总结
前言
神经代码智能利用深度学习理解、生成和优化代码,连接自然语言和编程语言,近年吸引了大量关注。本篇综述回顾了50多个模型、20多类任务和680多项工作,追溯了从RNN到LLM的范式转变,系统梳理了模型、任务、评测和应用的发展历程,从解决特定场景扩展到应对复杂现实挑战。Paper | https://arxiv.org/abs/2403.14734 |
---|---|
Github | https://github.com/QiushiSun/NCISurvey |
摘要
神经代码智能(Neural Code Intelligence,NCI)指的是采用深度学习技术以理解、生成及优化计算机代码,该技术正日益显示其在人工智能领域内的革命性影响。作为连接自然语言与编程语言的桥梁,这一领域无论在学术论文发表还是实际应用方面,近年来都已显著引起了学术界与工业界的广泛关注。本综述论文依照时间线对代码智能领域的发展进行了系统的梳理,涵盖了超过50种主要模型及其变体、20多种代码相关任务,以及超过680项的相关研究。文章按照历史进程,追溯了各个研究阶段的主要范式转变,例如从利用循环神经网络(RNN)模型代码到大语言模型(LLM)的转变。同时,论文还从模型构建、任务类型、评估方法及实际应用等方面,细致分析了各阶段的学术和技术演变。在应用层面,代码智能从最初专注解决特定场景的尝试,经过一个探索多样化任务的快速扩展期,至今已逐渐转向应对现实世界中日益复杂和多样的挑战。
代码模型的发展
当前代码模型的发展可以分为三个阶段,横跨了:
- 神经语言建模(Neural Language Modeling)时代
- 代码预训练模型时代(CodePTMs)
- 大型语言模型(LLMs)时代
下面分别对这三个发展阶段进行介绍。
神经语言建模
神经语言建模时期见证了深度学习来处理code的最早期尝试。在此阶段,开发的方法主要采用了成熟的循环神经网络(RNN)或卷积神经网络(CNN)来建模代码。具体来说,这些方法不仅处理代码的文本信息,还包括了代码的结构元素,如抽象语法树(AST)、数据流(Data Flow)和控制流(Control Flow)的提取与整合过程,这一发展与语义解析(Semantic Parsing)密切相关。此外,由于代码段能够被转换为连续的向量表示,因此该时期发展的技术也称为代码嵌入(Code Embeddings)。其中,最具代表性的技术如code2vec和code2seq,通过将AST中的路径嵌入到向量空间中,有效捕捉了代码的语义和结构特征,使得神经网络方法能够被广泛应用于多种代码相关的场景。
代码预训练模型
继预训练语言模型(Pre-trained Language Models, PLMs)在自然语言处理(NLP)领域取得显著成就后,研究者们迅速采纳这些架构以用于代码建模,催生了如CodeBERT和CodeT5等代表性的代码预训练模型(Code Pre-trained Models, CodePTMs)的蓬勃发展。这一阶段标志着代码智能领域中一个以预训练加微调策略为核心的繁荣时期。这些模型不仅继承了前一时代采用代码结构进行建模的传统,还引入了Transformer架构,显著增强了模型对代码表征学习的能力。
大型语言模型
继GPT-3和PaLM等通用大型语言模型(LLMs)在学术界和工业界取得极大成功后,以Codex、CodeGen和StarCoder为代表的代码专用大模型(CodeLLMs)再次激发了研究热潮。这一阶段标志了学习策略从任务特定的微调转向基于提示的学习(prompt learning)和上下文内学习(in-context learning)。同时,代码智能的应用也从局限于代码相关任务扩展到更广泛的现实世界应用场景,如逻辑推理、数学问题解决及协助解决传统自然语言处理任务。这些进展显示了代码智能技术在多领域的实用性和灵活性。
结合上述讨论,本文将不同时代、不同架构以及不同来源的代码模型之间的关系整理在下图中,供研究者使用:
学习范式的转移
在代码智能的模型发展过程中,其学习范式与自然语言处理领域经历了类似的转变。这一演进从最初利用神经网络方法对单一任务或场景进行建模开始,随后进入了预训练和任务特定微调阶段,允许一个模型处理多种任务。最终发展至大模型时代,以基于提示的学习(prompt learning)为主导的学习方式。
此外,这种范式的转变还使得代码智能的应用场景从传统的代码相关任务扩展到了更广阔的领域,包括数值推理、符号推理和信息抽取等经典的自然语言处理任务。这些变化不仅增强了模型的通用性,还拓展了其在实际应用中的潜力和影响。
数据集与评测基准
除了模型架构上的特征外,本文还系统性地回顾了以CodeSearchNet 和 The Stack 为代表的用于构建代码模型所使用的预料及其特性。
在评测上,本文也详细回顾了克隆检测、缺陷检测、代码翻译/修复以及代码生成等若干场景下的常见评测基准,并在文中对所有现有benchmarks进行了汇总和归类整理。此外,还展示了一些代表性模型的不同版本在生成代码时的性能表现(如下图所示),并就其进行了详细讨论。
跨领域协同
除了针对代码生成等常见代码任务,本文还就跨领域场景:代码辅助推理、代码训练与数学能力以及代码智能解决NLP任务等角度进行了深入的讨论。并得出了以下收获:
- 将代码生成和Symbolic Solver与LLM Reasoning相结合,代表了解决数值任务的一次颠覆性转变。通过以可执行代码替代自然语言作为推理媒介,不仅克服了长期存在的计算限制,还增强了模型的解释性和泛化能力。
- 尽管理论基础尚未建立,但我们已经可以经验主义地认为:代码训练可以增强LLMs数学能力。这一点也在逐渐被学术界接受。
- 采用代码作为中间表示,可以显著提高解决以信息抽取为代表的经典NLP任务的效率。跨越传统的以文本为核心的建模思想,code-centric的方法通过构建统一的模式,可以有效应对复杂和多样化的输入与输出形式。
应用与未来
除了上述research角度的讨论,这篇综述还详尽地讨论了代码智能在其它四个领域的应用:
- 软件工程:如编程助手,自动化软件开发等。
- 数据驱动决策:Text2SQL和数据科学。
- 智能体:机器人控制与自动化。
- AI4Science:辅助分子式生成和自动定理证明。
在此之后,本文分别从模型、评测、应用、高效化和跨领域等方面,抛出了若干值得研究的方向。
资源
除了论文本身外,本文的作者们还维护了一个GitHub项目,其中包含了若干份精心整理的Reading lists,Tutorials,博客以及本文所使用到的资源,并且将长期维护。
阅读总结
这篇综述对代码智能的整个进化轨迹进行了系统行的回归,从深度神经网络在代码上的初次尝试,到LLM时代取得的突破性进展。在这个过程中,作者探讨不同时期的关联,围绕模型、任务和应用的范式转变进行了详细的讨论和分析。此外,作者还探索了代码学习和机器智能等方面的协同作用,以及在现实世界中的应用。最后,作者确定了代码智能未来研究的几个有希望的方向,并预见了该领域会随着语言模型的进步,从而继续蓬勃发展。
全文逻辑清晰,引经据典,内容丰富且全面,并且提供了及时更新的github资源,特别适合对代码智能感兴趣的初学者进行学习。