2024.01.12

【ChatGPT + PR Agent + GitHub Actions】 プルリクの AI コードレビューを10分で自動化し、レビューのルールを詳細にカスタマイズする

D.M. です。
AIによる自動コードレビューが10分で可能になったので、それをチューニングしていく話をします。


開発現場でいかに AI を活用して効率化するか、という新たな課題

ChatGPT をはじめとした LLM の登場により、 AI を開発現場でどう活用するかということが一気に重要になりました。

検索するとすでに多くの提案や事例が紹介されています。
・テストコードを書かせる。
・バッチなどの短いコードを実装させる。
・コードレビューをさせる。
・画面モックを作らせる。
ただ実際の業務で汎用的に有効なものは限られると思っています。

完全に個人の感想ですが、直近1年でもっとも効果的ではないかと感じたもの、それは AI によるコードレビューです。

コードレビューは一般的に「仕様面」と「形式面」の2つが求められます。
「仕様面」は、プロジェクトに依存して毎回変わっていく要件に関するチェックになるため、前提情報の共有が人間同士でも困難ということもあり、まだまだ人間の領域ではと思っています。
一方、「形式面」は毎回同じルールに基づいて一般的に良いとされるコードに導いていくチェック作業を意味し、この点はAIとの相性が非常に良い可能性が高いです。

社内の勉強会でツール PR Agent が紹介され高い先見性を感じたため、こちらを検証した内容を記載します。





基本編


PR Agent とは


PR Agent は Pull Request を AI でレビューしてもらうためのツールです。
大きく2点があります。

・プルリクの要約
(=つまり本来 Pull Request を Open したユーザが書くべき説明)

・プルリクへのレビューコメント
(レビュー担当者が書くべきコメント)

このツールが優れているのは、 Github Actions で Pull Request がオープンされるとすぐに自動で実行できることです。
(CLI でもコマンドでレビューを実行可能です)

本体のコード自体は Python で書かれており、 OSS として GitHub に公開されています。
https://github.com/Codium-ai/pr-agent

開発元 CodiumAI 社によって提供されています。
https://www.codium.ai/

CodiumAI は、 VS Code や JetBrains など IDE で AI がコードの「説明」、「レビュー」、「テスト生成」をしてくれる Extention を提供しています。
CodiumAI 有料プラン 機能では、PullRequest 作成前のレビューや自社 SaaS 上での PR Agent 実行を固定金額で提供するなどがあります。
(もちろんセキュリティ面での安全なポリシーも謳っています)
https://www.codium.ai/pricing/
Github Copilot の競合といえそうなサービスです。(こっちはこっちで別途検証したい)


競合ツール


CodeRabbit


直接的な競合は CodeRabbit が該当するのではないでしょうか。
こちらにもプルリクの「要約」「レビューコメント」の機能が備わっています。
以下に簡単な比較表を作ってみました。

比較表
CodeRabbit PR Agent
GitHub Stars 1100 Stars 3000 Stars
言語 NodeJS Python
モデル gpt3.5 turbo, gpt4 など OpenAI OpenAI
VertexAI
AWS
HuggingFace
Llama2
Git プロバイダ GitHub, GitLab GitHub
Gitlab
BitBucket など
特徴 ポエムがある

社内勉強会では、弊社グループ会社の方が CodeRabbit の方を使っているよという共有を受けています。
現段階でそこまで大きな差はないようなので、私は GitHub Stars の数が多い PR Agent のほうに注目して説明していこうと思います。

Copilot Pull Request


GitHub Copilot も同様の機能を開発・公開しています。
https://githubnext.com/projects/copilot-for-pull-requests

すでにGitHub Copilot Enterprise ベータ にて提供が始まっています。
https://docs.github.com/ja/enterprise-cloud@latest/copilot/github-copilot-enterprise/copilot-pull-request-summaries/about-copilot-pull-request-summaries

こちらは今回そこまで充分な情報が集められませんでした。
ただ GitHub Copilot は実質的に広く普及する段階にあるため、今後の検証が必要であることは間違いありません。


いずれも発展中のためこれからが大いに期待できるプロダクトだと思います。


機能

PR Agent の主要な機能を紹介します。

PR Agent を GitHub Actions で実行するための yaml は、公式レポジトリにあります。
https://github.com/Codium-ai/pr-agent/blob/main/.github/workflows/pr-agent-review.yaml

