ChatGPT APIを活用したGitHub Pull Request自動レビューの実践

  • URLをコピーしました!

PR TIMESでCTOをやっている金子 (@catatsuy) です。

レビューの効率化や品質向上を目的として、少し前からGitHubのPull Request(以下PR)自動レビューを導入してみました。本記事では、その事例を紹介します。お手軽に始められる仕組みなので、興味のある方はぜひ試してみてください。

目次

bentoの紹介

CLI経由で手軽にChatGPT APIにリクエストを送れるツールを趣味で開発しています。

GitHub
GitHub - catatsuy/bento: Bundled ENhancements for Tasks and Operations Bundled ENhancements for Tasks and Operations. Contribute to catatsuy/bento development by creating an account on GitHub.

bentoは、ChatGPT APIを利用したCLIツールで、コードレビューの自動化を含むさまざまなタスクを効率化できます。今回は複数ある機能のうちの1つである、コードレビュー機能を使います。

使い方は簡単で、環境変数 OPENAI_API_KEY にChatGPTのAPIキーを設定した上で、例えば以下のコマンドを実行すると利用できます。

git diff -w | bento -review -language Japanese

bentoにgit diffの結果(-wオプションは、空白のみの変更を無視するため、実際のコードの変更にフォーカスしてレビューを行います)を渡すだけです。-reviewオプションを渡せばpromptを付与した上で、ChatGPTのAPIを呼び出してくれます。デフォルトはgpt-4o-mini(今後変更する可能性あり)で、-modelオプションで利用するモデルは変更できます。

言語はデフォルトは英語で、-languageオプションで言語を切り替えることができます。promptで渡しているだけなので、ChatGPTが対応している言語であれば動くはずです。社内のベトナム国籍のメンバーによるとVietnamese を渡せばベトナム語で返ってきたとのことでした。

ちなみにpromptが知りたい方は以下の実装を見てみてください。

GitHub
bento/internal/cli/cli.go at 44a27682ad03b0022f44a0471c191da53da41e44 · catatsuy/bento Bundled ENhancements for Tasks and Operations. Contribute to catatsuy/bento development by creating an account on GitHub.

GItHub Actionsによる自動化

bentoはただのCLIツールで、GitHubにコメントする機能などはないので、GitHub Actionsの機能やghコマンドを使って、PRのコメントにレビューコメントを残すようにしています。PRの内容を修正した場合は、基本的に既存のレビューコメントを上書きしています。GitHubのコメントは履歴が見れるようになっているので、以前のレビューコメントを見ることも可能です。

GitHub ActionsのbotがPRのコメントを編集・作成した履歴。4日前にコメントが4回編集され、1回作成されたことが表示されている。
GitHub ActionsのbotがPRのコメントを編集・作成した履歴。4日前にコメントが4回編集され、1回作成されたことが表示されている。

bentoのrepoにも自動レビューの設定をしており、参照実装として利用できるようにしているので参考にしてください。環境変数OPENAI_API_KEYを設定すれば動くはずです。

GitHub
File not found · catatsuy/bento Bundled ENhancements for Tasks and Operations. Contribute to catatsuy/bento development by creating an account on GitHub.

このファイルの注意点を書きます。

  • -languageオプションを渡していないので、コメントは英語で出力される
  • 差分が大きいPRの差分をすべてChatGPTのAPIに送っているとお金がかかるので、500行を超えていたら実行されない
  • bentoはGoのプロジェクトなので、 go.sum の差分を無視している
    • go.sumcomposer.lockなどのファイルを無視することで、依存関係の変更ではなく、実際のコード変更に焦点を当てたレビューが可能になります

なので設定したいrepoの特徴によって、適宜書き換えて利用してください。

ちなみにChatGPTがMarkdownを利用しているため、コードハイライトなども有効になります。

PR TIMESでのカスタマイズ例

PR TIMESではプロジェクトによって以下のカスタマイズをしています。

  • -language Japanese オプションを付与
  • プロジェクトによって package-lock.json composer.lock pnpm-lock.yaml phpstan-baseline.neon などのファイルの差分を無視

これらの設定をすれば快適に利用することができると思います。

実際のレビューコメント

実際に役に立ったレビューコメントの中で、いくつか紹介します。前述の通り、内容を修正した場合は、既存のレビューコメントを上書きしているため、画像がレビューコメントの変更内容になります。

