LayerX エンジニアブログ

LayerX の エンジニアブログです。

PR-Agent を使って Pull Request をAIレビューしてみた。(日本語対応もしてみた)

LayerXの suguru です。 今日は、バクラクの開発に導入した PR-Agentの話をしようと思います。

PR-Agent は、Codium AI によってオープンソースで開発されている ChatGPT を使ったプルリクエストを便利にするためのAIツールです。 現時点で、下記のような機能を持っています。

  • Pull Request の自動分析およびレビュー
  • Pull Request のタイトルと説明文を自動入力
  • コード改善の提案
  • フリーテキストな質問への回答
  • CHANGELOG の自動生成

必要なものは、 OpenAI のキーのみのため、CIに簡単に導入できます。

GitHub上へのインラインコメントなどにも対応しており、普段開発する際に面倒なプルリクエストに関する様々な作業を自動化することができます。 裏側ではデフォルトで GPT-4 を使っており、ソースコードを解析し、高精度な結果が期待できます。 また、プルリクエストのサイズが大きくなったとしても、重要なファイルを優先的に見て判断するアルゴリズムによって、トークンサイズに収まるような仕組みが入っており、比較的大きなプルリクエストもレビューすることができます。アルゴリズムについては、PR Compression Strategy に詳しい記載があります。

今回は、GitHub Actions で導入してみたのですが、とても簡単に導入できたので、その方法を紹介したいと思います。

まず、対象となる GitHub リポジトリの Actions Secret に OPENAI_KEY を追加し、 OpenAI のAPIキーを登録します。

その後 .github/workflows/pr-agent.yaml に以下のようなワークフローを作成します。

name: pr-agent

on:
  pull_request:
    types: [opened, reopened, synchronize]
  issue_comment:
    types: [created, edited]

permissions:
  pull-requests: write
  issues: write

jobs:
  pr_agent:
    runs-on: ubuntu-latest
    name: Run PR Agent
    if: ${{ github.event.sender.type != 'Bot' }}
    steps:
      - id: pr-agent
        uses: Codium-ai/pr-agent@main
        env:
          OPENAI_KEY: ${{ secrets.OPENAI_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

これで、pr-agent がプルリクエストが作成されるたびに実行されるようになります。 pr-agent が有効になると、AIによるレビュー結果が GitHub Comment されるようになります。 ためしに上記のファイル追加をしたプルリクエストを作ってみると、GitHub Actions が実行されます。

しばらく待っていると、プルリクエストのレビュー結果がコメントされます

もし動いていない場合は、Actions の実行ログを見てください。

PR-Agent は、プルリクエストにコメントを書くことで、いくつかの機能を利用できます。 ただし、コメントによるコマンドを使うためには、上記のプルリクエストを一度マージする必要があります。 Issue Comment のイベントは、メインブランチにワークフローが登録されてないと起動しないためです。

プルリクエストをマージしたら、別のプルリクエストを作ってコメントコマンドを試してみます。 たとえば、READMEに簡単な説明を追加したプルリクエストを作ります。

自動レビューがされることを確認し、プルリクエスト上にコメントによるコマンドを指示してみます。

まず、/describe というコメントをすると、しばらくして 👀 のリアクションがつきます。

その後、プルリクエストのタイトルと説明文が自動入力されます。プルリクエストのカテゴリや、 どういった変更がされたのかのサマリ、そしてファイルごとの変更点を簡単に要約したものが投入されます。

他にも /improve でコードの改善をサジェストしたり、 /ask でPRに対する質問をしたり、 様々なコメント機能が搭載されています。LayerXの実際のリポジトリで運用していますが、 サマリの内容やレビューの内容は、かなり正確に記載されており、プルリクエストの概要を いちいち説明として記入する手間も省けてかなり便利です。

PR-Agent はデフォルトで英語でレビュー結果やタイトルの生成をしますが、追加のインスラクションを与える機能があります。 そこで、レビュー内容を日本語にしたり、プルリクエストのタイトルを commitlint 形式にするインストラクションを 与えてみることにします。

PR-Agent は python の dynaconf を使っているので、 GitHub Actions のワークフローに環境変数を指定することで設定値を調整できるようになっています。

以下は今回与えるインストラクションです。 GitHub Actions のワークフローファイルのステップに、環境変数を追加しています。

    steps:
      - id: pr-agent
        uses: Codium-ai/pr-agent@main
        env:
          OPENAI_KEY: ${{ secrets.OPENAI_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_REVIEWER.EXTRA_INSTRUCTIONS: 'Please use Japanese in descriptions.'
          PR_DESCRIPTION.EXTRA_INSTRUCTIONS: 'Please use Japanese in descriptions. Titles should have prefix of commitlint pattern such as `feat:`, `chore:`, `test:`, `fix:`, `ci:`, `docs:` etc'

試しに、このプルリクエストを作ってみると...

レビュー内容が日本語化されました!

このプルリクエストをマージすると、次に作るプルリクエストから /describe で作成されるタイトルや説明文も日本語で記載されるようになります。以下は、試しに fractorial.js というシンプルな関数を追加した際の説明文です。

他にも様々な設定値があるので、いろいろいじってみたり、インストラクションを変更して試してみてください! 最近は PR-Agent のおかげで、プルリクエストの説明文を何も書かずに /describe とさっと記載して自動化していますが、殆どのケースで適切な説明文を記載してくれます。しかも、何のヒントを与えなくてもコードの内容を適切に解析し、文書化してくれることが以外と多いのです。

使う際に注意する点として、 PR-Agent はアクティブに開発中で、まだ安定版が出ていません。 main ブランチを参照しており、 Github Actions が稀にバグで実行できないことがあります。日々様々な機能が追加されているので見ていて楽しいのですが、安定した動作にはまだ少し時間が必要なようです。

みなさんもぜひ試してみて、素敵なプルリクエストライフをお送りください!