该存储库包含论文“Natural Language to Class-level Code Generation by Iterative Tool-augmented Reasoning over Repository”的官方代码和数据,该论文将在 2024 年国际机器学习会议以数据为中心的机器学习研究研讨会上发表( ICML'24 的 DMLR 研讨会)。
我们的工作介绍:
用于匿名目的的替代标题:使用迭代、工具增强的存储库推理从自然语言生成类级代码
法学硕士在代码生成任务中展示了巨大的潜力,在各种基准测试中在函数或语句级别上取得了有希望的结果。然而,与创建类等代码工件相关的复杂性,特别是在现实世界的软件存储库的上下文中,仍然没有得到充分探索。先前的研究将类级生成视为一项孤立的任务,忽略了现实世界软件环境中复杂的依赖关系和交互。
为了解决这一差距,我们引入了 RepoClassBench,这是一个综合基准测试,旨在严格评估 LLM 在现实存储库中生成复杂的类级代码的能力。 RepoClassBench 包括来自精选存储库的跨 Java、Python 和 C# 的“自然语言到类生成”任务。我们确保数据集中的每个类不仅在存储库中具有跨文件依赖关系,而且还包含相应的测试用例来验证其功能。我们发现当前的模型难以应对我们的基准带来的现实挑战,这主要是由于它们对相关存储库环境的暴露有限。
为了解决这个缺点,我们引入了 Retrieve-Repotools-Reflect (RRR),这是一种为法学硕士配备静态分析工具的新颖方法,可以在基于代理的框架中迭代地导航和推理存储库级别的上下文。我们的实验表明,RRR 显着优于 RepoClassBench 上的现有基线,展示了其在跨编程语言和各种设置下的有效性。我们的研究结果强调了代码生成基准迫切需要纳入存储库级别的依赖关系,以更准确地反映软件开发的复杂性。
我们的工作展示了利用专门工具来增强法学硕士对存储库上下文的理解的好处。
data
:包含 RepoClassBench 数据集内容和用于初始化评估工具管道的元数据。更多详细信息请参见此处。repoclassbench
:包含初始化 Java、C# 和 Python 存储库环境的代码;获取一段类代码并测量其相对于存储库中的测试用例的正确性。更多详细信息请参见此处。repotools
:包含我们工作中代理框架用来推理存储库的静态分析工具的实现。rrr
:RRR 代理与评估工具交互以解决基准任务的代码project_utils
:整个项目中使用的通用实用程序函数语言 | 任务数量 |
---|---|
爪哇 | 130 |
Python | 97 |
C# | 60 |
基准数据位于data/input
中,具有针对 Python、Java 和 C# 的单独文件。每个文件包含每个任务的以下属性:
task_id
:基准测试中每个任务的唯一标识符。class_name
:正在测试的类的名称。file_name
:包含存储库中类的真实实现的文件的路径。detailed_description
:类的详细描述,由代理/LLM 用于生成代码。sketchy_description
:类的不太详细的描述,为代码生成提供替代提示。repo_metadata
:有关包含该类的存储库的信息,包括:repo_name
commit_id
evaluation_metadata
:用于评估生成代码正确性的数据:ground_truth_class_body
:正在测试的类的正确实现。 要开始该项目,请按照下列步骤操作:
git clone https://github.com/microsoft/repoclassbench
cd repoclassbench
conda create --name repoclassbench_env python=3.11
conda activate repoclassbench_env
pip install -r requirements.txt
在评估您的管道/设置之前,请验证评估工具中所需的环境和存储库是否已正确设置。如果不是,跨三种语言的一项或多项任务的真实实现可能会失败。运行以下测试以确保设置正确:
# To ensure harness is setup for C#
pytest -x repoclassbench/tests/test_csharp.py
# To ensure harness is setup for Java
pytest -x repoclassbench/tests/test_java.py
# To ensure harness is setup for Python
pytest -x repoclassbench/tests/test_python.py
如果您准备好了解您的代码生成方法与我们的基准测试相比如何,您将在repoclassbench/tests
目录中找到示例代码来帮助您入门。按照此分步指南在特定任务上测试您的代码:
首先为您正在使用的编程语言创建一个Dataset
对象。例如,如果您正在测试 Python 代码,您可以编写:
from repoclassbench . dataset import Dataset
# Initialize the dataset for Python with detailed specifications
dataset = Dataset ( language = "python" , specification = "detailed" , delete_relatives = False )
接下来,从数据集中选择一个任务来测试您的代码。您可以通过使用其唯一标识符 ( task_id
) 获取task
对象来完成此操作:
# Replace 'task_id' with the actual ID of the task you want to test
task = dataset . get_instance_and_setup_env ( task_id )
检索任务的评估工具。这将为您提供一个TaskData
对象,其中包括评估器、需要生成的类的描述以及相关代码存储库的位置。
# Get the evaluator from the task object
evaluator = task . evaluator
# The path to the repository files and the class description are also available
repository_path = task . repo_dir
description_to_use = task . description
最后,是时候看看生成的代码的执行情况了。使用评估器测试您的代码并打印结果。
# 'code_test' should be replaced with the class code generated by your approach
evaluation_results = evaluator . evaluate ( code_test )
# Display the outcome of the evaluation
print ( "Number of passed testcases: " , evaluation_results . passed_tests )
print ( "Number of failed testcases: " , evaluation_results . failed_tests )
print ( "Did the code compile/pass linter checks: " , evaluation_results . compile_status )
print ( "Error feedback from the harness: " , evaluation_results . error_feedback )
请记住将code_test
替换为您的方法生成的实际代码。评估器将针对测试用例运行您的代码,并提供有关通过了多少测试、失败了多少测试、代码是否成功编译以及遇到的任何错误的反馈。
使用我们的代码和基准测试时,请考虑引用以下论文。
@inproceedings{deshpande2024classlevelcodegenerationnatural,
title={Natural Language to Class-level Code Generation by Iterative Tool-augmented Reasoning over Repository},
author={Ajinkya Deshpande and Anmol Agarwal and Shashank Shet and Arun Iyer and Aditya Kanade and Ramakrishna Bairi and Suresh Parthasarathy},
booktitle={ICML 2024 Workshop on Data-Centric Machine Learning Research},
year={2024},
url={https://openreview.net/forum?id=yqjr7ojVYa}
}
该项目欢迎贡献和建议。大多数贡献都要求您同意贡献者许可协议 (CLA),声明您有权并且实际上授予我们使用您的贡献的权利。有关详细信息,请访问 https://cla.opensource.microsoft.com。
当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA 并适当地装饰 PR(例如,状态检查、评论)。只需按照机器人提供的说明进行操作即可。您只需使用我们的 CLA 在所有存储库中执行一次此操作。
该项目采用了微软开源行为准则。有关详细信息,请参阅行为准则常见问题解答或联系 [email protected] 提出任何其他问题或意见。
该项目可能包含项目、产品或服务的商标或徽标。 Microsoft 商标或徽标的授权使用须遵守且必须遵循 Microsoft 的商标和品牌指南。在此项目的修改版本中使用 Microsoft 商标或徽标不得引起混淆或暗示 Microsoft 赞助。对第三方商标或徽标的任何使用均须遵守这些第三方的政策。