スペルミスやエラーハンドリングの漏れの指摘

自動レビュー結果の例。変数名のスペルミス(PRT_DESCRIPTON → PRT_DESCRIPTION)とエラーハンドリングの不足を指摘する内容が含まれている。修正例のコードスニペットも表示されており、HTTPレスポンスのステータスコードが200番台ではない場合のエラーハンドリング方法が示されている。
自動レビュー結果の例。変数名のスペルミス(PRT_DESCRIPTON → PRT_DESCRIPTION)とエラーハンドリングの不足を指摘する内容が含まれている。修正例のコードスニペットも表示されており、HTTPレスポンスのステータスコードが200番台ではない場合のエラーハンドリング方法が示されている。

自動レビュー導入前からスペルミスがありましたが、気付かれずに見過ごされてきました。そのことに気付けて修正できました。またエラーハンドリングの漏れに関する指摘もあり、助かりました。

コンポーネントのコメントに関する指摘

自動レビュー結果の例。コードの変更に関して、可読性とパフォーマンスの問題が指摘されている。widthからmax-widthとflex-growに変更されたことで、要素の幅に関する意図が不明確になったとされ、コメントの追加を推奨。また、flex-grow: 1 の使用によるパフォーマンスへの影響についても注意が必要とされ、レイアウトの適切な測定と最適化を求めている。コードスニペットも表示されている。
自動レビュー結果の例。コードの変更に関して、可読性とパフォーマンスの問題が指摘されている。widthからmax-widthflex-growに変更されたことで、要素の幅に関する意図が不明確になったとされ、コメントの追加を推奨。また、flex-grow: 1 の使用によるパフォーマンスへの影響についても注意が必要とされ、レイアウトの適切な測定と最適化を求めている。コードスニペットも表示されている。

フロントエンド開発ではコンポーネントをたくさん作る必要があります。各コンポーネントのメンテナンスを意識したコメントの改善提案は助かりました。

テストケースの追加提案・エラーメッセージについて

自動レビュー結果の例。コードの変更に関して、Completeness(完全性)とReadability(可読性)の観点で問題が指摘されている。getNextUrlメソッドのテストケースが不足している点を指摘し、無効なセレクターや空の入力に対するテストの追加を推奨。また、エラーメッセージの具体性が不足していることを指摘し、エラー原因を明示するためのメッセージ修正の例も示されている。
自動レビュー結果の例。コードの変更に関して、Completeness(完全性)とReadability(可読性)の観点で問題が指摘されている。getNextUrlメソッドのテストケースが不足している点を指摘し、無効なセレクターや空の入力に対するテストの追加を推奨。また、エラーメッセージの具体性が不足していることを指摘し、エラー原因を明示するためのメッセージ修正の例も示されている。

テストケース漏れや、エラーメッセージの不足を具体的に指摘してくれました。

terraformの設定ミス

自動レビュー結果の例。TerraformのIAMポリシーに関するバグとセキュリティの問題が指摘されている。Sidの定義にコロン(:)が使われており、これがHCLでは無効であるため、=に修正するように指摘。また、Resource =
自動レビュー結果の例。TerraformのIAMポリシーに関するバグとセキュリティの問題が指摘されている。Sidの定義にコロン(:)が使われており、これがHCLでは無効であるため、=に修正するように指摘。また、Resource = "*"がすべてのリソースに適用されるため、セキュリティリスクがあることが示され、特定のリソースARNに制限するよう修正案が提示されている。

terraformはPRの時点ではplanを実行し、mergeされてからapplyを実行するCIを動かしています。なのでplanは通るが、applyが通らないケースは事前に気付くことができず、mergeしてから慌てて直すこともよく起こっています。自動レビューの時点で動かない設定に気付けたり、セキュリティ的に良くない設定を指摘してくれるのは助かります。

自動レビューの効果と得た知見

元々の目的としてはレビューの完全自動化を目指しているわけではなく、以下のことを目指して設定をしました。

  • 差分を見るだけで分かる凡ミスを他人がレビューする前に気付きたい
  • 指摘された内容を更に深掘りして調べるなど、学習のきっかけにしたい

一応これらの目的はある程度達成されている印象です。

個人的には以下のことが助かっています。

  • 凡ミスやセキュリティ上、気をつけるべき事などをコメントしてくれる
  • ソースコードだけでなく、terraformなどもレビューしてくれるので事前にミスに気付きやすい
  • 社内に詳しい人が少ない言語でもレビューを行ってくれる

