GitHub Copilotの差分コードレビュー機能(β)を使ってみる
はじめに
VSCodeのキーボードショートカットをいじっていると、GitHub Copilotの新機能が使えるようになっていました。
下記の2つの機能です。
- Github Copilot でステージされた変更をレビューする
- Github Copilot で変更をレビューする
VSCodeの開発イテレーションプラン[1]や直近のVSCodeのリリースノート[2]を見ても、この機能についての情報は見当たらなかったのですが、β版として提供されているようです。
直接関連するのかは不明ですが、Developer Communityでは同様の機能の提案がされているようでした。
この記事では、現時点(2024/07)におけるGitHub Copilotの差分レビュー機能を試してみた結果を簡単に共有します。
使ってみる
[キーボードショートカット] -> [「GitHub Copilot: Review」]で検索すると、以下の2つのコマンドがヒットします。
適当なキーバインドを設定し、差分をステージして、その差分に対し機能を呼び出してみます。
以降、サンプルではGoのコードを使っています。
バグを含んだコードの指摘
以下のような、エラーを返す関数を呼び出す箇所で、あえてerrを無視するコードを書いてみます。
func igonreError() error{
err := someErrorFunc()
if err != nil {
return nil
}
}
この状態で、先ほど設定したキーバインドを押すと、分析中を示すポップアップが出てきます。画像はgit add
でステージした変更をレビューした場合です。
Copilotによる指摘は、該当のコードに対しインラインで行われます。意図通り、バグとなるコードを指摘するレビューが行われました。
コードの改善提案、コードスタイルの指摘
err := errors.New("error")
fmt.Println(err.Error())
上記のようなコードでは、fmt.Println(err.Error())
の部分で、エラーを標準出力ではなく標準エラー出力に出力するべきだと指摘されます。
コードスタイルに対しての指摘もされます。下記は.gitignoreに対し行われたレビューです。
複数ファイルが差分に含まれている場合
複数ファイルが差分に含まれている場合、1つづつ順番にレビューが行われ、「適用して次に移動」もしくは「破棄して次に移動」を選択することによって、次の指摘事項に遷移する。1ファイル内に複数の指摘事項が含まれている場合もあります。
試してみて
GitHub Copilotの差分レビュー機能には、対象のプロジェクトのコードベースをコンテキストとして注入されておらず、おそらく素のGitHub Copilotのモデル(現時点ではgpt-4o)をそのまま使っていそうでした。そのため、コードの改善提案やコードスタイルの指摘は、あくまで一般的な指摘に留まっています。
また、当たり前ですが、Copilotの出力にはハルシネーションが起こる可能性があります。例えば、Goではエラーを呼び出し元でラップし、情報を追加する手法がよく用いられていますが、下記のコードではラップしたエラーを破棄せよというなかなか硬派な指摘がされました。
差分にバイナリライクなファイルが含まれている場合、エラーが発生しレビューされません。
現時点ではα版でまだまだ改善の途中ということもありますが、本番投入はまだまだ難しそうという印象を持ちました。明らかにバグが発生しそうな箇所に関しては静的解析ツールで指摘してくれるものもあるので、ハルシネーションを加味するとそちらを整備したほうが良いでしょう。雑多に書いたスクリプトや個人プロジェクト、コード開発環境がまだあまり整備されていない状況であれば、セルフレビューツールとして使えそうです。
我々が人力でレビューしなければならないのは要件に対しての適合性や、ビジネスロジックの正しさ、コードの可読性、保守性、拡張性です。これらがCopilotによってカバーされると、それこそエンジニア不要論に一歩近づきますが、現時点ではまだまだ難しそうです。
主に、以下の2つが大きな壁になっているように感じました。
- 指摘する内容をどのように決定するか
- ドメイン知識に基づく指摘ができるか
偽陰性を減らすためには疑わしい箇所を多く指摘する必要がありますが、ハルシネーションがあるためその指摘の妥当性を人間がチェックするする必要があり、負担になります。また、ドメイン知識に基づく指摘ができないため、コードの改善提案やコードスタイルの指摘が一般的なものに留まってしまいます。
ここからは個人の妄想ですが、GitHub Copilot Enterpriseで解放されているknowledge bases機能[3]やCopilotのカスタム指示機能(β)[4]が統合されたり、コンテキスト変数の追加ができるようになると、実用的になると感じました。
指摘内容の決定プロセスや、レビューのコード提案内容が、プロジェクトのコードベース・ドメイン知識に基づくようになると、人力によるレビューコストを一定減らせそうです。
Discussion
関連機能として、GitHub上でCopilotをreviewerにできる機能が追加されたようです。