**介绍**
该存储库托管 multilspy,这是一个作为 2023 年 NeruIPS 论文“使用存储库上下文的静态分析来指导代码 LM 的解码”(Arxiv 上的“使用监视器指导代码语言模型的全局上下文”)研究的一部分开发的库。该论文介绍了用于使用语言模型生成代码的监视器引导解码 (MGD),其中监视器使用静态分析来引导解码,确保生成的代码遵循各种正确性属性,例如不存在幻觉符号名称、方法调用的有效顺序等。有关监视器引导解码的更多详细信息,请参阅论文和 GitHub 存储库 microsoft/monitors4codegen。
multilspy 是一个跨平台库,旨在简化创建语言服务器客户端以查询和获取来自各种通过语言服务器协议通信的语言服务器的各种静态分析结果的过程。它很容易扩展以支持任何具有语言服务器的语言,目前支持 Java、Rust、C# 和 Python。我们的目标是持续添加对更多语言服务器和语言的支持。
语言服务器是用于对代码存储库执行各种静态分析并提供有用信息的工具,例如类型导向的代码完成建议、符号定义位置、符号引用等,这些工具通过语言服务器协议 (LSP) 进行通信。由于 LSP 与语言无关,因此 multilspy 可以通过通用接口提供不同语言代码静态分析的结果。
multilspy 旨在通过处理使用语言服务器的各个步骤来简化使用语言服务器的过程:
* 自动处理平台特定服务器二进制文件的下载,以及语言服务器的设置/拆卸
* 处理客户端和服务器之间基于 JSON-RPC 的通信
* 维护和传递手动调整的服务器和语言特定配置参数
* 在执行查询/请求的所有服务器特定协议步骤时,向用户提供简单的 API。
multilspy 可以提供的某些分析结果是:
* 查找函数或类的定义 (textDocument/definition)
* 查找函数的调用者或类的实例化 (textDocument/references)
* 提供基于类型的反引用完成 (textDocument/completion)
* 获取将鼠标悬停在符号上时显示的信息,例如方法签名 (textDocument/hover)
* 获取给定文件中定义的所有符号的列表/树,以及符号类型(如类、方法等)(textDocument/documentSymbol)
请创建一个问题/PR 以添加上面未列出的任何其他 LSP 请求
**安装**
理想情况下,使用 python>=3.10 创建一个新的虚拟环境。要使用 conda 创建虚拟环境并激活它:
conda create -n multilspy_env python=3.10
conda activate multilspy_env
有关创建 Python 虚拟环境的更多详细信息和说明,请参阅官方文档。此外,我们还建议用户使用 Miniconda 作为上述创建虚拟环境步骤的替代方法。
要使用 pip 安装 multilspy,请执行以下命令:
pip install multilspy
**用法**
示例用法:
```python
from multilspy import SyncLanguageServer
from multilspy.multilspy_config import MultilspyConfig
from multilspy.multilspy_logger import MultilspyLogger
...
config = MultilspyConfig.from_dict({"code_language": "java"}) # 也支持“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", # 请求所在的代码文件名
163, # 请求符号的行号
4 # 请求符号的列号
)
result2 = lsp.request_completions(
...
)
result3 = lsp.request_references(
...
)
result4 = lsp.request_document_symbols(
...
)
result5 = lsp.request_hover(
...
)
...
```
multilspy 还提供了一个可以在异步上下文中使用的基于 asyncio 的 API。示例用法(asyncio):
```python
from multilspy import LanguageServer
...
lsp = LanguageServer.create(...)
async with lsp.start_server():
result = await lsp.request_definition(
...
)
...
```
文件 src/multilspy/language_server.py 提供了 multilspy API。tests/multilspy/ 下提供的几个 multilspy 测试提供了 multilspy 的详细用法示例。可以通过运行以下命令执行测试:
pytest tests/multilspy
**在 AI4Code 场景(如监视器引导解码)中使用 multilspy**
multilspy 提供了语言服务器协议为 VSCode 等 IDE 提供的所有功能。它有助于开发可以与 AI 系统(如大型语言模型 (LLM))交互的工具集。
**监视器引导解码**
一个这样的用例是监视器引导解码,其中 multilspy 用于查找静态分析的结果(如类型导向的完成),以指导使用 LLM 的代码逐令牌生成,确保所有生成的标识符/方法名称在存储库的上下文中都是有效的,从而显着提高生成的代码的可编译性。MGD 还演示了如何使用 multilspy 创建监视器,以确保 LLM 生成的代码中所有函数调用都接收正确的参数数量,并且对象的函数按照正确的顺序调用(例如,在文件对象上不要在“open”之前调用“read”)。
**multilspy 在其他用例中的应用**
* “修复测试:使用静态收集器和神经重排序器增强 LLM 以修复测试用例”,2024 年 IEEE 第 35 届国际软件可靠性工程研讨会 (ISSRE)
* 有关使用 multilspy 获取 Python 完成的教程
**常见问题解答 (FAQ)**
**执行 MGD 测试时与 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**
如果您在研究或应用程序中使用 Multilspy,请使用以下 BibTeX 引用:
```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 开源行为准则。
有关更多信息,请参阅行为准则常见问题解答或联系 [email protected] 提出任何其他问题或意见。
**商标**
本项目可能包含项目、产品或服务的商标或徽标。Microsoft 商标或徽标的授权使用须遵守并必须遵循 Microsoft 的商标和品牌指南。
在本项目的修改版本中使用 Microsoft 商标或徽标不得造成混淆或暗示 Microsoft 的赞助。
任何第三方商标或徽标的使用均须遵守该第三方的政策。