Copilot がワークスペースを理解する仕組み

Copilot エージェントは、コードベース全体を検索してコンポーネント間のつながりを把握し、実際のコードに基づいた回答を提供します。「認証はどこで処理されていますか?」や「リストエンドポイントのテストを追加して」といった広範なプロンプトを使用して、コードベースに基づいた正確な回答や編集案を得ることができます。

この記事では、Copilot がコードベースを理解する仕組みについて解説します。これには、コード検索に使用するさまざまなツールや、高速な検索を可能にするために作成されるインデックスが含まれます。これらの一般的なアプローチは、ファイルが5つのプロジェクトから50万ファイルのプロジェクトまで、すべてのコードベースで使用されます。

検索および読み取りツール

プロンプトを送信すると、Copilot は必要な情報を分析し、質問への回答やコード編集の生成を開始するために最適な検索ツールの組み合わせを自動的に選択します。Copilot はこれのために複数のツールを実行し、結果をレビューして、問題の十分な理解が得られるまで自動的にフォローアップ検索を行います。

例えば、「支払いサービスにエラーハンドリングを追加して」と依頼された場合、エージェントは以下のような動作を行います。

  1. セマンティック検索を使用して、プロジェクト全体から支払いに関連するコードを見つけます。
  2. grep を使用して、コードベース内の既存のエラーハンドリングパターンを見つけます。
  3. usages(使用箇所) を使用して、支払い関数がどのように呼び出されているかを追跡します。
  4. ファイル検索 を使用して、関連する設定ファイルやテストファイルを特定します。
  5. 関連するファイルを読み込み、調整された変更を行います。

この反復的なアプローチにより、エージェントは開発者が行うのと同じように、完全な全体像を把握できるまで複数の角度からコードベースを探索し、コンテキストを収集します。

エージェントは、以下の組み込み検索ツールにアクセスできます。プロンプト内で # に続けてツール名を入力することで、これらのツールを明示的に参照することも可能です。

