が利用可能になりました!11月の新機能と修正についてご確認ください。

VS Codeにおける「超賢さ」の追求

2023年11月13日 Chris Dias @chrisdias

先週のGitHub Universeに参加された方は、開発ワークフロー全体における人工知能の進歩、イノベーション、ビジョンを目の当たりにされたことと思います。このブログ投稿では、この広範なビジョンの実現に貢献してきた過去数ヶ月間のVisual Studio Codeの進歩に焦点を当てたいと思います。

「超賢い」

マット・デイモンとベン・アフレックの記念碑的作品「グッド・ウィル・ハンティング」で私が最も好きなセリフの一つは、「俺の友達、超賢いんだぜ」(ボストン訛りで読んでみてください。効果抜群です)。

このセリフは、ウィル(マット・デイモン)がチャッキー(ベン・アフレック)と自信過剰な「1年目の大学院生」の衝突を、アメリカ史をページごとに、言葉ごとに暗唱することで鎮圧した後、モーガン(ベンの実兄、ケイシー・アフレック)が言うものです。ウィルは読んだすべての本によって鍛えられ、会話に基づいてそれらを思い出すことができたと言えるでしょう。

AIはウィルに似ています。大量のテキストに関する知識を持っています。しかし、AIに欠けているもの、人間がAIにないものは、最適な回答を提供するための特定のやり取りの文脈です。ウィルの場合、彼は「場の空気を読む」こともできるので、彼の知識を駆使して巧妙な反論を繰り出すことができます。

大規模言語モデル(LLM)は、ある時点での公開リポジトリデータに基づいてトレーニングされています。つまり、現在のコードについては何も知りません。コード全般については知っていますが、コードに関する質問に正確に回答したり、ワークスペースの形式と機能に従った新しいコードを提案したりするために必要なコンテキストがありません。

この問題を回避するために、GitHub Copilot Chatは、モデルが質問に適切に回答するのに役立つコードのスニペットを送信します(これは、Retrieval Augmented Generation、または「RAG」と呼ばれます)。最も関連性の高いコードを見ることで、回答の精度が上がります。しかし、LLMに送信できるコードの量(およびプロンプトによるガイダンス)には限界があります。小規模なプロジェクトでは、通常は問題になりません。しかし、大規模なソースコードリポジトリを考えると、すべてのファイルの内容をモデルに送信することは不可能であることがすぐに分かります。より良い回答を得るための解決策は、適切な量の資源を合理的な時間で使用する事で関連性の高いコンテキストを送信することです。これの助けとなり、他の多くのシナリオを可能にするために、Copilot Chatに**参加者**の概念を追加しました。

参加者

チャット参加者は、ドメインエキスパートであり、AIをクエリ処理に完全に使用するか、バックエンドサービスに転送する従来の方法など、好きな方法でユーザーのクエリに回答できます。参加者は、ドメイン固有のツールへの大規模言語モデルのアクセスを提供することもできます。LLMの助けを借りて、参加者はツールを選択し、その呼び出し方法を定義できます。このようなチャット参加者の1つの例は`@workspace`です。`@workspace`参加者はワークスペースに関する情報を把握しており、ワークスペースに関する質問に答えることができます。内部的には、参加者は、セマンティック検索と組み合わせたGitHubのナレッジグラフ、ローカルコードインデックス、VS Codeの言語サービスなど、さまざまなツールによって支えられています。

チャット参加者は、クライアントまたはサービスによって提供できます。GitHub Universeでは、リポジトリにあるドキュメントを検索する方法を知るgithub.comチャットエクスペリエンスのサービスサイド参加者である「Docs Agent」(VS Codeに近日登場予定)のデモがありました。

クライアントサイドの参加者は、従来のVS Code拡張機能を通じて提供できます。拡張性セクションで詳しく説明しますが、現時点ではVS Codeで利用可能な2つのチャット参加者、`@workspace`と`@vscode`を見てみましょう。

@workspace

`@workspace`参加者は、ワークスペース内のコードに関するコンテキストを収集する方法を知っており、ナビゲーション、関連するクラスやファイルの検索などを支援できます。VS Codeリポジトリにいて、現在のICodeEditorを担当するサービスの詳細を知りたいとしましょう。参加者を次のように使用できます。

@workspace participant answering question about detecting running extensions

