AWSとPR-Agentを組み合わせてPRのコードレビュー自動化を試してみた。

モデルとしてAmazon Bedrock のClaude 3 Haikuモデルを利用してみた

こんちは、今度生成AIの勉強会に登壇する予定なので、ずっと気になってたコードレビューの自動化について調べてみました。
ちまたには生成AIを使ったさまざまなコードレビューのサービスがありますが、新しいサービスを契約せずともAWS環境を活用するだけでコードレビューが自動化できる仕組みを目指しました。

結果としてAmazon Bedrock・PR-Agentを組み合わせることで実現することができたので、感想や設定内容およびコードレビューの出力結果を記録したいと思います

雑まとめ

  • GitHubのPRに対して、Amazon Bedrockが提供するClaude 3 Haikuモデルを利用してコードレビューを実行しました
    • GitHubActionsでpr-agentを実行させています
  • pr-agentはドキュメントが充実しているため、設定に苦しむこともなく簡単に導入できました。また、利用するモデルも簡単に変更できます。
  • これを使って、PRのdescriptionの自動入力・レビュー・改善提案の3つを実行しました。
    • 小さいPRに対してClaude 3 Haikuモデルを利用した場合、消費したinputトークンが2700程度、outputが700程度となり、費用としては130円程度でした。
    • 結果については的外れなものも一部ありました
  • コスト・パフォーマンスの面では、エンタープライズな環境においては十分コスパが優れているのではないかと感じました。
    • 130円分のパフォーマンスが出てると感じています。
    • ただし、個人開発において採用するほどのコスパではないかなーと感じています。
  • 仮に、さらに高精度なモデル(Claude 3.5 Sonnet)を利用して同じトークン数を消費したとすると、費用は2600円にまであがります
    • 一日にPRがいくつも作成される環境では、コストが大きすぎるのではないかと思います。

設定内容

.github/workflows/pr-review.yml

on:
  pull_request:
    types: [opened, reopened, ready_for_review]
  issue_comment:
jobs:
  pr_agent_job:
    if: ${{ github.event.sender.type != 'Bot' }}
    runs-on: ubuntu-latest
    permissions:
      issues: write
      pull-requests: write
      contents: write
      id-token: write
    name: Run pr agent on every pull request, respond to user comments
    steps:
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ap-northeast-1
          role-to-assume: arn:aws:iam::151671725617:role/github-ftft
      - name: PR Agent action step
        id: pragent
        uses: Codium-ai/pr-agent@main
        env:
          OPENAI_KEY: dummy
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

https://github.com/diggymo/ftft/blob/9b03c0b7653c4301657e5bed1ed97d81ee04f919/.github/workflows/pr-review.yml

  • Amazon Bedrock を利用する場合は、OPENAI_KEYの指定は不要です。
  • 代わりに、AWS CLIが利用できる状態になっている必要があります。

.pr_agent.toml

[config]
model="bedrock/anthropic.claude-3-haiku-20240307-v1:0"
model_turbo="bedrock/anthropic.claude-3-haiku-20240307-v1:0"
fallback_models=["bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0"]

[pr_reviewer]
num_code_suggestions=5
inline_code_comments=true
extra_instructions="answer in Japanese"

[pr_description]
extra_instructions="answer in Japanese"

[pr_questions]
extra_instructions="answer in Japanese"

[pr_code_suggestions]
extra_instructions="answer in Japanese"

[pr_update_changelog]
extra_instructions="answer in Japanese"

https://github.com/diggymo/ftft/blob/9b03c0b7653c4301657e5bed1ed97d81ee04f919/.pr_agent.toml

  • model, model_turbo, fallback_modelsでモデルを指定します
  • コードに直接紐づけてレビューしてもらうために、inline_code_commentsを指定します
  • 日本語で回答してほしいので、extra_instructionsを指定します

結果

コミットした内容

Lambdaで動作させているNest.jsのアプリケーションに対して、PowerToolsのtracerを設定しています。
わずか10行程度の変更です

/img/2024-08-24-04.png

それに対する出力結果

実際のPullRequestはこちら

description

/img/2024-08-24-01.png
  • 日本語での回答を指定しましたが、英語になってしまいました。
  • 変更内容は全て網羅できています

review

/img/2024-08-24-02.png

PRに対するコメント

/img/2024-08-24-05.png

コードに対するコメント

  • 想定するレビューの労力を表してくれるのはレビュワーにとって嬉しいですね
  • コメントされている内容も正しくレビューとして適切だと私は感じました。

improve

/img/2024-08-24-03.png
  • PRの差分以外の点についても指摘されました。嬉しい反面、多すぎるとうっとうしく感じやすい機能だと思います

See also