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

让我们逐一了解各个部分。

这个系统本质上由两部分组成:离线收集并索引设置详情,以及在线提供结果。第一部分由“提取服务”(Ingestion Service)实现。它负责创建一个包含来自 VS Code 本身及其扩展的设置的丰富索引。由于我们希望查询响应时间尽可能短,我们在提取设置时会尽可能多地完成预处理工作,以减少处理查询时的负担。

Bing 提取服务

收集 VS Code 和扩展设置数据

在每次构建过程中,VS Code 会以一种模式启动,将所有配置写入一个 JSON 文件。我们必须实际运行 VS Code,因为我们无法静态确定所有的配置元数据。该文件包含每个设置的少量信息——名称、描述、类型、默认值;对于“枚举”(enum)类型的设置,还包含有效值列表及其描述。然后,我们将该文件上传到 Azure Storage。如果您感兴趣,可以在此处查看最近的一个示例

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

123000832 是一个唯一的构建编号,由产品版本加上自上次发布以来的 Git 提交次数计算得出。c1cd4378... 是构建所基于的 Git 提交 ID。而 ticino,一些忠实粉丝可能还记得,是我们最初那个昙花一现的代号。

Bing 的轮询服务会监控 Azure Storage 容器,一旦发现新的构建,就会通知提取服务。同时,Bing 会不断抓取 VS Code 扩展市场,等待扩展更新和新扩展。当发现新内容时,它会下载其 package.json 文件(对于扩展而言,所有配置元数据都包含在 package.json 中,无需启动它)并将这些设置传给提取服务。

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

1. 替代词管道

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

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

我们不希望惩罚那些拼错设置名称的用户。但我们早期发现,简单的模糊匹配要么会错过人类能理解的英语词汇变体,要么会包含太多假阳性匹配。因此,我们还引入了从 Bing.com 所用全功能服务中提取出的拼写检查(Speller)和词干提取(Stemmer)服务,用常见的拼写错误和相同词干的替代形式来丰富索引。例如,“formatted”、“formatter”、“format”——所有这些词都会被索引到一个使用“formatting”这个词的设置中。

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

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

4. 反馈/排名管道

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

门控模块 (Gating Module)

每一次索引提取都会通过门控模块,以确保索引不会因编程错误而损坏。我们编写了测试用例来验证以下内容

  • 新索引是向后兼容的,并为所有 VS Code 构建版本提供服务
  • 我们的黄金查询集(Golden query set)返回了预期的结果

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

搜索服务

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

总结

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

以下是一些示例

format on keypress

example - how to open new files on the left

beautify

如果您也有类似的问题,但没有像 Bing 团队为我们那样构建自定义服务的搜索团队,我们依然有好消息。您可以从 Bing 认知服务入手,这将帮助您为自己的应用程序添加智能。例如

关于测试的说明

在开发此系统时,我们需要一种量化评估结果的方法。我们决定基于“归一化折损累计增益”(Normalized Discounted Cumulative Gain, 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.