PR-Agent×GitHub Action×Azure OpenAIで実現するAIコードレビュー

Pull requestのタイトルや説明文を書いている時、「これ絶対AIでできるよな」と感じたことがある開発者は少なくないと思います。

もちろん変更の経緯や背景など、コードの差分からは読み取れない情報もありますが、コードの差分からわかることはAIが書いてくれるといいですよね。

この願いを叶えてくれるのがCodiumAIが提供しているPR-Agentです。GitHub Actionで実行でき、OpenAIはもちろんAzure OpenAIやAmazon Bedrockも使えます。

PR-Agentはすでにいろいろなところで取り上げられています*1 *2 *3ので、このブログ記事では、これまでにあまり紹介されていないPR-AgentでLLMとしてAzure OpenAIで使う方法と、使ってみた感想を紹介します。

どうしてPR-Agentを使うのか

コードレビューをできるAIエージェントはいくつかあります。今回は、以下の3つの理由で、CodiumAIが提供している、PR-Agentを選択しました。

  • 実行環境にGitHub Actionsがあり、アカウント作成が不要
  • データのプライバシーが明記されている
  • Azure OpenAIを使うことができる

また、Pull requestの要約であれば、GitHub のCopilot pull requestでも可能ですが、PR-Agentは要約に加えて、以下のような機能があり、それらを試してみたい気持ちもありPR-Agentを使いました。

機能 説明
DESCRIBE PRの説明(タイトル、種類、概要、コードの解説、ラベル)を生成します
REVIEW PRについて調整可能なフィードバック、可能性のある問題、セキュリティ上の懸念、レビュー作業量などを提供します
IMPROVE PRを改善するためのコード提案を行います
UPDATE CHANGELOG 変更ログを自動的に更新します
ADD DOCS 💎 PRで変更されたメソッド/関数/クラスのドキュメントを生成します
TEST 💎 PRのコード変更に基づいて、特定のコンポーネントの単体テストを生成します
IMPROVE COMPONENT 💎 PRで変更された特定のコンポーネントに対するコード提案を行います
ANALYZE 💎 PRで変更されたコンポーネントを特定し、各コンポーネントに対してテスト、ドキュメント、コード提案を対話形式で生成できるようにします
ASK PRについての自由記述形式の質問に答えます
GENERATE CUSTOM LABELS 💎 ユーザーが定義した特定のガイドラインに基づいて、PRのカスタムラベルを生成します
CI FEEDBACK 💎 失敗したCIジョブに対するフィードバックと分析を生成します
CUSTOM SUGGESTIONS 💎 ユーザーが定義した特定のガイドラインに基づいてのみ、PRコードを改善するためのカスタム提案を生成します
SIMILAR ISSUE 自動的に類似のイシューを検索して提示します

💎がついてるものは、PR-Agent ProというのPR-Agentのhostingサービスを利用し月額利用料を支払うことで利用できます。 また、SIMILAR ISSUE機能を使うにはVectorDBとしてPineconeかLanceDBを準備する必要があります。

GitHub ActionでPR-Agentを実行する

PR-AgentはGitHubやGitLabなどのGitプロバイダーに導入することができます*4。今回は、GitHubに導入する方法を紹介します。また、GitHubでの実行方法には「GitHub Action」と「GitHub App」が用意されており、今回はGitHub Actionを利用します。GitHub Appを使う場合は、GitHub Appの作成とDocker Repositoryの準備が必要ですが、より細かい設定が可能です。

GitHub ActionでPR-Agentを実行する方法はドキュメントにも記載されている*5ので、ここでは、LLMをAzure OpenAIに変更し、表示言語を日本語にしたワークフローを紹介します。

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
    name: Run pr agent on every pull request, respond to user comments
    steps:
      - name: PR Agent action step
        id: pragent
        uses: Codium-ai/pr-agent@1701eb5b0757cac9a2342d15cfcd8fc2a2d98e8b
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          AZURE_OPENAI_API_KEY: ${{ secrets.OPENAI_KEY }}
          OPENAI_API_TYPE: "azure"
          OPENAI_API_VERSION: "2024-03-01-preview"
          OPENAI.API_BASE: "https://<Azure OpenAIのリソース名>.openai.azure.com"
          OPENAI.DEPLOYMENT_ID: "Azure OpenAIのデプロイID"
          PR_DESCRIPTION.EXTRA_INSTRUCTIONS: "answer in Japanese"
          PR_REVIEWER.EXTRA_INSTRUCTIONS: "answer in Japanese"
          PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS: "answer in Japanese"

環境変数の命名規則が少し特殊で.が使われていますが、そういうものだと思って設定してください。

また、この設定はLLMのベースモデルにGPT-4.0を使っています。GPT-3.5を利用する場合は、もう少し設定が必要です。

