CN116166271A - 代码生成方法、装置、存储介质及电子设备 - Google Patents

代码生成方法、装置、存储介质及电子设备 Download PDF

Info

Publication number
CN116166271A
CN116166271A CN202310190548.6A CN202310190548A CN116166271A CN 116166271 A CN116166271 A CN 116166271A CN 202310190548 A CN202310190548 A CN 202310190548A CN 116166271 A CN116166271 A CN 116166271A
Authority
CN
China
Prior art keywords
code
word
target
code generation
sequence
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202310190548.6A
Other languages
English (en)
Inventor
刘露平
吴沁芸
杨萍
林蓝东
刘杰
宋欢
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Douyin Vision Co Ltd
Original Assignee
Douyin Vision Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Douyin Vision Co Ltd filed Critical Douyin Vision Co Ltd
Priority to CN202310190548.6A priority Critical patent/CN116166271A/zh
Publication of CN116166271A publication Critical patent/CN116166271A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N5/00Computing arrangements using knowledge-based models
    • G06N5/02Knowledge representation; Symbolic representation

Abstract

本公开涉及一种代码生成方法、装置、存储介质及电子设备,以提高自动生成代码的准确性。其中,该方法包括:获取目标文本,所述目标文本包括待补充的程序代码文本或用于描述代码功能的自然语言文本;将所述目标文本输入代码生成模型,得到基于所述目标文本生成的目标程序代码,其中,所述代码生成模型由代码理解任务和代码生成任务训练得到,且所述代码理解任务用于所述代码生成模型学习样本程序代码的语法特征和语义特征,所述代码生成任务用于所述代码生成模型学习基于所述样本程序代码生成新的程序代码的过程。

Description