自然言語を使用して`@workspace`参加者に「現在のICodeEditorを取得するために使用するサービスクラスは何ですか」と質問します。そこから、参加者はLLMに送信する適切な量のコンテキストを取得するために次の操作を実行します。

  • vscodeリポジトリは、GitHub Search Blackbirdサービスによってインデックス化されています。`@workspace`参加者は、このインデックスをツールとして使用して、リポジトリのナレッジグラフにアクセスします。`@workspace`参加者は、関連するコードスニペットとメタデータを返すセマンティック検索を実行します。GitHub検索サービスは上位10,000個のGitHubリポジトリをインデックス化しており、さらに追加する計画があります。

  • 次に`@workspace`参加者が使用するツールは、ローカルの未コミットの変更やCopilotの会話履歴など、追加のコードを見つけるためのローカルインデックスに対する字句テキスト検索です。

  • 次に`@workspace`は最終的なツールであるVS Codeの言語インテリジェンスを使用して、関数シグネチャ、パラメータ、インラインドキュメントなどの重要な詳細を追加します。

これらのコンテキストはすべて`@workspace`参加者によってランク付け、スライス、要約され、次にLLMに送信されて質問に回答されます。

必要なコンテキストをすべて備えているため、`@workspace`参加者は、開発者がより頻繁に尋ねる可能性のある種類の質問に答えることができます。たとえば、コードの異なる部分がどのように相互作用するかに関する質問などです。

  • 「`@workspace` 通知はどのようにスケジュールされていますか?」

または、関連するコード、依存関係、デザインパターンに関する知識を必要とする質問などです。

  • 「`@workspace` ニュースレターページと同様に、フォーム検証を追加してください」

@vscode

VS Codeは非常に多くの方法でカスタマイズできるため、VS Codeチームのメンバーでさえ、隠された機能を発見したときに嬉しく驚かされることがあります。ユーザーとチームメンバーの両方がVS Codeの全機能を活用できるようにするために、`@vscode`参加者を開発しました。

この参加者はVS Codeに関するすべての情報を把握しており、自然言語とVS Codeコマンドおよびカスタマイズ間のギャップを埋めるのに役立ちます。`@vscode`参加者は内部的に、すべての設定とコマンドのインデックスにアクセスできるツールを使用しており、この参加者がVS Codeのドキュメントも使用できるようにするツールを追加するプロセス中です。これで、「`@vscode` vscodeがファイルを偽装して開くときのそのものの名前は何ですか?そして、それを無効にするにはどうすればよいですか?」のような曖昧な質問をすることができます。

@vscode participant answering question about preview editors

応答には**設定エディタで表示**ボタンがあることに注意してください。これは、`@vscode`参加者がVS Codeの動作方法だけでなく、設定エディタやコマンドパレットを呼び出すツールも知っているためです。

さらに、コマンドパレットは類似性検索をサポートするようになったため、コマンドを検索するときにコマンドの正確な名前を知る必要がなくなりました。チームが毎月リリースするすべての機能を活用するために、独自のVS Code専門用語を話す必要はもうありません。

これは`@vscode`参加者の始まりにすぎません。ユーザーがVS Codeをよりよく理解し、完全に制御できるようにする、より多くのシナリオをサポートする予定です。

スラッシュコマンド

チャット参加者は、**スラッシュコマンド**と呼ばれるものを提供することもできます。これは、参加者によって提供される特定の機能へのショートカットです。質問に答える際のタスクの1つは、何をしたいかを理解し、意図を決定することです。

「Node.js Express Pug TypeScriptで新しいワークスペースを作成する」という意図は、新しいプロジェクトが必要であることを推測できますが、「`@workspace /new` Node.js Express Pug TypeScript」は明示的で簡潔であり、タイピング時間を節約できます。

New slash command

意図が明確になると、`@workspace`参加者は、自然言語の固有の曖昧性にもかかわらず、ユーザーのニーズに対応する可能性がはるかに高くなります。`@workspace`はディレクトリ構造を提案でき、ユーザーは提案されたファイルをクリックしてプレビューできます。これらのファイルを新しいフォルダーに生成する**ワークスペースの作成**ボタンがあります。

@workspace /new results displaying project tree and Create Workspace button

拡張性

