Nouveau cadre pour la génération de code à partir du langage naturel
Un cadre améliore la génération de code pour des langages spécialisés en utilisant la documentation.
― 9 min lire
Table des matières
Les récentes avancées en intelligence artificielle ont montré que les grands modèles de langage peuvent transformer efficacement le langage naturel en code. Ces modèles s'en sortent bien avec des langages de programmation courants comme C++, Java et Python, mais ils ont du mal avec des langages spécialisés comme YAML et JSON. C'est surtout parce que ces langages spécialisés ont des règles et des structures spécifiques que les modèles n'ont peut-être pas rencontrées durant leur entraînement.
Pour résoudre ce problème, les chercheurs ont essayé diverses méthodes comme fournir des exemples ou affiner les modèles. Cependant, ces approches échouent souvent à cause du manque de données spécifiques à ces langages et de la sensibilité à la façon dont les prompts sont structurés. Malgré ces défis, beaucoup d'organisations conservent une Documentation exhaustive sur leurs langages structurés, ce qui peut être précieux pour guider la Génération de code.
Dans cet article, nous présentons un nouveau cadre conçu pour utiliser efficacement cette documentation riche. Le cadre décompose la tâche de génération de code en deux étapes. Tout d'abord, il identifie les bibliothèques appropriées dans la documentation qui correspondent à la requête en langage naturel. Ensuite, il génère du code tout en respectant les règles énoncées dans la documentation de ces bibliothèques.
Méthodologie
Nous avons testé notre cadre avec deux langages structurés complexes : Ansible YAML et les commandes Bash. L'évaluation a été réalisée dans deux contextes : Hors-Domaine (OOD), où le modèle voit des bibliothèques complètement nouvelles durant les tests, et Dans-Domaine (ID), où certaines bibliothèques de l'entraînement apparaissent dans les tests.
Nos tests approfondis ont montré que notre cadre fournit constamment de meilleurs résultats sur divers indicateurs. Il réduit à la fois les erreurs syntaxiques et sémantiques dans le code généré, en particulier pour les langages qui ont moins de données d'entraînement disponibles.
Contexte
La tâche de transformer le langage naturel en code a gagné en importance avec l'émergence d'outils pour aider les développeurs à écrire du code plus efficacement. Ces outils permettent aux utilisateurs de décrire leurs intentions sans avoir besoin de connaître les spécificités du langage de programmation. Des outils comme Amazon Code Whisperer et GitHub Copilot ont montré d'excellents résultats dans ce domaine pour des langages populaires.
Cependant, ces outils font face à des défis importants lorsqu'ils traitent des langages spécialisés. Ces langages, souvent adaptés à des secteurs ou applications spécifiques, ont des règles et formats uniques qui peuvent varier considérablement. Beaucoup d'entreprises utilisent ces langages pour l'automatisation et la gestion d'infrastructure, pourtant les modèles existants n'arrivent souvent pas à bien les gérer à cause d'un manque de données d'entraînement pertinentes.
Bien que certaines méthodes essaient d'améliorer les performances du modèle en utilisant des exemples et de la documentation, elles échouent souvent à capturer la complexité des langages structurés. En conséquence, le code généré peut être incorrect ou incohérent. Pourtant, les entreprises maintiennent généralement une documentation détaillée qui explique la syntaxe et la structure de ces langages spécialisés. Nous croyons que cette documentation peut être mieux exploitée pour améliorer la génération de code.
Aperçu du cadre
Le cadre proposé fonctionne en deux étapes. La première étape implique l'identification de la documentation pertinente pour la tâche à accomplir. Dans cette phase, il récupère des informations sur les bibliothèques les plus applicables à la requête en langage naturel. La deuxième étape se concentre sur la génération de code tout en suivant les règles et la structure définies dans la documentation récupérée.
Étape 1 : Récupération d'informations
Dans la première étape, notre système récupère un ensemble de documents décrivant les bibliothèques pertinentes. Chaque document fournit des détails sur ce que la bibliothèque peut faire, sa syntaxe, et toutes les règles spéciales qui doivent être suivies. Nous expérimentons avec deux méthodes pour la récupération d'informations : récupération sparse et dense.
- Récupération Sparse : Cette méthode utilise des techniques traditionnelles pour identifier des documents pertinents sur la base de la correspondance de mots-clés.
- Récupération Dense : Dans cette approche, nous utilisons des réseaux de neurones pour trouver des documents qui sont sémantiquement similaires à la requête. Cela peut potentiellement donner de meilleurs résultats, car cela peut reconnaître les synonymes et les termes liés qui pourraient ne pas correspondre exactement.
Étape 2 : Génération de code
La deuxième étape se concentre sur la génération de l'extrait de code. Elle s'appuie sur la documentation récupérée et utilise des règles dérivées de celle-ci pour guider le processus de génération de code. Cela garantit que le code généré respecte la syntaxe et la structure spécifiées dans la documentation de la bibliothèque.
Modèles et schémas
Le modèle utilise des modèles qui représentent la structure du code. Chaque modèle définit à la fois des parties statiques et variables. La partie statique est fixe, tandis que la partie variable peut changer en fonction des exigences spécifiques de la requête utilisateur. Ce modèle aide le modèle à comprendre comment agencer correctement les différentes composantes du code.
Le modèle utilise également des règles de schéma qui spécifient les mots-clés valides pour chaque champ et décrivent comment différents champs se rapportent les uns aux autres. Par exemple, certains champs peuvent être obligatoires tandis que d'autres sont optionnels. En suivant ces règles de schéma durant la génération, le modèle peut éviter les erreurs qui pourraient découler de la génération de code invalide ou incorrect.
Signaux de déclenchement
Tout au long du processus de génération, le cadre utilise des signaux de déclenchement pour guider le modèle. Ces signaux indiquent quand des conditions spécifiques sont remplies durant le processus de génération de code. Par exemple, si le modèle génère un mot-clé particulier, cela peut activer des règles qui dictent quels mots-clés supplémentaires sont valides à ce moment-là dans le code.
Évaluation
Nous avons évalué notre cadre avec des tâches Ansible YAML et des commandes Bash. L'évaluation incluait à la fois des paramètres Dans-Domaine et Hors-Domaine pour évaluer l'efficacité de l'approche dans diverses conditions.
Ensembles de données
Pour Ansible YAML, nous avons compilé un ensemble de données provenant de diverses sources qui inclut de nombreux exemples. Cet ensemble contient des instances de langage structuré pour entraîner et évaluer efficacement le modèle. Pour la commande Bash, nous avons sélectionné un ensemble de données qui comporte des utilitaires Bash courants, assurant que les données d'entraînement et de test soient pertinentes.
Indicateurs
Nous avons utilisé plusieurs indicateurs différents pour l'évaluation :
- Correspondance exacte : Mesure la fréquence à laquelle le code généré correspond exactement à la commande de référence.
- Score F1 de tokens : Évalue la justesse du code généré sur la base des tokens individuels dans la commande.
- Précision du nom de commande : Vérifie si le bon utilitaire Bash est utilisé dans la commande générée.
Résultats
Notre cadre a montré une amélioration constante de la performance par rapport aux méthodes existantes. Dans chaque scénario, il a surpassé les références sur tous les indicateurs. Par exemple, la précision des noms de commandes et la justesse de la syntaxe générée se sont considérablement améliorées avec notre cadre.
Analyse de performance
- Amélioration par rapport aux références : Notre cadre a clairement démontré sa capacité à surpasser les méthodes traditionnelles. L'utilisation de la récupération d'informations et des approches de génération contraintes a abouti à un code plus précis et syntaxiquement correct.
- Robustesse face à des ressources limitées : Le cadre a excellé dans des scénarios avec peu de données d'entraînement, le rendant particulièrement utile pour les langages où les données sont rares.
- Adaptation dynamique : En intégrant la documentation et les règles de schéma dans le processus de génération, le cadre peut s'adapter à diverses situations, garantissant que le code généré respecte les normes requises.
Travaux futurs
Bien que notre cadre montre du potentiel, il y a des domaines à améliorer et à explorer davantage. Un aspect important est la nécessité d'entraîner conjointement les composants de récupération et de génération. En faisant cela, nous pourrions réduire les erreurs potentielles qui peuvent survenir lorsque la phase de récupération ne parvient pas à sécuriser la documentation la plus pertinente.
Un autre domaine à explorer est l'efficacité computationnelle de notre approche. Bien que la décodage contraint puisse ajouter un certain surcoût de traitement, l'optimiser pourrait conduire à des performances encore plus rapides sans sacrifier la précision.
De plus, l'intégration de techniques basées sur des parseurs pourrait aider le cadre à mieux comprendre les règles grammaticales complexes. Cela pourrait élargir son applicabilité à un plus large éventail de langages structurés.
Conclusion
Le cadre proposé fait un grand pas en avant dans la tâche de génération de code à partir de langage naturel pour des langages structurés spécialisés. En utilisant efficacement la documentation et les règles de schéma, il réduit les erreurs courantes tout en améliorant l'exactitude globale. Nos évaluations mettent en évidence ses points forts, en particulier dans les scénarios à faibles ressources où les méthodes traditionnelles peinent.
Ce travail contribue non seulement au domaine de la génération de code mais ouvre également de nouvelles voies pour la recherche. Nous croyons qu'en continuant à affiner ces méthodes, le potentiel de l'IA pour améliorer les pratiques de programmation ne fera que croître, rendant plus facile pour les développeurs de traduire leurs idées en code fonctionnel.
En rendant nos ensembles de données et notre code open source, nous espérons inspirer d'autres recherches et innovations dans ce domaine, faisant avancer les capacités de l'IA en programmation.
Titre: DocCGen: Document-based Controlled Code Generation
Résumé: Recent developments show that Large Language Models (LLMs) produce state-of-the-art performance on natural language (NL) to code generation for resource-rich general-purpose languages like C++, Java, and Python. However, their practical usage for structured domain-specific languages (DSLs) such as YAML, JSON is limited due to domain-specific schema, grammar, and customizations generally unseen by LLMs during pre-training. Efforts have been made to mitigate this challenge via in-context learning through relevant examples or by fine-tuning. However, it suffers from problems, such as limited DSL samples and prompt sensitivity but enterprises maintain good documentation of the DSLs. Therefore, we propose DocCGen, a framework that can leverage such rich knowledge by breaking the NL-to-Code generation task for structured code languages into a two-step process. First, it detects the correct libraries using the library documentation that best matches the NL query. Then, it utilizes schema rules extracted from the documentation of these libraries to constrain the decoding. We evaluate our framework for two complex structured languages, Ansible YAML and Bash command, consisting of two settings: Out-of-domain (OOD) and In-domain (ID). Our extensive experiments show that DocCGen consistently improves different-sized language models across all six evaluation metrics, reducing syntactic and semantic errors in structured code. We plan to open-source the datasets and code to motivate research in constrained code generation.
Auteurs: Sameer Pimparkhede, Mehant Kammakomati, Srikanth Tamilselvam, Prince Kumar, Ashok Pon Kumar, Pushpak Bhattacharyya
Dernière mise à jour: 2024-07-03 00:00:00
Langue: English
Source URL: https://arxiv.org/abs/2406.11925
Source PDF: https://arxiv.org/pdf/2406.11925
Licence: https://creativecommons.org/licenses/by/4.0/
Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.
Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.
Liens de référence
- https://www.latex-project.org/help/documentation/encguide.pdf
- https://www.ansible.com/
- https://aws.amazon.com/codewhisperer/
- https://github.com/features/copilot/
- https://w.wiki/6jCH
- https://manned.org/pkg/ubuntu-mantic
- https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html
- https://manned.org/
- https://huggingface.co/docs/transformers/en/internal/generation_utils
- https://github.com/stanford-futuredata/ColBERT