基于大型预训练模型AI链的控制流图生成方法及系统

未命名 10-19 阅读:117 评论:0

基于大型预训练模型ai链的控制流图生成方法及系统
技术领域
1.本发明涉及人工智能领域,具体的说,是涉及一种基于大型预训练模型ai链的控制流图生成方法及系统。


背景技术:

2.控制流图是软件工程中的基石,用于展示程序中语句的执行顺序和执行条件,对于诸如代码搜索、代码克隆检测和代码分类等任务至关重要。这些应用程序有助于提高代码质量和软件性能,凸显了控制流图在软件工程领域的重要作用。
3.在使用java这种静态类型编程语言进行开发时,通常会采用基于字节码的方法,如soot和wala,将java源代码编译成字节码形式。然后,通过对字节码进行分析和转换,生成java代码的控制流图。然而,当java代码存在显性语法错误时,字节码方法无法成功编译代码,因此无法生成控制流图。为了解决这个问题,开发人员可以使用基于抽象语法树(ast)的方法,直接从源代码生成控制流图,无需进行中间代码的转换。
4.尽管基于ast遍历的方法可以揭示代码的结构和控制流,但在构建ast的过程中,明显的语法错误会导致生成的控制流图出现行为丢失,即缺少节点和边。此外,即使修复了明显的语法错误,不良的编程实践可能导致ast遍历方法生成的控制流图存在行为偏差。不良的编程习惯指的是程序员粗心大意或意外违反编码规范,导致隐含语义错误的出现,其语义与开发者的初衷不同。这种隐含语义错误在语法上是正确的,因此静态分析方法很难准确捕捉到这些错误,导致生成的控制流图出现行为偏差。


技术实现要素:

