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/

【译】增强 Visual Studio 聊天中的代码库感知能力的更多相关文章

  1. 【广州.NET社区推荐】【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  2. 【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  3. 在Visual Studio 2013 中使用C++单元测试

    本文主要介绍在Visual Studio 2013中对代码进行单元测试的方法,包含了两方面的内容:对已有的Dll文件进行单元测试,以及对已有的源文件进行单元测试. 1. VS2013对DLL文件的单元 ...

  4. [.net 面向对象程序设计进阶] (27) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git

    [.net 面向对象程序设计进阶] (26) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git 本篇导读: 接上两篇,继续Git之旅 分布式版本控制系统 ...

  5. 如何在Visual Studio 2012中发布Web应用程序时自动混淆Javascript

    同Java..NET实现的应用程序类似,Javascript编写的应用程序也面临一个同样的问题:源代码的保护.尽管对大多数Javascript应用公开源代码不算是很严重的问题,但是对于某些开发者来说, ...

  6. 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)

    本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...

  7. 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)

    前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...

  8. Visual Studio Code中文文档(一)-快速入门

    Visual Studio Code是一个轻量级但是十分强大的源代码编辑器,重要的是它在Windows, OS X 和Linux操作系统的桌面上均可运行.Visual Studio Code内置了对J ...

  9. Visual Studio 2015中快捷键总结

    今天总结了Visual Studio工具中常用的快捷键,可供平时参考查阅. 程序调试相关的快捷键F5: 启动调试Ctrl+F5: 开始执行(不调试)Shift+F5: 停止调试Ctrl+Shift+F ...

  10. ASP.NET 5系列教程 (五):在Visual Studio 2015中使用Grunt、Bower开发Web程序

    基于Visual Studio 2015,你可以: 方便的管理前端包,如jQuery, Bootstrap, 或Angular. 自动运行任务,如LESS.JavaScript压缩.JSLint.Ja ...

随机推荐

  1. Java安全_RCE漏洞

    [!NOTE] 本次学习使用开源项目: https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou ...

  2. 「ABC 406 G」Travelling Salesman Problem

    「ABC 406 G」Travelling Salesman Problem 前言 本题笔者使用了两种方法来做,一是 \(\text{Slope trick}\) ,二是线段树,皆有讲解,各位读者按需 ...

  3. FastAPI权限验证依赖项究竟藏着什么秘密?

    title: FastAPI权限验证依赖项究竟藏着什么秘密? date: 2025/06/12 06:53:53 updated: 2025/06/12 06:53:53 author: cmdrag ...

  4. C#实现语音预处理:降噪、静音检测、自动增益(附Demo源码)

    无论是在音视频录制系统,还是音视频通话系统.或视频会议系统中,对从麦克风采集到的说话的声音数据进行预处理,都是是非常必要的. 语音数据预处理主要包括:​​降噪(Noise Reduction).静音检 ...

  5. Java源码分析系列笔记-15.CompletableFuture

    目录 1. 是什么 2. Future VS CompletableFutre 3. 使用 3.1. 运行一个不返回结果的任务 3.2. 运行一个返回结果的任务 3.3. 线程池 3.4. 手动完成任 ...

  6. Apache NiFi C2 Client 实现详解

    项目标题与描述 Apache NiFi C2 Client 是Apache NiFi项目中的Command and Control (C2)协议客户端实现,主要用于与C2服务器进行通信,实现远程管理和 ...

  7. 花150元,我用 AI 做出了千万播放的爆款视频!保姆级教程+完整提示词

    大家好,我是程序员鱼皮.这两天正在研究 怎么切显卡,只切贵的,不切对的: 我是怎么做到的呢?下面会分享. 这段时间,网上出现了很多利用 AI 制作 ASMR 视频的博主,其中比较有代表性的一位,几天的 ...

  8. 大模型基础补全计划(三)---RNN实例与测试

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   无 前言    本文是这个系列第三篇,它们是: & ...

  9. C# DataGridViewRow转换为(Model)实体对象

    https://blog.csdn.net/cxu123321/article/details/107875832 ContactModel model = dataGridView1.Current ...

  10. SciTech-Mathematics-Probability+Statistics- Descriptive stats +完全搞懂percentile(百分位数) + quartile(四分位数) + median(中位数) + percentiles() in NumPy+Pandas+SciPy.stats

    Descriptive Stats + percentiles in numpy and scipy.stats https://dev.to/sayemmh/descriptive-stats-pe ...