代码生成方法、装置、存储介质及电子设备
技术领域
本公开涉及计算机技术领域,具体地,涉及一种代码生成方法、装置、存储介质及电子设备。
背景技术
程序代码自动生成是软件智能化的重要技术手段,其可以辅助软件开发人员完成一些通用代码的开发,从而有效提高研发效率并节约研发成本。另外,随着自然语言处理技术的不断发展,预训练语言模型被广泛应用于程序代码生成。然而,相关技术主要基于条件概率语言模型的方式进行代码生成,即基于已有的上文信息来预测下一个程序符号出现的概率,只能学习到程序符号的统计分布。
发明内容
提供该发明内容部分以便以简要的形式介绍构思,这些构思将在后面的具体实施方式部分被详细描述。该发明内容部分并不旨在标识要求保护的技术方案的关键特征或必要特征,也不旨在用于限制所要求的保护的技术方案的范围。
第一方面,本公开提供一种代码生成方法,所述方法包括:
获取目标文本,所述目标文本包括待补充的程序代码文本或用于描述代码功能的自然语言文本;
将所述目标文本输入代码生成模型,得到基于所述目标文本生成的目标程序代码,其中,所述代码生成模型由代码理解任务和代码生成任务训练得到,且所述代码理解任务用于所述代码生成模型学习样本程序代码的语法特征和语义特征,所述代码生成任务用于所述代码生成模型学习基于所述样本程序代码生成新的程序代码的过程。
第二方面,本公开提供一种代码生成装置,所述装置包括:
获取模块,用于获取目标文本,所述目标文本为待补充的程序代码文本或用于描述代码功能的自然语言文本;
生成模块,用于将所述目标文本输入代码生成模型,得到基于所述目标文本生成的目标程序代码,其中,所述代码生成模型由代码理解任务和代码生成任务训练得到,且所述代码理解任务用于所述代码生成模型学习样本程序代码的语法特征和语义特征,所述代码生成任务用于所述代码生成模型学习基于所述样本程序代码生成新的程序代码的过程。
第三方面,本公开提供一种非临时性计算机可读介质,其上存储有计算机程序,该程序被处理装置执行时实现第一方面中所述方法的步骤。
第四方面,本公开提供一种电子设备,包括:
存储装置,其上存储有计算机程序;
处理装置,用于执行所述存储装置中的所述计算机程序,以实现第一方面中所述方法的步骤。
通过上述技术方案,代码生成模型可以通过代码理解任务和代码生成任务训练得到。其中,代码理解任务用于代码生成模型学习样本程序代码的语法和语义知识,代码生成任务用于代码生成模型学习基于样本程序代码生成新的程序代码的过程。由此,经过训练后的代码生成模型可以根据目标文本的语法和语义生成目标程序代码,提高自动生成代码的准确性。
本公开的其他特征和优点将在随后的具体实施方式部分予以详细说明。
附图说明
结合附图并参考以下具体实施方式,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。贯穿附图中,相同或相似的附图标记表示相同或相似的元素。应当理解附图是示意性的,原件和元素不一定按照比例绘制。在附图中:
图1是根据本公开一示例性实施例示出的一种代码生成方法的流程图;
图2是根据本公开一示例性实施例示出的一种代码生成方法的过程示意图;
图3是根据本公开一示例性实施例示出的一种代码生成方法中代码生成模型的示意图;
图4是根据本公开另一示例性实施例示出的一种代码生成方法的过程示意图;
图5是根据本公开一示例性实施例示出的一种代码生成方法中掩码矩阵的示意图;
图6是根据本公开另一示例性实施例示出的一种代码生成方法的过程示意图;
图7是根据本公开一示例性实施例示出的一种代码生成装置的框图;
图8是根据本公开一示例性实施例示出的一种电子设备的框图。
具体实施方式
下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。
需要注意,本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。另外需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
可以理解的是,在使用本公开各实施例公开的技术方案之前,均应当依据相关法律法规通过恰当的方式对本公开所涉及个人信息的类型、使用范围、使用场景等告知用户并获得用户的授权。
例如,在响应于接收到用户的主动请求时,向用户发送提示信息,以明确地提示用户,其请求执行的操作将需要获取和使用到用户的个人信息。从而,使得用户可以根据提示信息来自主地选择是否向执行本公开技术方案的操作的电子设备、应用程序、服务器或存储介质等软件或硬件提供个人信息。
作为一种可选的但非限定性的实现方式,响应于接收到用户的主动请求,向用户发送提示信息的方式例如可以是弹窗的方式,弹窗中可以以文字的方式呈现提示信息。此外,弹窗中还可以承载供用户选择“同意”或者“不同意”向电子设备提供个人信息的选择控件。
可以理解的是,上述通知和获取用户授权过程仅是示意性的,不对本公开的实现方式构成限定,其它满足相关法律法规的方式也可应用于本公开的实现方式中。
同时,可以理解的是,本技术方案所涉及的数据(包括但不限于数据本身、数据的获取或使用)应当遵循相应法律法规及相关规定的要求。
正如背景技术所言,随着自然语言处理技术的不断发展,预训练语言模型被广泛应用于程序代码生成。然而,这类方法将程序代码看作和自然语言文本类似的符号序列,并采用条件概率自回归生成的方式来训练代码生成,无法有效地学习到程序代码的语义,只能学习到程序符号的统计分布,并且程序代码的结构信息也无法被有效的捕获。
基于此,本公开提供一种代码生成方法,可以在代码生成模型的训练过程中融合程序代码理解和程序代码生成的多任务学习方法。也即是说,为了使得模型能够有效地学习到程序代码的语法和语义知识,本公开在训练目标上共设置了两大类训练任务:代码理解任务和代码生成任务。在代码理解任务中,可以让模型学习到程序代码的基础语法知识和语义知识,从而在模型应用阶段,模型可以根据输入文本的语法和语义生成程序代码,提高生成代码的准确性。
图1是根据本公开一示例性实施例示出的一种代码生成方法的流程图。参照图1,该代码生成方法可以包括:
步骤101,获取目标文本,该目标文本包括待补充的程序代码文本或用于描述代码功能的自然语言文本。
步骤102,将目标文本输入代码生成模型,得到基于目标文本生成的目标程序代码。其中,代码生成模型由代码理解任务和代码生成任务训练得到,且代码理解任务用于代码生成模型学习样本程序代码的语法特征和语义特征,代码生成任务用于代码生成模型学习基于样本程序代码生成新的程序代码的过程。
应当理解的是,本公开中输入代码生成模型的目标文本可以包括待补充的程序代码或用于描述代码功能的自然语言文本。其中,待补充的程序代码可以是未编写完整的程序代码,将该待补充的程序代码输入代码生成模型后,代码生成模型可以根据该待补充的程序代码输出完整的程序代码。用于描述代码功能的自然语言文本,比如可以是根据实际业务功能确定的自然语言文本,将该自然语言文本输入代码生成模型后,代码生成模型可以输出能够实现该业务功能的程序代码。由此,可以实现代码的自动生成,提高代码生成的效率,并且,在代码生成模型的训练阶段中同时引入代码理解和代码生成预训练任务,使得代码生成模型在应用阶段可以有效地捕获目标文本中的语法和语义知识以增强代码生成的性能,提高生成的程序代码的准确性。
下面首先说明代码生成模型的训练过程。
首先可以获取样本程序代码,然后对样本程序代码进行分词,并拆分成固定长度的分词序列,最后基于该分词序列对代码生成模型中进行训练。其中,固定长度可以是1024个token(分词)。
在一些实施例中,样本程序代码可以通过如下方式得到:先获取代码数据集,该代码数据集包括多个代码文件。然后,针对每个代码文件,执行以下至少一个预处理步骤,得到训练数据集:当代码文件中字符数占符号总数的比例大于或等于预设字符比例时,将代码文件加入训练数据集;当代码文件平均每行代码的字符数小于或等于第一预设阈值时,将代码文件加入训练数据集;当代码文件中注释信息的字符数小于或等于第二预设阈值时,将代码文件加入训练数据集。最后,将训练数据集中每个代码文件对应的程序代码确定为样本程序代码。
其中,预设字符比例、第一预设阈值和第二预设阈值可以根据实际情况设定,本公开实施例对此不作限定。比如,预设字符比例可以设定为40%,第一预设阈值可以设定为100,第二预设阈值可以设定为500。
应当理解的是,直接获取的代码数据集通常包含较多的重复代码数据和低质量代码数据,为了避免这些重复代码数据和低质量数据影响模型的学习过程,可以先对获取的代码数据集进行预处理。
例如,参照图2,首先,依次从代码数据集中遍历代码文件并计算文件的MD5(Message-Digest Algorithm)哈希值。第一次计算出哈希值后进行存储,第二次计算出哈希值后将其与存储的哈希值进行比对,如果哈希值存在,则表明是重复的文件,可以将其丢弃,如果哈希值不存在,则将本次的哈希值存储,以此类推,对代码数据集中的代码文件进行去重处理。之后,可以计算文件中字符数(由26个英文字母中至少一个字母构成的字符的数量)占代码文件的符号总数(字母、空格以及其他特殊字符的数量,其中一个空格算一个字符)的比率和代码文件中平均每行的字符数。如果代码文件中字符数占符号总数的占比值低于40%或者代码文件中平均每行的字符数超过100,则可以认为这是包含较多噪声的代码文件,从而不将该代码文件加入训练数据集,并继续计算下一个代码文件。反之,如果代码文件中字符数占符号总数的占比值高于等于40%或者代码文件中平均每行的字符数未超过100,则可以将该代码文件加入训练数据集。接着,预处理阶段还可以将代码文件中超过500个字符的注释信息去掉,以提高训练数据的质量。最后,将训练数据集中每个代码文件对应的程序代码确定为样本程序代码。
通过上述方式,可以基于原始代码数据,过滤重复和低质量代码数据,建立高质量训练数据集,从而减少重复和低质量代码数据对模型训练的影响,提高训练效果,进而提高训练后代码生成模型的结果准确性。
在一些实施例中,代码生成模型包括代码理解层、代码生成层和共享表示层,共享表示层输出的结果可以用于输入代码理解层或代码生成层。相应地,代码生成模型的训练步骤包括:当执行代码理解任务时,对样本程序代码进行掩码处理,得到掩码序列,将掩码序列输入代码生成模型,以通过共享表示层和代码理解层得到第一预测代码,并基于第一预测代码调整代码理解层和共享表示层的参数。当执行代码生成任务时,将样本程序代码输入代码生成模型,以通过共享表示层和代码生成层得到第二预测代码,并基于代码生成模型输出的结果调整代码生成层和共享表示层的参数。
也即是说,当执行代码理解任务时,可以通过掩码语言模型的方式进行训练。当执行代码生成任务时,可以通过条件语言模型的方式进行训练。
例如,参照图3,代码生成模型包括共享表示层、代码理解层和代码生成层,在训练阶段,可以通过代码理解任务调整共享表示层和代码理解层的参数,之后再通过代码生成任务调整共享表示层和代码生成层的参数。由此,在模型应用阶段,可以识别目标文本的语法和语义知识,从而通过该语法和语义知识输出更准确的目标程序代码。
下面介绍代码理解任务的训练过程。
在一些实施例中,对样本程序代码进行掩码处理,得到掩码序列,包括:对样本程序代码进行分词处理,得到分词序列;在分词序列中随机选取第一预设比例的第一目标分词,并将第一目标分词替换为第一预设掩码符号,得到掩码序列;和/或,在分词序列中随机选取第二预设比例的第二目标分词,并针对每个第二目标分词,在剩余分词中随机选取一目标剩余分词,将第二目标分词替换为目标剩余分词,得到掩码序列。
其中,剩余分词为分词序列中除第二目标分词外的分词。第一预设比例、第二预设比例和第一预设掩码符号可以根据实际情况设定,本公开实施例对此不作限定。比如,第一预设比例设定为12%,第二预设比例设定为1.5%,第一预设掩码符号设定为[MASK]。另外,可以直接选取第一预设比例和第二预设比例的分词,也可以先选取一定比例的分词,然后在选取出的分词中再选取一定比例的分词。比如,在确定训练样本对应的分词序列后,以token为单位随机选择分词序列中15%的token,然后将选择出的token中80%的token(即第一目标分词)使用[MASK]符号进行替换,并将选择出的token中10%的token(即第二目标分词)随机的使用其他token进行替换,得到掩码序列。由此,通过该掩码序列训练代码生成模型,可以让模型学习从掩码序列中恢复掩码分词的信息,从而让模型学习到程序代码的基础语法知识。
在一些实施例中,对样本程序代码进行掩码处理,得到掩码序列,包括:对样本程序代码进行分词处理,得到分词序列。然后,在分词序列中确定用于表征函数名的函数分词,并在函数分词中随机选取第三预设比例的目标函数分词,将目标函数分词替换为第二预设掩码符号,得到掩码序列;和/或,在分词序列中确定用于表征接口名的接口分词,并在接口分词中随机选取第四预设比例的目标接口分词,将目标接口分词替换为第三预设掩码符号,得到掩码序列。
其中,第三预设比例、第四预设比例、第二预设掩码符号和第三预设掩码符号可以根据实际情况设定,本公开实施例对此不作限定。比如,第三预设比例和第四预设比例均设定为20%,第三预设掩码符号和第四预设掩码符号均设定为[MASK],即,可以将样本程序代码中函数名的token按照20%的比例替换为[MASK]符号,和/或,可以将样本程序代码中接口(API,Application Programming Interface)名的token按照20%的比例替换为[MASK]符号,得到掩码序列。之后,通过该掩码序列训练代码生成模型,可以让模型学习恢复经掩码处理的函数名和API名称,从而让模型学习函数名与函数体的对应关系以及应用程序接口等语义知识。
在实际应用中,可以通过上述任一方式进行掩码处理,也可以结合上述两种方式进行掩码处理,本公开实施例对此不作限定。
在得到掩码序列后,可以将掩码序列输入代码生成模型,以通过共享表示层和代码理解层得到第一预测代码。在一些实施例中,可以先确定掩码序列对应的特征向量序列。然后,针对特征向量序列中的每个特征向量,通过共享表示层根据特征向量序列中位于特征向量前后的所有特征向量和注意力机制进行计算,得到中间特征向量,再针对每个中间特征向量,通过代码理解层根据除中间特征向量外的中间特征向量和注意力机制进行注意力计算,得到目标特征向量。最后,根据目标特征向量,得到第一预测程序代码。
其中,通过共享表示层根据特征向量序列中位于特征向量前后的所有特征向量和注意力机制进行计算,相当于是共享表示层进行了双向注意力计算。通过代码理解层根据除中间特征向量外的中间特征向量和注意力机制进行注意力计算,相当于是代码理解层进行了双向注意力计算。由此,当执行代码理解任务时,共享表示层和代码理解层均执行双向注意力计算,从而可以结合上文和下文进行代码理解,更准确的识别输入文本的语法和语义知识。
例如,参照图4,以代码生成模型为Transformer为例说明训练阶段模型各层的执行过程。首先,样本程序代码分词后的代码片段经过词嵌入层和位置编码层得到每个单词的词向量表示。其中,词嵌入层通过查表从词嵌入矩阵中获取相应的词嵌入向量。词向量矩阵是一个大小为42000×1024的矩阵,其中42000为词表的大小,1024为词向量的维度。位置编码层通过基于余弦的位置编码方式计算每个单词的位置编码向量。最后将每个单词对应的词嵌入向量和位置编码向量相加后得到该单词的词向量,如式(1)所示:
Figure BDA0004106940560000081
其中,
Figure BDA0004106940560000082
表示第i个单词对应的词向量,WordEmbedding(i)表示第i个单词对应的词嵌入向量,PositionEmbedding(i)表示第i个单词对应的位置编码向量。
经过词嵌入层后的序列输入共享表示层进行编码。共享表示层可以由多个transformer基本块(transformerblock)堆叠而成,每个基本块由多头注意力子层和前向反馈子层(图4未示出)构成。其中,多头注意力子层用于计算输入序列中各个词之间的相关关系。实际应用中,可以设定注意力头的数量为16,即可以采用16个注意力头,本公开实施例对此不作限定。在每个注意力头中,可以通过自注意力机制计算得到第i个单词的编码表示hi,如式(2)所示:
Figure BDA0004106940560000083
其中,Q表示第i个单词的词向量Hiembedding经过线性变化后得到的查询向量,K表示第i个单词的词向量Hiembedding经过线性变化后得到的键向量,V表示第i个单词的词向量Hiembedding经过线性变化后得到的值向量,KT表示K的转置,dk表示K的维度。
在得到单个注意力头输出的编码表示hi后,将多个注意力头的输出进行拼接后经过一个全连接层得到第i个单词的编码表示mi,如式(3)所示:
mi=concat(h′1,..,h′h)Wo (3)
其中,concat表示向量拼接,h′1表示第1个注意力头输出的编码表示,h′h表示第h个注意力头输出的编码表示,Wo表示多头注意力子层的参数。
进一步,为防止梯度消失,多头注意力子层的输出可以经过一个残差连接和归一化层后得到输出
Figure BDA0004106940560000091
如式(4)所示:
Figure BDA0004106940560000092
其中,LayerNorm表示归一化函数。
之后,前向反馈子层对多头注意力子层输出的向量进行进一步处理。其中,前向反馈子层由两个全连接和一个ReLU激活单元构成,其计算过程如式(5)所示:
Figure BDA0004106940560000093
其中,max表示取最大值函数,h″i表示前向反馈子层的输出,W1和W2表示前向反馈子层的参数,b1和b2为相应的偏置。应当理解的是,具体计算过程可以参照相关技术中transformer模型的计算过程,这里不再赘述。
类似地,前向反馈子层的输出也同样经过残差连接和归一化层后得到共享表示层的输出
Figure BDA0004106940560000094
如式(6)所示:
Figure BDA0004106940560000095
由此,可以通过共享表示层根据特征向量序列中位于特征向量前后的所有特征向量进行双向注意力计算,得到中间特征向量,即
Figure BDA0004106940560000096
之后,可以针对每个中间特征向量,通过代码理解层根据除中间特征向量外的中间特征向量进行双向注意力计算,得到目标特征向量。比如,沿用上述举例,共享表示层的输出
Figure BDA0004106940560000097
经过代码理解子网络的双向注意力计算后,依次经过残差层和前向反馈层后得到对应的目标特征向量,该计算过程和共享表示层的计算过程类似,可以参照前文,这里不再赘述。
最后,根据该目标特征向量,得到第一预测程序代码,从而基于该第一预测程序代码调整代码理解层和共享表示层的参数。
比如,沿用上述举例,将经过掩码处理后的掩码序列输入代码生成模型后得到每个单词的特征表示hs。随后将经掩码处理的单词所对应的
Figure BDA0004106940560000098
经过第一线性变换层后得到该单词属于词表中不同单词的概率/>
Figure BDA0004106940560000099
再将该概率经过softmax函数进行计算得到归一化概率pu,如式(7)和(8)所示:
Figure BDA0004106940560000101
Figure BDA0004106940560000102
其中,Wu表示第一线性变换层的参数,bu表示对应的偏置,m表示经掩码处理的单词,mi表示经掩码处理的单词对应的正确单词的标签,θ表示代码生成模型的参数,N表示词表中的单词总数。
然后,计算代码理解任务的损失函数,如式(9)所示:
Figure BDA0004106940560000103
其中,L1表示代码理解任务中计算得到的损失函数值,M表示经掩码处理的单词的个数。
最后,可以根据L1损失函数值调整代码理解层和共享表示层的参数,该过程与相关技术类似,这里不再赘述。
由此,当执行代码理解任务时,共享表示层和代码理解层均执行双向注意力计算,从而可以结合上文信息和下文信息进行代码理解,更准确的识别输入文本的语法和语义知识。
下面介绍代码生成任务的训练过程。
当执行代码生成任务时,可以将样本程序代码输入代码生成模型,以通过共享表示层和代码生成层得到第二预测代码,并基于代码生成模型输出的结果调整代码生成层和共享表示层的参数。
在一些实施例中,将样本程序代码输入代码生成模型,以通过共享表示层和代码生成层得到第二预测代码,包括:先确定样本程序代码对应的特征向量序列,其中特征向量序列包括N个特征向量,N为正整数。然后,针对特征向量序列中的第i个特征向量,通过共享表示层根据所述特征向量序列中位于第i个特征向量前后的所有特征向量和注意力机制进行计算,得到第i个中间特征向量,i为正整数。针对第i个中间特征向量,通过代码生成层根据前序特征向量和注意力机制进行计算,得到目标特征向量,其中前序特征向量为在第i个中间特征向量之前得到的所有中间特征向量。最后,根据目标特征向量,得到第二预测程序代码。
其中,通过共享表示层根据特征向量序列中位于第i个特征向量前后的所有特征向量和注意力机制进行计算,相当于是共享表示层进行了双向注意力计算。通过代码生成层根据前序特征向量和注意力机制进行计算,相当于是代码生成层进行了单向注意力计算。也即是说,当执行代码生成任务时,共享表示层执行双向注意力计算,代码理解层执行单向注意力计算,从而可以根据单词的上文信息预测下一个单词,实现代码生成。并且,由于共享表示层可以通过代码理解任务进行参数调整,因此共享表示层可以结合上文信息的语法和语义知识得到对应的特征并将其输入代码生成层进行处理,进而可以结合输入文本的语法和语义知识进行代码生成,提高代码生成的准确性。
例如,参照图3,多任务层包含代码理解和代码生成两个子网络,且两个子网络由多个transformer基本块构成,区别点在于代码理解子网络采用和共享表示层相同的双向注意力计算方式,即计算某个单词的依赖关系时会计算其与前后单词之间的依赖关系,而代码生成子网络采用单向注意力计算方式,即计算某个单词的依赖关系时只会计算该单词与其之前单词的依赖关系。比如,代码生成子网络采用基于掩码的注意力机制来计算单词的特征表示,如式(10)所示:
Figure BDA0004106940560000111
其中,Qs表示
Figure BDA0004106940560000112
经过线性变化后得到的查询向量,Ks表示/>
Figure BDA0004106940560000113
经过线性变化后得到的键向量,Vs表示/>
Figure BDA0004106940560000114
经过线性变化后得到的值向量,KT表示K的转置,d′k表示Ks的维度,M表示一个大小为n×n的掩码矩阵,n表示输入序列的长度,该矩阵对角线及左侧所有元素的值为1,而对角线右侧的所有元素为0。比如,图5是一个输入序列长度为6的掩码矩阵的示例。
应当理解的是,代码生成任务子网络的其他计算过程可以参照相关技术中原生transformer的计算过程,这里不再赘述。
如上文所述,在代码生成子网络中,引入了掩码矩阵后使得第i个单词的特征输出
Figure BDA0004106940560000115
是由其前序特征向量经过加权求和后获得的,因此其代表了前序序列的特征表示。由此,可以将在代码生成子网络中计算得到的每个单词的特征输出/>
Figure BDA0004106940560000116
经过第二线性变换层后得到每个单词属于词表中不同单词的概率/>
Figure BDA0004106940560000117
并经过softmax函数计算后得到其属于词表中不同单词的归一化概率Pg,如式(11)和(12)所示
Figure BDA0004106940560000118
Figure BDA0004106940560000119
其中,Wg表示第二线性变换层的参数,bg表示对应的偏置,m′表示下一个待生成的预测单词,m′i表示该预测单词对应的正确单词的标签信息。
然后,计算代码生成任务的损失函数,如式(13)所示:
Figure BDA0004106940560000121
其中,L2表示代码生成任务中计算得到的损失函数值,M″表示生成的预测单词的个数。
最后,可以根据L2损失函数值调整代码生成层和共享表示层的参数,该过程与相关技术类似,这里不再赘述。
通过上述方式,在代码生成模型的训练过程中,可以迭代地执行代码理解任务和代码生成任务,比如在第一轮迭代中先执行代码理解任务通过L1损失函数值对模型训练,在此过程中只更新模型的共享表示层和代码理解层的参数。随后,在第二轮迭代中执行代码生成任务通过L2损失函数值对模型训练,在此过程中只更新共享表示层和代码生成层的参数。如此循环,直到满足模型训练结束的条件,比如L1损失函数值和L2损失函数值均小于预设阈值等。另外,在整个训练过程中,可以使用梯度下降法对模型相应的参数进行更新,本公开实施例对此不作限定。
下面介绍代码生成模型的应用过程。
在通过上述方式训练得到代码生成模型后,可以对自然语言句子或待补充的程序代码片段进行分词处理,得到待处理分词序列,然后将待处理分词序列输入训练完成的代码生成模型,得到新的目标程序代码。
应当理解的是,在应用阶段,代码生成模型只利用共享表示层和代码生成层来预测目标程序代码中各单词的概率,步骤可以包括:1、对自然语言句子或待补充的程序代码片段进行分词处理,得到待处理分词序列。2、将待处理分词序列输入代码生成模型,经过编码后得到下一个预测单词的特征表示
Figure BDA0004106940560000122
3、将下一个预测单词的特征表示/>
Figure BDA0004106940560000123
送入线性解码层后,再经过softmax函数计算后得到该预测单词在词表中的概率分布Pg′,具体计算过程可以参照公式(11)和(12)。4、在得到概率分布Pg′后,根据概率大小选择待输出的目标预测分词。5、将目标预测分词拼接在待处理分词序列后输入模型,重复执行步骤3和步骤4得到新的预测分词,直接达到预设的最大序列长度或者输出的预测分词为结束符号后停止生成。/>
在一些实施例中,在步骤4中可以选择概率最大的分词作为目标预测分词进行输出。或者,在一些实施例中,为了增加输出的目标预测分词的多样性,可以通过核采样(nucleus sampling)解码算法得到预测单词。
比如,代码生成模型可以用于通过如下方式得到基于目标文本生成的目标程序代码:先基于目标文本确定一预测单词,然后将该预测单词作为初始的目标单词循环执行如下过程:将目标单词拼接在目标文本对应的分词序列中,得到目标分词序列,基于目标分词序列确定多个候选预测单词以及每一候选预测单词在预设词表中的概率,在候选预测单词对应的候选集合中随机选择一单词作为新的目标单词,直到目标分词序列的长度达到预设长度或者目标单词为预设结束符号。其中,候选集合中候选预测单词的概率和大于预设概率。
例如,在得到概率分布Pg′后,首先从概率分布Pg′中选择一个候选集合Vp,使得该候选集合中所有候选预测单词的概率和大于预设概率p,然后对候选集合Vp中的所有候选预测单词的概率进行归一化,并从中随机采样一个单词作为目标单词,计算过程如式(14)所示:
Figure BDA0004106940560000131
其中,x表示预测单词,预设概率p可以根据实际情况设定,比如可以设定为0.95,本公开实施例对此不作限定。
在预测得到一目标单词后,将该目标单词拼接在输入代码生成模型的分词序列后得到目标分词序列再输入代码生成模型,重复执行步骤(3)和步骤(4)预测输出新的目标单词,直到目标分词序列的长度达到预设长度或者输出的目标单词为预设结束符号。其中,预设长度和预设结束符号可以根据实际情况设定,本公开实施例对此不作限定。
例如,参照图6,本公开提供的代码生成方法主要包括数据预处理、模型训练和模型应用三个过程。应当理解的是,该三个过程的具体处理方式可以参照上文,下面作简要说明。首先在数据预处理过程中,可以获取程序代码数据集,然后对程序代码数据集进行数据去噪,并通过BPE(Byte Pair Encoding,字节对编码)分词算法进行词表训练,以得到用于后续分词的词表。之后,通过训练好的词表对去噪后的数据进行分词并拆分成固定长度的序列片段,并将该固定长度的序列片段输入代码生成模型进行训练。在模型训练过程中,基于代码理解任务和代码生成任务对代码生成模型进行训练。在模型应用过程中,对于待补充的程序代码片段,首先进行分词处理得到待处理分词序列,然后将该待处理分词序列输入训练完成的代码生成模型。之后,通过核采样解码算法得到最终的目标程序代码。
由此,可以基于代码理解和代码生成的多任务学习方法训练代码生成模型。其中,代码理解任务一方面可以采用掩码语言模型让模型学习从掩码文本中恢复单词信息,并且掩码单词是随机选择,从而使得模型可以学习到程序代码的基础语法学知识。另一方面,代码理解任务可以让模型学习恢复经掩码处理的函数名和API名称,从而学习函数名与函数体的对应关系等语义知识。在代码生成任务中,可以采用自回归条件语言模型进行训练,即通过上文的信息预测下一个最有可能出现的代码文本符号。由此,训练之后的代码生成模型可以基于待补充的程序代码文本或用于描述代码功能的自然语言文本输出更准确的目标程序代码。
基于同一构思,本公开还提供一种代码生成装置,该装置可以通过软件、硬件或者两者结合的方式成为电子设备的部分或全部。参照图7,该代码生成装置700包括:
获取模块701,用于获取目标文本,所述目标文本为待补充的程序代码文本或用于描述代码功能的自然语言文本;
生成模块702,用于将所述目标文本输入代码生成模型,得到基于所述目标文本生成的目标程序代码,其中,所述代码生成模型由代码理解任务和代码生成任务训练得到,且所述代码理解任务用于所述代码生成模型学习样本程序代码的语法特征和语义特征,所述代码生成任务用于所述代码生成模型学习基于所述样本程序代码生成新的程序代码的过程。
可选地,所述代码生成模型包括代码理解层、代码生成层和共享表示层,所述共享表示层输出的结果用于输入所述代码理解层或所述代码生成层,所述装置700还包括训练模块,用于:
当执行所述代码理解任务时,对所述样本程序代码进行掩码处理,得到掩码序列,将所述掩码序列输入所述代码生成模型,以通过所述共享表示层和所述代码理解层得到第一预测代码,并基于所述第一预测代码调整所述代码理解层和所述共享表示层的参数;
当执行所述代码生成任务时,将所述样本程序代码输入所述代码生成模型,以通过所述共享表示层和所述代码生成层得到第二预测代码,并基于所述代码生成模型输出的结果调整所述代码生成层和所述共享表示层的参数。
可选地,所述训练模块用于:
对所述样本程序代码进行分词处理,得到分词序列;
在所述分词序列中随机选取第一预设比例的第一目标分词,并将所述第一目标分词替换为第一预设掩码符号,得到掩码序列;和/或,
在所述分词序列中随机选取第二预设比例的第二目标分词,并针对每个所述第二目标分词,在剩余分词中随机选取一目标剩余分词,将所述第二目标分词替换为所述目标剩余分词,得到掩码序列,其中所述剩余分词为所述分词序列中除所述第二目标分词外的分词。
可选地,所述训练模块用于:
对所述样本程序代码进行分词处理,得到分词序列;
在所述分词序列中确定用于表征函数名的函数分词,并在所述函数分词中随机选取第三预设比例的目标函数分词,将所述目标函数分词替换为第二预设掩码符号,得到掩码序列;和/或
在所述分词序列中确定用于表征接口名的接口分词,并在所述接口分词中随机选取第四预设比例的目标接口分词,将所述目标接口分词替换为第三预设掩码符号,得到掩码序列。
可选地,所述训练模块用于:
确定所述掩码序列对应的特征向量序列;
针对所述特征向量序列中的每个特征向量,通过所述共享表示层根据所述特征向量序列中位于所述特征向量前后的所有特征向量和注意力机制进行计算,得到中间特征向量;
针对每个所述中间特征向量,通过所述代码理解层根据除所述中间特征向量外的中间特征向量和注意力机制进行注意力计算,得到目标特征向量;
根据所述目标特征向量,得到第一预测程序代码。
可选地,所述训练模块用于:
确定所述样本程序代码对应的特征向量序列,其中所述特征向量序列包括N个特征向量,所述N为正整数;
针对所述特征向量序列中的第i个特征向量,通过所述共享表示层根据所述特征向量序列中位于所述第i个特征向量前后的所有特征向量和注意力机制进行计算,得到第i个中间特征向量,所述i为正整数;
针对第i个所述中间特征向量,通过所述代码生成层根据前序特征向量和注意力机制进行计算,得到目标特征向量,其中所述前序特征向量为在第i个所述中间特征向量之前得到的所有中间特征向量;
根据所述目标特征向量,得到第二预测程序代码。
可选地,所述装置700还包括预处理模块,用于:
获取代码数据集,所述代码数据集包括多个代码文件;
针对每个所述代码文件,执行以下至少一个预处理步骤,得到目标代码数据集:当所述代码文件中字符数占符号总数的比例小于预设字符比例时,将所述代码文件从所述代码数据集中删除;当所述代码文件平均每行代码的字符数大于第一预设阈值时,将所述代码文件从所述代码数据集中删除;当所述代码文件中注释信息的字符数大于第二预设阈值时,将所述代码文件从所述代码数据集中删除;
将所述目标代码数据集中每个所述代码文件对应的程序代码确定为样本程序代码。
可选地,所述代码生成模型用于通过如下方式得到基于所述目标文本生成的目标程序代码:
基于所述目标文本确定一预测单词,并将所述预测单词作为初始的目标单词循环执行如下过程:
将所述目标单词拼接在所述目标文本对应的分词序列中,得到目标分词序列,基于所述目标分词序列确定多个候选预测单词以及每一所述候选预测单词在预设词表中的概率,在所述候选预测单词对应的候选集合中随机选择一单词作为新的目标单词,直到所述目标分词序列的长度达到预设长度或者所述目标单词为预设结束符号;
其中,所述候选集合中所述候选预测单词的概率和大于预设概率。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
基于同一构思,本公开还提供一种非临时性计算机可读介质,其上存储有计算机程序,该程序被处理装置执行时实现上述任一代码生成方法的步骤。
基于同一构思,本公开还提供一种电子设备,包括:
存储装置,其上存储有计算机程序;
处理装置,用于执行所述存储装置中的所述计算机程序,以实现上述任一代码生成方法的步骤。
下面参考图8,其示出了适于用来实现本公开实施例的电子设备800的结构示意图。本公开实施例中的终端设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。图8示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图8所示,电子设备800可以包括处理装置(例如中央处理器、图形处理器等)801,其可以根据存储在只读存储器(ROM)802中的程序或者从存储装置808加载到随机访问存储器(RAM)803中的程序而执行各种适当的动作和处理。在RAM 803中,还存储有电子设备800操作所需的各种程序和数据。处理装置801、ROM 802以及RAM 803通过总线804彼此相连。输入/输出(I/O)接口805也连接至总线804。
通常,以下装置可以连接至I/O接口805:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置806;包括例如液晶显示器(LCD)、扬声器、振动器等的输出装置807;包括例如磁带、硬盘等的存储装置808;以及通信装置809。通信装置809可以允许电子设备800与其他设备进行无线或有线通信以交换数据。虽然图8示出了具有各种装置的电子设备800,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在非暂态计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置809从网络上被下载和安装,或者从存储装置808被安装,或者从ROM 802被安装。在该计算机程序被处理装置801执行时,执行本公开实施例的方法中限定的上述功能。
需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、RF(射频)等等,或者上述的任意合适的组合。
在一些实施方式中,可以利用诸如HTTP(HyperText Transfer Protocol,超文本传输协议)之类的任何当前已知或未来研发的网络协议进行通信,并且可以与任意形式或介质的数字数据通信(例如,通信网络)互连。通信网络的示例包括局域网(“LAN”),广域网(“WAN”),网际网(例如,互联网)以及端对端网络(例如,ad hoc端对端网络),以及任何当前已知或未来研发的网络。
上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。
上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:获取目标文本,所述目标文本包括待补充的程序代码文本或用于描述代码功能的自然语言文本;将所述目标文本输入代码生成模型,得到基于所述目标文本生成的目标程序代码,其中,所述代码生成模型由代码理解任务和代码生成任务训练得到,且所述代码理解任务用于所述代码生成模型学习样本程序代码的语法特征和语义特征,所述代码生成任务用于所述代码生成模型学习基于所述样本程序代码生成新的程序代码的过程。
可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括但不限于面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言——诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)——连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。其中,模块的名称在某种情况下并不构成对该模块本身的限定。
本文中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑设备(CPLD)等等。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的公开范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述公开构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
此外,虽然采用特定次序描绘了各操作,但是这不应当理解为要求这些操作以所示出的特定次序或以顺序次序执行来执行。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实施例中。相反地,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实施例中。
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。

