202407论文研读—重新审视代码补全中的检索增强策略

背景

在软件工程领域的现有研究中,检索增强技术已经被应用在代码补全、代码生成、代码摘要生成、代码提交信息生成的场景上。这些技术通过检索和使用大规模检索库中的数据来辅助代码或文本信息的自动补全和生成过程,其生成效果要好于直接使用微调后的模型。

但现有的基于检索增强的代码补全方法存在两个明显问题:

1.将输入代码和检索结果直接拼接到一起作为生成模型的输入,这种方法带来了一个风险,即检索到的代码片段可能并不能对模型起到提示作用,反而有可能会误导模型,导致生成的代码结果不准确。

2.由于无论检索到的外部代码是否与输入代码完全相关,都会被与输入代码拼接起来输入到模型, 这导致该方法的效果在很大程度上依赖于代码检索阶段的准确性。如果检索阶段不能返回可用的代码片段, 那么后续的代码补全效果可能也会受到影响

经验研究

在经验研究中重点识别检索库的代码粒度、代码检索方法、检索结果的后处理方法这三个影响检索增强效果的因素,并通过半定性半定量实验对应得出三点可能能够优化检索增强效果的启示:

1.通过扩大检索库规模并选择更精细的代码表征粒度, 可能能够提升检索增强效果。

2.通过改进代码检索方法, 提升代码检索结果在功能、结构上与输入代码的相关性, 并在检索后根据代码检索结果的质量灵活决策是否使用检索增强方法, 可能能够提升检索增强的效果。

3.通过有效的提示模板将检索结果与输入代码结合起来, 可能能够提升检索增强的效果。

设计改进方法

提出了基于多阶段改进检索增强的代码补全方法(MAGIC)

从代码补全中的检索增强的三个主要阶段: 检索预处理阶段、检索阶段、检索后生成前阶段分别进行改进优化。改进方法主要分为三个阶段:检索库构建、检索精排、提示生成阶段。

1.检索库构建阶段

本文所构建的片段级代码库, 是在方法级代码库的基础上进行代码切分得到的,具有更小的代码粒度。

2.检索精排阶段

改进策略主要包括基于倒秩融合策略进行二次排序、基于索引的代码片段拼接、基于相似度阈值过滤检索结果三个部分。

3.基于提示模板生成代码

本文设计了一个简单的提示模板用于区分检索得到的外部代码和原输入代码。定义提示模板的目的是为了提供一个结构化的指导,以帮助模型生成准确、合理的输出。


实验评估

通过对照实验, 比较了现有的微软提出的ReACC检索增强代码补全框架与MAGIC方法在评估指标上的差距;通过消融实验,来验证MAGIC方法的三个主要优化策略的有效性;通过比较实验, 来对比MAGIC方法与现有的参数量更大的模型在推理性能与资源开销方面的差距。

总结

1.通过经验研究,重新审视了代码补全方法中的检索增强策略,并针对经验研究结果中的影响代码补全效果的因素分别利用半定性半定量的实验得到可能优化改进思路

2.依据实验得到的可优化改进思路,通过分阶段优化代码检索策略来改进检索增强的代码补全的方法

3.将提出的优化方法与现有的检索增强代码补全方法进行实验对比