PR-Agentで自動コードレビューを導入してみた

こんにちは。KENTEMでバックエンドを担当しているおかおかです。
弊社ではAzureやGitHubを利用しているため、AIによる自動コードレビューができるPR-Agentをお試しで導入してみました。

Azure OpenAI Serviceを作成する

  1. Azureのポータル上からAzure OpenAIを新規作成します。以下設定を行うだけで簡単に構築することができます。
    「gpt-4o」モデルを利用したいため、リージョンは「West US」にします。

    Azure OpenAI Service

  2. Azure OpenAIが作成できたら、モデルをデプロイします。
    「リソース管理」→「モデルデプロイ」→「展開の管理」をクリックすると「Azure OpenAI Studio」が表示されます。
    「共有リソース」→「デプロイ」→「モデルのデプロイ」を選択
    「gpt-4o」モデルを選択し、以下内容を入力して「デプロイ」します。

    Model Deploy

これでAzureの設定は完了です。簡単に作成することができました。

GitHubにYamlファイルを作成する

リポジトリに.github/workflows/code-review.yamlを追加し、以下設定をします。
OPENAI_KEY:デプロイしたAOAIリソースのAPIキー
OPENAI.API_VERSION:2024-02-15-preview
OPENAI.API_BASE:https://{aoai-resource-name}.openai.azure.com
OPENAI.DEPLOYMENT_ID:AIモデルのデプロイ時につけた名前

name: code-review

on:
  pull_request:
    types: [opened, ready_for_review]
  issue_comment:
    types: [created, edited]
  pull_request_review_comment:
    types: [created, edited]

env:
  EXTRA_SETTINGS : |
    必ず日本語で回答してください。
    文章が日本語で回答されているかを確認し、
    英語になっている場合は日本語にしてください。

jobs:
  pr_agent_job:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    # PRの場合
    # - ドラフトではない
    # コメントの場合
    # - /ask から始まる
    if: |
      (github.event_name == 'pull_request' &&
      !github.event.pull_request.draft) ||
      (endsWith(github.event_name, 'comment') &&
       startsWith(github.event.comment.body, '/ask'))
    permissions:
      issues: write
      pull-requests: write

    steps:
      - uses: Codium-ai/pr-agent@main
        env:
          OPENAI_KEY: ${{ secrets.OPENAI_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          OPENAI.API_TYPE: "azure"
          OPENAI.API_VERSION: ${{ vars.AZURE_API_VERSION }}
          OPENAI.API_BASE: ${{ vars.AZURE_API_BASE }}
          OPENAI.DEPLOYMENT_ID: ${{ vars.AZURE_API_DEPLOYMENT_ID }}
          # /describe
          PR_DESCRIPTION.EXTRA_INSTRUCTIONS: ${{ env.EXTRA_SETTINGS }}
          PR_DESCRIPTION.PUBLISH_LABELS: false
          # /review
          PR_REVIEWER.EXTRA_INSTRUCTIONS: ${{ env.EXTRA_SETTINGS }}
          # /improve
          PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS: ${{ env.EXTRA_SETTINGS }}

処理概要

  1. GitHubでプルリク作成

  2. Codium-ai/pr-agentがプルリクエストを解析
    このツールがプルリクエストの内容を取得し、解析のためにAzureのOpenAIサービスに送信

  3. AzureのOpenAIサービスが解析を実行
    AzureのOpenAIサービスがプルリクエストの内容を解析

  4. 結果がGitHubに戻る

導入したことでの効果

  • 変数名などの誤字を指摘してくれる

  • 1プロジェクトで1ヶ月利用したAzureのコストは、平均¥1,300~¥1,400程度であったため、非常にコスパが良い
    1PRを300行程度で試算した場合、約¥20程度

  • 機械的に自動で指摘されるため、指摘された側も素直に受け止めることができる(感情がないことが大きい)

  • 思った以上に指摘の精度が良かった
    以下実際によかった指摘です

検索機能の改善

 const showItems: Item[] = items.filter((item) =>
-  item.text.includes(inputText),
+  item.text.toLowerCase().includes(inputText.toLowerCase()),
 );

配列操作のパフォーマンス改善

- (file) => files.every((item) => !isSame(item.file, file.data))
+ (file) => !files.some((item) => isSame(item.file, file.data))

条件式を簡潔にする指摘

 onClick={() => {
-  isSelected === false &&
-    disabled !== true &&
-    props.onClick !== undefined &&
+  if (!isSelected && !disabled && props.onClick) {
     props.onClick();
+  }
 }}

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています!
建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。
recruit.kentem.jp career.kentem.jp