5.针对上述现有技术中的不足,本发明提供一种防止生成的控制流图出现行为偏差,提高生成控制流图准确性的基于大型预训练模型ai链的控制流图生成方法及系统。
6.本发明所采取的技术方案是:第一方面,提供一种基于大型预训练模型ai链的控制流图生成方法,将源代码视为自然语言,并利用其上下文理解和常识推理能力来捕获程序员预期的语义信息;将控制流图生成任务分解为多个子任务。
7.这些子任务将按照一定的结构链接形成一个ai链,逐步与llm交互;以缓解直接使用大型预训练语言模型llm的不确定性、错误响应和幻觉问题;采用正则表达式确定输入的嵌套代码块的控制流类型,根据控制流类型从已写好的prompt模板中选择对应的prompt,根据代码的控制流类型选择对应的prompt确保生成的控制流图的准确性。
8.第二方面,提供一种基于大型预训练模型ai链的控制流图生成方法,所述方法包括:s100,开始;s110,对java代码进行结构层次提取,所述结构层次提取是指提取所述java代码
的嵌套级别;s120,提取每一层嵌套结构中的嵌套代码块,基于所述提取出来的嵌套级别,得到所述每一层嵌套级别对应的代码块;s130,对代码中的嵌套代码块进行掩码替换操作;s140,判定是否java代码中的所有嵌套代码块都被掩码,java代码中不存在嵌套代码块则跳转步骤s150,进入检索prompt示例步骤,否则跳转步骤s120,进入根据代码层次结构提取嵌套代码块步骤;s150,根据嵌套代码块的控制流类型,检索对应的prompt示例;判断是否所有嵌套代码块都被掩码的条件是当代码中的所有的嵌套代码块都被占位符替换掉后,即认为所有的嵌套代码块都被掩码,即已经提取出了代码中所有的嵌套代码块。这时就可以进行下一步操作。在进行代码掩码操作的时候,会根据上一步“根据代码层次结构提取嵌套代码块”提取出来的嵌套代码块跟输入到“根据代码层次结构提取嵌套代码块”步骤的代码进行字符串匹配,当匹配到了对应的嵌套代码块,即进行掩码操作(即代码中可能还存在嵌套代码块,好需要进行迭代循环),若匹配失败,则认为代码中不包含有嵌套代码块,可以进入到“检索prompt示例”步骤。
9.s160,生成所述嵌套代码块的控制流图;s170,将所有的嵌套代码块的控制流图融合在一起,形成最后的整个java代码的控制流图;s180,结束。
10.在所有步骤中,因为只要涉及到使用llm(大模型)的步骤(对应系统中的ai模块)都需要编写prompt,prompt即提示,用来提示llm完成对应的任务。这里采用prompt检索示例操作,是根据嵌套代码块的类型来选择对应的prompt,例如:嵌套代码块的控制流类型是“if
”ꢀ
即选择控制流类型为“if”的prompt用来提示llm。
11.第三方面,提供一种基于大型预训练模型ai链的控制流图生成方法,得到java代码嵌套结构的步骤包括:调用模型的api接口来获得所述java代码的嵌套级别。
12.第四方面,提供一种基于大型预训练模型ai链的控制流图生成方法,得到每一层嵌套级别对应的代码块的过程包括:调用模型的api接口获得所述嵌套代码块;将所述java源代码中包含的提取的所述嵌套代码块用一个指定的占位符替换;重复执行所述嵌套代码块提取的过程,直至所有的嵌套级别的代码块都被提取。
13.第五方面,提供一种基于大型预训练模型ai链的控制流图生成方法,得到所述嵌套代码块的对应的prompt示例的步骤包括:使用正则表达式匹配的方式确定嵌套代码块的控制流类型。
14.在prompt知识库中进行匹配与嵌套代码块相同类型的五个prompt 示例。
15.第六方面,提供一种基于大型预训练模型ai链的控制流图生成方法,得到所述嵌套代码块的cfg的步骤包括:调用模型的api接口来获得所述嵌套代码块的控制流图;控制流图采用graphviz的python代码形式进行表示。
16.第七方面,提供一种基于大型预训练模型ai链的控制流图生成方法,得到整个java代码的cfg的步骤包括:调用模型的api接口来获得所述java代码的控制流图;控制流图采用graphviz的python代码形式进行表示。
17.第八方面,提供一种基于大型预训练模型ai链的静态类型代码的控制流图生成系统,包括:代码提取器模块和控制流图生成器模块;代码结构提取器模块与控制流图生成器模块连接;代码结构提取器模块,用于提取所述java代码的元结构,并根据元结构提取出所述java代码的多个嵌套代码块;控制流图生成器模块,用于生成所述java代码的所有嵌套代码块的控制流图,将所述的嵌套代码块的控制流图融合成为完整的控制流图。
18.第九方面,提供一种基于大型预训练模型ai链的静态类型代码的控制流图生成系统,所述代码结构提取器模块包括:层次结构提取ai模块、嵌套代码块提取ai模块和嵌套代码块掩码非ai模块;所述层次结构提取ai模块,通过利用大型预训练模型的上下文学习能力,提取出代码的嵌套结构;所述嵌套代码块提取ai模块,通过利用大型预训练模型的上下文学习能力,并利用所述代码嵌套结构,提取出每一层嵌套结构对应的嵌套代码块;所述嵌套代码块掩码非ai模块,用于将所述提取的嵌套代码块在源java代码中替换为指定的占位符。
19.第十方面,提供一种基于大型预训练模型ai链的静态类型代码的控制流图生成系统,所述控制流图生成器模块包括:嵌套代码块的控制流图生成ai模块、prompt示例检索非ai模块和图融合ai模块;嵌套代码块的控制流图生成ai模块,通过利用大型预训练模型的上下文学习能力,生成所述嵌套代码块的控制流图的graphviz的python代码表示;prompt示例检索非ai模块,使用正则表达式匹配所述嵌套代码块的控制流类型,基于所述控制流类型,选择对应的prompt模板;图融合ai模块,通过利用llm的上下文学习能力,融合所有的嵌套代码块的控制流图,生成所述源java代码的完整控制流图。
20.第十一方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述基于大型预训练模型ai链的控制流图生成方法。
21.本发明相对现有技术的有益效果:本发明基于大型预训练模型ai链的控制流图生成方法及系统,通过利用llm的上下文学习能力来克服传统静态分析方法在生成java代码的控制流图的挑战;llm可以容忍包含显示语法错误的代码并检测隐性语义错误;防止生成的控制流图出现行为偏差,提高生成控制流图准确性。
22.本发明基于大型预训练模型ai链的控制流图生成方法及系统,通过模拟人类的思
维过程,将任务分解为单个责任的子问题,并构建功能模块。这些模块以串行、并行或分拆合并的结构连接起来,与llm建立多轮交互,逐步解决问题。
23.本发明基于大型预训练模型ai链的控制流图生成方法及系统,使用gpt3.5作为底层的llm,这种方法不同于微调llm,后者需要在数据收集、预处理、注释和模型训练等方面付出大量的努力。
附图说明
24.图1为本发明实施例中的基于大型预训练模型的静态类型代码的控制流图生成方法流程图;图2为本发明实施例中结构层次提取的prompt设计图;图3为本发明实施例中嵌套代码块提取的prompt设计图;图4为本发明实施例中嵌套代码块cfg生成的prompt设计图;图5为本发明实施例中图融合的prompt设计图;图6为本发明实施例中基于大型预训练模型的静态类型代码的控制流图生成系统示意图。
具体实施方式
25.以下参照附图及实施例对本发明进行详细的说明:注意,下文出现的英文缩写术语在此提供对应的英文全程、中文译文以及中文专业术语的详细解释。
26.cfg:control flow graph,控制流图,程序分析中的概念,用于描述程序执行流程的有向图。
27.llm:large language model,大型预训练语言模型,人工智能领域的概念,在大规模语料库以上以自监督方式进行预训练的语言模型。
28.ai:artificial intelligence,人工智能,是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术学科。
实施例1
29.图1为根据本发明实施例用于建立java代码cfg的方法的流程图;如图1所示,所述方法包括:对java代码进行结构层次提取,所述结构层次提取是指提取所述java代码的嵌套级别。
30.提取每一层嵌套结构中的嵌套代码块,基于所述提取出来的嵌套级别,得到所述每一层嵌套级别对应的代码块。
31.对所述代码进行掩码操作,得到被掩码后的代码。
32.根据所述嵌套代码块的类型检索prompt示例。
33.生成所述嵌套代码块的cfg。
34.将所述的嵌套代码块的cfg融合在一起,形成最后的整个java代码的cfg。
35.具体地,在对java代码进行结构层次提取的过程中,为了提示llm执行此任务,使
用了一个prompt通用模板,如图2所示,输入为java代码,输出为代码的嵌套级别。prompt主要由两部分组分组成:任务描述和5个示例。其中任务描述为“analyze and format the following java
…”
同时,为了llm的提高嵌套级别的识别能力,任务描述还包括六种常见类型的控制流代码块,例如“class”声明、“method”声明、“if”语句、“while”、“for”语句和“switch”语句。在五个示例中,每个示例都由两部分组成:java代码和代码的结构层次。其中代码的嵌套结构层次采用一种简单的缩进方式来代表控制流语句的作用域。
36.具体地,在提取每一层嵌套代码块的过程中,为了提示llm执行此任务,使用了一个prompt通用模板,如图3所示,输入为java代码和上一个步骤输出的代码嵌套级别,输出为最里层嵌套结构的嵌套代码块。prompt主要由两部分组分组成:任务描述和5个示例。其中任务描述为“extract the nested code block according to code structure
…”
,每个示例由三部分组成:java代码、代码的嵌套结构和最里层嵌套结构对应的嵌套代码块。
37.具体地,代码掩码替换的过程中,将上一步提取出来的嵌套代码块与java代码进行匹配,将在java代码中匹配到的嵌套代码块使用一个特殊的占位符“string block=