しかし以下のような特徴もあるので、注意して使っていければと思っています。

  • 差分から無理矢理コメントをひねり出す時があるので、いちゃもん感が出ることがある
  • 差分のみしか渡していないので、呼び出している関数の実装を理解していないコメントをすることがある
  • そもそもの処理の前提を理解していないコメントをすることがある

導入時の注意点

コストとモデル選択

自動レビューのコストは、入力と出力のトークン数に基づいており、実行する内容によって変動します。ここでは、2024/10/10時点のOpenAIの料金に基づいた概算を示します。

まず、レビュー対象の差分が500行以下の場合を想定します。このとき、仮に入力トークンが10,000、出力トークンが1,000だとすると、使用するモデルによってコストは以下のようになります。

  • GPT-4o mini: 10,000トークンの入力 + 1,000トークンの出力 = 約0.0021ドル 円換算で、1回のレビューあたり約0.32円(1ドル150円換算)
  • GPT-4o: 10,000トークンの入力 + 1,000トークンの出力 = 約0.035ドル 円換算で、1回のレビューあたり約5.25円

どちらのモデルを選ぶかは、コストと精度のバランスによります。実際の使用感としては、GPT-4o miniでも十分な精度でレビューコメントを生成できることが多いですが、より精度を高めたい場合はGPT-4oを選ぶことをおすすめします。

将来的に、さらに精度を高めたい場合は、次のような方法も考えられます。

  • GPT-4oを利用する: 高精度なレビューが可能になります。
  • Fine-Tuningを行う: 社内のソースコードや過去のレビューコメントをデータとして活用し、独自モデルを作成することで、より的確なレビューを期待できます。

現時点では、コストを考慮してFine-Tuningは行わず、GPT-4o miniを使った運用を続けています。

セキュリティの注意点

会社のコードなら気にしなくていいと思いますが、GitHub Actionsを改竄すればChatGPTのAPIキーを盗むことが可能になるので、特にOSSの場合は、APIキーが漏洩しないようにGitHub Actionsの設定を慎重に確認することが重要です。READMEに英語で設定方法を書いておいたので、OSSで利用する事を考えている人は確認してください。

GitHub
GitHub - catatsuy/bento: Bundled ENhancements for Tasks and Operations Bundled ENhancements for Tasks and Operations. Contribute to catatsuy/bento development by creating an account on GitHub.

社内のコメント

フロントエンドエンジニア 古園

タイポしていないか、複数人で開発する際に分かりにくいコードになっていないかといった簡単な確認は自動レビューに任せることができればより開発スピードを上げられそうです。

しかし、現時点では見当違いなことやごく稀に変更前のコードを見てレビューを返してくるため便利かと言われると少し微妙な点も。

ただ、将来的にはCopilotのように開発を行う上で選択肢に上がるお助けツールの1つになる予感を感じさせるものでした!

EM代行 小張

ユニットテストの考慮漏れを指摘してくれるので、テストを書いた際は自動レビューの内容を確認するようにしています。

人対人のコードレビューは厳しい印象にならないように伝え方を工夫する必要がありますが、機械に指摘されるとそういう心配が不要になるのがメリットだと思っています。

社内で知見をためていきながら、より良い自動レビューになることをとても楽しみにしています!

最後に

この仕組みは、PR TIMESで約1ヶ月ほど運用しており、まだ人間のレビューが不要になるレベルには至っていませんが、すでにコードの改善に繋がるケースも増えてきました。特に、誰も気づかなかった凡ミスやセキュリティ上の注意点を早期に発見できるのは大きなメリットです。

今後も、ChatGPTを活用して社内の業務効率をさらに向上させる余地はたくさんあると感じています。これからも試行錯誤しながら改善を続けていくつもりです。もしbentoを使ってみて気に入っていただけたら、ぜひGitHubでスターを付けてもらえると嬉しいです。導入事例やフィードバックも、ぜひ教えてください。

GitHub
GitHub - catatsuy/bento: Bundled ENhancements for Tasks and Operations Bundled ENhancements for Tasks and Operations. Contribute to catatsuy/bento development by creating an account on GitHub.

これからも、一緒により良い開発環境を作っていきましょう!

  • URLをコピーしました!

この記事を書いた人

株式会社PR TIMESでCTOをやっています。がんばります。

目次