GitHub Actions 用の yaml を設定すると、起動時に以下の entrypoint.sh が実行されます。
https://github.com/Codium-ai/pr-agent/blob/main/github_action/entrypoint.sh

処理本体は github_action_runner.py です。ここで以下のタイミングにあわせて、 env で指定されたコマンドを実行します。
GITHUB_EVENT_NAME == “pull_request”
GITHUB_EVENT_NAME == “issue_comment”
https://github.com/Codium-ai/pr-agent/blob/main/pr_agent/servers/github_action_runner.py

env で指定できるのは以下の3つのコマンドです。(PR Agent の実体はコマンドラインツールになります)

/review

総評のレビューコメントを作成してくれる機能です。
Github Actions でプルリク作成時に自動的に実行すると、プルリクコメントとして “PR Analysis” “PR Feeedback” を記載してくれます。
何も設定しなくてもデフォルトで実行されます。
総評ではなく、個別のコードの修正をお願いしたい場合は、下の improve を使って行います。
GITHUB_ACTION.AUTO_REVIEW: true

/describe

プルリクの要約を作成してくれる機能です。
Github Actions でプルリク作成時に自動的に実行すると、プルリクコメントとして “PR Descrition” が記載されます。
GITHUB_ACTION.AUTO_DESCRIBE: true

/improve

ユーザがプルリクのコメントに /improve と記載すると、 “Suggestion” としてコードの提案をしてくれます。提案個数も NUM_CODE_SUGGESTIONS で指定が可能です。
GITHUB_ACTION.AUTO_IMPROVE: true


基本編で大体どんなものかわかったので、これから実際に使ってみようと思います。


2. 実践編

ここでは以下の3点を対応します。

A. 1つのコードをレビューさせてみる
B. 特定の基準に基づいてレビュー
C. Modelを変更したい

A. 1つのコードをレビューさせてみる


実際に利用して確認してみます。
これは正直10分もあれば可能です。

ユースケース的には以下の通りです。

1. 1つのシンプルなレポジトリを用意します。
2. PR Agent の Github Actions 用 yaml を commit → push → main へ merge します。
3. GITHUB_TOKEN と OPENAI_KEY を Secrets に設定します。
4. レビュー対象となる新たなコードを push します。
5. Pull Request を作ると、 GitHub Actions で自動的に OpenAI API 経由で gpt-4 によるレビューが始まります。
6. 概要説明とレビューコメントがPull Requestのコメントとして記載されます。


1. 1つのシンプルなレポジトリを用意します。


GitHub Actions yaml とレビュー対象のコード create_url.js しかないレポジトリを作りました。

root/
├ .github/
│    └ workflow/
│         └ pr-agent.yaml
└ src/
    └ create_url.js




2. Github Actions 用 yaml を commit → push → main へ merge します。


PR Agent を GitHub Actions で実行するための yaml を、ほぼそのまま .github/workflows/pr-agent-review.yaml に設定します。
https://github.com/Codium-ai/pr-agent/blob/main/.github/workflows/pr-agent-review.yaml

