ENECHANGE Developer Blog

ENECHANGE開発者ブログ

AIレビューツールであるCodeRabbitを試してみました【設定ファイルあり】

こんにちは、ENECHANGEの園木です。
弊社ではI/O Day という制度を試験的にに実施しています。
I/O Dayとは、エンジニアが通常業務の時間を使って技術的なインプット・アウトプットすることができる制度となっております。
今回はその制度を使い、AIレビューツールであるCodeRabbitを試してみました。

設定ファイルも用意していますので、興味がある方はぜひ目を通してみてください。

CodeRabbitとは?

CodeRabbitは、自然言語モデルAIを使用してGitHubプルリクエストのコードレビューと要約を行います。
AIによる行ごとのコード提案、差分レビュー、PRのサマリーを実現し、コード品質の向上と手動レビューの負担軽減を目指します。
レビューに用いるプロンプトはカスタマイズ可能なため、チーム独自のルールでレビューをすることが可能です。

しくみ

CodeRabbitはGitHub Actionsを用いてAIレビューをおこないます。
GitHub Actionsを使用するので、各種設定をリポジトリ内のyamlファイルで任意に設定することができます。

出力されるもの

CodeRabbitを導入した場合の実際のアウトプット物を紹介します。
本記事で例として使用する画像は既存リポジトリに「CodeRabbitを実装するためのPR」を作成した際のCodeRabbitの挙動となります。

1. リリースノート

スクリーンショット 2024-06-05 10.28.10.png

PRコメントの末尾にPRの目的レベルでの説明が記載されます。
PRの内容をもとに、変更点を以下の項目に分類します。

  • New Feature:新機能
  • Bug Fix:バグ修正
  • Documentation:ドキュメント
  • Refactor:リファクタリング
  • Style:スタイル
  • Test:テスト
  • Chore:雑務
  • Revert:取り消し

今回は「CodeRabbitを実装する」という内容なので新機能として説明されています。

この箇所はGitHub Actionsが走るたびに内容が更新されます。

2. 要約

PRの差分を要約します。 スクリーンショット 2024-06-05 11.02.29.png

画像はオリジナルから項目を変更したものです。
今回は以下の項目を出力するようにしました。

  • 要約
    • PR全体の変更点を完結に説明してくれます
  • 変更点
    • 差分ファイルごとにどのような変更がなされたかを要約してくれます

この箇所はGitHub Actionsが走るたびに内容が更新されます。

3. コードレビュー

差分を元に、AIがコードレビューをしてくれます。

  • レビューのサマリー
    • 指摘箇所のレビュー
    • 指摘箇所のレビュー

という形式でコメントが追加されます。

スクリーンショット 2024-06-05 11.07.24.png

プロンプトに沿ったレビューをするので、各チームごとに視点を言語化しておくと良さそうです。

準備

GitHub Actions実行ファイルの作成

.github/workflows配下にGitHub Actions用のyamlファイルを作成します。
自分は他のレビューAIの使用を見越して.github/workflows/code-rabbit.yamlにしました。

OpenAI API KEYの設定

下記URLにてOpenAIのAPI Keyを取得します。
https://platform.openai.com/api-keys

https://github.com/username/repository-name/settings/secrets/actions
にてOPENAI_API_KEYを新規で作成し、OpenAI API Keyを設定します。

デフォルトでの実行

https://github.com/coderabbitai/ai-pr-reviewer?tab=readme-ov-file#install-instructions
に記載されている内容でcode-rabbit.yamlを設定し、CodeRabbitが起動するかどうかを確認します。

無事にGitHub Actionsが走り、CodeRabbitによるレビューが追加されたらひとまずの実装は完了です🎉
ここからは、ファイル内で独自に設定すると良さそうな項目を紹介していきます。

最終的なファイル

まずは完成形から見せてしまいます。
code-rabbit.yamlは最終的に以下のようになりました。

設定ファイル

name: CodeRabbit

permissions:
  contents: read
  pull-requests: write

on:
  pull_request:
    types: [opened, ready_for_review]

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

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:
          openai_light_model: gpt-4o
          openai_heavy_model: gpt-4o
          language: ja-JP
          summarize: |
            次のmarkdownフォーマット形式を使用して、本PRの要約を出力します。

            [出力形式]
            ## 要約
            <!-- 特定のファイルではなく、全体の変更に関する高レベルの要約を80語以内で。 -->
            ## 変更点
            <!-- ファイルとその要約のテーブル。スペースを節約するために、同様の変更を持つファイルを1行にまとめることができます。 -->

