点击下方卡片,关注“自动驾驶之心”公众号
戳我-> 领取自动驾驶近15个方向学习路线
大语言模型已经融入算法工程师日常的开发工作中。熟练使用的小伙伴可以大幅提升日常的工作效率!而不懂的小伙伴还在苦哈哈网上各种搜索~今天自动驾驶之心就和大家分享一篇最新的综述—全面概括了用于代码生成的大型语言模型!如果您有相关工作需要分享,请在文末联系我们!
也欢迎添加小助理微信AIDriver004,加入我们的技术交流群
论文作者 | Juyong Jiang等
编辑 | 自动驾驶之心
论文链接:https://arxiv.org/abs/2406.00515
写在前面
大型语言模型(LLM)在被称为code LLM的各种代码相关任务中取得了显著的进步,特别是在根据自然语言描述生成具有LLM的源代码的代码生成方面。这一新兴领域因其在软件开发中的实际意义而引起了学术研究人员和行业专业人士的极大兴趣,例如GitHub Copilot。尽管从自然语言处理(NLP)或软件工程(SE)或两者的角度,对LLM进行了积极的探索,以用于各种代码任务,但明显缺乏专门用于代码生成的LLM的全面和最新的文献综述。在这项调查中,我们的目标是通过提供系统的文献综述来弥合这一差距,为研究LLM代码生成前沿进展的研究人员提供有价值的参考。我们引入了一种分类法来分类和讨论用于代码生成的LLM的最新发展,涵盖了数据管理、最新进展、性能评估和现实应用等方面。此外,我们还对代码生成LLM的演变进行了历史概述,并使用广泛认可的HumanEval和MBPP基准进行了实证比较,以强调代码生成LLM功能的逐步增强。考虑到学术界和实际发展之间的差距,我们确定了关键的挑战和有希望的机会。

分类系统
最近,大型语言模型(LLM)的开发激增,通过持续的预训练或微调,导致大量此类模型被重新用于代码生成任务。这一趋势在开源模型领域尤其明显。例如,Meta AI最初公开了LLaMA[217]模型,随后发布了专门为代码生成设计的Code LLaMA[196]。同样,DeepSeeker开发和发布的DeepSeek LLM[25]也被扩展到创建DeepSeekCoder[79],这是一种为代码生成量身定制的变体。Qwen团队在他们最初的Qwen[19]模型的基础上开发并发布了Code Qwen[215]。另一方面,微软已经解封了WizardLM[250],并正在探索其面向编码的对应产品WizardCoder[154]。谷歌加入了这场争论,发布了Gemma[214],随后又发布了Code Gemma[54]。除了简单地将通用LLM用于代码相关任务之外,还出现了大量专门为代码生成而设计的模型。值得注意的例子包括StarCoder[132]、OctoCoder[164]和CodeGen[169]。这些模型强调了LLM的发展趋势,其重点是代码生成。
认识到这些发展的重要性,我们提出了一种分类法,对代码生成LLM的最新进展进行分类和评估。如图3所示,这一分类法为寻求快速熟悉这一动态领域最先进技术的研究人员提供了全面的参考。

在下面的部分中,我们将对与代码生成相关的每个类别进行深入分析。这将包括问题的定义、需要解决的挑战,以及最突出的模型及其绩效评估的比较。
用于代码生成的大模型
具有Transformer架构的大型语言模型(LLM)已经彻底改变了许多领域,其在代码生成中的应用尤其具有影响力。这些模型遵循一个全面的过程,从代码数据的管理和合成开始,然后是结构化的训练方法,包括预训练和微调,以及使用复杂的即时工程技术。最近的进展见证了存储库级和检索增强代码生成的集成,以及自主编码代理的开发。此外,LLM编码能力的评估已成为该研究领域的一个关键组成部分。
在接下来的部分中,我们将在代码生成的上下文中详细探讨LLM的这些维度。第4.1节将介绍LLM开发各个阶段采用的数据管理和处理策略。第4.2节将讨论旨在减轻高质量数据恐怖性的数据合成方法。第4.3节将概述LLM中用于代码生成的主要模型体系结构。转到第4.4节,我们将研究全参数微调和参数有效微调的技术,这对于为代码生成任务定制LLM至关重要。第4.5节将阐明如何利用反馈的力量,通过强化学习来提高代码质量。第4.6节将深入研究提示的战略使用,以最大限度地提高LLM的编码能力。存储库级和检索增强代码生成的创新方法将分别在第4.7节和第4.8节中详细说明。此外,第4.9节将讨论自主编码代理的令人兴奋的领域。最后,第4.11节将深入了解利用LLM生成代码的一些实际应用程序,展示这些复杂模型在现实世界中的影响。通过这一全面的探索,我们旨在强调LLM在自动代码生成领域的重要性和潜力。
Data Curation & Processing



