拨开云雾 02月08日
基于LLM的多语言程序修复
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了一种名为RING的多语言程序修复引擎,它利用大型代码语言模型(如Codex)自动修复代码中的错误。RING将修复过程分解为三个阶段:错误定位、程序转换和候选排序。通过分析编译器或静态分析器产生的错误消息来定位错误,并利用小样本学习从范例库中选择与错误相关的修复示例,进行代码转换。最后,通过控制生成过程中的temperature参数生成多个候选项,并根据token的对数概率进行排序。RING旨在解决现有自动修复技术特定于语言且不易移植的问题,从而提高代码修复的效率和通用性。

📍 RING引擎将bug修复分为三个阶段:**错误定位**(利用编译器等工具识别错误)、**程序转换**(通过小样本学习,参考相似错误修复案例进行代码修改)和**候选排序**(通过调整temperature参数生成多个修复方案并排序)。

📚 RING引擎的关键在于**范例库**的构建和使用。范例库包含大量错误-修复对,通过错误向量选择或消息嵌入选择,找到与当前错误最相关的修复示例,辅助代码转换阶段。

🌡️ RING在候选排序阶段,通过**控制temperature参数**来生成多个修复候选方案,并通过对解码过程中选择的token的对数概率进行平均来对这些方案进行排序,选择最优的修复方案。

原创 zhanS 2024-01-18 14:56 新加坡

基于LLM的多语言程序修复

分享一篇来自AAAI' 23的论文,题目为:"Repair Is Nearly Generation: Multilingual Program Repair with LLMs"。

大多数程序员在写代码时都会犯错误;其中一些错误很小,只需对原始程序进行少量编辑。这类错误最近被称为“最后一英里错误”[3]。这些错误打破了有经验的开发人员的工作流程,并可能难倒新手程序员[1-2]。针对这类错误的现有自动修复技术是特定于语言的,并且不容易移植到新语言。Transferring symbolic方法需要大量的工程技术,而基于神经网络的方法则需要数据和再训练。

为此,作者提出了RING,一个多语言程序修复引擎,基于Codex等代码大语言模型,如图1所示。首先,RING将bug修复分为3个阶段:错误定位、程序转换、候选排序。

作为调试的第一步,程序员通常会找到错误的原因。对于大多数现代编程语言来说,定位语法错误和一些语义错误(如:类型错误)是通过编译器、静态分析器或linters等工具来实现的。根据这种直觉,作者考虑了由编译器或其他静态分析器产生的预处理错误消息。通过对此消息进行了规范化,以确保不同语言之间的一致性。图3显示了一个正在运行的示例的prompt变体,其中突出显示的内容对应于准备好的语法错误消息。对于错误消息可能不准确的语言,特别是关于报告的错误位置,作者发现删除报告的错误位置但保留错误文本的简单抽象效果很好

在开发人员确定了错误的位置之后,他们会在该位置对原始源代码进行适当的转换(一系列代码编辑操作)。随着时间的推移,大多数开发者会随着时间积累解决特定错误所需的转换类型的经验。此外,当新手遇到一个不熟悉的错误时,他们通常会搜索类似的错误/正确对的例子,这些例子可以为他们自己的转换提供信息。

研究表明,通过在prompt中添加任务的相关示例,LLM能够进行小样本学习,也就是从预期任务的少数示例中学习的能力[4-5]。给定修复程序的转换示例,作者利用RING中的这一功能来解决代码转换阶段的问题。而主要的挑战是选择与开发人员所犯错误相关的相关示例。遵循具有相似错误的程序具有相似错误的直觉,作者根据错误消息相似性从一组错误固定对中选择示例,并把这种错误组合的集合称为范例库。

为了捕捉语言工具的差异,作者基于不同的计算错误诊断的相似性度量实现了两种从示例库中选择程序的方法:

(1)错误向量选择:假设细粒度错误报告是可用的。例如,对于Excel解析器返回包含许多不同诊断计数器的详细报告,统计工具报告的每个错误类别的出现次数,并根据这些频率构建一个向量,称之为错误向量。然后,通过最小化误差向量之间的L2距离从示例库中选择程序。

(2)消息嵌入选择:假设高级错误伴随着自然语言的详细描述。例如,Python解析器经常为不同的错误返回相同的错误(如SyntaxError),同时通过相关的自然语言错误消息公开附加信息。通过使用预训练的CodeBERT模型嵌入编译器消息并基于余弦相似性比较嵌入来使用此描述。

LLM通过从有希望的候选对象中迭代采样每个token来实现其输出的变化(就是基于seq2seq的文本生成)。不太可能的token可以被选择的程度由一个称为temperature的参数控制。因此,可以通过控制生成过程中的temperature来生成多个候选项。

RING的最后一步是使用前面两个阶段中描述的prompt对通过查询Codex获得的候选项进行排序:对解码过程中选择的token的对数概率进行平均,并按照平均值的降序。作者发现在开发过程中用较高的temperature生成各种候选项并对它们进行排序比使用较低的temperature会产生更好的性能

参考文献

[1] Altadmri A, Brown N C C. 37 million compilations: Investigating novice programming mistakes in large-scale student data[C]//Proceedings of the 46th ACM technical symposium on computer science education. 2015: 522-527.

[2] Drosos I, Guo P J, Parnin C. HappyFace: Identifying and predicting frustrating obstacles for learning programming at scale[C]//2017 IEEE Symposium on Visual Languages and Human-Centric Computing (VL/HCC). IEEE, 2017: 171-179.

[3] Bavishi R, Joshi H, Cambronero J, et al. Neurosymbolic repair for low-code formula languages[J]. Proceedings of the ACM on Programming Languages, 2022, 6(OOPSLA2): 1093-1122.

[4] Brown T, Mann B, Ryder N, et al. Language models are few-shot learners[J]. Advances in neural information processing systems, 2020, 33: 1877-1901.

[5] Chowdhury J R, Zhuang Y, Wang S. Novelty controlled paraphrase generation with retrieval augmented conditional prompt tuning[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2022, 36(10): 10535-10544.


Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LLM 程序修复 多语言 Codex 自动修复
相关文章