Este repositorio alberga multilspy
, una biblioteca desarrollada como parte de la investigación realizada para el documento NeruIPS 2023 titulado "Decodificación guiada por monitores de código LM con análisis estático del contexto del repositorio" ("Guía de modelos de lenguaje de código con contexto global usando monitores" en Arxiv). El artículo presenta la decodificación guiada por monitor (MGD) para la generación de código utilizando modelos de lenguaje, donde un monitor utiliza análisis estático para guiar la decodificación, asegurando que el código generado siga varias propiedades de corrección, como la ausencia de nombres de símbolos alucinados y el orden válido de las llamadas a métodos. , etc. Para obtener más detalles sobre la decodificación guiada por monitor, consulte el documento y el repositorio de GitHub microsoft/monitors4codegen.
multilspy
es una biblioteca multiplataforma diseñada para simplificar el proceso de creación de clientes de servidores de idiomas para consultar y obtener resultados de varios análisis estáticos de una amplia variedad de servidores de idiomas que se comunican a través del protocolo de servidor de idiomas. Es fácilmente extensible para admitir cualquier lenguaje que tenga un servidor de idiomas y actualmente admite Java, Rust, C# y Python. Nuestro objetivo es agregar continuamente soporte para más servidores de idiomas e idiomas.
Los servidores de idiomas son herramientas que realizan una variedad de análisis estáticos en repositorios de código y brindan información útil, como sugerencias de finalización de código dirigidas por tipo, ubicaciones de definiciones de símbolos, referencias de símbolos, etc., a través del Protocolo de servidor de idiomas (LSP). Dado que LSP es independiente del idioma, multilspy
puede proporcionar resultados para análisis estáticos de código en diferentes idiomas a través de una interfaz común.
multilspy
pretende facilitar el proceso de uso de servidores de idiomas, manejando varios pasos en el uso de un servidor de idiomas:
Algunos de los resultados de análisis que multilspy
puede proporcionar son:
Es ideal crear un nuevo entorno virtual con python>=3.10
. Para crear un entorno virtual usando conda y activarlo:
conda create -n multilspy_env python=3.10
conda activate multilspy_env
Se pueden encontrar más detalles e instrucciones sobre la creación de entornos virtuales Python en la documentación oficial. Además, también remitimos a los usuarios a Miniconda, como alternativa a los pasos anteriores para la creación del entorno virtual.
Para instalar multilspy
usando pip, ejecute el siguiente comando:
pip install multilspy
Uso de ejemplo:
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
también proporciona una API basada en asyncio que se puede utilizar en contextos asíncronos. Uso de ejemplo (asincio):
from multilspy import LanguageServer
...
lsp = LanguageServer . create (...)
async with lsp . start_server ():
result = await lsp . request_definition (
...
)
...
El archivo src/multilspy/language_server.py proporciona la API multilspy
. Varias pruebas para multilspy
presentes en tests/multilspy/ proporcionan ejemplos de uso detallados para multilspy
. Las pruebas se pueden ejecutar ejecutando:
pytest tests/multilspy
multilspy
en escenarios AI4Code como la decodificación guiada por monitor multilspy
proporciona todas las funciones que el protocolo de servidor de idiomas proporciona a IDE como VSCode. Es útil desarrollar conjuntos de herramientas que puedan interactuar con sistemas de inteligencia artificial como los modelos de lenguaje grande (LLM).
Uno de esos casos de uso es la decodificación guiada por monitor, donde se utiliza multilspy
para encontrar resultados de análisis estáticos, como finalizaciones dirigidas por tipo, para guiar la generación de código token por token utilizando un LLM, asegurando que todos los nombres de identificadores/métodos generados sean válidos. en el contexto del repositorio, lo que aumenta significativamente la compilabilidad del código generado. MGD también demuestra el uso de multilspy
para crear monitores que garanticen que todas las llamadas a funciones en el código generado por LLM reciban la cantidad correcta de argumentos y que las funciones de un objeto se llamen en el orden correcto siguiendo un protocolo (como no llamar a "leer" antes de "abrir" en un objeto de archivo).
asyncio
al ejecutar las pruebas para MGDSi recibe el siguiente error:
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
Asegúrese de crear un nuevo entorno con Python >=3.10
. Para obtener más detalles, consulte la discusión sobre StackOverflow.
Si está utilizando Multilspy en su investigación o aplicaciones, cite usando este 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}
}
Este proyecto agradece contribuciones y sugerencias. La mayoría de las contribuciones requieren que usted acepte un Acuerdo de licencia de colaborador (CLA) que declara que tiene derecho a otorgarnos, y de hecho lo hace, los derechos para usar su contribución. Para obtener más detalles, visite https://cla.opensource.microsoft.com.
Cuando envía una solicitud de extracción, un bot CLA determinará automáticamente si necesita proporcionar un CLA y decorar el PR de manera adecuada (por ejemplo, verificación de estado, comentario). Simplemente siga las instrucciones proporcionadas por el bot. Solo necesitarás hacer esto una vez en todos los repositorios que utilicen nuestro CLA.
Este proyecto ha adoptado el Código de conducta de código abierto de Microsoft. Para obtener más información, consulte las preguntas frecuentes sobre el Código de conducta o comuníquese con [email protected] si tiene alguna pregunta o comentario adicional.
Este proyecto puede contener marcas comerciales o logotipos de proyectos, productos o servicios. El uso autorizado de las marcas comerciales o logotipos de Microsoft está sujeto y debe seguir las Pautas de marcas y marcas comerciales de Microsoft. El uso de marcas comerciales o logotipos de Microsoft en versiones modificadas de este proyecto no debe causar confusión ni implicar patrocinio de Microsoft. Cualquier uso de marcas comerciales o logotipos de terceros está sujeto a las políticas de dichos terceros.