Data Synthesis
大量研究表明,高质量的数据集对于提高大型语言模型(LLM)在各种下游任务中的性能是不可或缺的[3119159242248281]。例如,LIMA模型是一个65B参数的LLaMa语言模型,仅在1000个精心策划的提示和响应上进行了标准监督损失的微调,在43%的评估案例中,其性能与GPT-4不相上下,甚至优于GPT-4。与巴德相比,这一数字上升到58%,与达相比上升到65%,所有这些都没有使用强化学习或人类偏好建模[281]。QuRating计划战略性地选择包含四个关键文本质量的训练前数据,即写作风格、事实——琐事、所需专业知识和教育价值,这些数据与人类直觉产生共鸣。与基线模型相比,在这些数据上训练1.3B参数模型可以减少困惑,增强上下文学习[242]。
Pre-Training
模型体系结构。自机器翻译的Transformer体系结构[222]问世以来,它已成为解决广泛下游任务的大量大型语言模型(LLM)的事实骨干。Transformer及其衍生物的突出之处在于其卓越的并行计算能力和强大的表示能力[256273]。通过创新的缩放技术,如混合专家(MoE)[33200]和深度提升缩放(DUS)[117],基于变压器的LLM的容量已扩展到数千亿甚至数万亿个参数。这些放大模型展示了一系列应急能力[87114238],如指令跟随[173]、上下文学习[65]和逐步推理[95, 239],这些都是以前无法预见的。
在使用LLM的代码生成领域,当代模型的架构通常分为两类:编码器-解码器模型,如CodeT5[234]、CodeT5+[232]和CodeRL[125];或仅解码器模型,例如Codex[45]、StarCoder[132]、Code-Lama[196]和CodeGemma[54]。这些体系结构分别如图2(b)和(c)所示。为了全面概述,表4详细介绍了编码器-解码器体系结构,而表5侧重于代码生成中使用的仅解码器模型。


Instruction Tuning
在大规模数据集上预训练大型语言模型(LLM)后,下一阶段通常涉及增强模型处理和遵循指令的能力,称为指令调优。指令调整通常是指使用由构造为自然语言指令的结构化示例组成的数据集对预训练的LLM进行监督微调。图5展示了从Code Alpaca[40]中采样的两个指令数据示例。它利用了指令类型的异质性,将指令调整定位为一种多任务提示训练形式,显著增强了模型对我们任务的泛化能力。


Reinforcement Learning with Feedback
通过指令调优,大型语言模型(LLM)展现出了卓越的指令跟随能力。然而,它们通常会产生意想不到的、有毒的、有偏见的或幻觉的输出,这些输出与用户的意图或偏好不一致[107173235]。因此,将LLM与人类偏好相结合已成为一个关键的研究领域。一项值得注意的工作是InstructGPT[173],它在数据集上利用人类反馈的强化学习(RLHF)进一步微调指令调优模型,其中标注者按照质量从好到坏的顺序对模型输出进行排序。这种方法在高级会话语言模型的开发中发挥了重要作用,如ChatGPT[171]和Bard[157]。尽管取得了成功,但获取高质量的人类偏好排名数据是一个资源密集型过程[127]。为了解决这一问题,已经提出了从人工智能反馈中强化学习(RLAIF)[20127],以通过生成偏好数据来利用强大的现成LLM(例如,ChatGPT[171]和GPT-4[5])来模拟人类注释器。
Prompting Engineering
大规模语言模型(LLM),如GPT-3及其继任者,已经在大规模数据语料库上进行了训练,赋予了他们丰富的世界知识[31173237]。尽管如此,制定一个有效的提示来充分利用LLM的潜力仍然是一个长期的挑战[147]。提示工程的最新进展扩展了LLM的能力,实现了更复杂的任务完成,并提高了可靠性和性能。值得注意的技术包括思想链(CoT)[239]、自一致性[230]、思想树(ToT)[253]、通过计划进行推理(RAP)[83]、ReAct[254]、自精化[156]、反思[202]和LATS[280]。