Azure OpenAIを使うための設定

LLMにOpenAIを使う場合は、環境変数OPENAI_API_KEYを指定するだけで良いのですが、Azure OpenAIを使う場合は、OPENAI_API_TYPEOPENAI_API_VERSIONOPENAI.API_BASEOPENAI.DEPLOYMENT_IDを指定します。

OPENAI_API_TYPEは固定値azureで良いですが、ほかの環境変数はAzureのポータルから取得する必要があります。取得内容が正しいかは以下のスクリプトで確認できます。

AZURE_OPENAI_API_KEY="Azure OpenAIのAPIキー"
OPENAI_API_VERSION="2024-03-01-preview"
OPENAI.API_BASE="https://<Azure OpenAIのリソース名>.openai.azure.com"
OPENAI.DEPLOYMENT_ID="Azure OpenAIのデプロイID"
curl $OPENAI.API_BASE/openai/deployments/$OPENAI.DEPLOYMENT_ID/completions?api-version=$OPENAI_API_VERSION \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d "{\"prompt\": \"Once upon a time\"}"

表示言語を日本語にするための設定

また、PR-Agentの表示言語を日本語にするために、PR_DESCRIPTION.EXTRA_INSTRUCTIONSPR_REVIEWER.EXTRA_INSTRUCTIONSPR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONSを指定しています。

例えばPR_DESCRIPTION.EXTRA_INSTRUCTIONSanswer in Japaneseと指定すると、以下のようなプロンプトになります。

You are PR-Reviewer, a language model designed to review a Git Pull Request (PR).
Your task is to provide a full description for the PR content - files walkthrough, title, type, and description.
- Focus on the new PR code (lines starting with '+').
- Keep in mind that the 'Previous title', 'Previous description' and 'Commit messages' sections may be partial, simplistic, non-informative or out of date. Hence, compare them to the PR diff code, and use them only as a reference.
- The generated title and description should prioritize the most significant changes.
- If needed, each YAML output should be in block scalar indicator ('|-')
- When quoting variables or names from the code, use backticks (`) instead of single quote (').

Extra instructions from the user:
=====
answer in Japanese
=====


The output must be a YAML object equivalent to type $PRDescription, according to the following Pydantic definitions:
=====
class PRType(str, Enum):
    bug_fix = "Bug fix"
    tests = "Tests"
    enhancement = "Enhancement"
    documentation = "Documentation"
    other = "Other"

# 以下省略
# 全文は
# https://github.com/Codium-ai/pr-agent/blob/e429c5d012b05523e9a2bf53274b5ffd946ddae7/pr_agent/settings/pr_description_prompts.toml
# をご確認ください

PR-Agentの出力内容の紹介

ワークフローを作成するエディタの技術検証に作成したプロトタイプのPull requestを対象にPR-Agentを実行した結果を紹介します。

Describe

Pull requestをOpenして1分ほど経つと以下のように説明文が生成されます。私がPull request作成時に入力した内容これまではブラウザで擬似的にワークフローを実行していましたが〜も保持されています。

Capture of the pull request description updated by PR-Agent

Review

説明文が生成されてからさらに1分ほど経つと、以下のようにレビューが生成されます。レビューにかかる労力を5段階で示すEstimated effort to reviewが良いですね。 Possible issuesも適切な内容だと思います(技術検証用のプロトタイプなので意図的にそうしているのですが、実際のプロダクト開発でこういう指摘がされた時は対応したいですね)。

Capture of the review comment by PR-Agent

Ask

このプロトタイプでは社内での利用事例が少ないDrizzleというORMを使ったので、その紹介を兼ねてaskコマンドを実行しました。

Capture of using `ask` command to ask PR-Agent to describe what is Drizlle and why use it

1分ほど待つと以下のようなコメントが追加されました。

Capture of the comment by PR-Agent to describe Drizzle

Drizzleの紹介と利用用途を簡潔に書いてくれていていいですね。自分で書くとついつい長くなって個人的に書いたブログ記事とか紹介してしまうので、これくらいで書いてくれるのは助かります。

まとめ

PR-Agentは、GitHubワークフローでAIを活用したコードレビューを実現する優れたツールです。GitHub Actionsで実行できるため、導入が簡単です。さらに、Azure OpenAIをLLMとして利用することで、セキュリティとプライバシーの面でも安心して利用できます。

この記事ではPR-Agentが提供する主要機能である「Describe」、「Review」、「Ask」を試しました。いずれの機能も適切な出力を生成しており、開発チームのコードレビューの効率化に大いに役立つと感じました。特に「Review」機能の「Possible issues」や「Estimated effort to review」は、レビューの質と一貫性を高める上で非常に有用でした。

AIを活用したコードレビューの導入を検討している開発チームには、ぜひPR-Agentを試してみてほしいと思います。