本技术涉及软件开发,特别涉及一种基于云服务的代码生成方法及装置。
背景技术:
1、代码生成(code generation)或程序合成(program synthesis)技术,一直是软件工程(software engineering,se)和人工智能(artificial intelligence,ai)领域学术研究中的热点,并且因其巨大的商业价值而备受工业界关注。近两年来,得益于人工智能研究在(natural language processing,nlp)和程序语言处理(programming languageprocessing,plp)方面取得的成果,两个领域技术的结合将代码生成相关技术从学术研究逐步推向实际应用。就目前来看,基于人工智能的代码生成工具作为提高软件开发效率的辅助工具,已经成为近期备受瞩目的人工智能落地应用之一。
2、目前的代码生成技术主要针对行级代码的代码补全(code completion)和生成(code generation),与发展多年的编程环境和工具相比,其仍处于起步阶段,其技术和产品形态仍需要在实践中持续改进。
技术实现思路
1、本技术提供了一种基于云服务的代码生成方法及装置。本技术在生成代码时能够考虑项目级的上下文,有助于提高生成代码的生成效果。本技术提供的技术方案如下:
2、第一方面,本技术提供了一种基于云服务的代码生成方法。该方法可以由云平台执行。该方法包括:接收代码生成请求,代码生成请求用于请求生成编程项目中实现第一方法的第一可执行代码;基于代码生成请求,从编程项目的信息中,获取生成第一可执行代码所需的第一上下文信息;基于第一上下文信息和代码生成请求,生成第一可执行代码。
3、在本技术提供的基于云服务的代码生成方法中,在接收代码生成请求后,能够基于代码生成请求,从编程项目的信息中,获取生成第一可执行代码所需的第一上下文信息;然后,基于第一上下文信息和代码生成请求,生成第一可执行代码。在该基于云服务的代码生成方法中,由于需要先从编程项目的信息中获取生成第一可执行代码所需的第一上下文信息,该第一上下文信息包括来源于整个编程项目的项目级上下文信息,其能够反映代码和编程项目的逻辑结构,使得代码生成过程能够更多地利用实际编程中人类开发者所需的背景知识和编程项目的整体逻辑,因此提高了生成代码的能力,有助于改善代码生成技术的实际使用体验。
4、在本技术中,计算设备可以根据待生成的第一方法的第一上下文信息,生成第一方法的可执行代码。并且,根据前面描述可知,编程项目涉及的层级单元从大到小依次为:编程项目、代码模块、代码包、类和方法,则根据不同的应用需求,第一上下文信息可以在不同层级单元中获取。因此,用户可以通过客户端向计算设备发送范围指示,以指示第一上下文信息的获取范围。则该方法还包括:接收范围指示,范围指示用于指示第一上下文信息的获取范围。相应的,基于代码生成请求,从编程项目的信息中,获取生成第一可执行代码所需的第一上下文信息,包括:当范围指示用于指示第一上下文信息的获取范围为编程项目时,基于代码生成请求,从编程项目的信息中,获取第一上下文信息。
5、当范围指示用于指示第一上下文信息的获取范围为编程项目时,计算设备能够在整个编程项目中获取第一上下文信息。这样一来,计算设备就能够在生成第一可执行代码时,考虑代码和编程项目的逻辑结构,有助于提高代码生成能力。
6、用户可以根据需求指示是否查看获取的第一上下文信息,在用户需要或者不需要查看获取的第一上下文信息时,其可以执行对应的操作以触发预览指示,通过该预览指示向计算设备传达其需求。则该方法还包括:接收预览指示,预览指示用于指示是否预览第一上下文信息;当预览指示用于指示预览第一上下文信息时,显示第一上下文信息;接收指示同意第一上下文信息的同意指示。相应的,基于第一上下文信息和代码生成请求,生成第一可执行代码,包括:在接收到同意指示后,基于第一上下文信息和代码生成请求,生成第一可执行代码。
7、用于实现方法的可执行代码通常保存在源代码文件中,那么第一上下文信息可能包括该第一方法所属的源代码文件中的内容,也可能包括该第一方法所属的源代码文件外的内容,则在获取第一上下文信息时,可以分别从第一方法所属的源代码文件中和源代码文件外获取第一上下文信息。在一种实现方式中,获取生成第一可执行代码所需的第一上下文信息,包括:执行文件外上下文展开和文件内代码重组等处理,根据处理结果获取第一上下文信息。
8、在一种实现方式中,执行文件内代码重组,并根据重组结果获取第一上下文信息的实现过程包括:基于代码生成请求,从编程项目的信息中,获取生成第一可执行代码所需的第一上下文信息,包括:基于代码生成请求,在编程项目的文件中,获取第一方法所属的源代码文件;在源代码文件中,获取撰写位置位于第一方法后的下文信息;将下文信息的撰写位置调整至第一方法之前,使得调整位置后的下文信息成为第一方法的上文信息;基于第一方法的上文信息,获取第一上下文信息。
9、在一种实现方式中,通过文件外上下文展开,并根据展开结果获取第一上下文信息的实现过程包括:基于代码生成请求,在编程项目的文件中,获取第一方法所属的源代码文件;在编程项目的信息中,获取源代码文件使用到的位于源代码文件外的外部信息;在源代码文件中补充外部信息;基于经过补充的源代码文件,获取第一上下文信息。
10、可选的,该方法还可以包括:在编程项目的信息中,获取第一方法有权限访问的权限范围。相应的,在编程项目的信息中,获取源代码文件使用到的位于源代码文件外的外部信息,包括:在权限范围中,获取外部信息。通过在第一方法有权限访问的权限范围内获取外部信息,能够避免向该第一方法中引入第一方法没有权限访问的内容,保证获取的第一上下文信息的效率和有效性。
11、在一种实现方式中,获取第一方法有权限访问的权限范围,包括:基于第一方法在编程项目中的位置、第一方法所属的目标类的访问控制权限、及目标类的层次和引用关系中的至少一个,获取权限范围。其中,第一方法在编程项目中的位置可以通过生成点表示。目标类的层次表示目标类在编程项目的层级单元中的层次。目标类的引用关系表示目标类引用的内容。目标类的访问控制权限可以由开发人员设置,用于限定目标类中可执行代码的访问控制权限。
12、可选的,在基于第一上下文信息和代码生成请求,生成第一可执行代码之前,方法还包括:在第一上下文信息中移除目标信息,得到更新后的第一上下文信息,目标信息包括以下一种或多种:代码注释、变量赋值、方法体和指示代码底层逻辑的信息。
13、这样一来,可以删除第一上下文信息中与生成第一可执行代码无关的信息、涉及隐私的信息和/或敏感信息,从而在第一上下文中保留体现第一上下文中内容的层次结构和签名信息的相关内容。一方面能够达到压缩第一上下文信息的目的,使得在同样的输入长度下能够输入包含更多有价值内容的上下文信息,另一方面还能够保证生成的代码的可用性、用户隐私和代码的安全性。
14、在一种可实现方式中,用户可以根据应用需求,确定是否需要移除第一上下文信息中的目标信息,则该方法还包括:接收移除指示,移除指示用于指示是否移除第一上下文信息中的目标信息。相应的,在第一上下文信息中移除目标信息,得到更新后的第一上下文信息,包括:当移除指示用于指示移除第一上下文信息中的目标信息时,在第一上下文信息中移除目标信息,得到更新后的第一上下文信息。
15、在一种实现方式中,该移除指示可以指示需要执行移除操作,计算设备接收到指示执行移除操作的移除指示时,可以根据预设策略进行信息移除,而无需用户指示需要移除的目标信息的具体类型,即无需指示目标信息为调用方法的实现细节、变量赋值还是代码中包含的敏感信息。在另一种实现方式中,移除指示不仅可以指示需要执行移除操作,还可以指示需要移除的目标信息的具体类型。
16、当使用预训练模型生成第一可执行代码时,在基于第一上下文信息和代码生成请求,生成第一可执行代码之前,还可以对第一上下文信息进行抽象化处理,将第一上下文信息抽象为符合语法的接口声明形式,以达到复用预训练模型在训练过程中学习到的编程语言语法知识的目的。则在基于第一上下文信息和代码生成请求,生成第一可执行代码之前,该方法还包括:将第一上下文信息抽象为接口声明形式,得到更新后的第一上下文信息。
17、当使用代码生成模型生成第一可执行代码时,由于代码生成模型的输入长度有限制,因此在获取第一上下文信息后,还可以对第一上下文信息中的多个内容进行排序,以便于按照排序后的先后顺序向代码生成模型输入第一上下文信息中的多个内容,从而降低与第一方法具有较大的相关性的内容在输入代码生成模型时,因输入长度限制被截断的概率,以便于具有较高重要性的上下文信息能够输入代码生成模型。则在基于第一上下文信息和代码生成请求,生成第一可执行代码之前,该方法还包括:获取第一上下文信息中多个内容与第一方法的相关性;基于多个内容对应的相关性,对多个内容进行排序,得到更新后的第一上下文信息。
18、在一种实现方式中,基于多个内容对应的相关性,对多个内容进行排序,包括:将多个内容排列在第一方法的任务描述之前,且任一内容到任务描述的距离与内容对应的相关性反相关。
19、可选的,获取第一上下文信息中多个内容与第一方法的相关性的实现方式有多种,下面以以下几种实现方式为例对其进行说明。并且,其实现方式可以包括以下一种或多种的组合:获取每个内容的标识符与第一方法的相关信息的第一相似度,第一相似度与相关性正相关;获取每个内容与第一方法在编程项目中层次的距离,距离与相关性反相关;获取每个内容与第一方法的关联内容调用的上下文信息的第二相似度,第二相似度与相关性正相关,第一方法的关联内容包括以下一种或多种:第一方法所属的目标类的关联类,目标类中其它方法。
20、其中,标识符包括以下一种或多种:变量名、方法名、包名、类名和常量名。相关信息包括以下一种或多种:方法描述、方法名、返回类型和参数类型。
21、在一种实现方式中,在基于代码生成请求,从编程项目的信息中,获取生成第一可执行代码所需的第一上下文信息之前,还方法还包括:生成编程项目的逻辑结构图,逻辑结构图用于指示编程项目中各项内容的关联关系。相应的,基于代码生成请求,从编程项目的信息中,获取生成第一可执行代码所需的第一上下文信息,包括:基于代码生成请求对逻辑结构图进行分析,从编程项目的信息中,获取生成第一可执行代码所需的第一上下文信息。
22、可选的,基于第一上下文信息和代码生成请求,生成第一可执行代码,包括:将第一上下文信息和代码生成请求输入预训练模型,得到预训练模型输出的第一可执行代码。
23、则在基于第一上下文信息和代码生成请求,生成第一可执行代码之前,该方法还包括:获取已成功编译的编程项目中实现第二方法的第二可执行代码;获取第二可执行代码的第二上下文信息;将第二上下文信息作为待训练模型的输入,将第二可执行代码作为待训练模型的期望输出,对待训练模型进行训练,得到预训练模型。
24、可选地,当第二方法有方法注释时,待训练模型的输入还可以包括方法注释。类似地,当第二方法有方法签名时,待训练模型的输入还可以包括方法签名。其中,方法签名用于指示方法的使用方式。
25、在一种实现方式中,获取已成功编译的编程项目中实现第二方法的第二可执行代码,包括:获取已成功编译的编程项目中的所有第二方法;对所有第二方法进行筛选,得到通过筛选的第二方法,通过筛选的第二方法用于表达运算逻辑;获取实现通过筛选的第二方法的第二可执行代码。
26、其中,未通过筛选的第二方法具有以下一种或多种特点:第二方法的方法体为空,第二方法具有特殊用途,第二方法的方法体不包括运算表达式。例如,特殊用途包括以下一种或多种:获取、设置、构造和返回。
27、可选地,上下文信息为执行任务所需要的相关信息。在一种实现方式中,上下文信息包括以下一种或多种:已定义的类、变量和方法的功能、访问权限以及调用方式。通过获取第一上下文信息,并基于第一上下文信息生成第一可执行代码,能够复用编程项目中已定义的类、变量和方法的功能、访问权限以及调用方式,简化了生成第一可执行代码的复杂度,有助于提高代码生成能力。
28、第二方面,本技术提供了一种基于云服务的代码生成装置,配置于云平台,该基于云服务的代码生成装置包括:接收模块,用于接收代码生成请求,代码生成请求用于请求生成编程项目中实现第一方法的第一可执行代码;第一获取模块,用于基于代码生成请求,从编程项目的信息中,获取生成第一可执行代码所需的第一上下文信息;生成模块,用于基于第一上下文信息和代码生成请求,生成第一可执行代码。
29、可选的,接收模块,还用于接收范围指示,范围指示用于指示第一上下文信息的获取范围;第一获取模块,具体用于:当范围指示用于指示第一上下文信息的获取范围为编程项目时,基于代码生成请求,从编程项目的信息中,获取第一上下文信息。
30、可选的,接收模块,还用于接收预览指示,预览指示用于指示是否预览第一上下文信息;该基于云服务的代码生成装置还包括:显示模块,用于当预览指示用于指示预览第一上下文信息时,显示第一上下文信息;接收模块,还用于接收指示同意第一上下文信息的同意指示;生成模块,具体用于:在接收到同意指示后,基于第一上下文信息和代码生成请求,生成第一可执行代码。
31、可选的,第一获取模块,具体用于:基于代码生成请求,在编程项目的文件中,获取第一方法所属的源代码文件;在编程项目的信息中,获取源代码文件使用到的位于源代码文件外的外部信息;在源代码文件中补充外部信息;基于经过补充的源代码文件,获取第一上下文信息。
32、可选的,第一获取模块,具体用于:在编程项目的信息中,获取第一方法有权限访问的权限范围;在权限范围中,获取外部信息。
33、可选的,第一获取模块,具体用于:基于第一方法在编程项目中的位置、第一方法所属的目标类的访问控制权限、及目标类的层次和引用关系中的至少一个,获取权限范围。
34、可选的,第一获取模块,还用于:在第一上下文信息中移除目标信息,得到更新后的第一上下文信息,目标信息包括以下一种或多种:代码注释、变量赋值、方法体和指示代码底层逻辑的信息。
35、可选的,接收模块,还用于接收移除指示,移除指示用于指示是否移除第一上下文信息中的目标信息;第一获取模块,具体用于:当移除指示用于指示移除第一上下文信息中的目标信息时,在第一上下文信息中移除目标信息,得到更新后的第一上下文信息。
36、可选的,第一获取模块,还用于:将第一上下文信息抽象为接口声明形式,得到更新后的第一上下文信息。
37、可选的,第一获取模块,具体用于:基于代码生成请求,在编程项目的文件中,获取第一方法所属的源代码文件;在源代码文件中,获取撰写位置位于第一方法后的下文信息;将下文信息的撰写位置调整至第一方法之前,使得调整位置后的下文信息成为第一方法的上文信息;基于第一方法的上文信息,获取第一上下文信息。
38、可选的,第一获取模块,还用于:获取第一上下文信息中多个内容与第一方法的相关性;基于多个内容对应的相关性,对多个内容进行排序,得到更新后的第一上下文信息。
39、可选的,第一获取模块,具体用于:将多个内容排列在第一方法的任务描述之前,且任一内容到任务描述的距离与内容对应的相关性反相关。
40、可选的,获取第一上下文信息中多个内容与第一方法的相关性,包括以下一种或多种的组合:获取每个内容的标识符与第一方法的相关信息的第一相似度,第一相似度与相关性正相关;获取每个内容与第一方法在编程项目中层次的距离,距离与相关性反相关;获取每个内容与第一方法的关联内容调用的上下文信息的第二相似度,第二相似度与相关性正相关,第一方法的关联内容包括以下一种或多种:第一方法所属的目标类的关联类,目标类中其它方法。
41、可选的,标识符包括以下一种或多种:变量名、方法名、包名、类名和常量名。
42、可选的,相关信息包括以下一种或多种:方法描述、方法名、返回类型和参数类型。
43、可选的,第一获取模块,还用于:生成编程项目的逻辑结构图,逻辑结构图用于指示编程项目中各项内容的关联关系;第一获取模块,具体用于:基于代码生成请求对逻辑结构图进行分析,从编程项目的信息中,获取生成第一可执行代码所需的第一上下文信息。
44、可选的,生成模块,具体用于:将第一上下文信息和代码生成请求输入预训练模型,得到预训练模型输出的第一可执行代码。
45、可选的,该基于云服务的代码生成装置还包括:第二获取模块,用于获取已成功编译的编程项目中实现第二方法的第二可执行代码;第三获取模块,用于获取第二可执行代码的第二上下文信息;训练模块,用于将第二上下文信息作为待训练模型的输入,将第二可执行代码作为待训练模型的期望输出,对待训练模型进行训练,得到预训练模型。
46、可选的,待训练模型的输入还包括以下一种或多种:第二方法的方法注释和方法签名。
47、可选的,第二获取模块,具体用于:获取已成功编译的编程项目中的所有第二方法;对所有第二方法进行筛选,得到通过筛选的第二方法,通过筛选的第二方法用于表达运算逻辑;
48、获取实现通过筛选的第二方法的第二可执行代码。
49、可选的,未通过筛选的第二方法具有以下一种或多种特点:第二方法的方法体为空,第二方法具有特殊用途,第二方法的方法体不包括运算表达式。
50、可选的,特殊用途包括以下一种或多种:获取、设置、构造和返回。
51、可选的,上下文信息包括以下一种或多种:已定义的类、变量和方法的功能、访问权限以及调用方式。
52、第三方面,本技术提供了一种计算设备,包括存储器和处理器,存储器存储有程序指令,处理器运行程序指令以执行本技术第一方面以及其任一种可能的实现方式中提供的方法。
53、第四方面,本技术提供了一种计算设备集群,包括至少一个计算设备,每个计算设备包括处理器和存储器,至少一个计算设备的处理器用于执行至少一个计算设备的存储器中存储的指令,以使得计算设备集群执行本技术第一方面以及其任一种可能的实现方式中提供的方法。
54、第五方面,本技术提供了一种计算机可读存储介质,该计算机可读存储介质为非易失性计算机可读存储介质,该计算机可读存储介质包括程序指令,当程序指令在计算设备上运行时,使得计算设备执行本技术第一方面以及其任一种可能的实现方式中提供的方法。
55、第六方面,本技术提供了一种包含指令的计算机程序产品,当计算机程序产品在计算机上运行时,使得计算机执行本技术第一方面以及其任一种可能的实现方式中提供的方法。
1.一种基于云服务的代码生成方法,其特征在于,由云平台执行,所述方法包括:
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
3.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:
4.根据权利要求1至3任一所述的方法,其特征在于,所述基于所述代码生成请求,从所述编程项目的信息中,获取生成所述第一可执行代码所需的第一上下文信息,包括:
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
6.根据权利要求5所述的方法,其特征在于,所述在所述编程项目的信息中,获取所述第一方法有权限访问的权限范围,包括:
7.根据权利要求1至6任一所述的方法,其特征在于,在所述基于所述第一上下文信息和所述代码生成请求,生成所述第一可执行代码之前,所述方法还包括:
8.根据权利要求7所述的方法,其特征在于,所述方法还包括:
9.根据权利要求1至8任一所述的方法,其特征在于,在所述基于所述第一上下文信息和所述代码生成请求,生成所述第一可执行代码之前,所述方法还包括:
10.根据权利要求1至9任一所述的方法,其特征在于,所述基于所述代码生成请求,从所述编程项目的信息中,获取生成所述第一可执行代码所需的第一上下文信息,包括:
11.根据权利要求1至10任一所述的方法,其特征在于,在所述基于所述第一上下文信息和所述代码生成请求,生成所述第一可执行代码之前,所述方法还包括:
12.根据权利要求11所述的方法,其特征在于,所述基于所述多个内容对应的相关性,对所述多个内容进行排序,包括:
13.根据权利要求11或12所述的方法,其特征在于,所述获取所述第一上下文信息中多个内容与所述第一方法的相关性,包括以下一种或多种的组合:
14.根据权利要求13所述的方法,其特征在于,所述标识符包括以下一种或多种:变量名、方法名、包名、类名和常量名。
15.根据权利要求13所述的方法,其特征在于,所述相关信息包括以下一种或多种:方法描述、方法名、返回类型和参数类型。
16.根据权利要求1至15任一所述的方法,其特征在于,在所述基于所述代码生成请求,从所述编程项目的信息中,获取生成所述第一可执行代码所需的第一上下文信息之前,所述方法还包括:
17.根据权利要求1至16任一所述的方法,其特征在于,所述基于所述第一上下文信息和所述代码生成请求,生成所述第一可执行代码,包括:
18.根据权利要求17所述的方法,其特征在于,在所述基于所述第一上下文信息和所述代码生成请求,生成所述第一可执行代码之前,所述方法还包括:
19.根据权利要求18所述的方法,其特征在于,所述待训练模型的输入还包括以下一种或多种:所述第二方法的方法注释和方法签名。
20.根据权利要求18所述的方法,其特征在于,所述获取已成功编译的编程项目中实现第二方法的第二可执行代码,包括:
21.根据权利要求20所述的方法,其特征在于,未通过筛选的第二方法具有以下一种或多种特点:所述第二方法的方法体为空,所述第二方法具有特殊用途,所述第二方法的方法体不包括运算表达式。
22.根据权利要求21所述的方法,其特征在于,所述特殊用途包括以下一种或多种:获取、设置、构造和返回。
23.根据权利要求1至22任一所述的方法,其特征在于,所述上下文信息包括以下一种或多种:已定义的类、变量和方法的功能、访问权限以及调用方式。
24.一种基于云服务的代码生成装置,其特征在于,配置于云平台,所述装置包括:
25.根据权利要求24所述的装置,其特征在于,
26.根据权利要求24或25所述的装置,其特征在于,
27.根据权利要求24至26任一所述的装置,其特征在于,所述第一获取模块,具体用于:
28.根据权利要求27所述的装置,其特征在于,所述第一获取模块,具体用于:
29.根据权利要求28所述的装置,其特征在于,所述第一获取模块,具体用于:
30.根据权利要求24至29任一所述的装置,其特征在于,
31.根据权利要求30所述的装置,其特征在于,
32.根据权利要求24至31任一所述的装置,其特征在于,
33.根据权利要求24至32任一所述的装置,其特征在于,所述第一获取模块,具体用于:
34.根据权利要求24至33任一所述的装置,其特征在于,所述第一获取模块,还用于:
35.根据权利要求34所述的装置,其特征在于,
36.根据权利要求34或35所述的装置,其特征在于,所述获取所述第一上下文信息中多个内容与所述第一方法的相关性,包括以下一种或多种的组合:
37.根据权利要求36所述的装置,其特征在于,所述标识符包括以下一种或多种:变量名、方法名、包名、类名和常量名。
38.根据权利要求36所述的装置,其特征在于,所述相关信息包括以下一种或多种:方法描述、方法名、返回类型和参数类型。
39.根据权利要求24至38任一所述的装置,其特征在于,
40.根据权利要求24至39任一所述的装置,其特征在于,
41.根据权利要求40所述的装置,其特征在于,所述装置还包括:
42.根据权利要求41所述的装置,其特征在于,所述待训练模型的输入还包括以下一种或多种:所述第二方法的方法注释和方法签名。
43.根据权利要求41所述的装置,其特征在于,所述第二获取模块,具体用于:
44.根据权利要求43所述的装置,其特征在于,未通过筛选的第二方法具有以下一种或多种特点:所述第二方法的方法体为空,所述第二方法具有特殊用途,所述第二方法的方法体不包括运算表达式。
45.根据权利要求44所述的装置,其特征在于,所述特殊用途包括以下一种或多种:获取、设置、构造和返回。
46.根据权利要求24至45任一所述的装置,其特征在于,所述上下文信息包括以下一种或多种:已定义的类、变量和方法的功能、访问权限以及调用方式。
47.一种计算设备集群,其特征在于,包括至少一个计算设备,每个计算设备包括处理器和存储器,所述至少一个计算设备的处理器用于执行所述至少一个计算设备的存储器中存储的指令,以使得所述计算设备集群执行如权利要求1至23任一项所述的方法。
48.一种包含指令的计算机程序产品,其特征在于,当所述指令被计算设备集群运行时,使得所述计算设备集群执行如权利要求1至23任一项所述的方法。
49.一种计算机可读存储介质,其特征在于,包括计算机程序指令,当所述计算机程序指令由计算设备集群执行时,所述计算设备集群执行如权利要求1至23任一项所述的方法。