参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

VS Code 中由 Bing 提供支持的设置搜索

2018 年 4 月 25 日,作者:Rob Lourens @roblourens 和 Ankith Karat ankar@microsoft.com

你是否曾遇到在 VS Code 中查找某个设置的困难?你并非孤单一人。通过我们对常见 GitHub 问题、StackOverflow 问题、推文和用户研究的观察,我们发现许多用户在查找设置时遇到问题。这并不奇怪,因为 VS Code 本身包含 400 多个设置,安装扩展后,许多用户可能拥有更多设置。如果你考虑到用户常见的错误,例如拼写错误以及选择正确搜索词的挑战,用户确实会感到困难。

因此,几个月前,我们开始与 Bing 团队讨论他们是否能将他们的搜索专业知识应用于我们的问题。两个月前,我们推出了成果——一个由 Bing 提供支持的智能设置搜索体验。

之前

Before example

之后

After example

工作原理

经过一段时间的讨论和原型设计,我们决定采用一种安排:Bing 团队将运行一个设置搜索服务,为用户在 VS Code 设置编辑器中搜索的查询提供智能模糊设置匹配。

将 Bing 的自然语言搜索功能集成到 VS Code 中被证明具有挑战性。为了在网络上搜索文档,Bing 考虑了数千个信号,涉及页面相似度、点击数据、用户行为数据等。但我们没有这些丰富的元数据可用于我们的设置——只有每个设置的简短名称和描述。因此,Bing 团队结合了自定义服务和 Bing 的基本搜索功能,创建了一个针对我们搜索场景进行调整的系统。

以下是系统的高级概述

Bing Diagram

让我们看看每个部分。

这个系统本质上分为两方面——离线收集和索引设置详细信息,以及在线提供结果。第一部分由摄取服务实现。它负责创建一个包含来自 VS Code 本身和扩展的设置的丰富索引。由于我们希望查询响应时间尽可能短,因此我们在摄取设置时尽可能多地进行工作,以减少处理查询时必须进行的工作。

Bing 摄取服务

收集 VS Code 和扩展设置数据

在每次构建期间,VS Code 以一种模式启动,该模式将其所有配置写入 JSON 文件。我们必须实际启动 VS Code,因为我们无法静态确定所有配置元数据。该文件包含每个设置的一些信息——名称、描述、类型、默认值,以及对于“枚举”类型设置,有效值的列表及其描述。然后我们将文件上传到 Azure 存储。如果你好奇,可以在这里看到一个最近的例子

https://ticino.blob.core.windows.net/configuration/123000832/c1cd4378.../configuration.json

123000832 是一个唯一的构建号,由产品版本加上自上次发布以来的 Git 提交数计算得出。c1cd4378... 是构建所基于的 Git 提交 ID。而 ticino,一些忠实粉丝可能会记得,是我们的原始短命代号。

Bing 的轮询服务监视 Azure 存储容器,注意到新构建,并通知摄取服务。与此同时,Bing 不断爬取 VS Code 扩展市场,等待扩展更新和新扩展。当它找到一个时,它会下载其 package.json 文件(对于扩展,所有配置元数据都包含在 package.json 中。无需启动它),并将这些设置也传递给摄取服务。

整个过程是完全自动化的,并实时更新我们每个稳定发布版本和每日 Insider 版本中索引的设置。构建完成后几分钟内,Bing 的索引就会更新,以包含任何新添加的设置。

1. 备用词管道

用户有时会使用与我们设置名称和描述中使用的词语不同但等效的词语进行搜索。为了确保我们能够处理这些情况,我们集成了 Bing 的“备用词”生成管道。该管道使用用户行为、点击、在线排名和页面相似度等信号,从 Bing 的搜索数据中收集彼此含义相似的词语。例如,“update”和“upgrade”被设置为“备用词”,搜索其中一个将返回包含另一个词的设置。

2. 词干提取和拼写检查管道

我们不希望因用户拼错设置名称而惩罚他们,但我们早期发现,简单的模糊匹配要么会遗漏人类能理解的英语单词变体,要么会包含太多误报匹配。因此,我们还引入了拼写检查和词干提取服务,这些服务是从 Bing.com 上使用的完整服务中提取出来的,它们通过常见的拼写错误和相同词干的不同形式来丰富索引。例如,“formatted”、“formatter”、“format”——所有这些都将为使用“formatting”一词的设置进行索引。

