Page 261 - 《软件学报》2026年第4期
P. 261

1702                                                       软件学报  2026  年第  37  卷第  4  期



                                    表 2 SWE-bench Lite 数据集中各个代码仓库测试文件判断规则

                                        仓库名                            测试文件判断规则
                                   scikit-learn/scikit-learn
                                     astropy/astropy
                                   matplotlib/matplotlib           文件路径中包含“/tests/”字段
                                      sympy/sympy
                                      pydata/xarray
                                     pytest-dev/pytest             在代码仓库的testing文件夹下
                                      pallets/Flask
                                     Django/Django
                                     pylint-dev/pylint              在代码仓库的tests文件夹下
                                    mwaskom/seaborn
                                    sphinx-doc/sphinx
                                      psf/requests                          -

                    在测试文件路径截取阶段, 由于每个测试文件的路径较长且前缀通常相同, 为了在保留文件路径语义的基础
                 上尽量减少重复或无意义的信息, 本文对每个测试文件的路径进行处理. 具体方法是按照“/”字符对路径进行切割,
                 保留最后    3  个字符串, 然后再用“/”将它们拼接在一起, 形成一个更简洁且具代表性的路径信息. 这一处理方式有
                 效地提升了测试文件路径的简洁性, 同时保留了关键的语义信息. 所有截取后的测试文件路径将以字符串列表的
                 形式进行存储, 以便于后续的处理与检索.
                    在  prompt 构建阶段, 本文对多个     GitHub  问题报告进行了实验, 以探究在测试文件选择过程中, 使用问题报告
                 的哪一部分内容作为参考最为有效. 研究发现, 使用问题报告标题的效果最佳. 这主要是因为                            GitHub  问题报告的
                 格式较为自由, 其具体描述通常较为复杂, 可能包含大量干扰信息. 相比之下, 问题报告标题往往能够有效提炼出
                 关键信息, 提供更为直接的上下文. 因此, 本文决定仅将问题报告标题作为依据, 避免将所有描述信息纳入                               prompt,
                 以提升测试文件选择的准确率. 具体而言, 本文将              GitHub  问题报告的标题与经过截取的测试文件路径列表作为输
                 入, 结合适当的提示信息, 构建结构化的           prompt. 这样的设计使得大语言模型能够更清晰地理解任务要求, 并有效
                 选择出最有可能用于测试该问题报告的              n  个测试文件路径. 为确保结果的准确性和一致性, 输出结果也被要求按
                 照特定格式呈现.
                 prompt 1. 在测试文件列表中选择      n  个最可能测试给定问题报告的测试文件.

                 This is an issue title: {issue_title}.
                 Below I will give you a list of test files in the project path, please find out n paths most likely to test this issue.
                 Please note that what you need to find is the test file that tests the issue, not the most relevant file for the issue.
                 if n=1, the answer format is: “Most likely related path is: ‘xxx/xxx/xxx.py’”
                 if n=2, the answer format is: “Most likely related path is: ‘xxx/xxx/xxx.py’, ‘xxx/xxx/xxx.py’”
                 The list is:
                 {file_paths}
                    由于各个代码仓库的测试文件数量较多, 本文设计了多级选择策略来优化测试文件的选取过程. 具体而言, 对
                 于截取后的测试文件路径, 本文将其按照每              300  个路径为一组进行分组, 并以字符串列表的形式将每组路径放入
                 prompt 1  中的  file_paths 字段, 同时将  n  设置为  1, 以便让大语言模型从每一组中选出一个测试文件. 接着, 本文将
                 模型在每组测试文件中选择的结果放入一个新的空列表中, 然后再次将该列表放入                           prompt 1  中, 将  n  设置为  2, 并
                 让模型重复选择      5  次, 每次的结果均存入列表中. 最后, 统计列表中出现次数最高的测试文件路径, 并将其作为最
                 终结果. 这一策略有效地提高了选择的准确性, 并减小了                 prompt 的长度, 确保所选测试文件能够更好地满足测试
                 问题报告的需求.
                    图  5  展示了一个具体的测试文件选择           prompt 的例子, 该例子中的问题报告来源于            Django  仓库, 标题是
   256   257   258   259   260   261   262   263   264   265   266