作者:
(1) Alexander EI Brownlee,英国斯特灵大学;
(2) James Callan,英国伦敦大学学院;
(3) Karine Even-Mendoza,英国伦敦国王学院;
(4) Alina Geiger,约翰内斯古腾堡大学美因茨,德国;
(5) 卡罗尔·汉纳 (Carol Hanna),英国伦敦大学学院;
(6) Justyna Petke,伦敦大学学院,英国;
(7) Federica Sarro,英国伦敦大学学院;
(8) 多米尼克·索巴尼亚 (Dominik Sobania),德国美因茨约翰内斯·古腾堡大学。
大型语言模型 (LLM) 已成功应用于软件工程任务,包括程序修复。然而,它们在基于搜索的技术(例如遗传改良(GI))中的应用仍然很大程度上尚未被探索。在本文中,我们评估了使用 LLM 作为 GI 变异算子来改进搜索过程。我们扩展了 Gin Java GI 工具包来调用 OpenAI 的 API 来生成 JCodec 工具的编辑。我们使用 5 种不同的编辑类型对编辑空间进行随机采样。我们发现基于 LLM 的编辑通过单元测试的补丁数量比标准插入编辑高出 75%。此外,我们观察到,与标准编辑相比,法学硕士发现的补丁通常不太多样化。我们通过本地搜索来运行 GI,以寻找运行时的改进。尽管 LLM 增强 GI 发现了许多改进补丁,但标准 GI 发现了最佳改进补丁。
随着软件系统变得越来越大、越来越复杂,需要大量的手动工作来维护它们[2]。为了减少开发人员在软件维护和优化任务中的工作量,自动化范例至关重要。遗传改进(GI)[15]应用基于搜索的技术来改进现有软件的非功能属性(例如执行时间)以及功能属性(例如修复错误)。尽管 GI 在工业领域取得了成功 [12,13],但它仍然受到搜索中使用的变异算子集的限制 [14]。
大型语言模型 (LLM) 具有广泛的应用范围,因为它们能够处理文本查询,而无需针对当前的特定任务进行额外的培训。法学硕士已经在跨越多种不同编程语言的数百万个代码存储库中进行了预训练 [5]。它们在软件工程任务中的使用取得了巨大成功[9,6],在程序修复方面也显示出前景[17,19]。
Kang 和 Yoo [10] 提出,使用法学硕士来增强 GI 具有尚未开发的潜力。 GI 对不同的优化任务使用相同的变异算子。这些运算符是在开始搜索之前手工设计的,因此导致搜索空间有限。我们假设增加 LLM 补丁建议作为额外的变异算子将丰富搜索空间并产生更成功的变体。
在本文中,我们进行了多次实验来探索使用LLM作为GI中的变异算子是否可以提高搜索的效率和功效。我们的结果表明,LLM 生成的补丁对于随机搜索和本地搜索(使用中等提示类别)的编译率分别为 51.32% 和 53.54%。此前,LLM(按原样使用 LLM 模型)被证明可以生成大约 40% 时间编译的代码 [16,18]。我们发现,与标准 GI 编辑相比,随机抽样的基于 LLM 的编辑更常编译并通过单元测试。我们观察到,基于 LLM 的编辑通过单元测试的补丁数量比 GI 插入编辑高出 75%。然而,我们观察到法学硕士发现的补丁多样性较低。对于本地搜索,最好的改进是使用标准 GI 语句编辑,然后是基于 LLM 的编辑来实现。这些发现证明了法学硕士作为突变算子的潜力,并强调了在该领域进一步研究的必要性。
为了分析 LLM 作为 GI 中变异算子的使用,我们使用了 OpenAI 的 GPT 3.5 Turbo 模型和 GI 工具箱 Gin [3]。我们尝试了 Gin 中实现的两种类型的搜索:随机搜索和本地搜索。使用 OpenAI API 向 LLM 发出的请求是通过 Langchain4J 库发出的,温度为 0.7。我们实验中改进的目标项目是流行的 JCodec [7] 项目,它是用 Java 编写的。使用 Gin 的分析器工具通过重复分析 20 次并取结果集的并集来识别要编辑的“热门”方法。
对于随机抽样实验,我们设置了语句级编辑(从 [14] 复制/删除/替换/交换,并从 [4] 插入中断/继续/返回)和 LLM 编辑,随机生成每种类型 1000 个。每个单元测试使用 10000 毫秒的超时来捕获编辑引入的无限循环;超过超时时间将被视为测试失败。对于本地搜索,实验也进行了类似的设置。有 10 次重复运行(前 10 个热门方法各一次),但运行仅限于 100 次评估,总共 1000 次评估,与随机搜索相匹配。实际上,每次运行有 99 次编辑,因为第一次用于对原始未修补代码进行计时。
我们尝试了三种不同的提示来向 LLM 发送两种类型的搜索请求:简单提示、中等提示和详细提示。对于所有三个提示,我们的实现请求手头代码的五种不同变体。简单的提示仅请求代码,没有任何附加信息。中等提示提供了有关所提供的代码和要求的更多信息,如图 1 所示。具体来说,我们向 LLM 提供所使用的编程语言、代码所属的项目以及格式说明。详细提示通过有用更改的示例扩展了中等提示。该示例取自 Brownlee 等人获得的结果。 [4]。该补丁是应用于 jCodec 项目的插入编辑的成功实例(即编译、通过单元测试并比原始代码提供加速的编辑)。我们对实验中使用的所有详细提示请求使用相同的示例;这是因为 LLM 能够在用户提供特定信息的情况下进行归纳推理,并且 LLM 可以使用该输入生成更一般的语句,这在 GPT-4 [8] 中得到了进一步改进。
LLM 编辑是通过在目标“热门”方法中随机选择块语句来应用的。该块的内容in the prompt. The first code block in the LLM response is identified. Gin uses JavaParser (https://javaparser.org) internally to represent target source files, so we attempt to parse the LLM suggestion with JavaParser, and replace the original block with the LLM suggestion.
第一个实验比较了标准 GI 突变(即插入和语句编辑)与使用随机采样的不同详细提示(简单、中等和详细)的 LLM 编辑。表 1 显示了所有补丁以及仅特定补丁的结果。我们报告有多少个补丁被 JavaParser 成功解析(名为 Valid),有多少个补丁被编译,以及有多少个补丁通过了所有单元测试(名为 Passed)。我们排除了在语法上与原始软件等效的补丁。最佳结果以粗体显示。
我们看到,虽然通过标准插入和语句编辑发现了更多有效补丁,但通过使用 LLM 生成的编辑可以找到更多通过的补丁。特别是,对于“中”和“详细”提示,分别有 292 个和 230 个补丁通过了单元测试。对于插入和语句编辑,分别只有 166 和 91 通过了单元测试。有趣的是,对于每个操作员来说,具有最低/最高补丁通过率的热门方法都不同:了解这种变化对于未来的研究将会很有趣。
还值得注意的是,LLM 补丁的多样性较低:标准突变操作员发现的独特补丁比使用 Medium 的 LLM 多出 50% 以上,
和详细提示。然而,使用简单提示时,没有一个补丁通过单元测试,因为建议的编辑通常无法解析。因此,需要详细的提示来强制 LLM 生成可用的输出。
我们进一步研究了“Medium”和“Detailed”提示之间的差异,以了解“Detailed”(在独特的补丁集中)性能的降低,因为“Medium”有更多数量的已编译和通过的补丁。在两个提示级别中,42 个案例(在所有唯一有效案例中)生成的响应是相同的。但是,“详细”往往会生成较长的响应,平均为 363 个字符,而“中等”平均为 304 个字符。我们手动检查了几个详细的提示响应,其中我们识别了一些包括来自其他文件的变量,这可能会显着扩展 GI 可以探索的代码变体集。
第二个实验扩展了我们的分析,将标准编辑和 LLM 编辑与本地搜索的性能进行了比较。表 2 显示了本地搜索实验的结果。我们报告编译和传递补丁的数量以及发现运行时改进的补丁数量。此外,我们还以毫秒 (ms) 为单位报告中值和最佳改进。在表中,我们排除了所有空补丁。和以前一样,最佳结果以粗体显示。
我们再次看到,使用“中等”和“详细”提示的 LLM 可以找到更多通过单元测试的补丁。此外,通过使用带有这些提示的法学硕士可以找到更多改进。具体来说,对于Medium 和Detailed,我们分别发现了164 和196 项改进,而对于Insert 和Statement 我们只发现了136 项和71 项改进。最好的改进是使用语句编辑 508 毫秒。使用 LLM(使用中提示)发现的最佳改进只能将运行时间提高 395 毫秒。我们还检查了本地搜索结果中的一系列编辑,以深入了解中等提示和详细提示之间的区别,因为详细提示的响应编译率较低。在示例中,一系列编辑旨在内联对函数clip 的调用。详细提示试图在几次编辑中几乎立即合并调用,这可能会导致无效代码。另一方面,Medium 提示做了不太激进的改变,逐渐完善了代码。它首先用 if-then-else 语句和系统函数调用替换三元运算符表达式,然后最终尝试内联剪辑函数调用。
软件的遗传改进高度依赖于它在搜索过程中使用的变异算子。为了使运算符多样化并进一步丰富搜索空间,我们采用了大型语言模型(LLM)作为运算符。
局限性。总而言之,未来的工作应该考虑我们的目标 jCodec 之外的项目。我们的实验使用了 API,使我们无法控制 LLM 生成的响应或任何修改或优化它们的方式。虽然我们在实验过程中没有观察到行为的变化,但 OpenAI 可能随时改变模型,因此未来的工作应该考虑本地模型。我们仅对 LLM 请求的三种提示类型进行了实验,在有限数量的提示中发现了结果的变化。最后,我们解析法学硕士响应的实现相对简单。然而,这仅意味着我们报告的结果是悲观的,并且基于法学硕士的运营商可能会实现更大的改进。
概括。我们发现,虽然使用随机采样的标准编辑发现了更多有效和多样化的补丁,但通过基于 LLM 的编辑发现了更多通过单元测试的补丁。例如,使用 Medium 提示进行 LLM 编辑时,我们发现通过单元测试的补丁数量比经典插入编辑多 75% 以上。在我们的本地搜索实验中,我们发现语句编辑的最佳改进(508 毫秒)。基于 LLM 的最佳改进是在中等提示(395 毫秒)下发现的。因此,探索结合法学硕士和“经典”GI 编辑的方法是有潜力的。
我们的实验表明,LLM 请求所使用的提示对结果有很大影响。因此,在未来的工作中,我们希望通过快速工程进行更多实验。混合提示也可能会有所帮助:例如,从中等开始,然后切换到详细,以进行突破局部最小值的更大编辑。此外,将 LLM 编辑与其他内容(例如标准复制/删除/替换/交换或 PAR 模板 [11])相结合的可能性可能会很有趣。最后,我们希望对额外的测试项目进行更广泛的实验。
数据可用性。代码、法学硕士提示和实验基础设施、评估数据和结果可在 [1] 处以开源方式获取。该代码也在 github.com/gintool/gin 的“llm”分支下(提交 9fe9bdf;从主提交 2359f57 分支,等待与 Gin 完全集成)。
致谢UKRI EPSRC EP/P023991/1 和 ERC 741278。
使用大型语言模型增强遗传改良突变的神器。泽诺多(2023 年 9 月)。 https://doi.org/10.5281/zenodo.8304433
Böohme, M.、Soremekun, EO、Chattopadhyay, S.、Ugherughe, E.、Zeller, A.:错误在哪里以及如何修复?与实践者的实验。在:过程。 ACM 软件工程基础研讨会。第 117–128 页 (2017)
Brownlee, AE、Petke, J.、Alexander, B.、Barr, ET、Wagner, M.、White, DR:杜松子酒:让遗传改良研究变得简单。在:盖科。第 985–993 页 (2019)
Brownlee, AE、Petke, J.、Rasburn, AF:注入快捷方式以更快地运行 Java 代码。见:IEEE CEC 2020。 1–8
Chen, M.、Tworek, J.、Jun, H.、Yuan, Q.、Pinto, HPdO、Kaplan, J.、Edwards, H.、Burda, Y.、Joseph, N.、Brockman, G. 等al.:评估在代码上训练的大型语言模型。 arXiv 预印本 arXiv:2107.03374 (2021)
Fan, A.、Gokkaya, B.、Harman, M.、Lyubarskiy, M.、Sengupta, S.、Yoo, S.、Zhang, JM:软件工程的大型语言模型:调查和开放问题 (2023)
Github - jcodec/jcodec:Jcodec 主存储库, https://github.com/jcodec/jcodec
Han, SJ、Ransom, KJ、Perfors, A.、Kemp, C.:人类和大型语言模型中的归纳推理。认知系统研究 p。 101155 (2023)
侯X.,刘Y.,杨Z.,Grundy,J.,赵Y.,李L.,王K.,罗X.,罗D.,王H.:软件工程的大型语言模型:系统文献综述。 arXiv:2308.10620 (2023)
Kang, S., Yoo, S.:通过大型语言模型实现目标定制的遗传改进。 arXiv:2304.09386 (2023)
Kim, D.、Nam, J.、Song, J.、Kim, S.:从人类编写的补丁中学习自动补丁生成 (2013), http://logging.apache.org/log4j/
Kirbas, S.、Windels, E.、Mcbello, O.、Kells, K.、Pagano, M.、Szalanski, R.、Nowack, V.、Winter, E.、Counsell, S.、Bowes, D.、 Hall, T.、Haraldsson, S.、Woodward, J.:关于彭博社自动程序修复的介绍。 IEEE 软件 38(4), 43–51 (2021)
Marginean, A.、Bader, J.、Chandra, S.、Harman, M.、Jia, Y.、Mao, K.、Mols, A.、Scott, A.:Sapfix:自动端到端修复规模。见:ICSE-SEIP。第 269–278 页 (2019)
Petke, J.、Alexander, B.、Barr, ET、Brownlee, AE、Wagner, M.、White, DR:使用 Gin 进行自动程序修改的程序转换景观。实证软件工程 28(4), 1–41 (2023)
Petke, J.、Haraldsson, SO、Harman, M.、Langdon, WB、White, DR、Woodward, JR:软件的遗传改进:一项综合调查。 IEEE 进化计算汇刊 22, 415–432 (2018)
Siddiq, ML、Santos, J.、Tanvir, RH、Ulfat, N.、Rifat, FA、Lopes, VC:探索大型语言模型在生成单元测试中的有效性。 arXiv 预印本 arXiv:2305.00418 (2023)
Sobania, D.、Briesch, M.、Hanna, C.、Petke, J.:chatgpt 自动错误修复性能分析。见:2023 年 IEEE/ACM 国际自动化程序修复研讨会 (APR)。第 23-30 页。 IEEE 计算机协会 (2023)
Xia, CS、Paltenghi, M.、Tian, JL、Pradel, M.、Zhang, L.:通过大型语言模型进行通用模糊测试。 arXiv 预印本 arXiv:2308.04748 (2023)
Xia,CS,Zhang,L.:继续对话:使用 chatgpt 修复 337 个错误中的 162 个错误,每个错误 0.42 美元。 arXiv 预印本 arXiv:2304.00385 (2023)
本文可在 CC 4.0 许可下在 arxiv 上获取。