これに少し変更を入れてこんな感じにしました。
(以下、#コメントで補足)
name: PR-Agent

on:
  # プルリクが「オープン」「再オープン」「コミット追加」時に自動起動
  pull_request:
    types: [opened, reopened, synchronize]
  # イシューの「作成」「編集」時
  issue_comment:
    types: [created, edited]
  workflow_dispatch:

# GITHUB_TOKEN の権限がデフォルトで2つ必要です
permissions:
  issues: write
  pull-requests: write

jobs:
  pr_agent_job:
    # Ubuntsu で実行します
    runs-on: ubuntu-latest
    name: Run pr agent on every pull request
    steps:
      - name: PR Agent action step
        id: pragent
        # PR Agent の main ブランチを指定します
        uses: Codium-ai/pr-agent@main
        # この環境変数で細かいカスタマイズができます。
        env:
          OPENAI_KEY: ${{ secrets.OPENAI_KEY }}
          GITHUB_TOKEN: ${{ secrets.TOKEN_GITHUB }}
          GITHUB_ACTION.AUTO_REVIEW: true
          GITHUB_ACTION.AUTO_DESCRIBE: true
          GITHUB_ACTION.AUTO_IMPROVE: true

3. GITHUB_TOKEN と OPENAI_KEY を Secrets に設定します。


GITHUB_TOKEN
PR Agentがプルリクのレビューを記載するために必要は write 権限をトークンとして取得する必要があります。

こちらの取得はちょっとメニューの面倒な場所にあります。
(しかも最近権限の設定方法が変わったのでしょうか。Webで調べても少し違う内容が引っかかる)

私は以下の流れで Fine-grained personal access tokens を設定しました。

右上メニュー 一番下 Setting 
→ 左メニュー 一番下 Developer settings
→ Personal Access Tokens
→ Fine-grained personal access tokens

公式ページの説明
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

繰り返しになりますが、必要な Permission は以下になります。

  permissions:
  pull-requests: write
  issues: write

OPENAI_KEY
OpenAIのAPIを実行するためのキーです。
こちらは OPENAI の管理画面から発行できます。
以下のURLからすぐに作成可能です。
https://platform.openai.com/api-keys

Secrets
上記の変数を GitHub Actions で利用するために Secrets に設定します。
レポジトリ上部のメニューの右端にある Settings を使います。
公式の説明も合わせてご確認ください。
https://docs.github.com/ja/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository


4. レビュー対象となる新たなコードを push します。


JSでURLを作る処理を書きました。(これが次のパートの課題になります)
ここでは、こんなコードをレビューさせるのね、ぐらいの理解で問題ありません。

let domain = "example.com";
let param = "id";
let value = "1001";

let url = "https://" + domain + "?"+ param + "=" + value;



5. Pull Request を作ると、GitHub Actions で自動的に OpenAI API 経由で gpt-4 によるレビューが始まります。


Pull Request が立ち上がって10秒ぐらいでなんとなく処理が始まります。

GitHub Actions が Running。。。

6. 概要説明とレビューコメントがPull Requestのコメントとして記載されます。


画像的には人間がコメントしてるように見えますが、TOKEN を PR Agent の Bot に渡しているので、 実態としては Bot が回答してくれています。

一般的なレビューは1つのyamlをコピペして設定する程度で非常に簡単に利用できました。
むしろTOKENの取得の方が難しかったぐらいです。

ただ、レビュー結果が英語になってしまうなど、チューニングの余地があります。
以下でプロンプトを追記する方法を説明します。

B. 特定の基準に基づいてレビューさせてみる


コードレビューの基準をもっと詳細にカスタマイズしたいと思いませんか?

最近読んで面白かった記事で、プログラミングの原則を説明したものがありました。
「プログラミングの原則:構造化テキストを文字列結合で作らない、置換でいじらない」
https://tech.uzabase.com/entry/2023/11/29/185315

ポイントとしては、以下のように書いた方がプログラミングとしては正しいよねという話でした。

例)URLを生成する処理。

✕ 文字列結合で記述する。
var url = "https://" + domain + "?"+ param + "=" + value;

○ 構造化テキスト用のオブジェクトを使う。
// URLオブジェクトの作成
const url = new URL(location.href); 
// パラメータの追加
url.searchParams.append("param", value); 
url.toString();

この原則イケてる!レビュー基準に採用したい!となった場合、PR Agentではどのように実装すればよいでしょうか?

プロンプトに指示を追記する方法


先ほど設定した Github Actions の .github/workflows/pr-agent-review.yaml に以下の3つのパラメータを追記します。

PR_REVIEWER.EXTRA_INSTRUCTIONS
PR_DESCRIPTION.EXTRA_INSTRUCTIONS
PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS

以下 #コメントで補足していきます。
name: PR-Agent

on:
  # プルリクが「オープン」「再オープン」「コミット追加」時に自動起動
  pull_request:
    types: [opened, reopened, synchronize]
  # イシューの「作成」「編集」時
  issue_comment:
    types: [created, edited]
  workflow_dispatch:

# GITHUB_TOKEN の権限がデフォルトで2つ必要です
permissions:
  issues: write
  pull-requests: write

