生成AIを用いたコードレビュー

はじめに

初めまして。ARISEでWeb系の開発、モデルのソリューション組み込みを主に行う「ソリューションエンジニア」というキャリアトラックに所属しているエンジニアの坂本です。

先日から当社のブログでGitHub Copilotを利用したコード開発について触れてきました。

新人エンジニアがGitHub Copilotを使ってみた。
GitHub Copilotと一緒にTerraformを書いた体験談 初めてのインフラ構築
RAGアプリの作成でGitHub Copilotを使ってみた

しかし、生成AIを用いた開発補助ツールはコード生成だけにとどまらず、様々模索されています。

この記事を読んでくださっている皆様は、生成AIを用いた開発効率の向上に興味がある方も多いと思いますので、その中で今回は毛色を変えて生成AIを用いたコードレビューがどんなものなのかお伝えできればと考えています。

生成AIコードレビュー

生成AIを用いたコードレビューと一口に言ってもすでに何種類も存在している状況です。

・OSSとして開発が盛んなのはPR-Agent
・企業が提供しているものとしてはCodeRabbit

などがあります。中には自前で実装している方もいらっしゃる状態です。

今回はCodeRabbitの無料版OSSであるai-pr-reviewを試したいと思います。

注意事項

現在はGitHub上でアーカイブされていますので、試す際はforkして使用ライブラリをアップデートするなどの対策をお願いします。

また、今回の使用コードは当社都合でChatGTPではなくAzure OpenAI Serviceを使用できるように一部改変しています。セキュリティ的にもAzureの方が使用しやすい企業もあるかと思います。

あくまで、本記事は生成AIを使ったレビューがどんなものなのかイメージをつかむものだと思っていただければと。

実際に動かしてみた

まずは論より証拠ということで動かしてみます。

動かし方は公式サイトの通り自身のリポジトリに下記ymlをGitHub Actionsで動くように.github/workflows/配下に保存します。

name: Code Review

permissions:
  contents: read
  pull-requests: write

on:
  pull_request:
  pull_request_review_comment:
    types: [created]

concurrency:
  group:
    ${{ github.repository }}-${{ github.event.number || github.head_ref ||
    github.sha }}-${{ github.workflow }}-${{ github.event_name ==
    'pull_request_review_comment' && 'pr_comment' || 'pr' }}
  cancel-in-progress: ${{ github.event_name != 'pull_request_review_comment' }}

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: coderabbitai/ai-pr-reviewer@latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        with:
          debug: false
          review_simple_changes: false
          review_comment_lgtm: false

そのうえでプルリクを出してみると自動でコードレビューを行ってくれます

7, 8行目を見るとわかるのですがプルリク作成時とプルリクにコメントがついた際に動くようになってますね。

要約

では実際にTerraformファイルを変更したプルリクを出してみます。

特に内容を指定していなくても差分から追加内容を知らせてくれます。(謎のポエムつきで笑)

次にPythonのFastAPI環境を構築した際のプルリクエストを見てみます。

 

こちらも問題なく変更点が表示されており、別言語でも問題なく動くことが確認できます。

これだけでもプルリクエストの内容ひとまとめにされており、概要を知るには十分かと思います。

わざわざプルリクに変更点を書かなくてよくなるので、簡単な変更を出したいときにも手間を抑えてくれますね。

コメント

要約だけでもプルリクに履歴がしっかり残るので価値はありそうですが、真骨頂はコードに対してもコメントをくれるところだと思います。

これはTerraformでAWS IAMに関する変更をした際に、S3へのアクセスのセキュリティについての提案になります。

正直、このレベルであれば静的解析を実施すれば防げるものもあるかと思います。

真骨頂はこの先にあります。

(codeNekoになっているのはライセンス確認の上でforkの際、猫好きな人が改変したためです笑)

実際に質問すると対話形式で質問に対する返答をくれます。

生成AIではあるので正確性は調べる必要があるものもありますがそれ自体がレビューイの勉強になりますし、通常のレビューでも指摘点が正しいか確認するのは同様かと思います。

また、コード的に意図があって通常と違う構成にして指摘を受けた場合記のように対話形式で納得してもらえれば、ログも残りますしlinter系の設定を一々変える必要もないのでまさに通常のレビュー感覚で受けられます。

後で誰が見てもプルリク上にやり取りが残っているというのも大きなメリットでもあります。

Draftプルリクでも動作しますので、とりあえず作ってみてレビューという仮想の壁打ち相手としてはまさに誰の工数も取らないので気軽に相談できるのもメリットかと思います。

一方で生成AIを利用するのにかかる料金はコード量にも寄りますが、1回数円~数十円になりますのでそこは要相談にはなるかと。

おわりに

本記事では、生成AIを用いたコードレビューについてまとめました。

生成AIの弱点として情報が正確とは限らないというのがありますが、人間がレビューする上でも同等かと思います。そこに対して、レビュアーは忙しいことも多いので細かい指摘はある程度生成AIとやり取りして最後のチェックを人間にするだけで工数としてはそれなりに減少が見込めるのではないでしょうか?

プロンプト等の改善もできるので、うまくやれば精度を上げたり、コメントの内容を改善できるかと思います。その改善時間がとれない場合は有償ツールを使うなどでより精度の高いものが使えるかと思います。

GitHub Copilotも浸透してきている昨今。今度はコードレビュー側で生成AIを使用してみるのもいかがでしょうか。

もちろん、その分のツールの使用料金というものもかかりますので、何を優先するのかをチームで議論しながらこの記事が最適な開発方法を見つけられる一助となれば幸いです。

関連記事