以下では、デフォルトから変更した項目について説明します。

トリガーの設定を変更する(GitHub Actionsの設定)

デフォルトの状態では

  • 新規PRが作成されたとき
  • pushされたとき

で毎回ワークフローが走ってしまうので、以下のタイミングをトリガーにしました。

  • 新規PRが作成されたとき
  • PRがDraftからOpenに変わったとき

これにより、開発者の任意のタイミングでAIレビューをすることができます。

CodeRabbit独自の設定項目

jobs:
  review:
    steps:
      with:

配下に独自に設定できる項目があります。

https://github.com/coderabbitai/ai-pr-reviewer/blob/main/action.yml
にデフォルト値が記載されており、変更や追加が必要なものはこちらで設定することができます。

openai_light_model, openai_heavy_model

レビューに使用する言語モデルを指定することができます。
openai_light_modelopenai_heavy_modelは以下のように使い分けられているようです。

  • openai_light_model
    • 変更点の要約など、軽微なタスク
  • openai_heavy_model
    • レビューやコメントといった複雑なタスク

参考

デフォルトではgpt-3.5-turbogpt-4になっています。
これをどちらも最新モデルであるgpt-4oに変更しました。

openai_light_model: gpt-4o
openai_heavy_model: gpt-4o

理由は以下です。

  • GPT-3.5での要約は信頼性と再現性が低い
  • GPT-4よりもGPT-4oの方が高性能かつ安価

参考: 言語モデル別の価格 https://openai.com/api/pricing/

language

レビューの言語を設定します。
我々の開発チームは日本人から構成されるため、日本語に設定しました。

language: ja-JP

ちなみに、この項目で言語設定しておけばプロンプトを日本語訳して設定し直す必要はないハズです。

summarize

デフォルトで指定されているWalkthroughという言葉に馴染みが無かったので要約に変更しました。
また、デフォルトだとPoemが入ってるので、削除しました。

スクリーンショット 2024-05-27 15.58.16.png

出力形式をマークダウンフォーマットで指定し、各項目で何を出力するのかはコメント形式で指定しました。

その他の設定

その他にも設定可能な項目がいくつかありました。
自分は触っていないのですが、運用で参考になりそうな項目をいくつかピックアップします。

  • path_filters
    • CodeRabbitによるレビューをスキップするファイル
  • disable_review
    • デフォルト値: false
    • trueにすることでレビューをスキップさせることが可能
  • disable_release_notes
    • デフォルト値: false
    • trueにすることでリリースノートの作成をスキップさせることが可能
  • openai_model_temperature
    • デフォルト値: 0.05
    • 0-2の範囲で変更可能。大きくするとより不確実性が増す
    • tempratureって何?という方はこちら
  • system_message
    • CodeRabbitのシステムプロンプト
    • どんな観点でレビューして欲しいのかを設定可能
  • summarize_release_notes
    • リリースノート作成用のシステムプロンプト

実際どうなの?

実案件で作成されたPRをCodeRabbitにレビューさせた感想は以下です。

  • nil対策をしてくれる
    • nilに対するエラーハンドリングをしていない箇所に対して指摘してくれました
  • タイポを指摘してくれる
    • メソッド名のタイポを指摘してくれました

全体的にtoo muchなレビューではありますが、「指摘された箇所の修正が不要であること」をPR作成者がコメントした上でレビュワー(人間)に渡すことでコードの理解度は増すと思います。

また、CodoRabbitが作成した文章はすべてマークダウンで書かれているので、これを編集することで人間がゼロから書く作業コストを削減できます。
ただし、レビューコメントを修正するのはあまりよろしく無い気がします。

個人的な結論としては、CodeRabbitは現状でも十分に活用可能なレベルであり、導入することで得られるメリットの方が大きいと感じています。

ENECHANGEでは成長意欲の高いエンジニアを募集しています!

弊社はエネルギーの未来をつくるというミッションを掲げています。
今回試験的に実施したI/O Day以外にも、資格取得に関する制度など成長意欲の高いエンジニアにとっては働きやすい環境です。
このような制度に興味があるエンジニアのみなさんは、ぜひ一度Wantedlyからカジュアル面談を申し込んでみてください!

www.wantedly.com

参考

https://zenn.dev/minedia/articles/7928ef7545b393