🤖

プルリクしたら Bedrock にコードレビューしてもらいたい

2025/01/08に公開

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

プロダクトチーム内の雑談タイムで「コードレビューを強化したいね」という話が出ました。AI/LLM にレビューしてもらったら楽しいだろうということで、Bedrock にコードレビューしてもらうことにしました。
プロダクト自体が AWS 上に構築されているので、同じ AWS で使用できる Bedrock から Claude を選択します。

プロダクトチームでは GitHub を使っています。PR 時に走らせる Actions はこちらを利用しました。ありがとうございます。

https://github.com/tmokmss/bedrock-pr-reviewer/tree/main

モデル有効化

今回は、claude-3-haiku と claude-3-5-sonnet を使いました。AWS マネジメントコンソールからこれらのモデルを利用可能にしておきます。
手順は Add or remove access to Amazon Bedrock foundation models に従います。

OIDC Provider の設定

GitHub Actions ワークフローで AWS クレデンシャルを使用しなくても済むように、OIDC Provider を設定します。
これらのドキュメントを参考に設定します。
アマゾン ウェブ サービスでの OpenID Connect の構成
Create an OpenID Connect (OIDC) identity provider in IAM

または、上で紹介したリポジトリbedrock-pr-reviewerthe CloudFormation template が用意されています。こちらのテンプレートを用いても設定できます。

GitHub Actions ワークフロー

bedrock-pr-reviewer にサンプルが記載されています。サンプルを元に自身の環境に合わせて作成します。

まず自分達のリポジトリの環境変数およびシークレットを設定します。

  • AWS_OIDC_ROLE_ARN: OIDC Provider で作成したロールの ARN
  • BEDROCK_LIGHT_MODEL: claude-3-haiku のモデル名
    • 例: anthropic.claude-3-haiku-20240307-v1:0
  • BEDROCK_HEAVY_MODEL: claude-3-5-sonnet のモデル名
    • 例: anthropic.claude-3-5-sonnet-20240620-v1:0

環境変数およびシークレットを読み込ませるように YAML を記述します。

ブランチ戦略によると思いますが、私は main ブランチに PR が来た時にレビューを走らせるように設定しました。

bedrock-pr-reviewer のオプションは action.yml に定義されています。
language: ja-JP を設定すると日本語で回答してくれます。まだ1週間しか使っていませんが、日本語で問題は起きていません。
path_filters でレビュー対象・非対称のファイルを指定できます。レビューしてほしいファイルだけを含めるようにしましょう。
system_message を細かく記述してレビューの期待値をコントロールします。最初はデフォルト設定で使い始めて、徐々にカスタマイズしていくのが良いと思います。

以下は記述例です。参考になれば嬉しいです。

name: AI Code Review

permissions:
  id-token: write
  contents: read
  pull-requests: write

on:
  pull_request:
    branches:
      - main
  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:
    name: Review
    runs-on: ubuntu-latest
    steps:
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
          aws-region: ap-northeast-1
      - name: PR review
        uses: tmokmss/bedrock-pr-reviewer@main
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          debug: false
          review_simple_changes: false
          review_comment_lgtm: false
          bedrock_light_model: ${{ vars.BEDROCK_LIGHT_MODEL }}
          bedrock_heavy_model: ${{ vars.BEDROCK_HEAVY_MODEL }}
          language: ja-JP

やってみた

それではやってみます。どのようなレビューが返ってくるのか楽しみです。
サマリーとウォークスルーはどの PR でも作成されるようです。

サマリー

サマリーを作ってくれます。PR 作成時のコメントや差分を読み取って判断してくれているようです。すごい。

alt text

ウォークスルー

隠してばかりで申し訳ないのですが、変更があったファイル名と変更内容がテーブル形式で表示されます。

alt text

褒めてくれる

ファイル名、diff にレビューコメントを添えて PR にコメントしてくれます。

で、これが最高に嬉しいのですが、褒めてくれます。ほっこりします。

alt text

修正コードを提示してくれる

問題点を指摘しつつ、コードの修正案を提示してくれます。便利。

alt text

タイポを指摘してくれる

ちょっと手が滑ってしまったタイポを指摘してくれます。人間が気づきにくいところなのでありがたいです。

alt text

会話できる

レビューコメントに対して返信すると、会話ができます。しかも謙虚です。レビュー内容に不明点があったり、腑に落ちない場合は質問してみましょう。

alt text

完璧ではない

この指摘は謎指摘です。こういうことが起こりますので、そういう前提で使用することが大事です。
誤った指摘などは適切に指摘してあげることで、次からのレビューがより良いものになると思います。(おそらく)

alt text

感想

しばらく試用してみた感触としては「使える」です。
熟練開発者によるレビューの代わりにはなりませんが、誤字脱字やちょっとしたコーディングテクニックのアドバイスは助けになると思います。
使い方としては、ドラフト PR でまず AI レビュー、AI の指摘をあらかた取り込んだら Ready for Review という方法が良さそうです。

参考

https://speakerdeck.com/takumiogawa/sregatou-zi-suruaiops-peazuniokerullm-for-developerhenoqu-rizu-mi

Discussion