Este repositório hospeda multilspy
, uma biblioteca desenvolvida como parte da pesquisa conduzida para o artigo NeruIPS 2023 intitulado "Decodificação guiada por monitor de LMs de código com análise estática do contexto do repositório" ("Modelos de linguagem de código guia com contexto global usando monitores" no Arxiv). O artigo apresenta a Decodificação Guiada por Monitor (MGD) para geração de código usando Modelos de Linguagem, onde um monitor usa análise estática para guiar a decodificação, garantindo que o código gerado siga várias propriedades de correção, como ausência de nomes de símbolos alucinados, ordem válida de chamadas de método , etc. Para obter mais detalhes sobre a decodificação guiada por monitor, consulte o artigo e o repositório GitHub microsoft/monitors4codegen.
multilspy
é uma biblioteca multiplataforma projetada para simplificar o processo de criação de clientes de servidores de idiomas para consultar e obter resultados de várias análises estáticas de uma ampla variedade de servidores de idiomas que se comunicam através do protocolo de servidor de idiomas. É facilmente extensível para suportar qualquer linguagem que possua um Language Server e atualmente suporte Java, Rust, C# e Python. Nosso objetivo é adicionar continuamente suporte para mais servidores e idiomas.
Servidores de linguagem são ferramentas que executam uma variedade de análises estáticas em repositórios de código e fornecem informações úteis, como sugestões de conclusão de código direcionadas ao tipo, locais de definição de símbolos, referências de símbolos, etc., através do Language Server Protocol (LSP). Como o LSP é independente de linguagem, multilspy
pode fornecer resultados para análises estáticas de código em diferentes linguagens em uma interface comum.
multilspy
pretende facilitar o processo de utilização de servidores de linguagem, lidando com várias etapas no uso de um servidor de linguagem:
Alguns dos resultados da análise que multilspy
pode fornecer são:
É ideal criar um novo ambiente virtual com python>=3.10
. Para criar um ambiente virtual usando conda e ativá-lo:
conda create -n multilspy_env python=3.10
conda activate multilspy_env
Mais detalhes e instruções sobre a criação de ambientes virtuais Python podem ser encontrados na documentação oficial. Além disso, também encaminhamos os usuários ao Miniconda, como alternativa às etapas acima para criação do ambiente virtual.
Para instalar multilspy
usando pip, execute o seguinte comando:
pip install multilspy
Exemplo de uso:
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
também fornece uma API baseada em assíncrono que pode ser usada em contextos assíncronos. Exemplo de uso (assíncio):
from multilspy import LanguageServer
...
lsp = LanguageServer . create (...)
async with lsp . start_server ():
result = await lsp . request_definition (
...
)
...
O arquivo src/multilspy/language_server.py fornece a API multilspy
. Vários testes para multilspy
presentes em testes/multilspy/ fornecem exemplos detalhados de uso para multilspy
. Os testes podem ser executados executando:
pytest tests/multilspy
multilspy
em cenários AI4Code como decodificação guiada por monitor multilspy
fornece todos os recursos que o protocolo de servidor de linguagem fornece para IDEs como VSCode. É útil desenvolver conjuntos de ferramentas que possam interagir com sistemas de IA como Large Language Models (LLM).
Um desses casos de uso é a decodificação guiada por monitor, onde multilspy
é usado para encontrar resultados de análises estáticas, como conclusões direcionadas por tipo, para orientar a geração de código token por token usando um LLM, garantindo que todos os nomes de identificadores/métodos gerados sejam válidos no contexto do repositório, aumentando significativamente a compilabilidade do código gerado. MGD também demonstra o uso de multilspy
para criar monitores que garantem que todas as chamadas de função no código gerado pelo LLM recebam o número correto de argumentos e que as funções de um objeto sejam chamadas na ordem correta seguindo um protocolo (como não chamar "read" antes de "open" em um objeto de arquivo).
asyncio
ao executar os testes para MGDSe você receber o seguinte erro:
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
Certifique-se de criar um novo ambiente com Python >=3.10
. Para obter mais detalhes, dê uma olhada na discussão StackOverflow.
Se você estiver usando o Multilspy em suas pesquisas ou aplicações, cite o uso deste 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 projeto aceita contribuições e sugestões. A maioria das contribuições exige que você concorde com um Contrato de Licença de Colaborador (CLA), declarando que você tem o direito de nos conceder, e realmente nos concede, os direitos de uso de sua contribuição. Para obter detalhes, visite https://cla.opensource.microsoft.com.
Quando você envia uma solicitação pull, um bot CLA determinará automaticamente se você precisa fornecer um CLA e decorará o PR adequadamente (por exemplo, verificação de status, comentário). Basta seguir as instruções fornecidas pelo bot. Você só precisará fazer isso uma vez em todos os repositórios usando nosso CLA.
Este projeto adotou o Código de Conduta de Código Aberto da Microsoft. Para obter mais informações, consulte as Perguntas frequentes sobre o Código de Conduta ou entre em contato com [email protected] com perguntas ou comentários adicionais.
Este projeto pode conter marcas registradas ou logotipos de projetos, produtos ou serviços. O uso autorizado de marcas registradas ou logotipos da Microsoft está sujeito e deve seguir as Diretrizes de Marcas Registradas e Marcas da Microsoft. O uso de marcas registradas ou logotipos da Microsoft em versões modificadas deste projeto não deve causar confusão nem implicar patrocínio da Microsoft. Qualquer uso de marcas registradas ou logotipos de terceiros está sujeito às políticas desses terceiros.