🤖

約1年AIコードレビューを運用してみた【ai-pr-reviewer】

2024/09/06に公開

約1年前にAIにコードレビューをさせるGithub Actionである、ai-pr-reviewerが話題になりましたね!
immedioでもそのタイミングでAIコードレビューを導入し、細々設定を変更しながら運用を続けてきました。
ということで、この記事は1年間のAIレビューで得た知見を共有していきたいと思います。

Workflowの設定

現在使用しているworkflowは以下の通りです!

name: Review by OpenAI

permissions:
    contents: read
    pull-requests: write

on:
    pull_request:
        types: [opened, review_requested]
    pull_request_review_comment:
        types: [created]
    issue_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
        if: |
         (github.event_name == 'issue_comment' && contains(github.event.comment.body, '[run review]') && github.event.issue.pull_request) ||
         (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '[run review]')) ||
         (github.event_name == 'pull_request' && github.event.action == 'opened') ||
         (github.event_name == 'pull_request' && github.event.action == 'review_requested' && github.event.requested_team.name == 'request_ai_review')
        timeout-minutes: 15
        steps:
            - uses: coderabbitai/openai-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
                openai_light_model: gpt-4o-mini
                openai_heavy_model: gpt-4o
                openai_timeout_ms: 900000 # 15分
                language: ja-JP
                path_filters: |
                    !**/*.lock
                    !**/*.sum

導入方法などは他の記事にお任せするとして、特に意識した設定項目について解説していきます。

レビュー頻度

レビューの頻度については初回PRオープン時と、request_ai_reviewというチームをReviewersに設定したタイミングにしました。

最初コミットの都度レビューする設定も試したのですが、コストが嵩むのはもちろん、レビューに一貫性がなくなかなか収束しないのが大変で1週間程度で辞めました。

初回オープン時のみだとまずPR作ってから開発を進めていくようなスタイルにマッチしないので、能動的にレビューを呼ぶ仕組みとしてReviewersの設定トリガーを用意しました。
具体的にはrequest_ai_reviewというチームを作り、そのチームがreviewerに指定されたらAIレビューが動くようにしています。
(一度外して付け直すことで再実行も可能です)

(github.event_name == 'pull_request' && github.event.action == 'review_requested' && github.event.requested_team.name == 'request_ai_review')

使用しているモデル

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

まずlight_modelはレビューの品質に関わる部分ではなく、サマリとかポエムを返すだけなので一番安いgpt-4o-miniにしています。
重要なのはheavy_modelで、こちらは常に最新のモデル(現在はgpt-4o)にしています。
ですが最近はコメントの表示崩れなども目立つようになり微妙と感じることも増えてきました。

これがgpt-4oの影響かはわかりませんが、gpt-4時代と比較して性能が上がったとは特に感じませんでした。
そもそもgpt-4自体が時が経つにつれどんどん精度が落ちていってたと感じ、実際に記事を書くにあたり改めて見比べましたが去年のほうが明らかにAIのコメントも丁寧でした。


↑去年のレビューはまず文章量からやる気が感じられる!

実行時間

        timeout-minutes: 15

実行時間は15分で設定しています。
これだと差分が多いとき(100ファイルとか)にオーバーしてしまうこともあるのですが、そもそもデカすぎるPRが作られること自体減らしていきたいよねって話もあるので特に伸ばしたりはしていません。

AIを活用する上で意識したほうが良いと感じたもの

AIはコードベース全体を把握した上で動くのではなく基本的に限られた範囲だけを見て動作します。
なので一般的でない書き方をしているようなプロダクトだと、そこが毎回レビューで指摘されるという状況になります。
もちろん無視すれば良いだけですが、レビューの大半が無意味なコメントで埋まってるような状況が続くとだんだん読まれなくなっていくので極力標準に揃えたほうが良さそうだと感じました。

たとえば弊社では元々エラーレスポンスをpanicで返却する方針になっていたため毎回指摘されており、フレームワーク標準の書き方に揃える方向で修正しました。

プロンプトで「ここは指摘するな」と指定すルコとでも防げるかもしれませんが、Github Copilotなど他の生成AI系サービスを使ってくことも考えるとAIが理解しやすいコードに合わせるという観点で実装していくことも重要になってくるのではと思います。

実際AIレビューはどうなの?

最初導入したときは「もう人間のレビューいらなくなる!」という雰囲気でしたが、不要なコメントも多くだんだん読まれなくなっていったのが正直なところでした。
完全に間違ったレビューをすることもあり、それが続くことでAIレビュー自体の信用が落ち読まれなくなっていった印象です。
もちろん今も有益なレビューがあるのは事実で、コードレビューでコメントした内容を実はAIがすでに書いていたということも多々あります。(特にtypo系には強い印象です。)

今回はあくまでarchivedされているai-pr-reviewerを使い続けての感想なので、公式のCodeRabbitなどを使っていくとまた印象は変わってくるかもしれません。
ClaudeやGeminiなどGPT以外の様々なモデルも出てきているので、「AIダメだよね」とはならずに積極的に活用していけるようトライ&エラーしていきたいと思います!

immedioテックブログ

Discussion