VS Codeにおける優れたスマートさの追求
2023年11月13日 by Chris Dias, @chrisdias
先週の GitHub Universe をご覧になった方は、開発者ワークフロー全体における人工知能の多大な進歩、革新、ビジョンを目の当たりにしたことでしょう。このブログ記事では、このより広範なビジョンの実現に貢献している、ここ数か月の Visual Studio Code に関する進歩に焦点を当てたいと思います。
「恐ろしく賢い (Wicked smart)」
マット・デイモンとベン・アフレックの独創的な映画「グッド・ウィル・ハンティング」で私のお気に入りのセリフの一つは、「こいつは恐ろしく賢いんだ (my boy's wicked smaaahtt)」です (最大限の効果を得るにはボストン訛りで読んでください)。
このセリフは、ウィル (マット・デイモン) がチャッキー (ベン・アフレック) と自信過剰な「大学院1年生」との対立を、アメリカの歴史に関する事実をページごと、一語一句記憶を呼び起こすことで仲裁した後、モーガン (ベン・アフレックの弟、ケイシー・アフレック) によって語られます。ウィルは読んだすべての本によって訓練され、会話に基づいてそれらを思い出すことができたと言えるでしょう。
AI はウィルに似ています。多くのテキストについて知っています。しかし、AI に欠けているもの、つまり人間が持っていて AI が持っていないものは、可能な限り最善の答えを出すための特定の対話のコンテキストです。そしてウィルの場合、「場の空気を読む」こともできるため、その本の知識を使って、巧みに作り上げられた論破を返すことができます。
大規模言語モデル (LLM) は、ある時点での公開リポジトリのデータでトレーニングされています。つまり、あなたの現在のコードについては何も知りません。コード全般については知っていますが、それに関する質問に正確に答えたり、ワークスペースの形式や機能に従った新しいコードを提案したりするために必要なコンテキストを持っていません。
この問題を回避するため、GitHub Copilot Chat は、モデルがより良い質問に答えるのに役立つコードのスニペットを送信します (これは検索拡張生成、または「RAG」と呼ばれます)。最も関連性の高いコードを見ることで、回答はより良くなります。しかし、LLM に送信できるコードの量 (およびプロンプトによるガイダンス) には制限があります。小規模なプロジェクトでは、これは通常問題になりません。しかし、世の中にある大規模なソースコードリポジトリを考えてみれば、すべてのファイルの内容をモデルに送信することが不可能であることにすぐに気づくでしょう。より良い回答を得るための解決策は、妥当な時間内に適切な量のリソースを使用して、関連するコンテキストを送信することです。これを支援し、他の多くのシナリオを可能にするために、Copilot Chat に参加者 (participants) の概念を追加しました。
参加者
チャット参加者はドメインの専門家であり、クエリ処理で AI を完全に使用したり、従来の方法でバックエンドサービスに転送したりするなど、好きな方法でユーザーのクエリに答えることができます。参加者は、大規模言語モデルにドメイン固有のツールへのアクセスを提供することもできます。LLM の助けを借りて、参加者はツールを選択し、その呼び出し方法を定義することができます。そのようなチャット参加者の一例が @workspace
です。@workspace
参加者はあなたのワークスペースについて知っており、それに関する質問に答えることができます。内部的には、この参加者はさまざまなツールによって強化されています。GitHub のナレッジグラフとセマンティック検索、ローカルコードインデックス、VS Code の言語サービスが組み合わされています。
チャット参加者は、クライアントまたはサービスによって提供できます。GitHub Universe では、サービス側の参加者である「Docs Agent」のデモがありました。これは github.com のチャット体験で、リポジトリにあるドキュメントの検索方法を知っているものです (近々 VS Code にも搭載予定)。
クライアント側の参加者は、従来の VS Code 拡張機能を通じて提供できます。詳細については、拡張性のセクションで説明しますが、まずは現在 VS Code で利用可能な 2 つのチャット参加者、@workspace
と @vscode
を見てみましょう。
@workspace
@workspace
参加者は、ワークスペース内のコードに関するコンテキストを収集する方法を知っており、ナビゲートしたり、関連するクラスやファイルなどを見つけたりするのに役立ちます。VS Code リポジトリにいて、現在の ICodeEditor を担当するサービスについてもっと知りたいとします。この参加者を次のように使用できます。
@workspace
参加者に「現在の ICodeEditor を取得するために使用するサービスクラスは何ですか」と尋ねるために自然言語が使用されます。そこから、参加者は LLM に送信するために適切な量のコンテキストを取得するために次のことを行います。
-
vscode リポジトリは GitHub Search Blackbird サービスによってインデックス化されています。
@workspace
参加者はこのインデックスをツールとして使用し、リポジトリのナレッジグラフにアクセスします。@workspace
参加者はセマンティック検索を実行し、関連するコードスニペットとメタデータを返します。GitHub 検索サービスは上位 1 万の 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
参加者が VS Code の動作方法を知っているだけでなく、設定エディターやコマンドパレットを呼び出すツールも持っているためです。
さらに、コマンドパレットは類似性検索をサポートするようになったため、コマンドを検索する際に正確な名前を知る必要がなくなりました。チームが毎月リリースするすべての優れた機能を活用するために、独自の VS Code の専門用語を話す必要はもうありません。
これは @vscode
参加者の始まりにすぎません。ユーザーが VS Code をよりよく理解し、完全に制御できるように、ますます多くのシナリオをサポートする予定です。
スラッシュコマンド
チャット参加者は、私たちがスラッシュコマンドと呼ぶものを提供することもできます。これは、参加者が提供する特定の機能へのショートカットです。質問に答える際のタスクの 1 つは、意図を判断し、何をしたいのかを理解することです。
「Node.js Express Pug TypeScript で新しいワークスペースを作成」が新しいプロジェクトを望んでいることを推測できますが、「@workspace /new
Node.js Express Pug TypeScript」は明確かつ簡潔で、入力時間を節約できます。
意図が明確になれば、@workspace
参加者は、自然言語に固有の曖昧さにもかかわらず、ユーザーのニーズに対応する可能性がはるかに高くなります。@workspace
はディレクトリ構造を提案でき、ユーザーは提案されたファイルをクリックしてプレビューできます。これらのファイルを新しいフォルダに生成する[ワークスペースを作成] ボタンがあります。
拡張性
「VS Code は単なるシェルであり、輝かせるには拡張機能が必要です!」 - これは、VS Code の成功における自分たちの役割を誇らしげに誇示する、VS Code 拡張機能に取り組む Microsoft チームのいつもの会議の合言葉です。私たち VS Code コアチームは、彼らに完全に同意します - VS Code は、豊かな拡張機能エコシステムなしでは今日の製品にはなり得ませんでした!AI も例外ではなく、コア AI 体験は Copilot で輝きますが、私たちのビジョンは、エコシステムのすべての拡張機能が参加し、LLM モデルが可能な限り最高のコンテキストと根拠を持てるようにすることです。今日、私たちはこのビジョンの基礎を築くために、チャット参加者 API を提案状態で追加します。
チャット参加者 API を使用すると、拡張機能はユーザーからの特定の質問に答えることができる参加者を提供できます。@workspace
と @vscode
の両方の参加者は、この API を使用して実装されています。チャット参加者を使用すると、ユーザーはエディターのフローにとどまりながら、内側と外側のループツールから豊富で最新の情報を AI の会話に取り込むことができます。参加者はある分野の専門家のようなものであり、ユーザーがプロンプトで @participant を明示的に言及すると、そのプロンプトはその特定の参加者を提供した拡張機能に転送されます。
参加者は、単純なテキストや画像の応答には Markdown を使用して応答したり、よりインタラクティブな体験のためにファイルツリーやボタンで応答したりできます。例えば、参加者がユーザーに新しいワークスペースの作成を提案している場合、プレビューとしてファイルツリーを使用できます。参加者は各応答にフォローアップを提供でき、会話をさらに進めるための提案と考えることができます。スムーズなユーザー体験を提供するために、API 全体がストリーミングベースになっています。既に述べたように、参加者はスラッシュコマンド(特定の機能へのショートカット)を持ち込むことができます。例えば、@docker
参加者は /generate
スラッシュコマンドを提供し、「@docker /generate
ワークスペース用の DOCKERFILE」というユーザープロンプトの例になります。現在の構文は明確で簡潔であるため、便利な時間節約になります。それでも、VS Code コアがユーザーの自然言語プロンプトに基づいて正しい参加者とスラッシュコマンドを自動的に選択できるように、意図検出に取り組んでいます。
Azure や Docker のすべてを知っているチャット参加者を VS Code に直接インストールすることを想像してみてください。あるいは、あなたが素晴らしい仕事をしていることを肯定してくれるかわいい動物を提示するために、画像生成をツールとして使用する DALL-E 参加者が必要なだけかもしれません。
参加者は、そのドメインのツールにアクセスしながら、任意のドメイン固有のコンテンツを持ち込むことができます。例えば、1ES は One Engineering System の略で、Microsoft の内部エンジニアリングシステムです。1ES VS Code 拡張機能は、Microsoft の内部エンジニア向けの特定の質問に答えることができる @1es
参加者を提供します。@1es
参加者は、実際に何をしているかを動的に計画し、表示します。LLM モデルで利用可能な公開データの一部を使用しますが、Microsoft 内部の仕様も認識し、両方を組み合わせて最適な回答を提供します。
そして、参加者は現在のコンテキストを持っているので、議論を続けることができます。
また、拡張機能が LLM にアクセスし、LLM を使用してユーザーのクエリを処理して回答することを選択できる API を追加しています。現在、この 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 を使用して修正] を選択します。
このオプションは、/fix
とエラーメッセージが入力されたインラインチャットを開きます。舞台裏では、追加の VS Code の診断コンテキストを取り込み、それによって Copilot が修正を提供できるようになります。この場合、left
と right
配列を正しい型宣言を使用するように更新します。
/fix
は、従来のツールが不足していることがあるシェルなどの言語で特に役立つことに気づきました。
提案をより明確にするために、Copilot は特定の修正を提案した理由を説明しようとします。ユーザーが提案された Copilot の修正を約 60% の確率で受け入れていることを知り、私たちは喜んでいます。時には、修正が電球の近くのソースコードに関連しておらず、必要なのが不足している依存関係のインストールである場合があります。その場合、/fix
は統合ターミナルで実行できるコマンドを提案します。
/fix
と同様に、/doc
スマートアクションもユーザーに人気があります。/doc
を使用するには、コードのブロックを選択し、右クリックして [Copilot] > [ドキュメントを生成] を選択します。Copilot はコードのドキュメンテーションコメントを生成し、そのドキュメントの品質に驚かれることでしょう。
コミットメッセージとプルリクエストメッセージを生成する
意図が非常に明確な場合があります。その場合、AI との体験はほとんど魔法のように感じられます。私のお気に入りは、Copilot にコミットメッセージを自動的に生成させる機能です。Copilot をインストールしたソースコードビューでは、コミットメッセージフィールドの横に新しいキラキラアイコンが表示されます。キラキラアイコンを選択すると、Copilot がメッセージを埋めてくれます!
この体験にはとても興奮していて、先日 vscode.dev/github を使って Markdown を編集しているときに、Copilot 拡張機能がまだウェブ対応していないため、こんなコミットさえしました。
フローに戻り、続けてプルリクエストを作成しましょう。GitHub Pull Requests and Issues 拡張機能をインストールしていますが、これは Copilot Chat 拡張機能の存在を認識しています。PR を作成すると、タイトルと説明の横に別のキラキラアイコンが表示されます。それを選択すると、Copilot が自動的に素晴らしい説明を書いてくれます!
これも、週に数十回、数百回行う単純でありながら退屈なタスクを自動的に処理することで、生産性を向上させるのに AI が役立つもう 1 つの分野です。
なんだって?!
そして最後に、真に賢い AI を作るということは、対話をできるだけ楽にすることです。
私たちはここ数年で、業界として音声認識技術に非常に優れてきました。多くの人々が、音声アシスタントと高度な LLM の組み合わせを待ち望んでいたことを知っています。今、VS Code でこの 2 つを一緒に使用できます。
新しい VS Code Speech 拡張機能は、VS Code に音声テキスト変換サポートをもたらします。インストールすると、すべての自然言語入力ダイアログにマイクアイコンが表示されます。それを選択し、Copilot に質問をして、魔法を楽しんでください。
どうだ、まいったか!?言っただろ、こいつは恐ろしく賢いんだって!
この拡張機能はまだプレビュー段階で、現在は英語のみをサポートしていますが、今後数ヶ月にわたって新しい言語と機能で更新を続けていきます。
賢く働き、頑張りすぎない
上記のすべて、そしてそれ以上の機能が、今日 VS Code で利用可能です!GitHub Copilot 拡張機能をインストールするだけです。そして、Copilot Chat の機能について詳しくは、私たちのドキュメントで学ぶことができます。
ありがとう!
Chris と VS Code チームより
ハッピー・スマート・コーディング!