jobs:
  pr_agent_job:
    # Ubuntsu で実行します
    runs-on: ubuntu-latest
    name: Run pr agent on every pull request
    steps:
      - name: PR Agent action step
        id: pragent

        # PR Agent の main ブランチを指定します
        uses: Codium-ai/pr-agent@main

        # この環境変数で細かいカスタマイズができます。
        env:
          OPENAI_KEY: ${{ secrets.OPENAI_KEY }}
          GITHUB_TOKEN: ${{ secrets.TOKEN_GITHUB }}
          GITHUB_ACTION.AUTO_REVIEW: true
          GITHUB_ACTION.AUTO_IMPROVE: true

          # レビュー総評コメントである "PR Feedback" への追加プロンプト 
          PR_REVIEWER.EXTRA_INSTRUCTIONS: >- 
            日本語で回答してください。 
            以下の原則に従ってコメントしてください。
            URLなどの構造化テキストを文字列結合で作ってはいけない。
            置換でいじってはいけない。オブジェクトまたはライブラリを使ってください。

          # プルリクの要約 "PR Descrition" に関する追加プロンプト
          PR_DESCRIPTION.EXTRA_INSTRUCTIONS: >- 
            日本語で回答してください。
            タイトルは feat: 、chore: 、test: 、fix: 、ci: 、docs: などの
            commitlint パターンの接頭辞を含む必要があります。

          # /improve で呼び出す修正コードの "Suggestion" 時の追加プロンプト
          PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS: >-
            日本語で回答してください。
            以下の原則に従ってコメントしてください。
            URLなどの構造化テキストを文字列結合で作ってはいけない。
            置換でいじってはいけない。オブジェクトまたはライブラリを使ってください。

          # /improve コメントの後に提案されるコードの数。
          PR_CODE_SUGGESTIONS.NUM_CODE_SUGGESTIONS: 2

          # Modelを変更
          CONFIG.MODEL: gpt-4-1106-preview

こちらを設定して実行すると、
・指示通り「日本語」で回答をもらえます。
・”PR Description”, “PR Feedback”, “Suggestion” の3か所で記載したルールが適用されます。

最終的に PR Feedback と、 /improve コメントで出力される Suggestion で原則が適用されました。



C. Modelを変更したい


公式の説明が埋もれており例が記載されていなかったので、ここでやり方を解説しておきます。

PR Agent では LLM のモデルはデフォルトで gpt-4 が使われるようです。
現状有効性の高い gpt-4-1106-preview への変更を試みてみます。

モデルの変更については、公式ドキュメントにしっかり記述があります。

Changing a model
See here for the list of available models. To use a different model than the default (GPT-4), you need to edit configuration file. For models and environments not from OPENAI, you might need to provide additional keys and other parameters. See below for instructions.

モデル変更
利用可能なモデルのリストについては、こちらを参照してください。デフォルト(GPT-4)とは異なるモデルを使用するには、 configuration ファイルを編集する必要があります。OPENAI 以外のモデルと環境の場合は、追加のキーやその他のパラメーターを指定する必要がある場合があります。手順については以下を参照してください。

※公式の Changing a Model 参照
https://github.com/Codium-ai/pr-agent/blob/main/Usage.md#changing-a-model


読んでいくと現状有効性の高い gpt-4-1106-preview はサポートされていることがわかります。
ただ、これを利用するには configuration.toml の model パラメータを修正する必要があります。

configuration.toml
https://github.com/Codium-ai/pr-agent/blob/main/pr_agent/settings/configuration.toml#L2



You may configure PR-Agent by adding environment variables under the env section corresponding to any configurable property in the configuration file.
Some examples:

PR-Agent を構成するには、構成ファイル内の構成可能なプロパティに対応する env セクションの下に環境変数を追加します。
いくつかの例:

env:
# … previous environment values
OPENAI.ORG: “
PR_REVIEWER.REQUIRE_TESTS_REVIEW: “false” # Disable tests review
PR_CODE_SUGGESTIONS.NUM_CODE_SUGGESTIONS: 6 # Increase number of code suggestions

※Run as a Github Action 参照
https://github.com/Codium-ai/pr-agent/blob/main/INSTALL.md#run-as-a-github-action


結論としては yaml に以下のように記載することで変更することができました。

name: PR-Agent
(中略)
        env:
        (中略) 
          # Modelを変更
          CONFIG.MODEL: gpt-4-1106-preview



まとめ


PR Agent は AI 関連のプロダクトの中で間違いなく上位に位置する強力なツールです。

特に、プロンプトの追記により、より精度の高いレビューを行うことができます。
PR_REVIEWER.EXTRA_INSTRUCTIONS
PR_DESCRIPTION.EXTRA_INSTRUCTIONS
PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS

モデルも、 OpenAI のモデルだけでなく、 HuggingFace にある独自のモデルを参照することができるなどの柔軟性があり、今後 GitHub Copilot との競合になる可能性が高いと思います。

宣伝


次世代システム研究室では、最新のテクノロジーを調査・検証しながら、インターネットにおける挑戦的なアプリケーション開発を行うアーキテクトを募集しています!
募集職種一覧 からご応募をお待ちしています!

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事