Claims (11)

1.一种代码生成方法,其特征在于,所述方法包括:
获取目标文本,所述目标文本包括待补充的程序代码文本或用于描述代码功能的自然语言文本;
将所述目标文本输入代码生成模型,得到基于所述目标文本生成的目标程序代码,其中,所述代码生成模型由代码理解任务和代码生成任务训练得到,且所述代码理解任务用于所述代码生成模型学习样本程序代码的语法特征和语义特征,所述代码生成任务用于所述代码生成模型学习基于所述样本程序代码生成新的程序代码的过程。
2.根据权利要求1所述的方法,其特征在于,所述代码生成模型包括代码理解层、代码生成层和共享表示层,所述共享表示层输出的结果用于输入所述代码理解层或所述代码生成层,所述代码生成模型的训练步骤包括:
当执行所述代码理解任务时,对所述样本程序代码进行掩码处理,得到掩码序列,将所述掩码序列输入所述代码生成模型,以通过所述共享表示层和所述代码理解层得到第一预测代码,并基于所述第一预测代码调整所述代码理解层和所述共享表示层的参数;
当执行所述代码生成任务时,将所述样本程序代码输入所述代码生成模型,以通过所述共享表示层和所述代码生成层得到第二预测代码,并基于所述代码生成模型输出的结果调整所述代码生成层和所述共享表示层的参数。
3.根据权利要求2所述的方法,其特征在于,所述对所述样本程序代码进行掩码处理,得到掩码序列,包括:
对所述样本程序代码进行分词处理,得到分词序列;
在所述分词序列中随机选取第一预设比例的第一目标分词,并将所述第一目标分词替换为第一预设掩码符号,得到掩码序列;和/或,
在所述分词序列中随机选取第二预设比例的第二目标分词,并针对每个所述第二目标分词,在剩余分词中随机选取一目标剩余分词,将所述第二目标分词替换为所述目标剩余分词,得到掩码序列,其中所述剩余分词为所述分词序列中除所述第二目标分词外的分词。
4.根据权利要求2所述的方法,其特征在于,所述对所述样本程序代码进行掩码处理,得到掩码序列,包括:
对所述样本程序代码进行分词处理,得到分词序列;
在所述分词序列中确定用于表征函数名的函数分词,并在所述函数分词中随机选取第三预设比例的目标函数分词,将所述目标函数分词替换为第二预设掩码符号,得到掩码序列;和/或
在所述分词序列中确定用于表征接口名的接口分词,并在所述接口分词中随机选取第四预设比例的目标接口分词,将所述目标接口分词替换为第三预设掩码符号,得到掩码序列。
5.根据权利要求2-4任一所述的方法,其特征在于,所述将所述掩码序列输入所述代码生成模型,以通过所述共享表示层和所述代码理解层得到第一预测代码,包括:
确定所述掩码序列对应的特征向量序列;
针对所述特征向量序列中的每个特征向量,通过所述共享表示层根据所述特征向量序列中位于所述特征向量前后的所有特征向量和注意力机制进行计算,得到中间特征向量;
针对每个所述中间特征向量,通过所述代码理解层根据除所述中间特征向量外的中间特征向量和注意力机制进行注意力计算,得到目标特征向量;
根据所述目标特征向量,得到第一预测程序代码。
6.根据权利要求2-4任一所述的方法,其特征在于,所述将所述样本程序代码输入所述代码生成模型,以通过所述共享表示层和所述代码生成层得到第二预测代码,包括:
确定所述样本程序代码对应的特征向量序列,其中所述特征向量序列包括N个特征向量,所述N为正整数;
针对所述特征向量序列中的第i个特征向量,通过所述共享表示层根据所述特征向量序列中位于所述第i个特征向量前后的所有特征向量和注意力机制进行计算,得到第i个中间特征向量,所述i为正整数;
针对第i个所述中间特征向量,通过所述代码生成层根据前序特征向量和注意力机制进行计算,得到目标特征向量,其中所述前序特征向量为在第i个所述中间特征向量之前得到的所有中间特征向量;
根据所述目标特征向量,得到第二预测程序代码。
7.根据权利要求1-4任一所述的方法,其特征在于,所述样本程序代码是通过如下方式得到的:
获取代码数据集,所述代码数据集包括多个代码文件;
针对每个所述代码文件,执行以下至少一个预处理步骤,得到训练数据集:当所述代码文件中字符数占符号总数的比例大于或等于预设字符比例时,将所述代码文件加入训练数据集;当所述代码文件平均每行代码的字符数小于或等于第一预设阈值时,将所述代码文件加入训练数据集;当所述代码文件中注释信息的字符数小于或等于第二预设阈值时,将所述代码文件加入训练数据集;
将所述训练数据集中每个所述代码文件对应的程序代码确定为样本程序代码。
8.根据权利要求1-4任一所述的方法,其特征在于,所述代码生成模型用于通过如下方式得到基于所述目标文本生成的目标程序代码:
基于所述目标文本确定一预测单词,并将所述预测单词作为初始的目标单词循环执行如下过程:
将所述目标单词拼接在所述目标文本对应的分词序列中,得到目标分词序列,基于所述目标分词序列确定多个候选预测单词以及每一所述候选预测单词在预设词表中的概率,在所述候选预测单词对应的候选集合中随机选择一单词作为新的目标单词,直到所述目标分词序列的长度达到预设长度或者所述目标单词为预设结束符号;
其中,所述候选集合中所述候选预测单词的概率和大于预设概率。
9.一种代码生成装置,其特征在于,所述装置包括:
获取模块,用于获取目标文本,所述目标文本为待补充的程序代码文本或用于描述代码功能的自然语言文本;
生成模块,用于将所述目标文本输入代码生成模型,得到基于所述目标文本生成的目标程序代码,其中,所述代码生成模型由代码理解任务和代码生成任务训练得到,且所述代码理解任务用于所述代码生成模型学习样本程序代码的语法特征和语义特征,所述代码生成任务用于所述代码生成模型学习基于所述样本程序代码生成新的程序代码的过程。
10.一种非临时性计算机可读介质,其上存储有计算机程序,其特征在于,该程序被处理装置执行时实现权利要求1-8中任一项所述方法的步骤。
11.一种电子设备,其特征在于,包括:
存储装置,其上存储有计算机程序;
处理装置,用于执行所述存储装置中的所述计算机程序,以实现权利要求1-8中任一项所述方法的步骤。
CN202310190548.6A 2023-02-23 2023-02-23 代码生成方法、装置、存储介质及电子设备 Pending CN116166271A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310190548.6A CN116166271A (zh) 2023-02-23 2023-02-23 代码生成方法、装置、存储介质及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310190548.6A CN116166271A (zh) 2023-02-23 2023-02-23 代码生成方法、装置、存储介质及电子设备