3. 自然语言处理 (NLP) 管道

我们还希望用户能够用他们自己的自然语言描述他们的查询,因此我们添加了 Bing 的自然语言处理管道。该管道收集常用的语音和文本模式,并将它们添加到索引中。例如,它使系统能够识别“如何禁用 css 验证”中的重要词语以找到 "css.validate"

4. 反馈/排名管道

我们创建了一个反馈机制,让我们能够从用户反馈中学习和改进。它允许我们手动指定新的词对或提高某些查询的预期结果。反馈会上传到服务,并几乎立即反映在搜索结果中。

门控模块

每次摄取到索引中都会经过门控模块,该模块只是确保索引不会因某种编程错误而损坏。我们编写了测试用例来验证以下内容:

  • 新索引向后兼容并服务于所有 VS Code 构建
  • 我们的黄金查询集返回预期结果

门控模块中的故障将阻止索引摄取并立即通知团队。还创建了一个仪表板服务,允许我们监控管道所有阶段的健康状况。它具有警报机制和回滚到最后一个已知良好状态的能力,以确保任何问题都可以以最小的停机时间快速解决。

搜索服务

最后,在运行时,来自我们用户的查询命中 Azure 负载均衡器 服务,该服务根据其物理接近度或当前负载选择我们的一个地理复制服务器来处理查询。该位置托管的搜索服务通过索引中的查找检索相关结果,在某些情况下应用手动排名覆盖,并将其返回给 VS Code 客户端。

整合起来

我们现在拥有一个系统,它能更好地理解设置查询,并为许多以前会返回空结果的查询提供结果。

以下是一些示例

format on keypress

example - how to open new files on the left

beautify

如果你有类似的问题,并且没有像 Bing 团队为我们做的那样为你构建定制服务的搜索团队,我们仍然有一些好消息。你可以开始使用 Bing 的认知服务,这将帮助你为自己的应用程序添加一些智能。例如

关于测试的说明

在开发这个系统时,我们需要一种量化评估结果的方法。我们决定构建一个基于 归一化折减累积增益(NDCG)概念的测试框架。不深入细节,这是一种在给定查询、一组结果以及这些结果的分数的情况下,对搜索引擎结果进行评分的方法。我们手动编写了相当多的测试用例,但意识到我们需要一种自动化的方法来为所有设置生成测试用例,包括新添加的设置和扩展中的设置。因此,我们编写了一个工具,可以自动为任何设置生成测试用例。它使用设置名称和描述中的词语,并通过不同的转换器运行它们,这些转换器模拟用户选择备用词、拼写错误或使用自然语言模式进行搜索。我们还为一些流行扩展的设置生成了测试用例。

我们每 6 小时运行一次完整的测试套件,它可以自动更新,以便始终测试最新构建中的设置。测试套件确保系统正常运行,并让我们有信心,当我们在后端进行更改时,不会损害结果质量。

下一步

我们可以通过几种方式继续改进系统。例如,我们还在建立一个基于用户行为的自动化反馈循环。如果许多人搜索相似的查询,然后选择相同的结果,我们知道这个结果可能是一个好结果,应该排名更高。

目前该服务仅对英文进行索引,但我们希望索引翻译后的设置描述并支持非英文语言搜索。目前还有一些配置元数据尚未索引,例如 "workbench.colorCustomizations" 设置的可能值。更进一步,我们希望显示尚未安装的扩展的结果。如果你搜索 "debug python",并且本地设置没有强匹配项,那么我们希望引导你使用一个可以帮助你调试 Python 代码的扩展。我们还考虑了 VS Code 中这项技术的其他应用。也许命令面板可以从类似的服务中受益。

我们需要您的反馈

感谢 Bing 团队的朋友们,现在查找设置更容易了!用户反馈是改善结果的最佳方式,因此在您搜索设置时,如果您没有看到预期的结果,请在 GitHub 上提交问题。事实上,如果您正在使用 VS Code Insiders,您甚至会看到一个按钮,可以调用我们新的问题报告器,让您更轻松地提交包含我们所需所有详细信息的问题。

编码愉快!

Rob Lourens,VS Code - @roblourens

Ankith Karat,Bing - ankar@microsoft.com

© . This site is unofficial and not affiliated with Microsoft.