「VS Codeは単なるシェルです。輝かせるには拡張機能が必要です!」- VS Code拡張機能に取り組んでいるMicrosoftチームの通常の会議のテーマソングであり、VS Codeの成功における彼らの役割を誇らしげに示しています。VS Codeコアチームとして、私たちは完全に同意します。VS Codeは、豊富な拡張機能エコシステムがなければ、今日の製品にはなっていません!AIも同じです。コアAIエクスペリエンスはCopilotで輝く一方、私たちのビジョンは、エコシステムのすべての拡張機能が参加し、LLMモデルが可能な限り最高のコンテキストと根拠を持つことができるようにすることです。今日、チャット参加者API提案状態で追加することで、このビジョンの基盤を築きます。

チャット参加者APIにより、拡張機能は、ユーザーからの特定の質問に回答できる参加者を提供できます。`@workspace`と`@vscode`の両方の参加者は、このAPIを使用して実装されています。チャット参加者を使用すると、ユーザーはエディターのフローを維持しながら、内側と外側のループツールの豊富で最新の情報をAIの会話に取り込むことができます。参加者は特定の分野のエキスパートのようなもので、ユーザーがプロンプトで@参加者を明示的に言及すると、そのプロンプトはその特定の参加者を提供した拡張機能に転送されます。

参加者は、シンプルなテキストや画像の応答にはMarkdownを使用できますが、よりインタラクティブなエクスペリエンスのために、ファイルツリーやボタンを使用することもできます。例えば、参加者がユーザーのために新しいワークスペースの作成を提案する場合、ファイルツリーをプレビューとして使用できます。参加者は、各応答に対してフォローアップを提供でき、会話の進め方に関する提案と考えてください。スムーズなユーザーエクスペリエンスを提供するために、API全体がストリーミングベースになっています。すでに述べたように、参加者はスラッシュコマンド(特定の機能へのショートカット)を利用できます。例えば、@docker参加者は/generateスラッシュコマンドを提供し、次の例のようなユーザープロンプト「@docker /generate a DOCKERFILE for workspace」になります。現在の構文は明示的で簡潔であるため、時間を節約できます。それでも、ユーザーの自然言語プロンプトに基づいて、VS Codeコアが適切な参加者とスラッシュコマンドを自動的に選択できるように、インテント検出に取り組んでいます。

AzureやDockerについてすべて知っているチャット参加者をVS Codeにインストールすることを想像してみてください。あるいは、画像生成をツールとして使用するDALL-E参加者を使用して、あなたが素晴らしい仕事をしていることを確認する可愛い動物を提示する必要があるかもしれません。

DALL-E generated image of cute cat providing an affirmation

参加者は、そのドメインのツールにアクセスしながら、任意のドメイン固有のコンテンツを提供できます。例えば、1ESはOne Engineering Systemの略で、Microsoft内部のエンジニアリングシステムです。1ES VS Code拡張機能は、Microsoft内部のエンジニア向けに特定の質問に答えることができる@1es参加者を提供します。@1es参加者は、動的に計画を行い、実際に何をしているかを示しています。LLMモデルで利用可能な公開データの一部を使用しますが、Microsoft内部の特性も認識し、両方を組み合わせて最適な回答を提供します。

@1es participant answering a question about CFS, a Microsoft internal initiative

そして、参加者は現在のコンテキストを持っているため、議論を続けることができます。

@1es participant providing more details about using CFS

また、拡張機能がLLMにアクセスできるようにするAPIを追加しており、ユーザーのクエリを処理して回答するためにLLMを使用することを選択できます。現在、このAPIは参加者を実装する拡張機能に限定されています。チャット参加者APIは、提供された参加者に正確なユーザープロンプトを渡し、LLMへのアクセスにより、参加者はこれらの言語プロンプトを特定のバックエンドAPI呼び出しに簡単に変換できます。このAPIの使用は、ユーザーが参加者によって使用されたリクエスト数とトークン数を認識できるように、注意深く透明性を持って処理します。

チャット参加者APIはまだ提案段階であり、近いうちにAPIを最終決定することを目標に、改善方法に関するフィードバックを求めています。既に今日から試すことができ、開始する最善の方法は、当社のチャット参加者拡張性サンプルから始めることです。開発者向けのAI駆動型イノベーションをぜひご覧ください。

利便性