Publications (1)

Publication Number Publication Date
CN116166271A true CN116166271A (zh) 2023-05-26

Family

ID=86419885

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310190548.6A Pending CN116166271A (zh) 2023-02-23 2023-02-23 代码生成方法、装置、存储介质及电子设备

Country Status (1)

Country Link
CN (1) CN116166271A (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116578288A (zh) * 2023-05-30 2023-08-11 杭州行至云起科技有限公司 基于逻辑判断的结构化自定义灯效配置方法及其系统
CN116841506A (zh) * 2023-06-30 2023-10-03 北京百度网讯科技有限公司 程序代码生成方法及装置、模型训练方法及装置
CN117648079A (zh) * 2024-01-29 2024-03-05 浙江阿里巴巴机器人有限公司 任务处理、代码补全、代码问答及任务处理模型训练方法
CN117648079B (zh) * 2024-01-29 2024-05-14 浙江阿里巴巴机器人有限公司 任务处理、代码补全、代码问答及任务处理模型训练方法

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116578288A (zh) * 2023-05-30 2023-08-11 杭州行至云起科技有限公司 基于逻辑判断的结构化自定义灯效配置方法及其系统
CN116578288B (zh) * 2023-05-30 2023-11-28 杭州行至云起科技有限公司 基于逻辑判断的结构化自定义灯效配置方法及其系统
CN116841506A (zh) * 2023-06-30 2023-10-03 北京百度网讯科技有限公司 程序代码生成方法及装置、模型训练方法及装置
CN116841506B (zh) * 2023-06-30 2024-05-03 北京百度网讯科技有限公司 程序代码生成方法及装置、模型训练方法及装置
CN117648079A (zh) * 2024-01-29 2024-03-05 浙江阿里巴巴机器人有限公司 任务处理、代码补全、代码问答及任务处理模型训练方法
CN117648079B (zh) * 2024-01-29 2024-05-14 浙江阿里巴巴机器人有限公司 任务处理、代码补全、代码问答及任务处理模型训练方法

Similar Documents

Publication Publication Date Title
CN111274815B (zh) 用于挖掘文本中的实体关注点的方法和装置
CN116166271A (zh) 代码生成方法、装置、存储介质及电子设备
CN113436620B (zh) 语音识别模型的训练方法、语音识别方法、装置、介质及设备
CN112509562B (zh) 用于文本后处理的方法、装置、电子设备和介质
CN112883968B (zh) 图像字符识别方法、装置、介质及电子设备
CN111368551B (zh) 一种确定事件主体的方法和装置
CN113723341B (zh) 视频的识别方法、装置、可读介质和电子设备
CN112200173B (zh) 多网络模型训练方法、图像标注方法和人脸图像识别方法
CN112270200A (zh) 一种文本信息的翻译方法、装置、电子设备和存储介质
CN115908640A (zh) 生成图像的方法、装置、可读介质及电子设备
CN112883967A (zh) 图像字符识别方法、装置、介质及电子设备
CN113591490B (zh) 信息处理方法、装置和电子设备
CN111915689B (zh) 用于生成目标函数的方法、装置、电子设备和计算机可读介质
CN113610228B (zh) 神经网络模型的构建方法及装置
CN115984868A (zh) 文本处理方法、装置、介质及设备
CN111582456B (zh) 用于生成网络模型信息的方法、装置、设备和介质
CN111626044B (zh) 文本生成方法、装置、电子设备及计算机可读存储介质
CN111581455B (zh) 文本生成模型的生成方法、装置和电子设备
CN114429629A (zh) 图像处理方法、装置、可读存储介质及电子设备
CN114765025A (zh) 语音识别模型的生成方法、识别方法、装置、介质及设备
CN113986958A (zh) 文本信息的转换方法、装置、可读介质和电子设备
CN113222050A (zh) 图像分类方法、装置、可读介质及电子设备
CN111814807B (zh) 用于处理图像的方法、装置、电子设备和计算机可读介质
CN116343905B (zh) 蛋白质特征的预处理方法、装置、介质及设备
CN117743555B (zh) 答复决策信息发送方法、装置、设备和计算机可读介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination