Dieses Repository enthält den offiziellen Code und die offiziellen Daten für das Papier „Natural Language to Class-level Code Generation by Iterative Tool-augmented Reasoning over Repository“, das auf der International Conference on Machine Learning Workshop on Data-Centric Machine Learning Research 2024 vorgestellt wird ( DMLR-Workshop bei ICML'24).
Unsere Arbeit stellt vor:
Alternativer Titel, der aus Gründen der Anonymität verwendet wird: Codegenerierung auf Klassenebene aus natürlicher Sprache mithilfe iterativer, Tool-Enhanced Reasoning over Repository
LLMs haben bei Codegenerierungsaufgaben ein erhebliches Potenzial gezeigt und bei verschiedenen Benchmarks vielversprechende Ergebnisse auf Funktions- oder Anweisungsebene erzielt. Die mit der Erstellung von Code-Artefakten wie Klassen verbundenen Komplexitäten, insbesondere im Kontext realer Software-Repositories, sind jedoch noch unzureichend erforscht. Frühere Forschungen behandeln die Generierung auf Klassenebene als isolierte Aufgabe und vernachlässigen die komplizierten Abhängigkeiten und Interaktionen, die reale Softwareumgebungen charakterisieren.
Um diese Lücke zu schließen, stellen wir RepoClassBench vor, einen umfassenden Benchmark, der zur strengen Bewertung von LLMs bei der Generierung von komplexem Code auf Klassenebene in realen Repositorys entwickelt wurde. RepoClassBench umfasst „Natural Language to Class Generation“-Aufgaben für Java, Python und C# aus einer Auswahl von Repositorys. Wir stellen sicher, dass jede Klasse in unserem Datensatz nicht nur dateiübergreifende Abhängigkeiten innerhalb des Repositorys aufweist, sondern auch entsprechende Testfälle zur Überprüfung ihrer Funktionalität enthält. Wir stellen fest, dass aktuelle Modelle mit den realistischen Herausforderungen unseres Benchmarks zu kämpfen haben, vor allem aufgrund ihrer begrenzten Exposition gegenüber relevanten Repository-Kontexten.
Um dieses Manko zu beheben, führen wir Retrieve-Repotools-Reflect (RRR) ein, einen neuartigen Ansatz, der LLMs mit statischen Analysetools ausstattet, um in einem agentenbasierten Framework iterativ durch den Kontext auf Repository-Ebene zu navigieren und Überlegungen darüber anzustellen. Unsere Experimente zeigen, dass RRR die bestehenden Baselines von RepoClassBench deutlich übertrifft und seine Wirksamkeit in allen Programmiersprachen und unter verschiedenen Einstellungen unter Beweis stellt. Unsere Ergebnisse unterstreichen die dringende Notwendigkeit, dass Code-Generierungs-Benchmarks Abhängigkeiten auf Repo-Ebene einbeziehen, um die Komplexität der Softwareentwicklung genauer widerzuspiegeln.
Unsere Arbeit zeigt die Vorteile der Nutzung spezieller Tools, um das Verständnis von LLMs für den Repository-Kontext zu verbessern.
data
: Enthält den Inhalt des RepoClassBench-Datensatzes und die Metadaten zum Initialisieren der Evaluierungs-Harness-Pipeline. Weitere Details hier.repoclassbench
: Enthält den Code zum Initialisieren der Repository-Umgebungen für Java, C# und Python; um einen Teil des Klassencodes zu nehmen und seine Korrektheit in Bezug auf die Testfälle im Repository zu messen. Weitere Details hier.repotools
: Enthält die Implementierung statischer Analysetools, die vom Agenten-Framework in unserer Arbeit verwendet werden, um Überlegungen zum Repository anzustellen.rrr
: Code für den RRR-Agenten, der mit dem Evaluierungskabel interagiert, um Benchmark-Aufgaben zu lösenproject_utils
: Gemeinsame Dienstprogrammfunktionen, die im gesamten Projekt verwendet werden Sprache | Anzahl der Aufgaben |
---|---|
Java | 130 |
Python | 97 |
C# | 60 |
Die Benchmark-Daten befinden sich in data/input
mit separaten Dateien für Python, Java und C#. Jede Datei enthält die folgenden Attribute für jede Aufgabe:
task_id
: Eindeutige Kennung für jede Aufgabe im Benchmark.class_name
: Name der getesteten Klasse.file_name
: Pfad zur Datei, die die Ground-Truth-Implementierung der Klasse im Repository enthält.detailed_description
: Ausführliche Beschreibung der Klasse, die vom Agenten/LLM zum Generieren von Code verwendet wird.sketchy_description
: Weniger detaillierte Beschreibung der Klasse, die eine alternative Eingabeaufforderung für die Codegenerierung bietet.repo_metadata
: Informationen über das Repository, das die Klasse enthält, einschließlich:repo_name
commit_id
evaluation_metadata
: Daten zur Beurteilung der Korrektheit des generierten Codes:ground_truth_class_body
: Die korrekte Implementierung der getesteten Klasse. Um mit dem Projekt zu beginnen, befolgen Sie diese Schritte:
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
Bevor Sie Ihre Pipeline/Ihr Setup evaluieren, überprüfen Sie, ob die erforderlichen Umgebungen und Repositorys im Evaluierungsstrang ordnungsgemäß eingerichtet sind. Wenn nicht, schlägt die Ground-Truth-Implementierung einer oder mehrerer Aufgaben in den drei Sprachen möglicherweise fehl. Führen Sie die folgenden Tests durch, um eine ordnungsgemäße Einrichtung sicherzustellen:
# 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
Wenn Sie sehen möchten, wie Ihr Codegenerierungsansatz im Vergleich zu unserem Benchmark abschneidet, finden Sie im Verzeichnis repoclassbench/tests
Beispielcode, der Ihnen den Einstieg erleichtert. Befolgen Sie diese Schritt-für-Schritt-Anleitung, um Ihren Code für eine bestimmte Aufgabe zu testen:
Erstellen Sie zunächst ein Dataset
-Objekt für die Programmiersprache, mit der Sie arbeiten. Wenn Sie beispielsweise Python-Code testen, würden Sie schreiben:
from repoclassbench . dataset import Dataset
# Initialize the dataset for Python with detailed specifications
dataset = Dataset ( language = "python" , specification = "detailed" , delete_relatives = False )
Wählen Sie als Nächstes eine Aufgabe aus dem Datensatz aus, an der Sie Ihren Code testen möchten. Sie können dies tun, indem Sie das task
mithilfe seiner eindeutigen Kennung ( task_id
) abrufen:
# Replace 'task_id' with the actual ID of the task you want to test
task = dataset . get_instance_and_setup_env ( task_id )
Rufen Sie die Bewertungstools für die Aufgabe ab. Dadurch erhalten Sie ein TaskData
Objekt, das den Evaluator, eine Beschreibung der Klasse, die Sie generieren müssen, und den Speicherort des relevanten Code-Repositorys enthält.
# 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
Schließlich ist es an der Zeit, die Leistung Ihres generierten Codes zu sehen. Verwenden Sie den Evaluator, um Ihren Code zu testen und die Ergebnisse auszudrucken.
# '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 )
Denken Sie daran code_test
durch den tatsächlichen Code zu ersetzen, der durch Ihren Ansatz generiert wurde. Der Evaluator führt Ihren Code anhand der Testfälle aus und gibt Feedback dazu, wie viele Tests bestanden wurden, wie viele fehlgeschlagen sind, ob der Code erfolgreich kompiliert wurde und welche Fehler aufgetreten sind.
Bitte denken Sie daran, das folgende Dokument zu zitieren, wenn Sie unseren Code und Benchmark verwenden.
@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}
}
Dieses Projekt freut sich über Beiträge und Vorschläge. Für die meisten Beiträge müssen Sie einem Contributor License Agreement (CLA) zustimmen, in dem Sie erklären, dass Sie das Recht haben, uns die Rechte zur Nutzung Ihres Beitrags zu gewähren, und dies auch tatsächlich tun. Weitere Informationen finden Sie unter https://cla.opensource.microsoft.com.
Wenn Sie eine Pull-Anfrage einreichen, ermittelt ein CLA-Bot automatisch, ob Sie eine CLA bereitstellen müssen, und schmückt die PR entsprechend (z. B. Statusprüfung, Kommentar). Folgen Sie einfach den Anweisungen des Bots. Sie müssen dies nur einmal für alle Repos tun, die unsere CLA verwenden.
Dieses Projekt hat den Microsoft Open Source Verhaltenskodex übernommen. Weitere Informationen finden Sie in den häufig gestellten Fragen zum Verhaltenskodex oder wenden Sie sich bei weiteren Fragen oder Kommentaren an [email protected].
Dieses Projekt kann Marken oder Logos für Projekte, Produkte oder Dienstleistungen enthalten. Die autorisierte Nutzung von Microsoft-Marken oder -Logos unterliegt den Marken- und Markenrichtlinien von Microsoft und muss diesen entsprechen. Die Verwendung von Microsoft-Marken oder -Logos in geänderten Versionen dieses Projekts darf keine Verwirrung stiften oder eine Sponsorschaft durch Microsoft implizieren. Jegliche Nutzung von Marken oder Logos Dritter unterliegt den Richtlinien dieser Drittanbieter.