Ce référentiel héberge multilspy
, une bibliothèque développée dans le cadre de la recherche menée pour l'article NeruIPS 2023 intitulé "Monitor-Guided Decoding of Code LMs with Static Analysis of Repository Context" ("Guiding Language Models of Code with Global Context using Monitors" sur Arxiv). L'article présente le décodage guidé par le moniteur (MGD) pour la génération de code à l'aide de modèles de langage, dans lequel un moniteur utilise une analyse statique pour guider le décodage, garantissant que le code généré suit diverses propriétés d'exactitude, comme l'absence de noms de symboles hallucinés, l'ordre valide des appels de méthode. , etc. Pour plus de détails sur le décodage guidé par le moniteur, veuillez vous référer au document et au référentiel GitHub Microsoft/monitors4codegen.
multilspy
est une bibliothèque multiplateforme conçue pour simplifier le processus de création de clients de serveur de langage pour interroger et obtenir les résultats de diverses analyses statiques à partir d'une grande variété de serveurs de langage qui communiquent via le protocole de serveur de langage. Il est facilement extensible pour prendre en charge n'importe quel langage doté d'un serveur de langage et prend actuellement en charge Java, Rust, C# et Python. Nous visons à ajouter continuellement la prise en charge de davantage de serveurs de langues et de langues.
Les serveurs de langage sont des outils qui effectuent diverses analyses statiques sur les référentiels de code et fournissent des informations utiles telles que des suggestions de complétion de code orientées type, des emplacements de définition de symboles, des références de symboles, etc., via le protocole de serveur de langage (LSP). Puisque LSP est indépendant du langage, multilspy
peut fournir les résultats d’analyses statiques de code dans différents langages sur une interface commune.
multilspy
a l'intention de faciliter le processus d'utilisation des serveurs de langue, en gérant différentes étapes d'utilisation d'un serveur de langue :
Certains des résultats d'analyse que multilspy
peut fournir sont :
Il est idéal pour créer un nouvel environnement virtuel avec python>=3.10
. Pour créer un environnement virtuel à l'aide de conda et l'activer :
conda create -n multilspy_env python=3.10
conda activate multilspy_env
De plus amples détails et instructions sur la création d'environnements virtuels Python peuvent être trouvés dans la documentation officielle. De plus, nous renvoyons également les utilisateurs à Miniconda, comme alternative aux étapes ci-dessus pour la création de l'environnement virtuel.
Pour installer multilspy
à l'aide de pip, exécutez la commande suivante :
pip install multilspy
Exemple d'utilisation :
from multilspy import SyncLanguageServer
from multilspy . multilspy_config import MultilspyConfig
from multilspy . multilspy_logger import MultilspyLogger
...
config = MultilspyConfig . from_dict ({ "code_language" : "java" }) # Also supports "python", "rust", "csharp"
logger = MultilspyLogger ()
lsp = SyncLanguageServer . create ( config , logger , "/abs/path/to/project/root/" )
with lsp . start_server ():
result = lsp . request_definition (
"relative/path/to/code_file.java" , # Filename of location where request is being made
163 , # line number of symbol for which request is being made
4 # column number of symbol for which request is being made
)
result2 = lsp . request_completions (
...
)
result3 = lsp . request_references (
...
)
result4 = lsp . request_document_symbols (
...
)
result5 = lsp . request_hover (
...
)
...
multilspy
fournit également une API basée sur asyncio qui peut être utilisée dans des contextes asynchrones. Exemple d'utilisation (asyncio) :
from multilspy import LanguageServer
...
lsp = LanguageServer . create (...)
async with lsp . start_server ():
result = await lsp . request_definition (
...
)
...
Le fichier src/multilspy/langage_server.py fournit l'API multilspy
. Plusieurs tests pour multilspy
présents sous tests/multilspy/ fournissent des exemples d'utilisation détaillés pour multilspy
. Les tests peuvent être exécutés en exécutant :
pytest tests/multilspy
multilspy
dans les scénarios AI4Code comme le décodage guidé par le moniteur multilspy
fournit toutes les fonctionnalités que le protocole de serveur de langage fournit aux IDE comme VSCode. Il est utile de développer des ensembles d'outils pouvant s'interfacer avec des systèmes d'IA tels que les grands modèles linguistiques (LLM).
Un de ces cas d'utilisation est le décodage guidé par le moniteur, où multilspy
est utilisé pour trouver les résultats d'analyses statiques telles que les complétions dirigées par type, pour guider la génération de code jeton par jeton à l'aide d'un LLM, garantissant que tous les noms d'identifiant/méthode générés sont valides. dans le contexte du référentiel, améliorant considérablement la compilabilité du code généré. MGD démontre également l'utilisation de multilspy
pour créer des moniteurs garantissant que tous les appels de fonction dans le code généré par LLM reçoivent le nombre correct d'arguments et que les fonctions d'un objet sont appelées dans le bon ordre en suivant un protocole (comme ne pas appeler "read" avant "open" sur un objet fichier).
asyncio
lors de l'exécution des tests pour MGDSi vous obtenez l'erreur suivante :
RuntimeError: Task <Task pending name='Task-2' coro=<_AsyncGeneratorContextManager.__aenter__() running at
python3.8/contextlib.py:171> cb=[_chain_future.<locals>._call_set_state() at
python3.8/asyncio/futures.py:367]> got Future <Future pending> attached to a different loop python3.8/asyncio/locks.py:309: RuntimeError
Veuillez vous assurer de créer un nouvel environnement avec Python >=3.10
. Pour plus de détails, veuillez consulter la discussion StackOverflow.
Si vous utilisez Multilspy dans vos recherches ou applications, veuillez citer en utilisant ce BibTeX :
@inproceedings{NEURIPS2023_662b1774,
author = {Agrawal, Lakshya A and Kanade, Aditya and Goyal, Navin and Lahiri, Shuvendu and Rajamani, Sriram},
booktitle = {Advances in Neural Information Processing Systems},
editor = {A. Oh and T. Naumann and A. Globerson and K. Saenko and M. Hardt and S. Levine},
pages = {32270--32298},
publisher = {Curran Associates, Inc.},
title = {Monitor-Guided Decoding of Code LMs with Static Analysis of Repository Context},
url = {https://proceedings.neurips.cc/paper_files/paper/2023/file/662b1774ba8845fc1fa3d1fc0177ceeb-Paper-Conference.pdf},
volume = {36},
year = {2023}
}
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.