このmultilspy
は、 NeruIPS 2023 論文「リポジトリ コンテキストの静的分析によるコード LM のモニターガイドによるデコーディング」 (Arxiv の「モニターを使用したグローバル コンテキストによるコードの言語モデルのガイド」) というタイトルの NeruIPS 2023 論文のために実施された研究の一部として開発されたライブラリである multilspy をホストします。この文書では、言語モデルを使用したコード生成のためのモニターガイド付きデコーディング (MGD) が紹介されています。MGD では、モニターが静的解析を使用してデコーディングをガイドし、生成されたコードが幻覚シンボル名の欠如、メソッド呼び出しの有効な順序などのさまざまな正確性プロパティに従っていることを確認します。モニターガイド付きデコーディングの詳細については、論文および 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 を提供します。 testing/multilspy/ の下にあるmultilspy
のいくつかのテストは、 multilspy
の詳細な使用例を提供します。テストは以下を実行することで実行できます。
pytest tests/multilspy
multilspy
の使用multilspy
言語サーバー プロトコルが VSCode などの IDE に提供するすべての機能を提供します。 Large Language Model (LLM) などの AI システムとインターフェースできるツールセットを開発すると便利です。
そのようなユースケースの 1 つは、モニターガイド付きデコーディングです。ここでは、 multilspy
を使用して型指定補完などの静的分析の結果を検索し、LLM を使用してトークンごとのコード生成をガイドし、生成されたすべての識別子/メソッド名が有効であることを確認します。リポジトリのコンテキストで、生成されたコードのコンパイル可能性が大幅に向上します。また、MGD multilspy
、LLM で生成されたコード内のすべての関数呼び出しが正しい数の引数を受け取ること、およびオブジェクトの関数がプロトコルに従って正しい順序で呼び出されること (「open」の前に「read」を呼び出さないなど) を保証するモニターを作成するための 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 を使用するすべてのリポジトリでこれを 1 回行うだけで済みます。
このプロジェクトはマイクロソフトのオープンソース行動規範を採用しています。詳細については、行動規範に関する FAQ を参照するか、追加の質問やコメントがあれば [email protected] までお問い合わせください。
このプロジェクトには、プロジェクト、製品、またはサービスの商標またはロゴが含まれている場合があります。 Microsoft の商標またはロゴの許可された使用には、Microsoft の商標およびブランド ガイドラインが適用され、それに従わなければなりません。このプロジェクトの修正バージョンで Microsoft の商標またはロゴを使用することは、混乱を引き起こしたり、Microsoft のスポンサーであることを暗示したりしてはなりません。第三者の商標またはロゴの使用には、それらの第三者のポリシーが適用されます。