該儲存庫託管multilspy
,該庫是NeruIPS 2023 論文“Monitor-Guided Decoding of Code LMs with Static Analysis of Repository Context”(Arxiv 上的“Guiding Language Models of Code with Global Context using Monitors”)的研究的一部分而開發的。本文介紹了使用語言模型進行程式碼產生的監視器引導解碼(MGD),其中監視器使用靜態分析來指導解碼,確保生成的程式碼遵循各種正確性屬性,例如不存在幻覺的符號名稱、方法調用的有效順序有關 Monitor-Guided Decoding 的更多詳細信息,請參閱論文和 GitHub 存儲庫 microsoft/monitors4codegen。
multilspy
是一個跨平台庫,旨在簡化創建語言伺服器客戶端的過程,以便從透過語言伺服器協定進行通訊的各種語言伺服器查詢和獲取各種靜態分析的結果。它可以輕鬆擴展以支援任何具有語言伺服器的語言,目前支援 Java、Rust、C# 和 Python。我們的目標是不斷增加對更多語言伺服器和語言的支援。
語言伺服器是對程式碼儲存庫執行各種靜態分析並透過語言伺服器協定 (LSP) 提供有用資訊的工具,例如類型導向的程式碼完成建議、符號定義位置、符號引用等。由於 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,可以在非同步上下文中使用。用法範例(非同步):
from multilspy import LanguageServer
...
lsp = LanguageServer . create (...)
async with lsp . start_server ():
result = await lsp . request_definition (
...
)
...
檔案 src/multilspy/language_server.py 提供了multilspy
API。 test/multilspy/ 下的多項multilspy
檢定提供了multilspy
的詳細使用範例。可以透過執行以下命令來執行測試:
pytest tests/multilspy
multilspy
multilspy
提供了 language-server-protocol 為 VSCode 等 IDE 提供的所有功能。開發可以與大型語言模型 (LLM) 等人工智慧系統互動的工具集非常有用。
其中一個用例是監控引導解碼,其中multilspy
用於查找靜態分析的結果(例如類型定向完成),以指導使用 LLM 逐個令牌生成程式碼,確保所有生成的標識符/方法名稱都是有效的在儲存庫的上下文中,顯著提高了生成程式碼的可編譯性。 MGD 還示範了使用multilspy
建立監視器,以確保 LLM 產生的程式碼中的所有函數呼叫接收正確數量的參數,並且按照協定以正確的順序呼叫物件的函數(例如不在「open」之前呼叫「read」)在文件對像上)。
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 在所有儲存庫中執行一次此操作。
該專案採用了微軟開源行為準則。有關詳細信息,請參閱行為準則常見問題解答或聯繫 [email protected] 提出任何其他問題或意見。
該項目可能包含項目、產品或服務的商標或標誌。 Microsoft 商標或標誌的授權使用須遵守且必須遵循 Microsoft 的商標和品牌指南。在此項目的修改版本中使用 Microsoft 商標或標誌不得混淆或暗示 Microsoft 贊助。任何對第三方商標或標誌的使用均須遵守這些第三方的政策。