該儲存庫包含論文「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 贊助。任何對第三方商標或標誌的使用均須遵守這些第三方的政策。