🤖

AI コードレビューツール Qodo Merge を試験導入してみた

に公開

こんにちは!BABY JOB 開発部です!
今回は AI コードレビューツール Qodo Merge を試験導入してみた話をご紹介します。

背景

開発現場での生成 AI 活用が当たり前になってきました。弊社においても「日々の開発でどう活かせるか」を考える中で、まずはコードレビューの自動化に目を向けました。狙いは次の 3 点です。

  • レビューイの学びを促進する
  • レビュアーの負担を減らす
  • プロダクトのコード品質を向上させる

これらを目的とし、AI コードレビューツールの検証を開始しました。

ツール選定

候補に挙がったツールは以下の 3 つです。

選定にあたり、「Amazon Bedrock(以下、Bedrock) と接続できるツールであること」を重視しました。理由は次の通りです。

  1. データプライバシーの担保
    プロンプトや LLM の出力が保存されたり、モデルのトレーニングに使用されたりしないと明示されている[1]
  2. モデル使用に対する従量課金方式のため、初期費用を抑えた導入が可能
    昨今の AI ツールはユーザーごとの月額課金が一般的で、全員分を契約すると初期費用が膨らみがち
  3. モデルの選択肢が豊富
    LLM の進化が速いため、同一プラットフォーム内でモデルを切り替えられる点が魅力的
  4. 既に予算化されている AWS 費用の中で運用可能
    予算の観点からも、導入やモデル切り替えの敷居が低いことは魅力的

この条件で候補を絞り込んだところ、以下のような結果となりました。

ツール 採否 主な理由
Qodo Merge 無料版[2] ユーザーごとの月額課金不要で Bedrock も使用可能。
Qodo Merge 有料版 ユーザーごとの月額課金が必要なので不採用。
CodeRabbit 無料版[3] 現在はアーカイブ済なので不採用。
CodeRabbit 有料版 ユーザーごとの月額課金が必要なので不採用。
GitHub Copilot code review 選定時点で Public Preview 段階だったため不採用。
※現在は一般提供されているが、ユーザーごとの月額課金が必要なので不採用。

各ツールの機能差については、冒頭の目的を達成する観点ではそこまで大差無いものと判断しています。
以上を踏まえ、私たちの環境では Qodo Merge の無料版がマッチしていると判断し、試験導入へと進みました。

Qodo Merge の概要

Qodo Merge は、AI を活用してプルリクエストのレビューを自動化・効率化するツールです。代表的な機能は次の通りです。

  • プルリクエストの要約生成 — 変更点を分析し、プルリクエストのタイトルや要約を自動生成
  • レビューガイドの提示 — 人間のレビュアーがレビューする際のヒント提供
  • 改善コードの提案 — コードの問題点や改善案の提示

導入方法

無料版で Qodo Merge を使用する方法はいくつかある[4]のですが、今回はチームで馴染みのある GitHub Actions で使用する形を採用しました。
そのため、導入方法も GitHub Actions が前提となっています。

構成図

Bedrock でモデルアクセスをリクエスト

Bedrock 上のモデルはいきなり使用できるわけではなく、AWS に対して申請が必要です[5]
Bedrock コンソールのサイドバー > モデルアクセス > 「特定のモデルを有効にする」ボタン から、画面の案内に従ってリクエストを行います。

AWS IAM のリソースを作成

GitHub Actions から Bedrock に接続するために IAM のリソースを作成する必要があります。
次のようなテンプレートを AWS CloudFormation に適用し、関連リソースを作成します。

テンプレート
AWSTemplateFormatVersion: 2010-09-09

