【译】增强 Visual Studio 聊天中的代码库感知能力

Visual Studio 中更智能的代码搜索:从 BM25 到语义搜索

在我们最新的 17.14.11 版本中,我们在代码探索以获取有意义的上下文方面取得了重大飞跃。我们新的远程语义搜索集成能帮助您比以往更快、更精准地找到所需内容。

通过将远程语义搜索直接嵌入到 Visual Studio Copilot 的代码搜索体验中,我们将传统关键词搜索(BM25)的优势与尖端 AI 模型的深度上下文理解能力相结合。这意味着您的搜索不再局限于匹配词语,还能理解搜索查询背后的概念和意图。

让我们深入了解新功能的内容、它为何具有颠覆性意义以及您如何从今天开始使用它。

传统方法:BM25 + 重排序

在此次更新之前,Visual Studio 的代码搜索完全依赖于一个基于 BM25 的搜索引擎。BM25 是一种成熟的排序算法,用于评估每个文档(如代码文件或符号)与查询的匹配程度。它通过分析词频和文档长度来实现这一点,平衡一个词在文档中出现的频率与它在整个代码库中出现的稀有程度。简单来说,一个词在文件中出现的次数越多(在一定范围内),且在整体上越不常见,该文件就被认为越相关。

除此之外,我们还使用了重排序逻辑来优化结果。这一步骤会给某些匹配项额外的权重,比如文件名中的匹配项或活跃项目中的符号,这样最可能相关的结果就会出现在最顶端。

局限性:

BM25 完全是基于关键词的。它本身并不理解同义词、概念或语境。

搜索 "get user authentication token " 只会匹配包含那些确切词汇(authentication, token等)的文件,而会漏掉像 RetrieveOAuthCredential 或 JWT 这样的匹配项。

升级:语义搜索

与专注于匹配精确词语的传统搜索不同,语义搜索匹配的是含义。在先进的向量嵌入技术支持下,它会将您的查询和每一段代码都转化为高维空间中的点。而正是在这个空间里,它们的语义相似度得以衡量。

这意味着它能理解像"fetch user credentials"和"get authentication token"这样的短语是密切相关的,即便它们没有任何完全相同的词语。语义搜索捕捉函数的用途、变量背后的意图,甚至是代码注释中的上下文,以提供真正符合您所寻找内容的结果。

在 Visual Studio 中使用语义代码搜索

得益于我们的远程索引功能,语义代码搜索适用于托管在 Azure DevOps 和已建立索引的 GitHub 仓库中的解决方案。要了解有关 GitHub 集成的更多信息,请查看《About GitHub Code Search -- GitHub Docs》。

试用方法:

- 打开您的 Copilot 聊天窗口

- 使用我们的 #solution 功能来提出如下问题:

"#solution API 请求在哪里?"

"身份验证在哪里处理? #solution"

可以随意使用自然语言,我们的语义引擎能理解完整的句子。例如:"我们在哪里为 API 请求生成 JWT 令牌?"

实际应用示例

让我们以 Roslyn 代码库为例来探究其工作原理。我们将在 Copilot 中运行搜索查询,并对结果进行并排比较。在下面的表格中,左侧是传统 BM25 算法返回的结果,右侧是新的语义搜索返回的结果。这些示例凸显了代码搜索可以变得多么智能和精准。

借助语义搜索,结果可能会更少,但准确性会显著提高。搜索引擎能够理解 "删除非同步修饰符" 和 "移除 Async 修饰符" 表达的是相同的意图,尽管措辞不同,这体现了它对代码含义更深层次的理解。

BM25 往往会返回包含匹配术语的文件,即便这些文件相关性较低或可能不相关,比如损坏的文件或测试文件。例如,在使用 BM25 时,结果中会包含一个名为 SmartIdenterEnterOnTokenTests 的额外文件,该文件与查询并非直接相关。

小结

将远程语义搜索集成到 Visual Studio Copilot 中,是 Copilot 在理解开发者代码库方面迈出的重要一步。通过将传统关键词搜索的精确性与人工智能驱动的语义搜索所具备的深入、上下文感知的洞察力相结合,找到合适的代码变得前所未有的轻松。

无论您是深入研究复杂的遗留项目,还是探索不熟悉的代码库,这种强大的新型搜索体验都能帮助您直接触及核心要点,节省时间并减少挫折感。

今天就来尝试一下,体验更智能的代码搜索方式吧。

Happy coding!

原文链接:https://devblogs.microsoft.com/visualstudio/improving-codebase-awareness-in-visual-studio-chat/