VS Codeのエージェントモードを拡張するには、を試してください!

VS CodeでBingが提供する設定検索

2018年4月25日 Rob Lourens @roblourens と Ankith Karat ankar@microsoft.com

VS Codeで特定の設定を見つけるのに苦労したことはありませんか?あなたは一人ではありません。一般的なGitHubの問題、StackOverflowの質問、ツイート、そして私たちが行ったユーザー調査を調べると、多くのユーザーが設定を見つけるのに苦労していることが分かりました。VS Codeにはデフォルトで400以上の設定が含まれており、拡張機能をインストールすると、多くのユーザーはさらに多くの設定を持つことになるため、これは驚くことではありません。入力ミスや適切な検索語を選ぶ難しさなど、典型的なユーザーの誤りを含めると、ユーザーは苦労します。

そこで数ヶ月前、私たちはBingチームと、彼らがその検索専門知識を私たちの問題に応用できるかどうかについて話し合いを始めました。そして2ヶ月前、私たちはその結果である、Bingを搭載したインテリジェントな設定検索エクスペリエンスを出荷しました。

以前

Before example

以後

After example

仕組み

数ヶ月の議論とプロトタイプ作成期間を経て、Bingチームが設定検索サービスを運営し、VS Codeの設定エディターでユーザーが検索するクエリに対してインテリジェントなあいまいな設定の一致を提供するという取り決めに決定しました。

Bingの自然言語検索機能をVS Codeに統合するのは困難であることが判明しました。Bingは、Web上のドキュメントを検索するために、ページの類似性、クリックデータ、ユーザー行動データなど、何千ものシグナルを考慮します。しかし、私たちの設定には、各設定の短い名前と説明しかなく、このような豊富なメタデータはありませんでした。そこでBingチームは、カスタムサービスとBingの基本的な検索機能を組み合わせて、私たちの検索シナリオに特化したシステムを構築しました。

以下にシステムの概要を示します

Bing Diagram

各部分を見ていきましょう。

このシステムには基本的に2つの側面があります。オフラインでの設定の詳細の収集とインデックス作成、そしてオンラインでの結果の提供です。最初の部分は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コンテナを監視し、新しいビルドを認識し、Ingestion Serviceに通知します。同時に、BingはVS Code Extension Marketplaceを常にクロールし、拡張機能の更新や新しい拡張機能を待っています。新しい拡張機能を見つけると、そのpackage.jsonファイルをダウンロードし(拡張機能の場合、すべての構成メタデータはpackage.jsonに含まれています。起動する必要はありません)、それらの設定もIngestion Serviceに渡します。

このプロセス全体は完全に自動化されており、安定版リリースビルドと毎日更新されるInsidersビルドのそれぞれについて、インデックス化された設定をリアルタイムで常に更新しています。ビルド完了後数分以内に、Bingのインデックスは新しく追加された設定を含むように更新されます。

1. 代替語パイプライン

ユーザーは、設定名や説明で使用している単語とは異なるが同等の単語で検索することがあります。そのようなケースにも対応できるよう、Bingの「代替語」生成パイプラインを統合しました。このパイプラインは、ユーザー行動、クリック、オンラインランキング、ページの類似性などのシグナルを使用して、Bingの検索データから互いに類似した意味を持つ単語を収集します。たとえば、「update」と「upgrade」は「代替語」として設定されており、どちらかを検索すると、もう一方を含む設定が返されます。

2. ステムとスペラーパイプライン

設定の名前を間違って入力したことでユーザーに不利益を与えたくありませんが、初期の段階で、単純なあいまい一致では、人間が理解できる英単語のバリエーションを見逃すか、誤検知が多すぎることがわかりました。そこで、Bing.comで使われている本格的なサービスから抽出したスペラーとステマーサービスも組み込みました。これらは、一般的なスペルミスや同じ単語の語幹の異なる形式でインデックスを強化します。たとえば、「formatted」、「formatter」、「format」はすべて、「formatting」という単語を使用する設定に対してインデックスされます。

3. 自然言語処理(NLP)パイプライン

また、ユーザーが自身の自然言語でクエリを記述できるようにするため、Bingの自然言語処理パイプラインを追加しました。このパイプラインは、一般的に使用される音声およびテキストパターンを収集し、インデックスに追加します。たとえば、「css検証を無効にする方法」というクエリから重要な単語を識別し、"css.validate"を見つけることをシステムに可能にします。

4. フィードバック/ランキングパイプライン

ユーザーからのフィードバックから学習し、改善できるフィードバックメカニズムを作成しました。これにより、新しい単語ペアを手動で指定したり、特定のクエリに対する期待される結果をブーストしたりできます。フィードバックはサービスにアップロードされ、ほぼすぐに検索結果に反映されます。

ゲーティングモジュール

インデックスへの取り込みはすべてゲーティングモジュールを通過し、プログラミングエラーによってインデックスが破損していないことを確認します。以下のことを検証するテストケースが書かれています

  • 新しいインデックスは下位互換性があり、すべてのVS Codeビルドに対応します
  • ゴールデンクエリセットは期待される結果を返します

ゲーティングモジュールでの障害は、インデックスの取り込みを阻止し、チームに即座に通知します。パイプラインのすべての段階の健全性を監視できるダッシュボードサービスも作成されました。アラートメカニズムと、既知の最終良好な状態にロールバックする機能を備えており、あらゆる問題を最小限のダウンタイムで迅速に解決できるようにしています。

検索サービス

最後に、実行時に、ユーザーからのクエリはAzure Load Balancerサービスにヒットし、物理的な近接性または現在の負荷に基づいて、geo-replicatedサーバーのいずれかを選択してクエリを処理します。その場所にホストされている検索サービスは、インデックスのルックアップで関連する結果を取得し、場合によっては手動のランキングオーバーライドを適用し、それらをVS Codeクライアントに返します。

すべてをまとめる

私たちは現在、設定クエリをよりよく理解し、以前は何も返さなかった多くのクエリに対して結果を提供するシステムを持っています。

いくつか例を挙げます

format on keypress

example - how to open new files on the left

beautify

もし同様の問題を抱えていて、私たちにBingチームがしてくれたようにカスタムサービスを構築してくれる検索チームがいない場合でも、良いニュースがあります。BingのCognitive Servicesから始めることができます。これにより、ご自身のアプリにインテリジェンスを追加するのに役立ちます。例えば、

テストについて

このシステムを開発する上で、結果を定量的に評価する方法が必要でした。私たちは、正規化割引累積ゲイン(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