이 저장소는 NeruIPS 2023 논문 "Repository Context의 정적 분석을 통한 코드 LM의 모니터 기반 디코딩"(Arxiv의 "모니터를 사용하여 전역 컨텍스트로 코드의 언어 모델 안내")이라는 제목의 연구의 일부로 개발된 라이브러리인 multilspy
를 호스팅합니다. 이 문서에서는 언어 모델을 사용하여 코드 생성을 위한 MGD(모니터 기반 디코딩)를 소개합니다. 여기서 모니터는 정적 분석을 사용하여 디코딩을 안내하고 생성된 코드가 환각 기호 이름의 부재, 메서드 호출의 유효한 순서와 같은 다양한 정확성 속성을 따르도록 보장합니다. 등. Monitor-Guided Decoding에 대한 자세한 내용은 논문 및 GitHub 저장소 microsoft/monitors4codegen을 참조하세요.
multilspy
는 언어 서버 프로토콜을 통해 통신하는 다양한 언어 서버에서 다양한 정적 분석 결과를 쿼리하고 얻기 위해 언어 서버 클라이언트를 만드는 프로세스를 단순화하도록 설계된 크로스 플랫폼 라이브러리입니다. Language Server가 있고 현재 Java, Rust, C# 및 Python을 지원하는 모든 언어를 지원하도록 쉽게 확장할 수 있습니다. 우리는 더 많은 언어 서버와 언어에 대한 지원을 지속적으로 추가하는 것을 목표로 하고 있습니다.
언어 서버는 코드 저장소에 대한 다양한 정적 분석을 수행하고 LSP(Language Server Protocol)를 통해 유형별 코드 완성 제안, 기호 정의 위치, 기호 참조 등과 같은 유용한 정보를 제공하는 도구입니다. LSP는 언어에 구애받지 않으므로 multilspy
공통 인터페이스를 통해 다양한 언어로 된 코드의 정적 분석 결과를 제공할 수 있습니다.
multilspy
언어 서버 사용의 다양한 단계를 처리하여 언어 서버 사용 프로세스를 쉽게 만들려고 합니다.
multilspy
제공할 수 있는 분석 결과 중 일부는 다음과 같습니다.
python>=3.10
으로 새로운 가상 환경을 만드는 것이 이상적입니다. conda를 사용하여 가상 환경을 만들고 활성화하려면 다음을 수행하십시오.
conda create -n multilspy_env python=3.10
conda activate multilspy_env
Python 가상 환경 생성에 대한 자세한 내용과 지침은 공식 문서에서 확인할 수 있습니다. 또한 위의 가상 환경 생성 단계에 대한 대안으로 사용자에게 Miniconda를 추천합니다.
pip를 사용하여 multilspy
설치하려면 다음 명령을 실행하십시오.
pip install multilspy
사용 예:
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
비동기 컨텍스트에서 사용할 수 있는 asyncio 기반 API도 제공합니다. 사용 예(asyncio):
from multilspy import LanguageServer
...
lsp = LanguageServer . create (...)
async with lsp . start_server ():
result = await lsp . request_definition (
...
)
...
src/multilspy/언어_server.py 파일은 multilspy
API를 제공합니다. test/multilspy/ 아래에 있는 multilspy
에 대한 여러 테스트는 multilspy
에 대한 자세한 사용 예를 제공합니다. 테스트는 다음을 실행하여 실행할 수 있습니다.
pytest tests/multilspy
multilspy
사용 multilspy
언어 서버 프로토콜이 VSCode와 같은 IDE에 제공하는 모든 기능을 제공합니다. LLM(대형 언어 모델)과 같은 AI 시스템과 인터페이스할 수 있는 도구 세트를 개발하는 것이 유용합니다.
이러한 사용 사례 중 하나는 모니터 기반 디코딩입니다. 여기서는 multilspy
사용하여 유형 지향 완성과 같은 정적 분석 결과를 찾고 LLM을 사용하여 토큰별 코드 생성을 안내하여 생성된 모든 식별자/메서드 이름이 유효한지 확인합니다. 저장소의 맥락에서 생성된 코드의 컴파일 가능성을 크게 향상시킵니다. MGD는 또한 LLM 생성 코드의 모든 함수 호출이 올바른 수의 인수를 수신하고 객체의 함수가 프로토콜에 따라 올바른 순서로 호출되도록(예: "열기" 전에 "읽기"를 호출하지 않는 것과 같이) multilspy
를 생성하기 위해 multilspy를 사용하는 방법을 보여줍니다. 파일 객체에서).
asyncio
관련 런타임 오류다음 오류가 발생하는 경우:
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
Python >=3.10
사용하여 새 환경을 생성했는지 확인하세요. 자세한 내용은 StackOverflow 토론을 참조하세요.
연구나 응용 프로그램에서 Multilspy를 사용하는 경우 다음 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}
}
이 프로젝트는 기여와 제안을 환영합니다. 대부분의 기여는 귀하가 귀하의 기여를 사용할 수 있는 권리를 갖고 있으며 실제로 그렇게 하고 있음을 선언하는 기여자 라이센스 계약(CLA)에 동의해야 합니다. 자세한 내용을 보려면 https://cla.opensource.microsoft.com을 방문하세요.
끌어오기 요청을 제출하면 CLA 봇이 자동으로 CLA 제공이 필요한지 여부를 결정하고 PR을 적절하게 장식합니다(예: 상태 확인, 댓글). 봇이 제공하는 지침을 따르기만 하면 됩니다. CLA를 사용하여 모든 저장소에서 이 작업을 한 번만 수행하면 됩니다.
이 프로젝트는 Microsoft 오픈 소스 행동 강령을 채택했습니다. 자세한 내용은 행동 강령 FAQ를 참조하거나 추가 질문이나 의견이 있는 경우 [email protected]으로 문의하세요.
이 프로젝트에는 프로젝트, 제품 또는 서비스에 대한 상표나 로고가 포함될 수 있습니다. Microsoft 상표 또는 로고의 승인된 사용에는 Microsoft의 상표 및 브랜드 지침이 적용되며 이를 따라야 합니다. 이 프로젝트의 수정된 버전에 Microsoft 상표 또는 로고를 사용하면 혼동을 일으키거나 Microsoft 후원을 암시해서는 안 됩니다. 제3자 상표 또는 로고의 사용에는 해당 제3자의 정책이 적용됩니다.