VS Code 中由 Bing 提供支持的设置搜索
2018 年 4 月 25 日,作者:Rob Lourens @roblourens 和 Ankith Karat ankar@microsoft.com
您是否曾遇到在 VS Code 中查找特定设置的麻烦?您并不孤单。通过查看常见的 GitHub 问题、StackOverflow 问题、推文以及我们进行的用户研究,我们发现许多用户在查找设置方面存在问题。这并不奇怪,因为 VS Code 开箱即用包含 400 多个设置,安装扩展后,许多用户可能会有更多设置。如果您将常见的用户错误(例如打字错误和选择正确搜索词的挑战)考虑在内,用户会感到很困难。
因此,几个月前,我们开始与 Bing 团队讨论他们是否可以将他们的搜索专业知识应用于我们的问题。两个月前,我们发布了成果——一个由 Bing 提供支持的智能设置搜索体验。
之前

之后

工作原理
经过一段时间的讨论和原型设计,我们决定采用一种安排:Bing 团队将运行一个设置搜索服务,该服务将为用户在 VS Code 设置编辑器中搜索的查询提供智能的模糊设置匹配。
将 Bing 的自然语言搜索功能集成到 VS Code 中被证明具有挑战性。为了在网络上搜索文档,Bing 考虑了数千个与页面相似性、点击数据、用户行为数据等相关的信号。但我们没有这些丰富的元数据可用于我们的设置——每个设置只有一个简短的名称和描述。因此,Bing 团队结合了自定义服务和 Bing 的基本搜索功能,创建了一个针对我们搜索场景进行调整的系统。
以下是系统的高级概述
让我们看看每个部分。
该系统主要分为两部分——离线收集和索引设置详细信息,以及在线提供结果。第一部分由摄取服务实现。它负责创建一个包含 VS Code 本身和扩展中的设置的丰富索引。由于我们希望查询响应时间尽可能短,因此我们在摄取设置时尽可能多地进行工作,以减少处理查询时必须进行的工作。
Bing 摄取服务
收集 VS Code 和扩展设置数据
在每次构建期间,VS Code 会以一种模式启动,在该模式下它会将其所有配置写入 JSON 文件。我们必须实际启动 VS Code,因为我们无法静态确定所有配置元数据。该文件包含每个设置的一些信息——名称、描述、类型、默认值,以及对于“枚举”类型设置,有效值列表及其描述。然后我们将文件上传到 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 的“备选词”生成管道。该管道使用用户行为、点击、在线排名和页面相似性等信号,从 Bing 的搜索数据中收集彼此含义相似的词语。例如,“update”和“upgrade”被设置为“备选词”,搜索其中一个将返回包含另一个词语的设置。
2. 词干提取和拼写检查管道
我们不希望因用户拼写错误设置名称而惩罚他们,但我们很早就发现,简单的模糊匹配要么会错过人类可以理解的英语单词变体,要么会包含太多误报匹配。因此,我们还包含了一个拼写检查器和词干提取服务,它们是从 Bing.com 上使用的完整服务中提取出来的,这些服务通过常见的拼写错误和同一词干的不同形式来丰富索引。例如,“formatted”、“formatter”、“format”——所有这些都将为使用“formatting”一词的设置进行索引。
3. 自然语言处理 (NLP) 管道
我们还希望用户能够用自己的自然语言描述他们的查询,因此我们添加了 Bing 的自然语言处理管道。该管道收集常用的语音和文本模式并将其添加到索引中。例如,它使系统能够识别“如何禁用 css 验证”中的重要词语以找到 “css.validate”
。
4. 反馈/排名管道
我们创建了一个反馈机制,使我们能够从用户反馈中学习和改进。它允许我们手动指定新的词对或提高某些查询的预期结果。反馈会上载到服务,并几乎立即反映在搜索结果中。
门控模块
每次摄取到索引中都会经过门控模块,该模块只是确保索引没有因为某些编程错误而损坏。我们编写了测试用例来验证以下内容
- 新索引向后兼容并支持所有 VS Code 构建
- 我们的黄金查询集返回预期结果
门控模块中的故障将阻止索引摄取并立即通知团队。还创建了一个仪表板服务,使我们能够监控管道所有阶段的运行状况。它具有警报机制和回滚到最后一个已知良好状态的能力,以确保任何问题都可以以最短的停机时间快速解决。
搜索服务
最后,在运行时,来自我们用户的查询将发送到 Azure 负载均衡器服务,该服务根据物理距离或当前负载选择我们的一个异地复制服务器来处理查询。该位置托管的搜索服务通过在索引中查找检索相关结果,在某些情况下应用手动排名覆盖,然后将其返回给 VS Code 客户端。
整合所有功能
我们现在拥有一个系统,它能更好地理解设置查询,并为许多以前会返回空结果的查询提供结果。
以下是一些示例
如果您有类似的问题,并且没有搜索团队像 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