Repository Level & Long Context
在当代软件工程实践中,对代码库的修改是广泛的,包括一系列活动,包括包迁移、临时代码编辑和GitHub问题的解决。虽然大型语言模型(LLM)在函数级代码生成方面表现出了令人印象深刻的能力,但在处理存储库固有的更广泛的上下文时,例如导入依赖项、父类和具有相似名称的文件时,它们往往会出现问题。这些缺陷导致存储库级代码生成的性能不理想,正如最近的研究所指出的[205, 206]。
Retrieval Augmented
大语言模型(LLM)表现出了令人印象深刻的能力,但受到几个关键问题的阻碍,如幻觉[139269]、知识过时[104]和不透明[30]、无法追踪的推理过程[72,96, 239,282]。虽然指令调整(见第4.4节)和带反馈的强化学习(见第4.5节)等技术缓解了这些问题,但它们也带来了新的挑战,如灾难性遗忘和训练期间对大量计算资源的需求[81,174]。
Autonomous Coding Agents
大语言模型(LLM)的出现标志着通用人工智能(AGI)潜在途径的新时代的开始,引起了学术界和工业界的极大关注[98,225,241,246]。基于LLM的自主代理的一系列应用程序迅速扩展,包括AutoGPT[2]、AgentGPT[1]、BabyAGI[3]和AutoGen[245],突显了这项技术的前景。

Evaluation


