メインコンテンツまでスキップ

コードを生成する

GitHub Copilot ChatのAgent Modeを使い、ソースコードやテストコードを生成させ、完成度を高めていく方法について記載します。

ソースコード作成からテスト実施までを行う

使用するGitHub Copilot ChatのMode

Agent Modeを使います。

GitHub Copilotに実装してもらいたい機能の設計書とテスト仕様書をMarkdown形式等のテキスト形式で用意しておき、機能の実装を指示します。
テストコードは開発の進め方から判断してGitHub Copilotが自動で作成し、テストの実行まで行います。

以下のようなプロンプトファイルを用意しておき、Chatウィンドウで呼び出します。

---
mode: "agent"
tools: ["Agentが使用できるツール"]
description: "Serviceクラスを作成してください"
---

# 前提

このプロンプトファイルには入力変数が含まれます。
プロンプトファイルを呼び出しに、入力変数のいずれかが未指定の場合はプロンプトの実行を中止し、ユーザーに入力変数の指定を指示してください。

# 指示

設計書 ${input:doc} にもとづいて、Serviceクラスを実装してください。

- クラス名: ${input:className}
- メソッド名: ${input:methodName}

テストコードはテスト仕様書 ${input:spec} をもとに作成してください。
またテストコードの内容を検討する際には、設計書 ${input:doc} とテスト対象クラス ${input:className} クラスも参考にしてください。

# 実装パターン

## Serviceの実装例

(省略)

# テストコードパターン

## Serviceのテストコード実装例

(省略)

ここで、プロンプトファイルおよびプロンプトに指定すべき変数の値を以下と仮定します。

  • プロンプトファイル: .github/prompts/generate-service.prompt.md
  • 設計書(${input:doc}): #file:ユーザー登録機能.md
  • テスト仕様書(${input:spec}): #file:ユーザー登録機能テスト仕様書.md
  • 実装対象のクラス名(${input:className}): UserService
  • 実装対象のメソッド名(${input:methodName}): register
ポイント

プロンプトファイルのtoolsには、Agent Modeに利用させてもよいツールを指定します。

また#fileVisual Studio Codeでファイルをコンテキストに追加する変数です。

この時、Chatウィンドウでは以下のように指示します。

/generate-service doc=#file:ユーザー登録機能.md spec=#file:ユーザー登録機能テスト仕様書.md  className=UserService methodName=register

この指示で、GitHub Copilotは事前に整備したインストラクションファイルの内容を読み込んだうえで以下の作業を行います。

  • UserServiceクラスの作成
  • テストクラスの作成とテストメソッドの実装
  • テストの実施
ポイント

テスト実施などのためにGitHub Copilotが外部コマンドを実行する際には、ユーザに実行許可を求めます。
これは意図しないコマンドの実行を防ぐための安全機能ですが、許可を与えない限りAIのタスクはそこで停止することに注意してください。

ユーザに変更内容の承認を求めるのは、開発の進め方で定めた内容が完了した時になります。
それまでは、外部コマンドの実行でユーザに実行許可を求める場合を除き、実装内容に問題があった場合は自己修復を試みます。

最終的に生成されたコードに問題がなければ承認し、そうでなければ拒否してGitHub Copilotに修正を依頼する、もしくは自分で修正してください。

人が確認できる量のソースコードを生成させる

Agent Modeを利用すると定めた開発の進め方に則りテストコードの作成まで行うため、1度に生成されるソースコードのボリュームが大きくなりがちです。 また単にソースコードを生成するのではなく、テスト実行など複数のステップを挟むため実行時間も伸びやすくなります。

一方で、AIが生成するコードは人が確認しなければいけません。
生成されるソースコード量や実行時間も大きくなるため、インストラクションファイルが整備しきれていなかったり、曖昧な指示をしてしまったりすると、AIに大幅な修正依頼をすることが多くなるでしょう。
結果として、かえって生産性が低下する要因となりかねません。

特に開発の初期段階では、扱いきれないほどの大量のソースコードを生成させるのではなく、人が確認できる量のソースコードを生成させて精度を見てみるとよいでしょう。

AIに与える情報や開発プロセスを調整する

期待する精度のソースコードが生成されない場合は、以下のような点を見直し必要に応じて修正します。

  • インストラクションファイルやプロンプトファイルの指示内容が曖昧ではないか
  • 設計書の記述内容が曖昧ではないか
  • コンテキストに与えるべき情報の不足していないか
  • AIに与える情報が膨大になっていないか

AIに与える情報が多すぎる場合は、生成する成果物の精度が低下します。この場合、以下のようなプロセス変更を検討してみましょう。

  • ソースコードの作成、テストコードの作成とテスト実施をわけて指示する
  • テストケースが大量にある場合は、入力となるテスト仕様書を分割して生成を指示する

この時、Agent Modeが自己修復できるようなプロセスとしましょう。たとえば1回の指示ではソースコードの作成のみに留める場合、ビルドや静的解析が成功するところまでを確認する、などです。
人が作業を実施した場合に、確認する単位に合わせると考えやすいでしょう。

また、完璧なコードが生成されることを目指して永遠にプロンプトなどの改善とトライ&エラーを繰り返すのではなく、ある程度のところで割り切って残りは人が修正するといった割り切りも必要なことがあります。

AIにソースコードを出力させてもうまくいかない場合は、1度Ask Modeで実装予定の内容を出力させ、確認や調整を行ってからAgent Modeで出力させるという方法もあります。
Modeの切り替えが手間にはなりますが、試してみてください。

本ガイドが目指すGitHub Copilot導入の目的は、AIを活用した生産性の向上です。AIに完璧に作業をさせることではありません。
AIの出力精度を向上させ生産性を上げるための工夫は必要ですが、AIを活用するという手段に囚われすぎないでください。