こんちは、今度生成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 }}
- 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行程度の変更です
それに対する出力結果
description
- 日本語での回答を指定しましたが、英語になってしまいました。
- 変更内容は全て網羅できています
review
- 想定するレビューの労力を表してくれるのはレビュワーにとって嬉しいですね
- コメントされている内容も正しくレビューとして適切だと私は感じました。
improve
- PRの差分以外の点についても指摘されました。嬉しい反面、多すぎるとうっとうしく感じやすい機能だと思います