block1
’”
进行替换。
38.具体地,当代码掩码替换过程中没有匹配到相同的嵌套代码块,则认为java代码中的嵌套代码块已全部提取出来,则生成嵌套代码块的cfg。否则,继续迭代根据代码层次结构提取嵌套代码块并进行代码掩码替换操作。
39.具体地,检索prompt示例过程中,具体来说,为六种嵌套代码块(即class_block、method_block、while_block、if_block、switch_block和for_block)中的每一种提前准备了五个原子示例。这些示例构成了本发明的知识库。然后,当给定一个嵌套代码块,使用正则表达式匹配的方式确定输入的嵌套代码块的控制流类型,根据控制类型在现有知识库中匹配与嵌套代码块相同类型的五个示例。
40.具体地,生成所述嵌套代码块的cfg的过程中,为了提示llm执行此任务,使用了一个prompt通用模板,如图4所示,输入为上一步骤提取的嵌套代码块,输出为嵌套代码对的cfg。其中,输出的cfg使用graphviz的python代码表示其节点和边。prompt主要由两部分组分组成:任务描述和5个示例。其中任务描述为“convert the following code to a control flow graph(cfg )”。每个示例由两部分组成:嵌套代码块和嵌套代码块的cfg。
41.具体地,融合所有嵌套代码块的cfg的过程中,为了提示llm执行此任务,使用了一个prompt通用模板,如图5所示,输入为上一步骤生成的所有嵌套代码块的cfg和源java代码,输出为源java代码完整的cfg。prompt主要由两部分组分组成:任务描述和5个示例。其中任务描述为“please create a complete control flow graph of the code
…”
。通过提供llm嵌套代码块的cfg,它可以学习模仿给定示例的行为特征,并为给定代码生成完整而准确的cfg。
42.综上,本发明使用ai链替代传统的静态分析方法应用于cfg构建过程,克服传统方法面对代码中的显性语法错误和隐性语义错误的挑战,生成更加完备的cfg。
实施例2
43.本发明提供了一种用于建立cfg的系统,如图6所示,所述cgf生成系统包括:代码结构提取器模块和cfg生成器模块。
44.具体地,所述代码结构提取器模块,用于提取所述java代码的元结构,并根据元结构提取出java代码的多个嵌套代码块。
45.具体地,将所述代码结构提取器模块分为若干基于llm推理的ai模块和遵循明确定义规则或逻辑的非ai模块。其中,ai模块包括:层次结构提取ai模块,被配置为通过利用llm的上下文学习能力,提取出代码的嵌套结构,并用于指导下一个ai模块;嵌套代码块的cfg生成ai模块,被配置为通过利用llm的上下文学习能力,根据上一个ai模块提取的代码嵌套结构,提取出最内层嵌套结构对应的嵌套代码块;嵌套代码块掩码非ai模块,被配置为将所述提取的嵌套代码块在源java代码中替换为指定的占位符。在所述代码结构提取器模块中输入为需要转换的java源代码,并迭代地调用三个模块,不断提取java代码最内层结构的嵌套代码块,并进行掩码操作,直至提取出java源代码所有结构层次对应的嵌套代码块。
46.具体地,所述cfg生成器模块,用于生成所述java代码的所有嵌套代码块的cfg,将所述的嵌套代码块的cfg融合成为完整的cfg。
47.具体地,所述cfg生成器模块包括:嵌套代码块的cfg生成ai单元,被配置为通过利用llm的上下文学习能力,生成所述嵌套代码块的cfg的graphviz的python代码表示;prompt示例检索非ai模块,被配置为根据嵌套代码块的控制流类型,从知识库中选择对应的prompt示例;图融合ai模块,被配置为通过利用llm的上下文学习能力,融合所有的嵌套代码块的cfg,生成源java代码的完整的cfg。在所述cfg生成器模块中输入为所有的嵌套代码块,并通过迭代调用嵌套代码块的cfg生成ai模块和prompt示例检索非ai模块,为每一个嵌套代码块生成对应的cfg。最后将生成的所有嵌套代码块的cfg输入到图融合ai模块,生成最终的完整而准确的cfg。
48.综上,本发明提供了各个方面的方案,其使用ai链替代传统的静态分析方法应用于控制流图构建过程。克服传统方法面对代码中的显性语法错误和隐性语义错误的挑战,生成更加完备的cfg。
49.本发明基于大型预训练模型ai链的控制流图生成方法及系统,通过利用llm的上下文学习能力来克服传统静态分析方法在生成java代码的控制流图的挑战;llm可以容忍包含显示语法错误的代码并检测隐性语义错误。
50.本发明基于大型预训练模型ai链的控制流图生成方法及系统,通过模拟人类的思维过程,将任务分解为单个责任的子问题,并构建功能模块。这些模块以串行、并行或分拆合并的结构连接起来,与llm建立多轮交互,逐步解决问题。
51.本发明基于大型预训练模型ai链的控制流图生成方法及系统,使用gpt3.5作为底层的llm,这种方法不同于微调llm,后者需要在数据收集、预处理、注释和模型训练等方面付出大量的努力。
52.以上所述,仅是本发明的较佳实施例而已,并非对本发明的结构作任何形式上的限制。凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均属于本发明的技术方案范围内。

