コンテキストディレクトリー
別名: スニペットインクルージョン用のスニペットディレクトリ
Description
リポジトリ内のコンテキストディレクトリにコードベース全体のコンテキストを収集することで、開発中に GitHub Copilot に正確な文脈を渡しやすくします。
Problem
不正確な提案 GitHub Copilotはコードベース全体のコンテキストを取得できず、不正確な提案を行う可能性があります。これにより、コードの品質が低下したり、開発者が修正や調整を行う時間が増えたりすることがあります。
効率の低下 開発者が関連ファイルを隣接タブに開いておかなければ、GitHub Copilot はそれらのファイルから情報を取得できません。その結果、提案が不正確になり、開発者が手動で関連ファイルを検索・参照しながらコードを書くことになってしまいます。これは開発者の生産性を低下させる可能性があります。
コードの一貫性の喪失 コードベース全体のコンテキストを取得できない場合、GitHub Copilotが提案するコードが、既存のコードと一貫性がない場合があります。これはコードの可読性や保守性に悪影響を与え、チーム全体の開発速度を遅らせる可能性があります。
Story
ある日、プロジェクトチームのエンジニアが、GitHub Copilotを使って新しい機能を開発することにしました。彼女はGitHub Copilotに興味津々で、その助けを借りてコードを素早く書くことができると考えていました。
しかし、開発が進むにつれて、彼女はGitHub Copilotが提案するコードが時々不正確であることに気づきました。それでも彼女は手動で修正し、開発を進めていましたが、段々とその作業に疲れ始めました。さらに、他のチームメンバーからも、GitHub Copilotが提案したコードが一貫性に欠けるという指摘が寄せられました。
彼女は、なぜGitHub Copilotが正確な提案を行わないのか疑問に思い、調査を始めると、不正確な提案の一員となっているのが、関連ファイルを正しく開いておかなかったことだったとわかりました。一方で、すべてのファイルを開いたままにしておくことも現実的ではありませんし、そもそも GitHub Copilot は隣接タブのデータのみを送るため、多く開いておくことに意味がありません。また、GitHub Copilot で使われているモデルである Codex を考えると、トークンとして渡せる数に限りがあることも彼女は気付きました。
そこで彼女は、コンテキストディレクトリパターンを導入することにしました。関連ファイルを開いたままにしておくことで、GitHub Copilotがより正確な提案を行えるようになることを期待しています。
Context
AI コーディング支援ツールの代表的プロダクトである GitHub Copilotは、現在開いているファイル、またはタブで開いている同一拡張子のファイルの情報に基づいて提案を行います。 GitHub Copilot の裏で使われている Codex モデルに渡せるトークン数は限られています。そのため VS Code など GitHub Copilot 拡張は開いているファイルのすべての情報を参考情報として GitHub Copilot のサーバーに送ることはせず、開いているファイルの中で類似性の高いファイルを優先して送信データに含めます。スニペットを含めることは "スニペットインクルージョン" と呼ばれます。 そのため隣接するタブには適切な数の関連するファイルだけを開いておく必要があります。少なすぎても多すぎてもいけません。
Solution
Context ディレクトリを作成します GitHub Copilot に覚えさせたいコンテキストやルールなど、補佐的に使いたいファイルを集めたディレクトリを個人、またはチームで作成します。
現在開発しているものに関係のないファイルを閉じます
現在開発中の内容に関連するファイルをVS Code でタブを開いたままにします 現在、GitHub Copilot はコードベース全体のコンテキストを取得する機能がありませんが、現在のファイルとエディタで開かれているファイルを読み取ることができます。関連ファイルのタブを開いたままにしておくことで、GitHub Copilot がより正確な提案を提供できるようになります。
Resulting Context
コンテキストディレクトリーを使用することで、GitHub Copilotがより正確な提案を提供できるようになります。関連ファイルのタブを開いたままにすることで、効果的なコード補完を得ることができます。
Note
現在 GitHub Copilot が読む対象にしているファイルは限定的です。Python を書いている場合はスニペットファイルや参照対象のファイルも Python のコードであることが望ましいです。
必要に応じて、これらのディレクトリを.gitignore に書き記すことで、内容を push しないようにすることができます。
また、Git Submodule を使うことで context ディレクトリを別のものとして切り出すことができます。