VS Code の Bing を活用した設定検索
2018年4月25日 Rob Lourens @roblourens および Ankith Karat ankar@microsoft.com
VS Codeで特定の設定を見つけるのに苦労したことはありませんか?あなただけではありません。一般的なGitHubのイシュー、StackOverflowの質問、ツイート、そして私たちが行ったユーザー調査を見ると、多くのユーザーが設定を見つけるのに問題があることがわかりました。VS Codeには400以上の設定が標準で含まれており、拡張機能をインストールすると、多くのユーザーはさらに多くの設定を持つことになるため、これは驚くことではありません。入力ミスなどの典型的なユーザーの間違いや、適切な検索語句を選択する難しさを考慮に入れると、ユーザーは苦労しています。
そこで数ヶ月前、私たちはBingチームに、彼らの検索専門知識を私たちの問題に応用できるかどうかについて相談を始めました。そして2ヶ月前、私たちはその結果、つまりBingを搭載したインテリジェントな設定検索エクスペリエンスを出荷しました。
以前

以後

仕組み
議論とプロトタイピングの期間を経て、私たちはBingチームが設定検索サービスを運営し、VS Codeの設定エディターでユーザーが検索するクエリに対してインテリジェントなあいまい設定マッチを提供するという取り決めに合意しました。
Bingの自然言語検索機能をVS Codeに統合するのは困難であることが判明しました。ウェブ上のドキュメントを検索するために、Bingはページの類似性、クリックデータ、ユーザー行動データなどに関連する何千ものシグナルを考慮します。しかし、私たちの設定には、それぞれの簡単な名前と説明があるだけで、そのような豊富なメタデータは利用できませんでした。そこでBingチームは、カスタムサービスとBingの基本的な検索機能を組み合わせて、私たちの検索シナリオに合わせたシステムを作成しました。
システムの概要を以下に示します
各部分を見ていきましょう。
このシステムには基本的に2つの側面があります。オフラインでの設定詳細の収集とインデックス作成、そしてオンラインでの結果提供です。最初の部分はインジェストサービスによって実装されています。このサービスは、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の「代替語」生成パイプラインを統合しました。このパイプラインは、ユーザー行動、クリック、オンラインランキング、ページの類似性などのシグナルを使用して、Bingの検索データから互いに類似した意味を持つ単語を収集します。たとえば、「update」と「upgrade」は「代替語」として設定されており、一方を検索すると、もう一方を含む設定が返されます。
2. ステマーとスペラーのパイプライン
設定名のスペルミスでユーザーに不利益を与えたくはありませんが、単純なあいまい一致では、人間が理解できる英語の単語のバリエーションを見逃したり、誤検知が多すぎたりすることが早期に判明しました。そこで、Bing.comで使用されている本格的なサービスから抽出されたスペラーとステマーサービスも組み込みました。これらは、一般的なスペルミスや同じ単語の語幹の別の形式でインデックスを強化します。たとえば、「formatted」、「formatter」、「format」など、「formatting」という単語を使用する設定に対してはすべてインデックスが作成されます。
3. 自然言語処理 (NLP) パイプライン
また、ユーザーが自分の自然言語でクエリを記述できるようにするため、Bingの自然言語処理 パイプラインを追加しました。このパイプラインは、一般的に使用される音声およびテキストパターンを収集し、それらをインデックスに追加します。たとえば、「how to disable css validation」から重要な単語を識別して"css.validate"
を見つけることを可能にします。
4. フィードバック/ランキングパイプライン
ユーザーからのフィードバックから学び、改善できるフィードバックメカニズムを作成しました。これにより、新しい単語のペアを手動で指定したり、特定のクエリに対する期待される結果をブーストしたりできます。フィードバックはサービスにアップロードされ、ほぼ即座に検索結果に反映されます。
ゲーティングモジュール
インデックスへのすべての取り込みはゲーティングモジュールを経由します。これは、プログラミングエラーによってインデックスが破損していないことを確認するためです。以下のことを検証するテストケースが記述されています。
- 新しいインデックスは下位互換性があり、すべてのVS Codeビルドに対応しています
- 私たちのゴールデンクエリセットは期待される結果を返します
ゲーティングモジュールで障害が発生すると、インデックスの取り込みが阻止され、チームに即座に通知されます。また、パイプラインのすべての段階の健全性を監視できるダッシュボードサービスも作成されました。これにはアラートメカニズムと、最後の既知の正常な状態にロールバックする機能があり、問題が最小限のダウンタイムで迅速に解決されることを保証します。
検索サービス
最後に、実行時には、ユーザーからのクエリはAzure Load Balancerサービスに到達します。このサービスは、物理的な近接性または現在の負荷に基づいて、geoレプリケートされたサーバーのいずれかを選択してクエリを処理します。その場所にホストされている検索サービスは、インデックス内のルックアップで関連する結果を取得し、場合によっては手動のランキング上書きを適用し、それらをVS Codeクライアントに返します。
全体像
私たちは現在、設定クエリをよりよく理解し、以前は何も返されなかった多くのクエリに対しても結果を配信するシステムを持っています。
例をいくつか示します
もしあなたも同様の問題を抱えていて、Bingチームが私たちにしてくれたようにカスタムサービスを構築してくれる検索チームがいない場合でも、いくつか良いニュースがあります。BingのCognitive Servicesを利用すれば、独自のアプリにインテリジェンスを追加できます。たとえば、
テストについて
このシステムを開発するにあたり、結果を定量的に評価する方法が必要でした。そこで、正規化累積利得 (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