Ce référentiel contient le code officiel et les données de l'article « Natural Language to Class-level Code Generation by Iterative Tool-augmented Reasoning over Repository », qui sera présenté à l'atelier de la Conférence internationale sur l'apprentissage automatique 2024 sur la recherche sur l'apprentissage automatique centré sur les données ( Atelier DMLR à l'ICML'24).
Notre travail présente :
Titre alternatif utilisé à des fins d'anonymat : Génération de code au niveau de la classe à partir du langage naturel à l'aide d'un raisonnement itératif amélioré par des outils sur un référentiel
Les LLM ont démontré un potentiel important dans les tâches de génération de code, obtenant des résultats prometteurs au niveau des fonctions ou des instructions dans divers benchmarks. Cependant, les complexités associées à la création d'artefacts de code tels que les classes, en particulier dans le contexte de référentiels de logiciels réels, restent sous-explorées. Des recherches antérieures traitent la génération au niveau des classes comme une tâche isolée, négligeant les dépendances et interactions complexes qui caractérisent les environnements logiciels du monde réel.
Pour combler cette lacune, nous introduisons RepoClassBench, un benchmark complet conçu pour évaluer rigoureusement les LLM dans la génération de code complexe au niveau des classes dans des référentiels du monde réel. RepoClassBench comprend des tâches de « génération de langage naturel vers classe » sur Java, Python et C# à partir d'une sélection de référentiels. Nous veillons à ce que chaque classe de notre ensemble de données ait non seulement des dépendances entre fichiers au sein du référentiel, mais inclut également des cas de test correspondants pour vérifier sa fonctionnalité. Nous constatons que les modèles actuels ont du mal à relever les défis réalistes posés par notre référence, principalement en raison de leur exposition limitée aux contextes de référentiel pertinents.
Pour remédier à cette lacune, nous introduisons Retrieve-Repotools-Reflect (RRR), une nouvelle approche qui équipe les LLM d'outils d'analyse statique pour naviguer et raisonner de manière itérative sur le contexte au niveau du référentiel dans un cadre basé sur des agents. Nos expériences démontrent que RRR surpasse considérablement les références existantes sur RepoClassBench, démontrant son efficacité dans tous les langages de programmation et dans divers paramètres. Nos résultats soulignent la nécessité cruciale de benchmarks de génération de code pour intégrer les dépendances au niveau des dépôts afin de refléter plus précisément les complexités du développement logiciel.
Notre travail montre les avantages de l'utilisation d'outils spécialisés pour améliorer la compréhension du contexte du référentiel par les LLM.
data
: contient le contenu de l'ensemble de données RepoClassBench et les métadonnées pour initialiser le pipeline de harnais d'évaluation. Plus de détails ici.repoclassbench
: Contient le code pour initialiser les environnements de référentiel pour Java, C# et Python ; pour prendre un morceau de code de classe et mesurer son exactitude par rapport aux cas de test dans le référentiel. Plus de détails ici.repotools
: Contient l'implémentation d'outils d'analyse statique utilisés par le framework agentique dans notre travail pour raisonner sur le référentiel.rrr
: Code pour l'agent RRR interagissant avec le harnais d'évaluation pour résoudre les tâches de référenceproject_utils
: fonctions utilitaires courantes utilisées dans tout le projet Langue | Nombre de tâches |
---|---|
Java | 130 |
Python | 97 |
C# | 60 |
Les données de référence se trouvent dans data/input
, avec des fichiers séparés pour Python, Java et C#. Chaque fichier contient les attributs suivants pour chaque tâche :
task_id
: Identifiant unique pour chaque tâche du benchmark.class_name
: Nom de la classe testée.file_name
: Chemin d'accès au fichier contenant l'implémentation de la vérité terrain de la classe dans le référentiel.detailed_description
: description détaillée de la classe, utilisée par l'agent/LLM pour générer du code.sketchy_description
: description moins détaillée de la classe, fournissant une invite alternative pour la génération de code.repo_metadata
: informations sur le référentiel contenant la classe, notamment :repo_name
commit_id
evaluation_metadata
: Données permettant d'évaluer l'exactitude du code généré :ground_truth_class_body
: L'implémentation correcte de la classe testée. Pour démarrer le projet, suivez ces étapes :
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
Avant d'évaluer votre pipeline/configuration, vérifiez que les environnements et référentiels requis dans le faisceau d'évaluation sont correctement configurés. Dans le cas contraire, la mise en œuvre de la vérité terrain d’une ou plusieurs tâches dans les trois langues risque d’échouer. Exécutez les tests suivants pour garantir une configuration correcte :
# 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
Si vous êtes prêt à voir comment votre approche de génération de code se compare à notre référence, vous trouverez un exemple de code pour vous aider à démarrer dans le répertoire repoclassbench/tests
. Suivez ce guide étape par étape pour tester votre code sur une tâche spécifique :
Commencez par créer un objet Dataset
pour le langage de programmation avec lequel vous travaillez. Par exemple, si vous testez du code Python, vous écririez :
from repoclassbench . dataset import Dataset
# Initialize the dataset for Python with detailed specifications
dataset = Dataset ( language = "python" , specification = "detailed" , delete_relatives = False )
Ensuite, choisissez une tâche dans l’ensemble de données sur laquelle tester votre code. Vous pouvez le faire en récupérant l'objet task
à l'aide de son identifiant unique ( task_id
) :
# Replace 'task_id' with the actual ID of the task you want to test
task = dataset . get_instance_and_setup_env ( task_id )
Récupérez les outils d’évaluation de la tâche. Cela vous donnera un objet TaskData
, qui comprend l'évaluateur, une description de la classe que vous devez générer et l'emplacement du référentiel de code correspondant.
# 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
Enfin, il est temps de voir comment fonctionne votre code généré. Utilisez l'évaluateur pour tester votre code et imprimer les résultats.
# '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 )
N'oubliez pas de remplacer code_test
par le code réel généré par votre approche. L'évaluateur exécutera votre code par rapport aux cas de test et fournira des commentaires sur le nombre de tests réussis, combien ont échoué, si le code a été compilé avec succès et les erreurs rencontrées.
Veuillez envisager de citer l'article suivant lorsque vous utilisez notre code et notre référence.
@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}
}
Ce projet accueille les contributions et suggestions. La plupart des contributions nécessitent que vous acceptiez un contrat de licence de contributeur (CLA) déclarant que vous avez le droit de nous accorder, et que vous nous accordez effectivement, le droit d'utiliser votre contribution. Pour plus de détails, visitez https://cla.opensource.microsoft.com.
Lorsque vous soumettez une pull request, un robot CLA déterminera automatiquement si vous devez fournir un CLA et décorera le PR de manière appropriée (par exemple, vérification du statut, commentaire). Suivez simplement les instructions fournies par le bot. Vous n’aurez besoin de le faire qu’une seule fois pour tous les dépôts utilisant notre CLA.
Ce projet a adopté le code de conduite Microsoft Open Source. Pour plus d’informations, consultez la FAQ sur le code de conduite ou contactez [email protected] pour toute question ou commentaire supplémentaire.
Ce projet peut contenir des marques ou des logos pour des projets, des produits ou des services. L'utilisation autorisée des marques ou logos Microsoft est soumise et doit respecter les directives relatives aux marques et aux marques de Microsoft. L'utilisation des marques ou logos Microsoft dans les versions modifiées de ce projet ne doit pas prêter à confusion ni impliquer le parrainage de Microsoft. Toute utilisation de marques ou de logos tiers est soumise aux politiques de ces tiers.