VS Code 中由必应驱动的设置搜索
2018 年 4 月 25 日,作者:Rob Lourens @roblourens 和 Ankith Karat [email protected]
您是否曾经在 VS Code 中难以找到某个设置?您不是一个人。在查看常见的 GitHub 问题、StackOverflow 问题、推文和我们进行的用户研究时,我们看到许多用户在查找设置时遇到问题。这并不奇怪,因为 VS Code 开箱即用地包含 400 多个设置,并且安装了扩展后,许多用户可能会有更多设置。如果包括典型的用户错误(例如拼写错误)和选择正确搜索词的挑战,用户会感到困难。
因此,几个月前,我们开始与必应团队讨论他们是否可以将他们的搜索专业知识应用到我们的问题上。两个月前,我们发布了结果 - 由必应驱动的智能设置搜索体验。
之前
之后
它是如何工作的
经过一段时间的讨论和原型设计,我们决定了一种安排,即必应团队将运行一个设置搜索服务,该服务将为用户在 VS Code 设置编辑器中搜索的查询提供智能的模糊设置匹配。
将必应的自然语言搜索功能集成到 VS Code 中被证明具有挑战性。为了在 Web 上搜索文档,必应会考虑数千个与页面相似性、点击数据、用户行为数据等相关的信号。但是,我们没有为我们的设置提供这种丰富的元数据 - 每个设置只有一个简短的名称和描述。因此,必应团队结合了自定义服务和必应的基本搜索功能,创建了一个针对我们的搜索场景进行调整的系统。
以下是该系统的高级概述
让我们来看看每个部分。
该系统基本上有两个方面 - 离线收集和索引设置详细信息,以及在线提供结果。第一部分由摄取服务实现。它负责创建包含来自 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
,一些铁杆粉丝可能还记得,是我们最初的短暂代号。
必应的轮询服务会监视 Azure 存储容器,注意到新的构建,并通知摄取服务。同时,必应不断爬取 VS Code 扩展市场,等待扩展更新和新扩展。当它找到一个时,它会下载其 package.json
文件(对于扩展,所有配置元数据都包含在 package.json
中。无需启动它。)并将这些设置传递给摄取服务。
整个过程是完全自动化的,并为我们的每个稳定发布版本和每日 Insiders 版本实时更新索引设置。在构建完成后几分钟内,必应的索引就会更新以包含任何新添加的设置。
1. 备选词管道
用户有时会使用与我们在设置名称和描述中使用的词不同但等效的词进行搜索。为了确保我们可以处理这些情况,我们集成了必应的“备选词”生成管道。此管道使用用户行为、点击、在线排名和页面相似性等信号从必应的搜索数据中收集含义彼此相似的词。例如,“update”和“upgrade”被设置为“备选词”,搜索其中一个将返回包含另一个的设置。
2. 词干提取器和拼写检查器管道
我们不想因为用户拼错设置的名称而惩罚用户,但是我们早期发现简单的模糊匹配要么会遗漏人类可以理解的英语单词的变体,要么会包含太多的误报匹配。因此,我们还包括了从 Bing.com 上使用的完整服务中提取的拼写检查器和词干提取器服务,这些服务使用常见的拼写错误和同一词干的替代形式来丰富索引。例如,“formatted”、“formatter”、“format” - 所有这些都将为使用“formatting”一词的设置进行索引。
3. 自然语言处理 (NLP) 管道
我们还希望使用户能够用自己的自然语言描述他们的查询,因此我们添加了必应的自然语言处理管道。该管道收集常用的语音和文本模式并将其添加到索引中。例如,它使系统能够识别“如何禁用 css 验证”中的重要词,以查找 "css.validate"
。
4. 反馈/排名管道
我们创建了一种反馈机制,使我们能够从用户反馈中学习和改进。它允许我们手动指定新的词对或提升某些查询的预期结果。反馈将上传到服务,并几乎立即在搜索结果中反映出来。
门控模块
每次摄取到索引中都会通过门控模块,该模块仅确保索引没有由于某些编程错误而损坏。我们编写了测试用例来验证以下内容
- 新索引是向后兼容的,并为所有 VS Code 构建提供服务
- 我们的黄金查询集返回预期结果
门控模块中的失败将阻止索引摄取并立即通知团队。还创建了一个仪表板服务,使我们能够监视管道所有阶段的运行状况。它具有警报机制和回滚到上次已知良好状态的能力,以确保可以快速解决任何问题,并最大程度地减少停机时间。
搜索服务
最后,在运行时,我们用户的查询会命中 Azure 负载均衡器服务,该服务会根据其物理距离或当前负载选择我们的一个地理复制服务器来处理查询。托管在该位置的搜索服务通过在索引中查找来检索相关结果,在某些情况下应用手动排名覆盖,然后将其返回给 VS Code 客户端。
整合在一起
我们现在有一个可以更好地理解设置查询的系统,并为许多以前没有返回任何结果的查询提供结果。
以下是一些示例
如果您有类似的问题,并且没有像必应团队为我们那样构建自定义服务的搜索团队,我们仍然有一些好消息。您可以开始使用 必应认知服务,这将帮助您在自己的应用程序中添加一些智能。例如
关于测试的说明
在开发此系统时,我们需要一种方法来定量评估结果。我们决定基于 归一化折扣累积增益 (NDCG) 的概念构建一个测试框架。无需深入了解细节,这是一种对搜索引擎的结果进行评分的方法,给定一个查询、一组结果和这些结果的分数。我们手动编写了许多测试用例,但意识到我们需要一种自动生成所有设置的测试用例的方法,包括将添加的新设置和扩展中的设置。因此,我们编写了一个可以自动为任何设置生成测试用例的工具。它使用设置名称和描述中的词,并通过不同的转换器运行它们,这些转换器模拟用户选择替代词、进行拼写错误或使用自然语言模式进行搜索。我们还为一些流行的扩展中的设置生成了测试用例。
我们每 6 小时运行完整的测试套件,它可以自动更新自身,以便始终测试最新构建中的设置。测试套件向我们保证系统正在正常运行,并使我们有信心,当我们在后端进行更改时,不会损害结果质量。
下一步是什么
我们可以通过几种方式继续改进系统。例如,我们还根据用户行为建立一个自动反馈循环。如果很多人搜索类似的查询,然后选择相同的结果,我们知道该结果可能是一个好结果,应该排名更高。
目前,该服务仅以英语索引,但我们希望索引翻译后的设置描述并支持非英语语言的搜索。还有一些配置元数据当前未被索引,例如 "workbench.colorCustomizations"
设置的可能值。并且将搜索更进一步,我们希望显示当前未安装的扩展的结果。如果您搜索 "debug python"
,并且本地设置没有强大的匹配项,那么我们希望引导您找到可以帮助您调试 Python 代码的扩展。我们还考虑了此技术在 VS Code 中的其他应用。也许命令面板可以从类似的服务中受益。
我们需要您的反馈
感谢 Bing 团队的朋友们,现在查找设置变得更加容易了! 用户反馈是改进结果的最佳方式,因此在您搜索设置时,如果您没有看到预期的结果,请在 GitHub 上提交问题。 事实上,如果您使用的是 VS Code Insiders,您甚至会看到一个按钮,该按钮将调用我们新的问题报告器,使您可以更轻松地提交包含我们所需的所有详细信息的问题。
祝您编码愉快!
Rob Lourens,VS Code - @roblourens
Ankith Karat,Bing - [email protected]