ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

领域知识的重要性:使用修复模板改进修复Python类型错误的提示

领域知识的重要性:使用修复模板改进修复Python类型错误的提示 : with Fix for Typeof , China引用Yun Peng, Gao, Gao, Huo,以及R. Lyu.: 2023年, 针对类型2有修复措施。论文摘要怎样利用领域知识去自动改进提示从而解决类型错误, 这是一个充满挑战性且还未被充分探索的问题, 我们提出了一种方法, 这方法新颖且基于提示, 它结合修复模板来修复类型错误, 首先借助一种新颖的层次聚类算法挖掘出通用的修复模板, 这些被识别出的修复模板表明了现有类型错误修复的常见编辑模式与上下文, 之后通过把这样的通用修复模板当作领域知识, 为预训练的代码模型生成代码提示。1 引言近年来, 在多数人工智能以及数据科学应用里头, 它得到了广泛运用, 所以变得极其流行, 它采用动态类型系统, 在这个系统里, 变量的类型仅在运行的时候才确定, 然而, 问题在于, 更多的类型错误将会在运行时出现, 对应用程序的可靠性构成威胁, 又到了近年来, 基于学习这样一种方式的自动程序修复方法的, 也就是APR方法, 变得相当流行, 还特别强大, 这是因为它们不依赖于特定的特征, 并且能够自动地去学习, 并且有着从现有的错误修复当中生成补丁的能力, 而且不需要明确定义出相关合成规则。于基于学习的办法里, 往昔常常运用基于神经机器翻译 NMT 的途径, 把错误代码行转译为正确的代码行。近来, 有人提出了首个基于提示的APR方法, 称作这个, 且取得了最优性能。然而, 鉴于类型错误的层级各异以及类型错误修复模式的多样, 自动把提示跟领域知识相融合是一项难题。为进行针对上述挑战的应对, 我们提出了, 一种借助提示的领域感知办法用以修复类型错误。我们具体的贡献内容如下:2 方法含有两个主要的阶段, 一个是模板挖掘的阶段, 另一个是补丁生成的阶段, 它们的概述正如图1所展示的那样。图 1的概览2.1 模板挖掘阶段模板挖掘阶段, 主要是涵盖两个阶段的, 一个是修复解析阶段, 另一个是修复模板挖掘阶段。修复解析这个阶段, 其目的在于把那种类型错误的修复转变为特定样子的修复模板。而修复模板挖掘阶段, 则是借助被提起的层次聚类算法, 将解析出来的特定修复模板进行抽象处理并且合并成通用的修复模板。2.1.1 修复模板的定义我们认定, 把修复模板定义成由三个部分组合而成的情况, 这三个部分当中包括修复模式, 还包括内部上下文, 另外也涵盖外部上下文, 这三个部分全部都是依据下面所定义的模板树来予以表示的。定义 2.1.1.1模板树模板树呈现为一种树形结构, 此结构由N,E,rt所构成, 其中那N, 是节点的集合, 另外的E, 是边的集合, 再就是rt它属于N, 而rt是根节点。我们依据 的抽象语法树AST去定义模板树, 在维持原始 AST 节点类型 t 的情形下, 我们借助把所有原始 AST 节点类型以及属性类型重新归类为八个基类型的方式, 来增添一个基类型 bt。定义 2.1.1.2修复模式有种模式叫修复模式, 它是一种映射, 这种映射是这样的, 存在一个东西, 它是错误代码的模板树, 还有另一个东西, 它是修复后代码的模板树。定义 2.1.1.3内部上下文### 第一小句, 内部上下文是一个对 (, rn)。### 第二小句阐述 是谁, 其中 是这样的, 即它是包含修复模式的最深语句的模板树。### 第三小句阐述 rn 是什么, 这里的 rn 是将 n 映射到 (br, ar) 的映射, 其中 br 和 ar 是边关系, 且此处的 n 属于.N。### 第四小句阐述映射作用相关解释部分内容, 有这样一个映射, 它指示了从 此为错误代码的模板树中被移除的节点。### 第五小句阐述映射作用具体说完整体的话来是, 还有这个映射, 它说明了在 此为修复后代码的模板树中被添加的节点。定义 2.1.1.4外部上下文外部上下文是一种存在, 它是针对特定的一对内容, 这对内容里, 其中一个是内部上下文之前语句所对应的模板树, 另一个则是内部上下文之后语句所对应的模板树, 是这样的一种情况。定义 2.1.1.5修复模板用于修复的具有的模板, 它属于一种三元组, 这个三元组包含修复模式, 还包含内部上下文, 另外还包含外部上下文。我们根据修复模式P将修复模板分为四类Add: ∅⋀ ≠ ∅: ≠ ∅⋀ ∅: ≠ ∅⋀ ≠ ∅⋀ ⊂: ≠ ∅⋀ ≠ ∅⋀ ⊈2.1.2 修复解析修复解析这个行动开展的时候, 将会把所有类型的错误, 针对存在的这些错误进行修复解析, 把它变成特定的修复模板, 关于如此这般事情, 图2给出了一个示例用来作出说明。图 2一个针对 fix :的修复解析过程的示例。解析修复模式以及内部上下文, 给定一个修复提交, 先提取所有添加语句的行信息, 再提取所有删除语句的行信息, 而后遍历错误代码的抽象语法树, 接着遍历修复后代码的抽象语法树来构建模板树, 为了处理不同级别的编辑, 定位包含修改行的最深语句级别的AST节点, 从错误代码中提取相应的子树, 从修复后代码中提取相应的子树, 然后, 修剪两者中共有的相同子树, 仅留下变化的部分。由于经过修剪之后的, 并且仅仅涵盖编辑部分的, 能够检查编辑究竟是处在表达式层面还是语句层面。要是, 并且共享相同的根节点, 那就判定编辑并未重写整个语句, 所以它属于表达式级别。不然的话, 能够判定编辑是语句级别的。对于语句级别的编辑, 其内部上下文为空。对于表达式级别的编辑, 要通过提取两者共有的相同节点来创建内部上下文。借此形成一个新的模板树。并从此中减去构建成修复模式中的部分, 构建修复模式中的剩余部分。内部上下文中连接特定部分与修复模式中特定部分的边的关系, 也要记录在内部上下文中。将位于内部上下文作用域之外, 却与修复模式有着直接数据依赖关系的语句, 识别为外部上下文。具体来讲, 它会抽取在内部上下文之前, 以及之后, 和修复模式共享相同变量的语句, 来分别进行构建。为了让修复模板的抽象进程得以简化, 还会对其中不含有共享变量的子树进行修剪。2.1.3 修复模板挖掘。于修复模板挖掘进程里, 借由层次聚类把特定的修复模板予以抽象并合并成普遍的修复模板, 每一回均会抽象或者合并两个最为相似的修复模板, 且将从具体至一般的修复模板构建成聚类树, 我们界定了两种相似度度量, 分别是值距离与结构距离。定义 2.1.3.1 (修复模板距离)。修复中的模板里, 存在两个这样的模板树, 树之间的值距离dp , 以及结构距离 sdp, 按此情况来定义为:于此处, Num(t)用以表示模板树t里的节点数量, 并且, (VMp)以及(TMp)被予以定义为:定义 2.1.3.2 (上下文距离)。上下文中两个模板树之间的值距离dc和结构距离sdc定义为在这里, MAXa,b,c会对集合a与b里的元素实施配对操作, 进而找出这些配对能够达成的最高相似度c, 随后返回配对的数量。Num(t)用以表示模板树t之中的节点数量, 而(t)返回的是一个模板树t的叶节点集合。(VMc)以及(TMc)被确定为:模板是抽象的, 并非对整个修复模板进行一次性抽象, 而是每次仅抽象一个组件, 这个组件可以是修复模式, 也可以是内部上下文, 或者是外部上下文。通过一个名为“”的过程来对两个相似的组件加以抽象。图3正式展示了在修复模式下执行“”过程的方法。图4正式展示了在上下文中执行“”过程的方法。图 3修复模版的抽象过程上述自顶向下以及自底向上之类的方法, 分别被修复模式与上下文的抽象所遵循。一般而言, 于从两个彼此相似的模板树里对模板节点a以及b进行抽象之时, 或许会存在下面这四种情形:有着相同的节点, 其中a与b是完全一样的, 它们能够被留存于泛化而来的修复模板当中。• 值抽象: a与b有着相同的类型, 然而值却不一样。去创建一个具备相同类型的节点, 且把值设定成一个特殊的ABS标记, 以此来指示一个占位符hole。对于类型抽象这一情况, 有着这样的表述, a和b具备相同的基类型, 然而却有着不同的类型或者不同的值, 去创建一个拥有相同基类型的节点, 并且要把类型以及值都设定为一个特殊的ABS标记, 以此来指示一个占位符。• 节点移除a和b没有共同的属性。 直接移除这两个节点。在类型进行抽象之际, 会修剪所有子节点, 于节点移除之时亦是如此, 这是因为AST节点类型一旦发生改变, 其原始子节点的功能便会失效。凭借层次聚类展开修复模板的挖掘, 借助上述所讲的相似度度量以及抽象过程, 挑选出相似的修复模板, 经由层次聚类把它们予以合并从而构建聚类树 , 我们对于聚类树的定义是这样子的。图 4内部和外部上下文的抽象过程定义 2.1.3.3聚类树聚类树是这样一个树, 它是T,E,rt, 其中啊, T是修复模板集合, E是边, rt。T是根修复模板。边是一个对t,其中修复模板的父节点表示t是直接从抽象出来的。以确保领域知识的损失达到最少的程度, 在挖掘的进程当中, 遵循着两种策略。 其中首先这一情况而言, 在挑选组件对着手开展抽象操作的时候, 遵循“外部上下文 内部上下文 修复模式”这样的一种优先级别的顺序。 而其次的这一情况来说, 优先实施的是值方面的抽象, 而非类型方面的抽象。我们展示了的层次聚类算法算法1。2.2 补丁生成阶段补丁生成阶段主要涵盖两个过程, 其一为修复模板匹配, 其二是基于提示的补丁生成。2.2.1 修复模板匹配进行修复模板匹配时, 借由广度优先搜索即BFS, 于聚类树上挑选匹配的修复模板, 之后依据频率以及抽象比例, 针对修复模板予以排名。选中修复模板, 已知其针对一个有错误纳入其中的程序, 会把出现错误的那一行解析成一棵模板树, 还会把错误行之前以及之后的上下文各自解析成模板树, 会拿这三元组, 也就是错误行解析出的模板树、错误行前的上下文解析出的模板树、错误行后的上下文解析出的模板树, 与聚类树里的修复模板作比较, 以此来寻觅恰当的修复模板。定义 2.2.1.1模板节点匹配有两个模板节点, 分别是a和b , 要是a.value与b.value相匹配 , 而且(a.t,a.bt) 和b.t,b.bt相匹配, 那么a就匹配b。a.value匹配b.value如果b.valueABSa.valueb.value。当a.bt等于b.bt的时候, (a.t,a.bt)与b.t,b.bt相匹配, 对吧。(a.btb.ta.tb.t)。定义2.2.1.2模板树匹配对于两个模板树A和B如果A中存在一个节点aA.N使得a与B的根节点B.rt匹配并且存在节点映射定义 2.2.1.3修复模板匹配对于一个由、和构成的包含错误的程序, 以及一个由P、IC和EC组成的修复模板, 要是错误程序跟修复模板匹配, 那就得满足这些条件: (错误前的上下文模板树)跟EC.(修复模板的错误前上下文模板树)匹配, (错误后的上下文模板树)和EC.修复模板的错误后上下文模板树匹配, 而且错误行模板树与 (IC.,P.,IC.rn)匹配。当中, 可以这么说, (a,brn)代表着把模板树b连接于模板树a之上, 借助边(n,b.rt,rn.br)来达成, 这里面的n是才新添加的边的标识b.rt乃b的的根节点, rn.br可为n所对应的边界条件。按照上述规则, 由每个聚类树的根修复模板也就是最通用的修复模板起始, 借由广度优先搜索BFS去遍历聚类树, 直至寻觅到与错误程序相匹配的最深修复模板即最具体的修复模板。这些修复模板会被收集起来, 用以在接下来的步骤里进行排名。施行修复模板之排序, 于将该修复模板应用于陷于错误之程序以前, 会针对其做排序处理。为了于补丁生成之行径里去给预先训练之模型予以最多的领域方面之知识, 运用了两步的策略借以来就修复模板优先开展排序。对可提供相同错误模式不同修复方案的修复模板展开分组, 条件是它们具有同连接模板树。在同一组中之修复模版, 依所代表训练实例数量排序, 因数量多意味着于给定错误程序更频繁用此修复模板。接着, 按照每个组首个修复模板的抽象比率给组排序。模板树抽象比率乃指节点值或类型为ABS标记节点之比率。所谓的抽象比率要是越高, 那就表明跟它相关联的领域知识越稀少, 所以呢, 预训练的代码模型在生成完整的候选补丁以前, 是需要去预测更多信息的。2.2.2 基于提示的补丁生成。于这个进程里, 对修复模板予以排序接着应用到错误程序从而生成代码提示, 之后调用模型去填充代码提示里的掩码进而生成候选补丁。应用修复模板, 对于每一个选定的修复模板, 通过添加虚拟AST节点, 也就是值为ABS标记的AST节点, 作为占位符来完成其修复模式中的操作, 因为在修复模板挖掘过程中移除了一些子AST节点, 然后, 把错误程序中匹配的子树AST替换为完成的, 并且将修改后的错误程序AST转换为代码提示, 代码提示是包含ABS标记作为掩码的源代码, 这些掩码将由预训练的代码模型进行预测。生成补丁, 众多预训练的代码模型, 皆被训练用以预测源代码里的掩码, 所以它们自然而然能够用于预测代码提示中ABS标记的值。于本文之中, 我们挑选作为补丁生成进程里的预训练代码模型。在生成补丁之时, 会把代码提示中的ABS标记替换为中所运用的有序掩码标记, 接着调用去预测每个掩码的标记。把掩码的预测值填充至代码提示内以生成候选补丁。验证补丁, 在补丁产生过程之中, 运用经典的那种生成与验证方式, 对于生成出来的补丁而言, 先是把那些含有语法差错的补丁过滤掉, 接着针对每个补丁运行测试系列来寻觅合理的补丁, 更进一步的是, 合理的补丁会被作者予以检查从而辨认出正确的补丁。3 实验设计3.1 数据集从其中筛选出8,722个携带“fix type error”术语存在着合并动作的拉取请求, 在对一些过长涉及提交的部分予以剔除之后, 从中提炼出了10,981个属于修复类的代码, 借助这样的方式来构成训练集。两个基准测试集被我们使用了, 并且我们还在这两个基准测试集中, 移除了重复的类型错误, 也就是具有相同提交签名的类型错误, 最终, 从中得到了54个类型错误, 从中得到了109个类型错误。3.2 基线模型我们将与以下四个基线模型进行比较3.3 评估指标我们运用了在前期工作当中常常被使用到的准确并恰当的指标, 去测定于修复类型有误范畴内的效能如何。另外, 我们增添了一个全新的叫作模板覆盖率的指标, 此模板覆盖率被确定的含义是, 开发者给出针对bug的补全内容同某个方法的用以修复操作的模板相契合的bug在所占占比。表1, 和三个基线方法相比较而言, 其评估结果是以“/”这种格式来呈现的。修复率, 也就是正确补丁所占的比例。3.4 实现整个框架是以实现用途构建的, 代码行数超出一万行。关于PyTER以及相关部分, 我们径直采用了作者所发布的复现代码包。我们运用原始训练集以及自行收集的训练集展开训练, 目的在于适配修复类型错误这一情况。鉴于Codex不对公众开放, 我们借助所提供的code--002的公共API, 通过提示来查询它。4 评估在本节中我们将评估在以下三个研究问题上的性能4.1 RQ1:的有效性以评估于修复类型错误范畴内的有效性为目的, 我们针对基于规则的 APR 方法以及基于学习的 APR 方法展开了比较。表 1 呈现出了基准方法在两个基准测试集之上的性能, 还有其他相关情况。和基于学习方式的对比之下, 能够从表1那里看得出, Codex以及的呈现通常来讲要远远优于, 一旦对以及借由普遍领域没有关联提示模板的二者开展比较的时候, 我们能够发觉修复率相较于来说高出1至4倍。除此之外, 图5采用维恩图的形式, 展示了三种基于学习的方法, 在其中能够正确修复的仅仅专属的类型错误, 在里面。图 5基于学习的自动程序修复方法提供的正确补丁的韦恩图针对RQ1的回答在分别的两个基准测试里, 相较于当下最为先进的办法, 修复了更多的漏洞, 与此同时, 于这两个进行的基准测试当中, 得到了数量最多的独特类型错误修复状况, 这证实了在针对修复类型错误这一方面所具备的有效性。表2, 呈现的是, 与PyTER之间, 唯一类型错误修复数量的对比, 以及模板覆盖率的对照。表 3 中修复模板挖掘的统计信息。表 4消融实验结果。4.2 RQ2的模板挖掘能力为了全方位开展针对挖掘修复模板能力的调查, 我们留意于模板挖掘期间的性能状况, 以及所挖掘出的修复模板的可用性。性能在修复模板挖掘过程中, 是由表3展示出来的。模板覆盖率是和PyTER所实现的, 由表2展示出来的。其目的在于对挖掘出的修复模板怎样助力补丁生成进程做进一步探究, 为此, 我们针对每个类别下的修复模板开展了消融研究, 表4呈现出了相应结果。针对RQ2的回答有两个基准测试, 在这里面都达成了大概75%的模板覆盖率, 不止如此, 消融研究得出的结果, 也证实了挖掘到的修复模板, 于每个类别之下的有用之处。4.3 RQ3:的局限性首先, 存在这么一个局限性, 那就是有时候没办法给当下处于错误状态的程序寻找到相匹配的修复模板。其次, 这个局限性能够借助让其适应全新的代码模式予以缓解。其次一个缘由为, 被运用的模型, 有的时候, 就算给出了无误的修复模板, 仍旧没办法生成精准的补丁。那种局限性能够借由运用更为先进的预训练代码模型予以缓和。针对RQ3的回答有时候, 没办法去修复类型方面的错误, 而且, 在大概25%所占有的情形状况下, 挖掘出来的要修复的模板没办法覆盖到。5 相关工作5.1 自动程序修复大多数APR方法可以归类为基于规则的方法和基于学习的方法。依赖规矩的方式: 借助有规矩的APR方式运用预先设定的模板以及规则, 凭借静态与动态剖析产出针对差错的补丁。可是, 传统的依赖规矩的方式一般是特定于领域范畴的, 而且仅仅能够修补有限量的现实世界里的差错。达成了一种全新的修复模板设计, 专门用以应对不同程度的类型差错。最近, 基于学习的、相当流行且已显示出卓越性能的APR方法出现了, 它是第一个基于提示的APR方法, 会去把APR问题转化成填空问题。但此方法所使用的通用且不了解特定领域的提示, 很难处理复杂的类型错误。后来此问题得以解决, 是通过有结合领域知识以及提出的修复模板, 还通过现有的类型错误修复将它们挖掘出来, 才解决了这个问题。5.2 预训练语言模型此乃一个具备BERT风格的模型, 其在编程语言那儿开展了预训练, 还在自然语言方面进行了预训练, 能够跨越语言去理解意思并生成代码。于预训练期间将数据流图加以利用, 它不光可以领会代码的文本方面的信息, 并且还能够领会代码之中的控制流以及数据流方面的信息。是一种类似GPT风格的模型, 其所生成对象为与给定彼此关联的上下文相关的代码片段, 这般情况对于具体的代码补全以及代码生成等种种有关任务而言极其能发挥作用。Codex: 它属于GPT风格模型, 是借助微调GPT3模型从而生成函数的内容, 在代码生成这一任务之上, 以及代码理解这类任务之中, 均取得了显著的效果。这是一个模型, 它属于编码器 - 解码器类型, 其具备这样的机能, 那便是能够去处理各类和代码存在关联的任务, 像搜索代码、生成代码摘要等任务均可处理。6 结论我们提出了基于领域感知提示的方法, 该方法用于代码修复, 通过融入领域感知修复模板改进基于提示的方法, 实现了新颖的修复模板设计来处理不同级别的代码类型错误问题, 运用新颖算法方式挖掘修复模板, 经将修复模板应用于存在编码错误的代码, 把相应领域知识融入修复后的代码提示之中, 再调用预训练代码模型依据提示生成候选补丁, 实验证明其方法有效及此类挖掘修复模板功用显著。转述朱轶凡
返回列表