maybe daily dev notes

私の開発日誌

Amazon Bedrockでもコードレビューしたい!

最近LLMでコードレビューする記事が話題になっていました:

zenn.dev

上記の記事ではCodeRabbitというOSS/SaaSを用いることで、ボットがレビュワーとしてGitHubプルリクのレビューに参加する体験が実現されています。

CodeRabbitのOSS版ではChatGPTのAPIを用いる必要がありますが、色々な事情でAmazon Bedrockのほうが使いやすいという方もいるでしょう。今回はCodeRabbitリポジトリをフォークしてBedrock版を作成したので、使い方を紹介します。

GitHub - tmokmss/bedrock-pr-reviewer: AI-based Pull Request Summarizer and Reviewer with Chat Capabilities.

使い方

使い方はCodeRabbitとほぼ同一ですが、一点Bedrock APIを叩くためのAWS IAMロールのみ追加で設定する必要があります。

IAMロールの設定

OpenID Connectを使うことで、GitHub ActionsからAWSアカウントに対して簡単に認証認可できます。

簡単に構築するためのCloudFormationテンプレートを用意しました oidc-cfn.yamlSubjectClaimFilters には、必ずGitHub Actionsを利用したいGitHubリポジトリを指定してください:

  SubjectClaimFilters:
    Type: CommaDelimitedList
    Default: "repo:tmokmss/bedrock-review-test:*"

CFnテンプレートのデプロイは次のコマンドで実行できます:

aws cloudformation deploy --stack-name STACK_NAME --template-file oidc-cfn.yaml --capabilities CAPABILITY_IAM

デプロイが完了したら、作成されたIAMロール GitHubActionsServiceRole のARNを確認してください。

GitHub Actionsのyamlを作成

次に、レビューを実行したいリポジトリGitHub Actionsのyamlを作成します。雛形は下記です:

name: AI review

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

on:
  pull_request:
  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:
  Run-Bedrock-review:
    runs-on: ubuntu-latest
    steps:
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789012:role/YourRole # ここにIAMロールのARNを指定
          role-session-name: gha-session
          aws-region: us-east-1
      - name: PR review
        uses: tmokmss/bedrock-pr-reviewer@main
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          debug: true
          language: ja-JP # ボットが使う言語を指定

先程デプロイしたIAMロールのARNを指定さえすれば、そのままでもとりあえず使えます。リポジトリのルートディレクトリに .github/workflows/review.yaml のパスでyamlを作成・pushしてください。

これでセットアップは完了です。適当なプルリクを作成すると、AIがレビューやプルリクの要約などを実行してくれます。

また、 @reviewbot とメンションを付けつつコード内にコメントを追加・返信すると、適切な返答を返してくれます。このスクショだとやり取りがおぼつかないですが。

移植したばかりで私もまだあまり使えてないので、使い物になるかは未知です。少なくとも簡単に導入はできるので、ぜひ試してみて良し悪しを共有しましょう。それらの知見を活かしつつClaudeに合わせたプロンプトチューニングができると良いですね!

おまけ: ChatGPTアプリをBedrock (Anthropic Claude) に移植する

ついでにChatGPTからBedrock Claudeに移植したときのTipsを紹介します。

基本的に、LLMモデルの移行は極めて簡単です。LLMは (細かいパラメータの違いはあるものの) 総じて文字列(プロンプト)を受け取って文字列を返す関数として使えるので、ライブラリをインストールしてLLMを呼び出す部分のコードを書き換えるだけです。(今回だと差分はこの程度)

ただし、モデルにより良い(結果を返す)プロンプトの傾向は異なるようです。Claudeの場合は、こちらのドキュメントが参考になります。

docs.anthropic.com

XMLタグを利用する点などはChatGPTにはないユニークな点なので、注意したいです。また、Bedrock Claudeは \n\nHuman:{prompt}\n\nAssistant: の形式でプロンプトを入力しないと動作しないため注意しましょう。

また、ChatGPTではプロンプトを入力する際に "role": "system" などと指定することができますが、Claudeにはそのような概念はないようです。CodeRabbitでは出力言語を指定するなどのために使われていました。仕方ないのでClaudeではプロンプトの頭に指示をそのまま配置しましたが、意図通りに動作しているようです。

今回のAIレビュワーに関してはあまりプロンプトチューニングもしていないので、まだまだ改善の余地があるはずです。ぜひフィードバックお待ちしています。

それでは!