Applications
GitHub Copilot
CodeGeeX
CodeWhisperer
Codeium
CodeArts Snap
Tabnine
Replit
CHALLENGES & OPPORTUNITIES
根据我们的调查,LLM已经彻底改变了代码生成的范式,并取得了显著的性能。尽管取得了这一有希望的进展,但仍有许多挑战需要解决。这些挑战主要是由学术界和实践发展之间的差距造成的。例如,在学术界,HumanEval基准已被确立为评估LLM编码能力的事实标准。然而,许多工作表明,对HumanEval的评估不能反映实际发展的场景。相比之下,这些严峻的挑战为进一步的研究和应用提供了巨大的机会。在本节中,我们指出了关键的挑战,并确定了有希望的机会,旨在弥合研究与实践的差距。
增强存储库和软件规模的复杂代码生成。在实际的开发场景中,它通常涉及大量不同难度的复杂编程问题。虽然LLM已经证明了其在生成功能级代码片段方面的熟练程度,但这些模型往往会遇到更复杂、看不见的编程问题、存储库和软件级问题,这些问题在现实世界的软件开发中很常见。为此,它需要LLM中强大的解决问题的技能,而不仅仅是功能级别的代码生成。例如,AlphaCode[136]在编程竞赛中平均排名前54.3%,在这些竞赛中,解决竞争性编程问题需要了解算法和复杂的自然语言。[111]认为现有的LLM无法很好地解决现实世界中的GitHub问题,因为性能最好的模型Claude 2只能解决1.96%的问题。性能不佳的原因主要归因于LLM的推理能力较弱[95]、复杂的内部和外部依赖性[21]以及上下文长度限制[21]。因此,追求能够处理更复杂的存储库级和软件级代码生成的模型,为软件开发的自动化开辟了新的途径,并使编程更具生产力和可访问性。
根据代码结构调整的创新模型体系结构。由于其可扩展性和有效性,基于Transformer的LLM体系结构已成为解决代码生成任务的主流。从来没有,它们可能不是为了捕获编程语言(PL)的固有结构和语法而优化设计的。代码具有高度结构化的性质,其语法比自然语言更为严格。这对LLM提出了一个独特的挑战,LLM通常源于最初为自然语言处理(NLP)设计的模型。开发能够内在地理解和集成代码的结构特性的新型模型体系结构,为改进代码生成和集成提供了一个重要的机会。基于树的神经网络[162]等创新反映了代码的抽象语法树(AST)表示,可以为模型学习和生成编程语言提供一种更自然的方式。此外,利用编译器理论中的技术,如中间表示(IR)[137],可以使模型在更抽象和可推广的水平上运行,使其在多种编程语言中有效[179]。通过探索传统序列模型之外的架构,研究人员可以释放代码生成的新潜力。
为LLM的预训练和微调绘制高质量的代码数据。LLM的效率在很大程度上取决于预训练和微调阶段使用的代码数据集的质量和多样性。目前,存在大量高质量的大型数据集,这些数据集涵盖了广泛的编程任务、样式和语言。这种限制限制了LLM在我们的编程任务、不同的编码环境和真实世界的软件开发场景中进行概括的能力。开发更复杂的数据采集技术,如自动代码库挖掘[142]、高级过滤算法和代码数据合成[148](见第4.2节),可以创建更丰富的数据集。与行业合作伙伴(如GitHub)的合作也可以促进对专有代码库的访问,从而增强培训材料的实际相关性。此外,采用开源模型进行数据集共享可以加快集体努力,提高LLM研究可用代码数据的广度和深度。
为LLM中的编码能力评估开发全面的基准和指标。像HumanEval这样的当前基准测试可能无法获得实际软件开发所需的全部编码技能[167]。此外,度量通常侧重于语法正确性或功能准确性,而忽略了代码效率[180]、样式[41]、可读性[32]或可维护性[14]等方面。模拟真实世界软件开发挑战的综合基准测试的设计可以对LLM的编码能力进行更准确的评估。这些基准测试应该包括不同难度级别的各种编程任务,如调试[279]、重构[203]和优化[101],并且应该由评估代码定性方面的指标来补充。建立社区驱动的基准测试平台可以促进行业和学术界对LLM的持续评估和比较,用于代码生成。
支持低资源、低级别和特定领域的编程语言。LLM主要使用流行的高级编程语言进行训练,使得低资源、低级和特定领域的语言代表性不足。这种缺乏关注限制了LLM在某些专业领域和系统编程中的适用性[216]。加强对迁移学习和元学习方法的研究可能使LLM能够利用高资源语言的知识来提高其在不太常见的语言上的表现[35,43]。此外,与领域专家的合作可以指导创建有针对性的数据集和微调战略,以更好地服务于利基市场。具有多语言代码生成能力的LLM的开发也为扩大应用范围提供了重要机会。
LLM的持续学习,以跟上不断发展的编码知识的步伐。软件开发领域不断发展,新的语言、框架和最佳实践不断涌现。如果LLM不能适应这些变化并融入最新的编程知识,它们就有过时的风险[104227]。虽然检索增强代码生成可以缓解这些问题,但性能受到检索上下文质量的限制。虽然检索增强码生成为这些问题提供了部分解决方案,但其有效性本质上受到检索上下文的质量的约束。[152, 266, 283].因此,建立持续学习和更新LLM的机制有助于随着时间的推移保持其相关性。这可能包括实时监控代码库,以确定趋势和创新,以及创建增量学习系统,在不忘记先前获得的知识的情况下吸收新信息。让LLM参与到他们与人类开发人员互动的主动学习场景中,也可以促进持续的知识获取。
确保代码安全,并使LLM输出与人类编码偏好保持一致。确保LLM生成的代码的安全性和保障性是最重要的问题,它们与人类偏好和道德标准保持一致的能力也是最重要的。当前的模型可能会无意中引入漏洞或生成不符合所需规范的代码。研究在LLM管道中集成正式验证工具可以提高生成代码的安全性。此外,开发捕捉和反映人类道德偏好的对齐学习框架可以确保代码生成过程与社会价值观保持一致[173184]。透明和可解释的人工智能方法也可以通过使开发人员更容易访问决策过程,有助于建立对LLM生成代码的信任。
结论
在这项调查中,我们提供了一个系统的文献综述,为研究LLM代码生成前沿进展的研究人员提供了宝贵的参考。对数据管理、最新进展、性能评估和实际应用进行了全面的介绍和分析。此外,我们对近年来用于代码生成的LLM的演变进行了历史概述,并使用广泛认可的HumanEval和MBPP基准进行了实证比较,以强调LLM用于代码生成功能的逐步增强。考虑到学术界和实际发展之间的差距,还确定了未来调查的关键挑战和有希望的机会。此外,我们还建立了一个专门的资源网站,不断记录和传播该领域的最新进展。我们希望这项调查能够有助于全面、系统地概述LLM用于代码生成,并促进其蓬勃发展。我们乐观地相信,LLM最终会改变编码的方方面面,像专业程序员一样,自动编写安全、有用、准确、值得信赖和可控的代码,甚至解决目前人们无法解决的编码问题。
参考
[1] A Survey on Large Language Models for Code Generation
投稿作者为『自动驾驶之心知识星球』特邀嘉宾,欢迎加入交流!
① 全网独家视频课程
BEV感知、BEV模型部署、BEV目标跟踪、毫米波雷达视觉融合、多传感器标定、多传感器融合、多模态3D目标检测、车道线检测、轨迹预测、在线高精地图、世界模型、点云3D目标检测、目标跟踪、Occupancy、cuda与TensorRT模型部署、大模型与自动驾驶、Nerf、语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习)

② 国内首个自动驾驶学习社区
国内最大最专业,近3000人的交流社区,已得到大多数自动驾驶公司的认可!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知(2D/3D检测、语义分割、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、大模型、端到端等,更有行业动态和岗位发布!欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频

③【自动驾驶之心】技术交流群
自动驾驶之心是首个自动驾驶开发者社区,聚焦感知、定位、融合、规控、标定、端到端、仿真、产品经理、自动驾驶开发、自动标注与数据闭环多个方向,目前近60+技术交流群,欢迎加入!扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)
④【自动驾驶之心】全平台矩阵