一种检索增强的结构化代码生成系统及方法
未命名
10-25
阅读:63
评论:0
1.本发明涉及软件开发技术领域,尤其涉及一种检索增强的结构化代码生成系统及方法。
背景技术:
2.程序作为人类与计算机沟通的桥梁,其编写方式自计算机诞生以来就不断迭代更新直至现在。软件开发人员在编写程序的过程中有两种情景最为常见,一是编写重复且技术含量较低的代码;二是通过查阅学习编写能够实现新功能的代码。事实上,这两种情形都能够通过智能化代码生成技术进行解决。智能化代码生成是指根据开发人员利用自然语言直接描述的程序功能,使用特定手段让机器自行生成对应功能的代码的过程。
3.代码生成早期的工作大多是基于专家编写的规则来实现的,这样的做法泛化性差,且耗费人力资源巨大,因此并没有得到广泛的传播与应用。随着机器学习和深度学习的发展,智能化代码生成应运而生。目前,使用神经网络来完成从自然语言到代码的转换已经成为了代码生成任务研究的一项基本范式,展现出了其可行性和有效性。预训练模型是对传统神经网络的又一次革新,采用在大规模无标注数据上进行预训练,再在下游任务的高质量数据集上进行调优,从而使得结果显著提高。然而目前的趋势是将模型的规模不断扩大,从而在原有任务上取得更加优异的效果,甚至收获更多不曾设想而涌现出的能力。尽管智能化代码生成领域的预训练模型已经取得了非常先进的性能,它们仍然面临着资源与性能之间权衡的问题。如何在现有的模型上进行改进取得接近更大模型的性能成为当前代码生成任务最严峻的挑战之一。
4.已有的智能化代码生成模型一般采用神经网络来学习自然语言描述到代码片段的映射,这样学习到的知识大多隐含在模型的参数中。虽然使用预训练-调优范式能够一定程度上让有限参数的模型学习到更多的知识并应用于下游任务,但是模型的参数量决定了其在代码生成任务上性能的上限。另一方面,预训练模型调优的过程资源消耗巨大。事实上,模型在调优完成后知识量随着参数的更新结束而固定。如果后续有新的知识补充进来,模型就需要再次调优更新参数从而学习到新的知识。对于代码更新速度快的情形,往往已有的训练好的代码生成模型无法对其进行快速适配,从而也很难获得模型性能的持续提高。
技术实现要素:
5.本发明提供了一种检索增强的结构化代码生成系统,包括检索前处理模块、结构信息提取模块和代码生成融合模块,所述检索前处理模块根据自然语言描述来检索到功能相关的代码片段;所述结构信息提取模块对所述检索前处理模块检索到的代码片段进行结构信息的提取;所述代码生成融合模块将输入的自然语言和代码片段进行融合,完成代码生成任
务。
6.作为本发明的进一步改进,所述检索前处理模块通过代码检索方法和自然语言匹配方法检索到与输入自然语言最相近的多条候选代码作为检索结果。
7.作为本发明的进一步改进,所述代码检索方法采用codebert模型,在获取到预训练好的codebert模型后,将其在代码生成任务数据集上进行调优,使用调优后的codebert模型可以对输入的自然语言描述和待检索数据库中的代码分别进行编码得到固定长度的向量,通过对向量进行内积相似度计算得到前k个相似的候选代码。
8.作为本发明的进一步改进,在所述检索前处理模块中,离线使用调优后的codebert模型对所有待检索数据库中的代码进行编码和保存。
9.作为本发明的进一步改进,所述自然语言匹配方法采用bm25算法,使用bm25算法对输入的自然语言描述和待检索数据库中的代码对应的自然语言进行相似度检测,得到前k个相似的自然语言描述,将其作为索引,得到对应的k个相似的候选代码。
10.作为本发明的进一步改进,使用代码检索方法得到的最相似的一条候选代码和使用自然语言匹配方法得到的最相似的一条候选代码作为最终检索前处理模块的结果。
11.作为本发明的进一步改进,所述结构信息提取模块对每一段代码都提取出其唯一对应的抽象语法树,随后将抽象语法树作为图结构输入到图神经网络中进行消息传递和聚合,得到代码片段的结构信息。
12.作为本发明的进一步改进,将检索到的代码与原有的自然语言输入进行拼接输入到所述代码生成融合模块的编码器中得到嵌入向量表示,再将其与结构信息提取模块得到的向量进行拼接,输入到所述代码生成融合模块的解码器中完成代码生成任务。
13.本发明还提供了一种检索增强的结构化代码生成方法,包括如下步骤:步骤1:将检索前处理模块返回的检索结果直接拼接在原始自然语言输入之后,并使用分隔符将其隔开作为最终的输入,所述检索结果是检索前处理模块根据自然语言描述来检索到功能相关的代码片段;步骤2:将步骤1得到的输入经过代码生成融合模块的编码器得到固定长度的向量;步骤3:将结构信息模块提取出的向量与步骤2中获得的向量直接进行拼接,输入到代码生成融合模块的解码器中完成代码生成过程。
14.作为本发明的进一步改进,所述代码生成融合模块为codet5模型。
15.本发明的有益效果是:本发明在不改变原有模型规模的条件下,增强其泛化性,提升代码生成的能力。
附图说明
16.图1是本发明的方法流程图。
实施方式
17.本发明公开了一种检索增强的结构化代码生成系统,结构化代码生成系统也可以称为结构化代码生成模型,简称模型。结构化代码生成系统包括检索前处理模块、结构信息提取模块和代码生成融合模块。
18.智能化代码生成任务的数据一般由《自然语言描述,代码片段》构成,自然语言描述是模型的输入,代码片段是模型的输出。为了保证模型在训练与推理过程中模型接收信息的一致性,检索前处理模块主要根据自然语言描述来检索到功能相关的代码片段,这个过程可以看作是代码搜索。与此同时,由于代码生成任务的数据具备代码搜索任务不具备的《key-value》属性,因此检索前处理模型可以分为代码检索方法与自然语言匹配方法的结合,即,所述检索前处理模块通过代码检索方法和自然语言匹配方法检索到与输入自然语言最相近的多条候选代码(例如,两条候选代码)作为检索结果。
19.作为本发明的优选方案,所述代码检索方法采用codebert模型,在获取到预训练好的codebert模型后,将其在代码生成任务数据集上进行调优,使用调优后的codebert模型可以对输入的自然语言描述和待检索数据库中的代码分别进行编码得到固定长度的向量,通过对向量进行内积相似度计算得到前k个相似的候选代码。为了节省推理速度,可以离线使用调优后的codebert模型对所有待检索数据库中的代码进行编码和保存。
20.作为本发明的优选方案,所述自然语言匹配方法采用bm25算法,由于代码生成数据集的构成大多为《自然语言描述,代码片段》这样《key-value》的形式,同时考虑到使用同一个codebert可能会由于自然语言描述和代码片段之间的差异造成检索得到的结果较差。因此这里使用bm25对输入的自然语言描述和待检索数据库中的代码对应的自然语言进行相似度检测,得到前k个相似的自然语言描述,将其作为索引,得到对应的k个相似的候选代码。
21.本发明使用代码检索方法得到的最相似的一条候选代码和使用自然语言匹配方法得到的最相似的一条候选代码作为最终检索前处理模块的结果。
22.检索前处理模块的结果本质上是两条与输入文本最接近的代码片段,因此可以认为这两条数据在语法和语义上都非常接近最终要生成的代码。
23.因此所述结构信息提取模块对所述检索前处理模块检索到的两条候选代码进行结构信息的提取,便于其能够更好的作为辅助信息帮助生成质量更高的代码。
24.为获取代码的结构信息,所述结构信息提取模块对每一段代码都提取出其唯一对应的抽象语法树(ast),随后将抽象语法树作为图结构输入到图神经网络中进行消息传递和聚合,这个过程可以被视作对于ast的编码过程,最终的结果是固定长度的两条向量,其蕴含着检索所得到的两份代码片段的结构信息。
25.本发明的最终目的是生成符合自然语言描述功能的代码片段,代码生成融合模块本质上是一个生成器,将原有输入和检索结果进行融合,来更好地完成代码生成任务。在本发明中,代码生成融合模块使用的是codet5模型,也可以根据下面的具体描述更换为其他的transformer类模型,同样适用。
26.作为本发明的优选实施例,将检索到的代码与原有的自然语言输入进行拼接输入到所述代码生成融合模块的编码器中得到嵌入向量表示,再将其与结构信息提取模块得到的向量进行拼接,输入到所述代码生成融合模块的解码器中完成代码生成任务。
27.为了使得发明的模型在训练和推理阶段之间的差异尽可能缩小,模型在训练和推理过程中接收到的输入信息是一致的。如图1所示,本发明公开了一种检索增强的结构化代码生成方法,包括如下步骤:步骤1:将检索前处理模块返回的检索结果(例如,2条检索结果)直接拼接在原始
自然语言输入之后,并使用特殊分隔符[sep]将其隔开作为最终的模型输入,所述检索结果是检索前处理模块根据自然语言描述来检索到功能相关的代码片段。
[0028]
步骤2:将步骤1得到的输入经过代码生成融合模块的编码器得到固定长度的向量。
[0029]
步骤3:将结构信息模块提取出的向量与步骤2中获得的向量直接进行拼接,输入到代码生成融合模块的解码器中完成代码生成过程。
[0030]
本发明在不改变原有模型规模的条件下,增强其泛化性,提升代码生成的能力。
[0031]
以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。
技术特征:
1.一种检索增强的结构化代码生成系统,其特征在于:包括检索前处理模块、结构信息提取模块和代码生成融合模块,所述检索前处理模块根据自然语言描述来检索到功能相关的代码片段;所述结构信息提取模块对所述检索前处理模块检索到的代码片段进行结构信息的提取;所述代码生成融合模块将输入的自然语言和代码片段进行融合,完成代码生成任务。2.根据权利要求1所述的结构化代码生成系统,其特征在于:所述检索前处理模块通过代码检索方法和自然语言匹配方法检索到与输入自然语言最相近的多条候选代码作为检索结果。3.根据权利要求2所述的结构化代码生成系统,其特征在于:所述代码检索方法采用codebert模型,在获取到预训练好的codebert模型后,将其在代码生成任务数据集上进行调优,使用调优后的codebert模型可以对输入的自然语言描述和待检索数据库中的代码分别进行编码得到固定长度的向量,通过对向量进行内积相似度计算得到前k个相似的候选代码。4.根据权利要求3所述的结构化代码生成系统,其特征在于:在所述检索前处理模块中,离线使用调优后的codebert模型对所有待检索数据库中的代码进行编码和保存。5.根据权利要求2所述的结构化代码生成系统,其特征在于:所述自然语言匹配方法采用bm25算法,使用bm25算法对输入的自然语言描述和待检索数据库中的代码对应的自然语言进行相似度检测,得到前k个相似的自然语言描述,将其作为索引,得到对应的k个相似的候选代码。6.根据权利要求2所述的结构化代码生成系统,其特征在于:使用代码检索方法得到的最相似的一条候选代码和使用自然语言匹配方法得到的最相似的一条候选代码作为最终检索前处理模块的结果。7.根据权利要求1所述的结构化代码生成系统,其特征在于:所述结构信息提取模块对每一段代码都提取出其唯一对应的抽象语法树,随后将抽象语法树作为图结构输入到图神经网络中进行消息传递和聚合,得到代码片段的结构信息。8.根据权利要求1所述的结构化代码生成系统,其特征在于:将检索到的代码与原有的自然语言输入进行拼接输入到所述代码生成融合模块的编码器中得到嵌入向量表示,再将其与结构信息提取模块得到的向量进行拼接,输入到所述代码生成融合模块的解码器中完成代码生成任务。9.一种检索增强的结构化代码生成方法,其特征在于,包括如下步骤:步骤1:将检索前处理模块返回的检索结果直接拼接在原始自然语言输入之后,并使用分隔符将其隔开作为最终的输入,所述检索结果是检索前处理模块根据自然语言描述来检索到功能相关的代码片段;步骤2:将步骤1得到的输入经过代码生成融合模块的编码器得到固定长度的向量;步骤3:将结构信息模块提取出的向量与步骤2中获得的向量直接进行拼接,输入到代码生成融合模块的解码器中完成代码生成过程。10.根据权利要求9所述的结构化代码生成方法,其特征在于:所述代码生成融合模块为codet5模型。
技术总结
本发明提供了一种检索增强的结构化代码生成系统及方法,该结构化代码生成系统包括检索前处理模块、结构信息提取模块和代码生成融合模块,所述检索前处理模块根据自然语言描述来检索到功能相关的代码片段;所述结构信息提取模块对所述检索前处理模块检索到的代码片段进行结构信息的提取;所述代码生成融合模块将输入的自然语言和代码片段进行融合,完成代码生成任务。本发明的有益效果是:本发明在不改变原有模型规模的条件下,增强其泛化性,提升代码生成的能力。升代码生成的能力。升代码生成的能力。
技术研发人员:徐国爱 高翠芸 杨泽洲 廖清 刘川意 顾钊铨 陈思榕
受保护的技术使用者:哈尔滨工业大学(深圳)(哈尔滨工业大学深圳科技创新研究院)
技术研发日:2023.09.08
技术公布日:2023/10/20
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
航空商城 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/