前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于大模型的代码生成及其发展趋势

基于大模型的代码生成及其发展趋势

作者头像
用户1386409
发布于 2022-11-29 02:43:11
发布于 2022-11-29 02:43:11
5.8K00
代码可运行
举报
文章被收录于专栏:PaddlePaddlePaddlePaddle
运行总次数:0
代码可运行

本文整理自北京航空航天大学软件开发环境国家重点实验室副教授罗杰的主题分享——基于大模型的代码生成及其发展趋势。

模型驱动的

代码生成

代码生成问题是软件工程人工智能领域的一个经典难题,其核心在于针对给定的程序需求说明,生成符合需求的程序代码。

经典研究主要采用模型驱动的代码生成方法,通过采用形式化建模语言建立严格的需求和设计模型,再通过基于编译规则的代码生成方法,从形式语言模型等语义等价转换到程序代码,以保证程序代码和需求的一致。

这种方法从理论上说是完美的,甚至可以通过对编译规则的证明来确保形式语言模型和程序代码之间保持完全一致,但是它的问题也很突出:模型驱动代码生成方法成立的前提是需要建立一个形式语言模型。

通常来说,需求都是通过自然语言进行描述,因此需要有理解需求并熟悉形式语言建模的人才,在理解自然语言需求的基础上,将其建模为形式语言的模型。但是这一步相对比较困难,且消耗代价很高。因此,这种方法目前只在一些小领域,如机载软件的开发中得到应用。这一应用场景可以接受比较高的开发代价,但不能在软件开发场景中进行大规模推广。

基于大模型的

代码生成

近年来,随着人工智能的发展,研究人员开始尝试一条不同的路径,即基于预训练大规模语言模型进行代码生成。该方法的基本思想是基于自然程序代码的预训练,获得一个能够理解这个代码的大语言模型。基于这样的语言模型,可以采用自然语言的需求描述或其他提示,通过预训练代码大模型直接生成满足需求的程序代码。

如上图所示,这种方法首先会通过自然语言文本、一种或多种程序语言代码进行模型预训练,生成预训练语言模型,将模型在面向具体任务的数据上进行一些微调,就可以得到面向具体代码生成任务的生成模型。通过该模型大量生成的代码样本,可以通过某种后处理程序,从大量的样本中筛选出正确的代码,并作为最终的生成结果。

从以上结构中可以看到,基于大模型的代码生成,核心就是“代码大模型”,目前其主要类别可以分成三类:

  • 左到右语言模型,比如GPT系列模型,典型代表比如CodeParrot、Codex、PolyCoder模型,均采用了此种语言模型架构。
  • 编解码的语言模型,比如最近DeepMind推出的AlphaCode,就是基于编解码模型架构来进行实现。
  • 掩码语言模型,这类方法主要是基于BERT架构来进行实现。

目前的代码大模型,从整体上出现了一定的特点,从代码参数规模上整体呈现增长趋势。研究人员尝试着训练这种更大规模的预训练代码大模型,观察它在不同领域里可能的应用。

代码大模型的

发展现状

接下来对目前最新的一些代码大模型进行简单介绍。

第一个模型是MIT提出的PolyCoder模型,它采用了GPT-2架构,使用程序设计语言的代码进行预训练,使用了12种程序设计语言的代码,却并没有使用任何自然语言的文本进行预训练。可以看出,这样的代码大模型,用它生成程序测试时,能够直接通过测试的概率非常低,虽然生成更多的样本,测试通过概率会更高,但本质上看,它的正确率整体来说还是非常低。所以,预训练代码大模型直接生成的程序代码质量相对较低。

第二个模型是DeepMind提出的AlphaCode,它的框架基于编解码器架构,与PolyCoder相同,也是基于多种程序设计语言进行模型的预训练,使用了12种不同的程序设计语言。在AlphaCode编解码器设计架构时,采用了异构与非对称结构,在编码器部分,虽然使用的层数较少,但维度较大,这部分主要用于处理输入的自然语言描述的需求和提示。在解码器部分,采用了比较多的层数,但比较小的维度,专门用来生成代码。通过这种架构,就能够在同样的参数规模下更好地提高代码生成质量。

DeepMind的研究人员同样发现了从预训练语言模型里生成的代码质量相对较低。所以,他们采用了后处理的策略进行筛选和过滤,以得到正确的代码。他们试图通过生成海量样本的形式,从中找到正确的生成代码。

从实验结果中得出,生成的样本数量越大,获得正确代码的概率越高,甚至已经可以从百万级代码中筛选正确代码。同时我们发现,通过需求中给出的测试样例可以过滤掉99%的生成样本,在所有问题里,有10%的问题找不到一个能够通过需求给出测试样例的生成样本,更找不到正确的代码生成结果。因此,预训练语言模型直接输出代码的质量还是不太理想。

微软研究人员提出了代码生成方法“Jigsaw”,它采用了和DeepMind同样的策略,通过对代码的后处理方式提高生成代码的质量。与DeepMind不同的是,他们采用了程序代码的修复方法进行代码质量的提升。

实验结果中可以看到,从预训练代码大模型直接生成代码正确的概率较低。代码大模型倾向于使用出现频率高的变量名,而不是用户给定的变量名,可能会导致静态语义错误。代码大模型还倾向于重复犯同样的语法和语义错误,如左右括号不匹配的语法错误),逻辑运算的语义错误。

此外,Salesforce提出了CodeGen模型(A Conversational Paradigm for Program Synthesis),通过大型语言模型进行对话式程序生成的方法,将编写规范和程序的过程转换为用户和系统之间的多回合对话。它把程序生成看作一个序列预测问题,用自然语言表达规范,并对程序进行抽样生成。同时,CodeGen(16B)在HumanEval benchmark上已经超过OpenAI's Codex。

目前,PaddleNLP已经内置代码生成CodeGen模块,可以通过Taskflow一键调用。代码生成模型的好坏,一般可以通过求解一些算法题来评估。这里以 LeetCode第一题[1]为例,尝试让PaddleNLP模型自动补全代码。题目如下所示:

给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

1.Taskflow一键调用

代码语言:javascript
代码运行次数:0
运行
复制
from paddlenlp import Taskflow#Taskflow调用codegen = Taskflow("code_generation", "Salesforce/codegen-2B-mono")prompt = "def twoSum(nums, target):\n    hashmap={}\n    for ind,num in enumerate(nums):\n        hashmap[num] = ind\n    for i,num in enumerate(nums):"code = codegen(prompt)print(prompt)print(code[0])

2.输出结果

代码语言:javascript
代码运行次数:0
运行
复制
def twoSum(nums, target):    hashmap={}    for ind,num in enumerate(nums):        hashmap[num] = ind    for i,num in enumerate(nums):        if target - num in hashmap and hashmap[target - num]!= i:            return [i,hashmap[target - num]]

3.提交到LeetCode验证,执行结果显示通过

使用同样的调用方法,针对LeetCode第三题[2],PaddleNLP也通过了测试。这次我们的Prompt仅为函数名:

代码语言:javascript
代码运行次数:0
运行
复制
def lengthOfLongestSubstring(self, s: str) -> int:

题目如下图所示:

给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

示例 1:

输入: s = "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

除此之外,Prompt也可以为自然语言,例如注释、功能表述等,同样可以生成与之对应的代码。

代码语言:javascript
代码运行次数:0
运行
复制
Prompt = "# this function prints hello world"Model Output = def hello_world():    print("Hello World")hello_world()

当前代码大模型

存在的问题

北京航空航天大学软件开发环境国家重点实验室与百度合作,在飞桨平台上进行的大模型代码生成实验,也发现上述类似问题,比如会生成一些无意义的代码或者重复的代码。这些都会导致代码大模型的方法在进行应用时会出现问题。

当前代码大模型采用了“淘金”模式,从大量的泥沙里挑选金子。从软件工程角度,它的编码模式可以称为比较粗糙的Code&Fix模型,通过计算机的算力进行整体输入,通过不断试错或海量试错找到符合需求的正确代码,但这样的做法风险高、缺少质量控制、效率低。

综上所述,我们可以思考,是否可以提出一些新的代码生成方法,以提高代码生成的效率,这是未来一个可能的研究方向。

