はじめに
オープンワーク株式会社の23卒Webアプリエンジニアの室永です。最近ラーメンを食べ過ぎて徐々に体を壊しつつあります。
皆さんはGitHub Copilotを利用したことがありますでしょうか?オープンワークではエンジニアとデザイナーにGitHub Copilotのライセンスが付与されています。
ただ、正直私は今までなんとなくコード補完してもらっていただけで、GitHub Copilotの機能を活用しきれていなかったです。
今回はGitHub Copilotのコード補完とチャット機能のベストプラクティスを紹介しようと思います。
GitHub Copilotとは
概要
GitHub CopilotとはAIコーディングアシスタントであり、入力時に自動でコード補完を実施してくれます。
また、チャット機能を有しており、技術に関する質問や記述されたコードの説明や修正提案も可能です。
前提
この時期では、執筆時である2024年6月時点でのJetBrains製のIDEとVisual Studio Codeでの機能を紹介しています。
主にチャット機能において、Visual Studio Code版の方が色々な機能が存在しているようです。
docs.github.com docs.github.com
オープンワークではCopilot Businessプランを契約しているため、Copilot Enterpriseプラン限定の機能であるGitHubのPull requests要約機能などは紹介していません。
また、無料トライアル期間はありますが基本的に有料です。
GitHub Copilotのベストプラクティス
GitHub Copilotは大規模言語モデル(LLM)で動作しているため、適切なプロンプトや文脈(context)などの入力を与えるほど、良質な出力となります。
よって、コード補完機能やチャット機能の精度を高めるためには、できるだけ多くの適切なcontextを与える必要があります。
コード補完機能の精度を向上させるには
関連するファイルを開く
GitHub Copilotは現在開いているファイルからcontextを取得するため、作業中のファイルに関連するファイルを開いておくと良いでしょう。
また、逆に不要なファイルは閉じるようにしましょう。
インポートや参照を明示する
作業中のファイルに必要なinclude/importやモジュール参照などを記述することで、ライブラリやパッケージ、フレームワークのcontextを取得できます。
<?php use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; ...
トップレベルのコメントを入力する
作業中のファイルの最上部に、そのファイルの責務や詳細な仕様などをコメントとして書くことでcontextを提供できます。
特にデータ処理や文字列操作などにおいて、できるだけ詳細に記述したり、例示をすることで精度が向上します。
<?php /** * 以下の仕様でユーザーを作成するコマンド * 1. 文字列型のuserNameオプションが指定された場合、指定されたnameカラムのユーザーを作成する * 2. 数値型のuserAgeオプションが指定された場合、指定されたageカラムのユーザーを作成する */ class CreateUserCommand extends Command { ... }
意味や目的のある命名を行う
GitHub Copilotは変数や関数名からもcontextを取得し、その変数や関数の意味や目的を推測します。
よって、意味や目的が推測できるような具体的かつ詳細な命名をしましょう。(命名に限らずリーダブルなコードを書くことが大事です。)
<?php ❌ $val = $this->compute($user); ✅ $studentUserHash = $this->computeStudentUserHash($user);
具体的かつ適切なスコープでコメントを書く
関数やコードブロック単位での処理にコメントを書くことでGitHub Copilotにcontextを提供できます。
関数名のみでは詳細な処理内容についてのcontextを提供しきれないため、トップレベルのコメント同様に具体的かつ詳細にコメントを書くと良いでしょう。
<?php /** * 以下の仕様でユーザーを新規作成しデータベースに追加する * 1. 指定されたuserNameのユーザーを作成する * 2. 指定されたageのユーザーを作成する */ public function createUser(string $userName, int $age): User { ... }
コードブロック単位での処理についても同様です。適切なスコープごとにコメントを記述することが望ましいです。
<?php // 指定されたuserNameとageでユーザーを新規作成する ... // ユーザーをデータベースに保存する ...
出力例を提示する
出力例は強力なcontextとなるので、計算処理や配列操作などは例示をコメントとして書くようにしましょう。
<?php /** * 配列の各要素の値を2倍にする * 入力例: [1, 2, 3] * 出力例: [2, 4, 6] */ public function doubleArrayValues(array $list): array { ... }
一度に大量のコードを生成させない
「具体的かつ適切なスコープでコメントを書く」でも紹介したように、処理単位でコメントを記述しコードを生成する方が精度が良いです。
処理を小さな単位に分割し、適切なスコープごとに生成するようにしましょう。
チャット機能の精度を高めるには
不要なcontextを削除する
GitHub Copilotは同一チャット内の質問をcontextとして保存しており、新規の質問を行う際に不要な情報を考慮してしまう可能性があります。
よって、不要なcontextの質問は削除するか、初期化してからチャット機能を利用しましょう。ばつボタンで特定の質問のみ削除、「+」ボタンで初期化が可能です。
エージェント機能を利用する
※JetBrains版には存在しない機能になります
GitHub Copilot Chatにはエージェント機能があります。例えば、@workspaceを付与することで、GitHub Copilot Chatはワークスペース全体をcontextとして関連するファイルやクラスを考慮し質問に答えてくれます。
エージェント機能には以下が存在します。
エージェント機能 | 概要 |
---|---|
@workspace | ワークスペース内のcontextを提供 |
@vscode | Visual Studio Codeの機能や拡張に関するcontextを提供 |
@terminal | Visual Studio Code内でのターミナルに関するcontextを提供 |
コマンドやチャット変数を利用する
※一部JetBrains版には存在しない機能になります
GitHub Copilot ChatとChatGPTの違う点として、エージェント機能に加えコマンドやチャット変数が存在する点が挙げられます。
コマンド機能とは、選択したコードに対して任意プロンプトを実行させることができるショートカットです。
主要なコマンド機能には以下が存在します。
コマンド | 概要 |
---|---|
/help | ヘルプを表示する |
/doc | ドキュメントを生成する |
/explain | 選択したコードを説明する |
/fix | 選択したコードを修正する |
/tests | 選択したコードのテストを作成する |
JetBrains版とVisual Studio Code版でコマンド名が異なったり、利用できるコマンドが異なったりするので詳細については以下を確認してください。
また、チャット変数とは、GitHub Copilot Chatに指定のcontextを提供する変数です。
チャット変数 | 概要 |
---|---|
#editor | 現在アクティブなファイルのcontextを提供 |
#file | 指定したファイルのcontextを提供 |
#selection | 現在アクティブなファイルの選択範囲のcontextを提供 |
#terminalLastCommand | Visual Studio Code内でのターミナルの最後の実行コマンドのcontextを提供 |
#terminalSelection | Visual Studio Code内でのターミナルの選択範囲のcontextを提供 |
また、これらのエージェント機能やコマンドは複合して利用することも可能です。
関連するファイルをcontextに含める
上記の#fileや#selectionなどを利用して、質問内容に関連するファイルをcontextに含めましょう。
JetBrains版の場合はチャット変数機能が利用できないですが、チャット機能の「+」ボタンから任意のファイルをcontextとして追加することができます。
インラインチャットを使う
※JetBrains版には存在しない機能になります
エディタ上で直接チャット機能を利用したい場合、ショートカットでインラインチャットを呼び出すことができます。
作業中のコードに直接チャット機能を利用できるので便利です。(もっと動作速かったのですが、動画をGIF形式に変換したら遅くなりました...)
ライブラリやパッケージのバージョンを指定して回答してもらう
チャット機能でライブラリやフレームワークに関する質問をする場合は、その名称とバージョンを指定するとより良いcontextが取得できます。
プロンプト履歴をたどる
通常のターミナルのように、上下の矢印キーで以前実行したプロンプト履歴をたどることができます。
プロンプトエンジニアリングを意識する
GitHub Copilot Chatに限らず、ChatGPTやMicrosoft Copilot、Geminiなどを利用する際もプロンプトエンジニアリングは重要です。(良質な回答を引き出すには良い質問をしてあげることが重要ですね。)
プロンプトエンジニアリングについては長くなるのでこの記事では割愛します。
最後に
GitHub Copilotや生成AIの得意なこと・不得意なことを把握した上で、得意なことはGitHub Copilotにやってもらうことが開発生産性の向上につながると考えています。
良いツールであっても、使い方を理解せず漫然と使っていると上手に使いこなせないという私の個人的な反省をまとめたものでした。(公式ドキュメントや公式ブログを読むの大切ですね...)
オープンワークではGitHub Copilotの採用をはじめとして開発のしやすさにも注力しているので、少しでも興味を持った方はぜひ採用サイトを覗いていただけると嬉しいです!
参考