ツール 説明
セマンティック検索 (#codebase) 単なる正確なキーワード一致ではなく、質問の「意味」に一致するコードを見つけます。ワークスペースインデックスが必要です。
テキスト検索 特定のキーワードなど、テキストの一致をファイルコンテンツから検索します。
Grep ファイル全体から正確なテキストや正規表現パターンを検索します。インデックスなしでも機能します。
ファイル検索 ファイル名や glob パターンでファイルを検索します。
Usages(使用箇所) 「すべての参照の検索」「実装の検索」「定義へ移動」を組み合わせ、ファイル間でシンボルがどのように使用されているかを追跡します。
ディレクトリ一覧 ディレクトリの内容を一覧表示し、プロジェクト構造を調査します。
ファイルの読み取り 特定のファイルの内容を読み取り、詳細にコードを調査します。

これらのツールはあらゆるサイズのワークスペースで機能します。小規模なプロジェクトでは、ワークスペース全体をエージェントのコンテキストに直接読み込むことができます。大規模なプロジェクトでは、エージェントはプロジェクトサイズと利用可能なリソースに基づいて、最も効率的な検索戦略を選択します。

ワークスペース外の GitHub リポジトリを検索する

現在のワークスペースを検索するだけでなく、エージェントは他の GitHub リポジトリのコードを検索することもできます。これは、ローカルに開かれていないコードベースについて学習する必要がある場合(例:アップストリームライブラリの API を確認したり、リポジトリ間での実装を比較したりする場合など)に便利です。

ツール 説明
GitHub リポジトリのセマンティック検索 (#githubRepo) GitHub リポジトリをセマンティック検索し、関連するソースコードの断片を見つけます。owner/repo を使用してリポジトリを指定します。
GitHub テキスト検索 (#githubTextSearch) GitHub リポジトリまたは組織をテキスト検索し、特定のキーワードやコードパターンを含むファイルを検索します。

Issue や Pull Request の検索・管理など、より高度な GitHub ワークフローについては、GitHub MCP サーバー を使用してください。

エージェントがアクセスできるもの

エージェントは、開発者がコードベースを操作する際に使用するのと同じ情報源を検索します。

  • ワークスペース内のすべてのインデックス可能なファイル.gitignore で無視されたファイルを除く)
  • ネストされたフォルダーとファイル名を含むディレクトリ構造
  • コードシンボルと定義(クラス、関数、変数)
  • 現在選択されているテキスト、またはアクティブなエディター内で表示されているテキスト
  • 会話履歴と過去のツール実行結果
重要

ファイルを開いているか、無視されたファイル内でテキストを選択している場合、.gitignore はバイパスされます。

セマンティック検索ツール (#codebase) は、正確なキーワードではなく、意味に基づいてコードを見つけます。

セマンティック検索には、非常に大規模なコードベースでも高速に実行できるよう、インデックスの構築と維持が必要です。Copilot はこのインデックスを自動的に管理します。舞台裏ではインデックスの一部がローカルマシンに保存され、一部がリモートソースから提供されることがありますが、この違いをユーザーが管理する必要はありません。

インデックスの状態は、VS Code ステータスバーにある Copilot ステータスダッシュボードで確認できます。

Screenshot showing the workspace index status in the Copilot status menu.

セマンティックインデックスのソース

Copilot は、あらゆるワークスペースに対してセマンティックインデックスを自動的に構築・維持します。インデックスのソースによって、最初にインデックスが利用可能になるまでの速度が決まります。

  • GitHub リポジトリ: GitHub がワークスペース内の GitHub リポジトリをインデックス化します。これらを使用するには GitHub アカウントでサインインしてください。このインデックスはリポジトリごとに一度だけ構築すればよいため、多くの場合すぐに利用可能です。GitHub が必要に応じてインデックスを構築・更新します。小規模から中規模のプロジェクトでは高速ですが、数十万のファイルが含まれるリポジトリでは時間がかかる場合があります。リモートインデックス作成は、GitHub.com または GitHub Enterprise Cloud でホストされているリポジトリで機能します。GitHub Enterprise Server ではサポートされていません。

  • Azure DevOps リポジトリ: インデックスは自動的に構築・維持されます。VS Code で Microsoft アカウントにサインインすると、Copilot がインデックスの使用を開始します。現在のインデックスの状態については、Copilot ステータスバーアイテムを確認してください。

  • その他のワークスペース: GitHub や Azure DevOps リポジトリに裏打ちされていないローカルフォルダーを含むその他のワークスペースに対しては、Copilot がユーザーの代わりにセマンティックインデックスを構築します。最初の構築には数分かかることがありますが、その後はバックグラウンドで最新の状態に保たれます。この機能は現在個人アカウントでは有効ですが、組織やエンタープライズユーザー向けにはデフォルトでオフになっています。ポリシーを使用してこの機能を有効にする方法の詳細については、GitHub ドキュメントを参照してください。

現在のワークスペースのインデックスをオンデマンドで構築または再構築するには、コマンドパレットから Build Codebase semantic index コマンドを実行します。

セマンティックインデックスに含まれるコンテンツ

VS Code は、現在のプロジェクトの一部である関連テキストファイルをインデックス化します。これは特定のファイルタイプやプログラミング言語に限定されません。VS Code は、.tmp.out ファイルなど、通常は関連性の低い一部の一般的なファイルタイプを自動的にスキップします。

ワークスペースインデックスは、 files.exclude Open in VS Code Open in VS Code Insiders 設定または .gitignore ファイルによって VS Code から除外されているファイルも対象外となります。

画像や PDF などのバイナリファイルはインデックス化されません。

より良い結果を得るためのヒント

プロンプトの言い回しは、エージェントがどのツールを使用するか、そして結果の質に影響を与えます。

  • 具体的にする: 「これ」が前回の回答、現在のファイル、プロジェクト全体を指す可能性があるような「これは何をしますか?」といった曖昧な言葉は避けてください。
  • コード用語を使用する: エージェントが正確な一致を見つけられるよう、コード内に現れる関数名、クラス名、コンセプトを使用してください。
  • 手動でコンテキストを追加する: コードを選択したり、ファイルを参照したり、デバッグコンテキストやターミナル出力などの #-mention コンテキストアイテム を使用してください。
  • リクエストの範囲を絞る: 回答は「キャッチブロックのない例外を見つけて」といった複数の参照から引き出せますが、「この関数は何回呼び出されていますか?」といったコードベース全体の分析は期待しないでください。
  • コード以外の質問には外部ツールを使用する: 「このファイルに誰が貢献しましたか?」のような情報については、関連する ツールまたは MCP サーバー を設定してください。

プライベートリポジトリ

プライベートリポジトリでセマンティック検索を使用するには、Copilot に追加の権限が必要な場合があります。これらの権限がまだ許可されていない場合、起動時に VS Code が確認を求めます。一度許可すれば、セッションは将来のために安全に保存されます。

Modal window asking for additional authentication for a private repository.

セキュリティ、プライバシー、透明性に関する詳細は、GitHub Copilot Trust Center を参照してください。

よくある質問

プロンプトで #codebase を使用する必要がありますか?

いいえ。エージェントは意味がある場合に自動的にセマンティック検索を使用します。プロンプトに #codebase を追加する必要はありません。

#codebase ツールは常にセマンティックであり、一貫した結果を提供します。特定のプロンプトに対して強制的にセマンティック検索を行いたい場合は、コンテキストアイテムとして #codebase を追加することもできます。

ワークスペースがセマンティックにインデックス化されていない場合はどうなりますか?

ほとんどのワークスペースは自動的にインデックス化されますが、インデックスがまだ利用できない場合(例:新しいローカルワークスペースの初期インデックスが構築中の場合)、エージェントはテキスト検索、grep、ファイル検索、言語インテリジェンスを使用して、依然として効率的にコードを検索します。ワークスペースインデックスは、キーワードではなく意味によってコードを見つける「セマンティック検索」を可能にします。それがない場合、エージェントは他の検索ツールに依存しますが、ほとんどのプロンプトに対して正確な結果を提供できます。これらの他のツールでも非常に優れた結果が得られることがわかっています。

© . This site is unofficial and not affiliated with Microsoft.