代码大模型

未来发展趋势展望

我们发现,目前的代码大模型是使用与自然语言大模型相同的架构来实现的。但实际上,自然语言和程序设计语言之间的差别较大,自然语言语法复杂不严格,层次结构不清晰,语义不严谨,表达存在多义性。而程序设计语法简单严格、层次结构清晰、语义严格确定、表达不具有二义性,总体上看,是一种递归结构。

我们或许可以构造一个新型代码大模型架构,使其生成的程序更加符合程序语法和静态语义——这也是未来代码大模型发展的方向之一。

在实验过程中,大模型在代码生成时,会复制训练数据中的代码片段,导致生成代码出现版权问题。之所以会出现这种现象,是因为与目前大模型架构的学习理解的能力较弱,以记忆为主的特点相关。

未来的大模型可能会从记忆代码片段到学习人类编程的模式,而不是记忆代码片段。

总体来说,我们希望代码大模型未来能够得到更长远的发展,更好地学习代码中的编程模式,提高软件开发效率。

以上就是我的分享,谢谢大家。

本文转载自:AI大模型

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PaddlePaddle 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
鼻咽癌患者肿瘤部位和外周血的单细胞组成差异
在单细胞大行其道的近两年,我也安排了学徒们做了几百个有表达量矩阵可以下载的单细胞转录组文献图表复现,挑选其中100个成功的案例,提供代码给大家,希望对大家有帮助!
生信技能树
2021/04/29
1.1K0
鼻咽癌患者肿瘤部位和外周血的单细胞组成差异
RUNX1在B前体急性白血病细胞中的过表达(readMM函数活学活用)
接下来就可以读取它们啦,有意思的是每个样品都需要独立的读取3个文件,合并成为一个单细胞Seurat对象,操作技巧满满!
生信技能树
2021/12/04
6830
RUNX1在B前体急性白血病细胞中的过表达(readMM函数活学活用)
胃癌单细胞数据集GSE163558复现(二):Seurat V5标准流程
Hello小伙伴们大家好,我是生信技能树的小学徒”我才不吃蛋黄“。今天是胃癌单细胞数据集GSE163558复现系列第二期。第一期我们进行了数据的下载与读取并成功构建Seurat对象。本期,我们将在第一期基础上走Seurat V5标准流程,对Seurat对象进行QC质控、并利用harmony整合去批次、并按标准流程进行降维聚类分群。
生信技能树jimmy
2024/06/13
1.7K5
胃癌单细胞数据集GSE163558复现(二):Seurat V5标准流程
日光性皮炎和银屑病单细胞数据集复现
单细胞转录组学表明,IL-17A/F 在日光性皮炎和银屑病中具有不同的上游驱动力。
生信菜鸟团
2024/04/11
2750
日光性皮炎和银屑病单细胞数据集复现
学徒单细胞作业:敲除Dnmt1基因对小鼠肺部发育的影响
另外,前两天在《生信技能树》和《单细胞天地》等公众号都推出来了一个10X单细胞转录组钜惠套餐,详见:2个分组的单细胞项目标准分析,原价15~20万的6个10x单细胞转录组套餐,现价10万。其实本文介绍的就是:敲除Dnmt1基因前后分组的两个单细胞转录组数据分析。
生信技能树
2021/11/23
9610
单细胞水平看小鼠胰腺导管腺癌进展中的细胞异质性
文章链接:https://insight.jci.org/articles/view/129212
生信技能树
2021/12/10
9170
单细胞水平看小鼠胰腺导管腺癌进展中的细胞异质性
单细胞转录组分析揭示胃肠道间质瘤和微环境的异质性
文章标题:《Single-cell transcriptome analysis revealed the heterogeneity and microenvironment of gastrointestinal stromal tumors》
生信技能树
2021/12/10
9210
单细胞转录组分析揭示胃肠道间质瘤和微环境的异质性
一篇单细胞文献复现及代码部分更新
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE151177
生信菜鸟团
2023/12/14
1.8K0
一篇单细胞文献复现及代码部分更新
单细胞测序—标准流程代码(1)
现在的单细胞测序很少是单个样本测序了,一般是多个样本。这里用ifnb.SeuratData包中的ifnb示例数据来模拟单细胞测序多样本分析流程。
sheldor没耳朵
2024/08/20
8320
单细胞测序—标准流程代码(1)
​单细胞专题 | 7.单细胞下游分析——常规分析流程案例一
单细胞专题 | 1.单细胞测序(10×genomics技术)的原理 单细胞专题 | 2.如何开始单细胞RNASeq数据分析 单细胞专题 | 3.单细胞转录组的上游分析-从BCL到FASTQ 单细胞专题 | 4.单细胞转录组的上游分析-从SRA到FASTQ 单细胞专题 | 5.单细胞转录组的上游分析-从FASTQ到count矩阵 单细胞专题 | 6.单细胞下游分析——不同类型的数据读入
DoubleHelix
2022/12/16
5.5K0
​单细胞专题 | 7.单细胞下游分析——常规分析流程案例一
中性粒细胞的质量值到底是多低呢?
今天来看看一篇文献中使用BD单细胞测序技术,鉴定到的一大群中性粒细胞,这就来分析看看!多一点对中性粒细胞的实际认知~
生信技能树
2025/04/11
710
中性粒细胞的质量值到底是多低呢?
免疫抑制剂-TNBC单细胞数据集聚类分群
然后就是花费了从早上9点至下午4点的运行过程,流程是初级流程,时间是好几倍,这时间可以跑完别的一整篇了,果然不可高攀。 乍一看去,这些图不算难呀,可能这个PI和TI的设定得多花点时间琢磨一下
生信菜鸟团
2023/09/09
5110
免疫抑制剂-TNBC单细胞数据集聚类分群
根据线粒体基因进行过滤
上篇推文中对ncount_RNA 和nFeature_RNA进行了可视化,然后基于可视化结果进行了阈值的判断,并且也给大家分享了在实际分析中的应用
生信技能树jimmy
2024/05/01
5970
根据线粒体基因进行过滤
实战出真知——单细胞基础流程
我们选择的数据已经发表的文章题目是“Single cell RNA sequencing of human liver reveals distinct intrahepatic macrophage populations”,2018年发表在nature communications上,数据存在GSE115469。
生信技能树jimmy
2020/12/11
1.9K0
实战出真知——单细胞基础流程
单细胞水平看生存分析相关基因
针对每个癌症的全部基因批量了做了单基因的cox分析,挑选统计学显著的去对应的癌症去打分,看看是否有单细胞亚群特异性。
凑齐六个字吧
2024/07/02
1700
单细胞水平看生存分析相关基因
GSE163558单细胞数据处理流程分享
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE163558 ,GEO数据库搜索GEO数据号,下载并整理成Seurat所需的格式。
生信医道
2025/02/06
2660
GSE163558单细胞数据处理流程分享
单细胞降维聚类分群注释全流程学习(seruat5/harmony)
https://mp.weixin.qq.com/s/drmfwJgbFsFCtoaMsMGaUA
凑齐六个字吧
2024/09/07
3510
单细胞降维聚类分群注释全流程学习(seruat5/harmony)
画出像烟花一样的单细胞umap图,原因竟然是?
GSE125527数据:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE125527。
生信技能树
2025/02/05
1890
画出像烟花一样的单细胞umap图,原因竟然是?
BD单细胞测序数据分析流程(全)
BD和10x是两种常见的单细胞测序技术平台。我们已经分享了很多的10x 测序的教程。
生信菜鸟团
2024/04/11
2.8K0
BD单细胞测序数据分析流程(全)
Github代码文献复现之卵巢和子宫内膜癌(五)|| 数据合并, 标准化、特征选择以及聚类
今天继续来学习他的代码wiki上的:https://github.com/RegnerM2015/scENDO_scOVAR_2020/wiki
生信技能树
2025/03/03
1070
Github代码文献复现之卵巢和子宫内膜癌(五)|| 数据合并, 标准化、特征选择以及聚类
推荐阅读
相关推荐
鼻咽癌患者肿瘤部位和外周血的单细胞组成差异
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验