参加者とその無限の可能性に非常に興奮していますが、通常のワークフローでVS Codeに追加している便利なCopilot搭載のインタラクションについても説明したいと思います。AIを活用するためにエディターを再学習する必要はありません。

スマートアクション

スマートアクションはVS Codeのフロー(例:クイックフィックスとコンテキストメニュー)にシームレスに統合されており、プロンプトを記述する必要はありません。最も強力なスマートアクションは/fixです。これは、エラー「Argument of type 'number' is not assignable to parameter of type 'never'」を示す比較的単純なTypeScriptクイックソートアルゴリズムです。電球をクリックし、「Copilotを使用して修正」を選択します。

Quick Fix light bulb menu with Fix using Copilot selected

このオプションにより、/fixとエラーメッセージが入力されたインラインチャットが開きます。バックグラウンドでは、追加のVS Codeの診断コンテキストを取り込み、Copilotが修正を提供できるようにします。これにより、leftright配列が正しい型宣言を使用するように更新されます。

Copilot proposed fix shown in a diff view

/fixは、従来のツールが不足しているシェルなどの言語で特に役立つことに気づきました。

Copilot proposed fix for a shell command

提案をより明確にするために、Copilotは特定の修正を提案した理由を説明しようとします。ユーザーがCopilotによる修正提案を約60%の確率で受け入れることを知って喜んでいます。修正が電球近くのソースコードに関連していない場合があり、必要なのは欠落している依存関係のインストールです。その場合、/fixは統合ターミナルで実行できるコマンドを提案します。

/fixと同様に、/docスマートアクションもユーザーに人気があります。/docを使用するには、コードブロックを選択し、右クリックして、「Copilot」>「ドキュメントを生成」を選択します。Copilotはコードのドキュメントコメントを生成し、その品質に驚くでしょう。

/doc command with a generated JSDoc comment

コミットメッセージとプルリクエストメッセージの生成

意図が明確な場合、AIエクスペリエンスは魔法のように感じることがあります。今の私の好きな機能は、Copilotがコミットメッセージを自動的に生成できることです。Copilotがインストールされているソースコードビューでは、コミットメッセージフィールドの横に新しいスパークルアイコンが表示されます。スパークルを選択すると、Copilotがメッセージを入力します!

Source Control input box with sparkle to generate commit message

このエクスペリエンスに非常に興奮しているので、先日vscode.dev/githubでMarkdownを編集したときにこのコミットを行いました。Copilot拡張機能はまだWeb対応していません

Commit message wishing that Copilot worked in VS Code for the Web

フローに戻り、続行してプルリクエストを作成しましょう。GitHub Pull Requests and Issues拡張機能をインストールしています。これはCopilot Chat拡張機能の存在を認識しています。PRを作成すると、タイトルと説明の横に別のスパークルアイコンが表示されます。それを選択すると、Copilotが適切な説明を自動的に記述します!

GitHub Pull Request and Issue extension Create view with sparkle to generate title and description

これは、週に10回または100回行う単純だが面倒なタスクを自動的に処理することで、生産性を向上させることができるもう1つの分野です。

何だって?!

そして最後に、真にスマートなAIを作るということは、インタラクションをできるだけ簡単にできることを意味します。

過去数年で、音声認識技術において業界は非常に優れた成果を上げてきました。多くの人が、高度なLLMと音声アシスタントの組み合わせを切望していることを知っています。これで、VS Codeでこれらを組み合わせて使用できます。

新しいVS Code Speech拡張機能により、VS Codeに音声テキスト変換のサポートが追加されます。インストールすると、すべての自然言語入力ダイアログにマイクアイコンが表示されます。それを選択して、Copilotに質問し、魔法をお楽しみください。

Copilot chat input box with Speech extension microphone button

どうですか!?私の仲間は本当に賢いと言いました!

Copilot chat answer to best code editor for node and express app

この拡張機能はまだプレビュー段階であり、現在英語のみをサポートしていますが、今後数か月で新しい言語と機能を更新していきます。

より賢く、より効率的に働く

上記のすべてとその他の機能は、今日のVS Codeで利用できます!GitHub Copilot拡張機能をインストールするだけです。Copilot Chat機能の詳細については、ドキュメントをご覧ください。

ありがとうございました!

ChrisとVS Codeチーム

Happy Smart Coding!