技术特征:
1.一种基于大型预训练模型ai链的控制流图生成方法,其特征在于,将源代码视为自然语言,并利用其上下文理解和常识推理能力来捕获程序员预期的语义信息;将控制流图生成任务分解为多个子任务,并为每个子任务设计合适的prompt模板;这些子任务将按照一定的结构链接形成一个ai链,逐步与llm交互;采用正则表达式确定输入的嵌套代码块的控制流类型,根据控制流类型从prompt模板中选择对应的prompt,根据代码的控制流类型选择对应的prompt确保生成的控制流图的准确性。2.一种基于大型预训练模型ai链的控制流图生成方法,其特征在于,所述方法包括:s100,开始;s110,对java代码进行结构层次提取,所述结构层次提取是指提取所述java代码的嵌套级别;s120,提取每一层嵌套结构中的嵌套代码块,基于所述提取出来的嵌套级别,得到所述每一层嵌套级别对应的代码块;s130,对代码中的嵌套代码块进行掩码替换操作;s140,判定是否java代码中的所有嵌套代码块都被掩码,java代码中不存在嵌套代码块则跳转步骤s150,进入检索prompt示例步骤,否则跳转步骤s120,进入根据代码层次结构提取嵌套代码块步骤;s150,根据嵌套代码块的控制流类型,检索对应的prompt示例;s160,生成所述嵌套代码块的控制流图;s170,将所有的嵌套代码块的控制流图融合在一起,形成最后的整个java代码的控制流图;s180,结束。3.根据权利要求2所述基于大型预训练模型ai链的控制流图生成方法,其特征在于:得到java代码嵌套结构的步骤包括:调用模型的api接口来获得所述java代码的嵌套级别。4.根据权利要求2所述基于大型预训练模型ai链的控制流图生成方法,其特征在于:得到每一层嵌套级别对应的代码块的过程包括:调用模型的api接口获得所述嵌套代码块;将所述java源代码中包含的提取的所述嵌套代码块用一个指定的占位符替换;重复执行所述嵌套代码块提取的过程,直至所有的嵌套级别的代码块都被提取。5.根据权利要求2所述基于大型预训练模型ai链的控制流图生成方法,其特征在于:得到所述嵌套代码块的cfg的步骤包括:调用模型的api接口来获得所述嵌套代码块的控制流图;控制流图采用graphviz的python代码形式进行表示。6.根据权利要求2所述基于大型预训练模型ai链的控制流图生成方法,其特征在于,得到整个java代码的cfg的步骤包括:调用模型的api接口来获得所述java代码的控制流图;控制流图采用graphviz的python代码形式进行表示。
7.一种基于大型预训练模型ai链的静态类型代码的控制流图生成系统,其特征在于,包括:代码提取器模块和控制流图生成器模块;代码结构提取器模块与控制流图生成器模块连接;代码结构提取器模块,用于提取所述java代码的元结构,并根据元结构提取出所述java代码的多个嵌套代码块;控制流图生成器模块,用于生成所述java代码的所有嵌套代码块的控制流图,将所述的嵌套代码块的控制流图融合成为完整的控制流图。8.根据权利要求7所述基于大型预训练模型ai链的静态类型代码的控制流图生成系统,其特征在于:所述代码结构提取器模块包括:层次结构提取ai模块、嵌套代码块提取ai模块和嵌套代码块掩码非ai模块;所述层次结构提取ai模块,通过利用大型预训练模型的上下文学习能力,提取出代码的嵌套结构;所述嵌套代码块提取ai模块,通过利用大型预训练模型的上下文学习能力,并利用所述代码嵌套结构,提取出每一层嵌套结构对应的嵌套代码块;所述嵌套代码块掩码非ai模块,用于将所述提取的嵌套代码块在源java代码中替换为指定的占位符。9.根据权利要求7所述基于大型预训练模型ai链的静态类型代码的控制流图生成系统,其特征在于:所述控制流图生成器模块包括:嵌套代码块的控制流图生成ai模块、prompt示例检索非ai模块和图融合ai模块;嵌套代码块的控制流图生成ai模块,通过利用大型预训练模型的上下文学习能力,生成所述嵌套代码块的控制流图的graphviz的python代码表示;prompt示例检索非ai模块,使用正则表达式匹配所述嵌套代码块的控制流类型,基于所述控制流类型,选择对应的prompt模板;图融合ai模块,通过利用llm的上下文学习能力,融合所有的嵌套代码块的控制流图,生成所述源java代码的完整控制流图。10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至6任意一项所述基于大型预训练模型ai链的控制流图生成方法。

技术总结
本发明涉及人工智能领域,提供一种基于大型预训练模型AI链的控制流图生成方法及系统,对Java代码进行结构层次提取,结构层次提取是指提取所述Java代码的嵌套级别;提取每一层嵌套结构中的嵌套代码块,基于所述提取出来的嵌套级别,得到所述每一层嵌套级别对应的代码块;生成所述嵌套代码块的控制流图;将嵌套代码块的控制流图融合在一起,形成最后的整个Java代码的控制流图。本发明通过利用LLM的上下文学习能力来克服传统静态分析方法在生成Java代码的控制流图的挑战;LLM可以容忍包含显示语法错误的代码并检测隐性语义错误;防止生成的控制流图出现行为偏差,提高生成控制流图准确性。图准确性。图准确性。


技术研发人员:黄箐 邹舟 左正康 邢振昌 曾锦山 王昌晶
受保护的技术使用者:江西师范大学
技术研发日:2023.06.14
技术公布日:2023/9/23
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