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 图表

让我们来看一下每个部分。

这个系统基本上有两个方面 - 离线收集和索引设置详情,以及在线提供结果。第一部分由Ingestion Service实现。它负责创建一个包含来自VS Code本身和扩展的设置内容的丰富索引。由于我们希望查询响应时间尽可能短,我们在摄取设置时尽可能多地完成工作,以减少处理查询时必须做的工作。

必应数据摄取服务

收集 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中。无需启动它。)并将这些设置也传递给摄取服务。

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

1. 替代词管道

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

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

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

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

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

4. 反馈/排名管道

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

门控模块

每次索引的摄入都会通过门控模块,该模块确保索引没有由于某些编程错误而损坏。我们编写了测试用例来验证以下内容:

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

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

搜索服务

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

将所有内容整合在一起

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

以下是一些示例:

按键格式化

示例 - 如何在左侧打开新文件

美化

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

关于测试的说明

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

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

下一步是什么

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

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

我们需要您的反馈

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

编程快乐!

Rob Lourens, VS Code - @roblourens

安基思·卡拉特,必应 - ankar@microsoft.com