Resources:
  GitHubOIDCProvider:
    Type: AWS::IAM::OIDCProvider
    Properties:
      Url: https://token.actions.githubusercontent.com
      ClientIdList:
        - sts.amazonaws.com
      ThumbprintList:
        - ffffffffffffffffffffffffffffffffffffffff # 指定は必要なものの認証時に使用されないため、ダミー値を指定

  GitHubCodeReviewPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      ManagedPolicyName: ai-review-policy
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - bedrock:InvokeModel
            Resource:
              - !Sub arn:${AWS::Partition}:bedrock:*::foundation-model/*

  GitHubCodeReviewRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: ai-review-role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Federated: !GetAtt GitHubOIDCProvider.Arn
            Action: sts:AssumeRoleWithWebIdentity
            Condition:
              StringEquals:
                "token.actions.githubusercontent.com:aud": sts.amazonaws.com
              StringLike:
                "token.actions.githubusercontent.com:sub": "repo:<Organization名>/*" # Organization が所有するリポジトリからの疎通を許可
      ManagedPolicyArns:
        - !Ref GitHubCodeReviewPolicy

※リソースの作成を確認したら、IAM ロールの ARN を控えておきます。

GitHub Actions のワークフローファイルを作成

続いて、Qodo Merge を起動するワークフローファイルの作成です。
公式ドキュメントを参考に以下のような yml ファイルを作成します。

on:
  pull_request:
    types: [opened, reopened, ready_for_review]
  issue_comment:
    types: [created]

jobs:
  execute_ai_code_review:
    if: ${{ github.event.sender.type != 'Bot' }}
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
      contents: write
      id-token: write
    steps:
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AI_REVIEW_ROLE_ARN }}
          aws-region: ap-northeast-1 # アクセスが承認されたモデルのリージョンを指定
      - name: Pull request analysis and feedback
        uses: qodo-ai/pr-agent@v0.28
        env: # ここで Qodo Merge のオプションを設定可能
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          CONFIG.MODEL: "<アクセスが承認されたモデルのIDを指定>"
          CONFIG.FALLBACK_MODELS: '["<アクセスが承認されたモデルのIDを指定>"]'
          PR_DESCRIPTION.EXTRA_INSTRUCTIONS: "Descriptionの説明は日本語で回答してください"
          PR_REVIEWER.EXTRA_INSTRUCTIONS: "日本語で回答してください"
          PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS: "日本語で回答してください"
          PR_DESCRIPTION.ENABLE_PR_TYPE: false
          PR_DESCRIPTION.PUBLISH_DESCRIPTION_AS_COMMENT: true
          PR_DESCRIPTION.ADD_ORIGINAL_USER_DESCRIPTION: false
          PR_REVIEWER.REQUIRE_CAN_BE_SPLIT_REVIEW: true
          PR_CODE_SUGGESTIONS.COMMITABLE_CODE_SUGGESTIONS: true

以下は Qodo Merge に日本語で出力させるための設定です。
PR_DESCRIPTION は他と同じ書き方だと日本語にならないことがありましたが、下記のように設定することで安定して日本語が出力されるようになりました。

PR_DESCRIPTION.EXTRA_INSTRUCTIONS: "Descriptionの説明は日本語で回答してください"
PR_REVIEWER.EXTRA_INSTRUCTIONS: "日本語で回答してください"
PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS: "日本語で回答してください"

GitHub Actions シークレットの登録

ワークフローファイルで IAM ロールの ARN をシークレット経由で取得するようにしているため、GitHub リポジトリに以下の内容でシークレットを登録します。

Name Secret
AI_REVIEW_ROLE_ARN <IAM ロールの作成時に控えた ARN>

動かしてみる

次のようなメソッドを生やした上でプルリクエストを公開し、ワークフローを起動してみます。

プルリクエストの要約

要約は以下のような形で出力されます[6]
レビュアーがレビュー開始時にプルリクエストの概要を掴むために読んだり、レビューイがプルリクエストの説明欄を書く際の叩きとして使用したりすることもあります。

レビューガイド

レビュー労力の目安や、特にレビューした方が良い場所など、人によるレビュー時のヒントが出力されています。

改善コードの提案

AI による改善コメントも入っています。
デフォルトでは「プルリクエストの要約」や「レビューガイド」と同様、そのままコミットできる行コメントではなく通常コメントとして投稿されるのですが、PR_CODE_SUGGESTIONS.COMMITABLE_CODE_SUGGESTIONS オプションの指定によって行コメントに変えています。

開発メンバーからのフィードバック

一定期間、開発メンバーに使用してもらった後、アンケートを実施しました。
特に、下記の目的について効果があったかを尋ねています。

  • レビューイの学びを促進する
  • レビュアーの負担を減らす
  • プロダクトのコード品質を向上させる

すると、学び促進やコード品質向上については半数以上が効果を感じている一方で、レビュアーの負担軽減にはあまり繋がっていないという意見が多く出ました。

原因分析

レビュアーの負担が軽減されていない理由を探るにあたり、「負担が減るのはどんなときか」を整理しました。
結論としては、「人間のレビュアーが書くはずだった指摘を AI が先回りしてコメントしてくれているとき」が該当します。
この先回りコメントがあれば、人間は指摘を文章化する時間と、指摘を入れる相手に配慮する心理的負担を削減できます。
現状では、その先回りコメントが不足しているため、負担軽減を実感できていないものだと考えます。
そしてこれは、人間のレビュアーが行う指摘の観点を AI に十分伝えられていないことが主因です。

今後の動き

今回得た知見を踏まえ、LLM に渡すプロンプトを整備します。
まずは、過去のレビューで繰り返し挙がっている指摘を抽出し、普遍的なルールに落とし込めそうなものをプロンプトに組み込みます。
例えば、責務違反に関する指摘が見受けられるので、社内 wiki に掲載している責務ガイドラインを活用できたらと考えています。

最後に

AI コードレビューツール導入のリアルな部分を紹介しました。
実際に試してみると当初抱いていた期待に届かない部分もあり、導入して終わりではなく、改善が前提なのだと感じています。
導入を検討している方の参考になれば幸いです。最後までお読みいただきありがとうございました!

脚注
  1. Amazon Bedrock では、プロンプトおよび AI のレスポンスを保存またはログに記録することはありません。Amazon Bedrock は、プロンプトと完了を使用して AWS モデルをトレーニングせず、サードパーティーに配布しません。↩︎

  2. 過去に PR-Agent から Qodo Merge に名称が変わりましたが、リブランドがあり、現在は有料版を Qodo Merge、無料版を PR-Agent と呼んでいるようです。説明の便宜上、本記事では一律 Qodo Merge という表記で記載します。 ↩︎

  3. 無料版は ai-pr-reviewer、有料版は CodeRabbit Pro と呼ばれています。 ↩︎

  4. Installation - Qodo Merge (and open-source PR-Agent) ↩︎

  5. 執筆時点で、リクエストは Bedrock のコンソール上でのみ可能です。 ↩︎

  6. Title は差分と無関係ですが、コミットメッセージから判定しているものと思われます。 ↩︎

BABY JOB  テックブログ

Discussion