Slack & AWS Service & pr-agent & AzureOpenAIを使ってPRをAIにレビューさせてみた
はじめに
こんにちは。株式会社divxのエンジニア、大久保です。
本記事では、OSSのpr-agentを使ってAIレビューを自動化した際の経験について詳しくご紹介します。
システム全体の流れとしては、SlackのスラッシュコマンドがAPI Gatewayを経由し、Lambda関数をトリガーします。その後、Azure OpenAI、EC2を介してGitHubにレビューを送信する仕組みになっています。
私が所属する開発チームでは複数のアプリケーションを管理していますが、GitHub Actionsで各アプリケーションごとに設定を行うと管理が複雑化します。そのため、リポジトリごとに設定するのではなく、グローバルにAIレビューを行えるような構成にしました。
このシステムにより、レビューの効率が大幅に向上し、コード品質の向上に大いに役立っています。
システム構成
システム構成は上記のとおりとなっております。
以下の流れで処理が進行します:
1. Slackのスラッシュコマンド
Slackのスラッシュコマンドを使用してAPI Gatewayにリクエストを送信します。例えば、 /reviewというコマンドを用いてリクエストをトリガーすることができます。このコマンドにより、開発者はSlack内から直接コードレビューのリクエストを行うことができます。
2. API Gateway
API GatewayはSlackから送信されたリクエストをLambda frontendにルーティングします。API Gatewayは複数のサービスを統合し、外部との接点を提供する役割を果たします。
3. Lambda1
リクエストのバリデーションを行い、API Gatewayにレスポンスを返却します。また、問題がなければLambda Backendにリクエストを送信します。これにより、サーバーの管理を行うことなく、スケーラブルなAPIを迅速に構築することが可能です。
4. Lambda2
Lambda frontendからリクエストを受け取り、EC2サーバーに接続を行います。ここでは、必要なロール権限を与えて、EC2を操作できるように設定します。
5. EC2サーバー
Lambda backendから受け取ったリクエストを処理して、Azure OpenAIにリクエストを送信します。
6. Azure OpenAI
EC2から送信されてきたリクエストを処理して、レビュー内容の生成を行います。Azure OpenAIの特性を活かし、高度な自然言語処理を行います。
7. GitHub
EC2がpr-agentの機能を使用して、GitHubにレビュー内容を送信します。このプロセスを通じて、AIによる自動レビューが実現します。
これにより、プロセス全体がシームレスに進行し、高品質なコードレビューが自動化されます。
Slack Slash Commandとは
SlackのSlash Commands(スラッシュコマンド)は、ユーザーがSlackのメッセージ入力フィールドから特定のコマンドを実行するための機能です。通常、スラッシュ(/)で始まるコマンドを入力すると、そのコマンドが特定のアクションをトリガーします。
具体例として、/reviewコマンドを作成し、Request URLにAPI Gatewayで作成したURLを貼り付けます。このコマンドにより、開発者はSlack内から直接、GIthubプルリクエストのレビューをリクエストできます。ここでは例としてexampleというSlashCommandを作成します。
API Gatewayとは
API Gatewayは、マイクロサービスアーキテクチャやサーバーレスアプリケーションにおいて重要な役割を果たすコンポーネントであり、クライアントからのリクエストを適切なFrontendやBackendサービスにルーティングするための中継役を担います。API Gatewayを使用することで、Slackのメッセージ送信機能をマイクロサービスとして実装し、リアルタイムでのコミュニケーションを実現します。
サーバーレスアーキテクチャの一環として、API Gatewayを通じてAWS Lambda関数をトリガーし、動的なバックエンド処理を実行します。この連携により、サーバーの管理を行うことなく、スケーラブルなAPIを迅速に構築できます。
リソースとは
リソース(Resource)はAPIで扱うエンドポイントやパスのことを指します。例えば、RESTful APIにおける各URLパスやエンドポイントはそれぞれリソースとして定義されます。リソースは階層構造を持つことができ、親リソースと子リソースの関係で表現されます。
リソースを作成してから、統合リクエストの設定をします。
統合リクエストとは
API Gatewayの統合リクエスト(Integration Request)は、API GatewayとLambda(今回のケース)との間でデータをやり取りするための設定です。簡単に言えば、クライアントから受け取ったリクエストを適切な形式に変換し、サービスに転送するための設定を行う部分です。
ステージとは
ステージ(Stage)はAPIの異なる公開バージョンや環境を管理するための機能です。APIのデプロイ先として、開発(Development)、ステージング(Staging)、本番環境(Production)などのステージを設定することが一般的です。各ステージは独自のURLエンドポイントを持ち、独立して管理できます。
ここで作成したURLを先ほど作成したSlash CommandのURLに設定しています。
Lambdaとは
Lambda(ラムダ)は、AWS(Amazon Web Services)が提供するサーバーレスコンピューティングサービスの一つで、ユーザーがインフラストラクチャを管理することなくコードを実行できる環境を提供します。具体的には、AWS Lambdaを利用すると、コードをトリガー(イベント)に応じて自動的に実行することができます。
Lambda1の役割
API Gatewayからのリクエストのバリデーションをして、問題ないリクエストならAPI Gatewayにレスポンスを返却します。
また、問題なければLambda Backendにリクエストを送ります。
今回のバリデーションは下記に問題ないか検証しています。
- Verification Token
- parameter, argument
- pr-agentで処理するGitHubのURL
Lambda2の役割
Lambda Backendは下記の役割を担っています。
- EC2の開始
- EC2との接続
- EC2の停止
適切なロール権限を与えて、EC2を操作できるようにしておきます。
ロール権限とは
AWSのロール(Role)と権限(Permission)は、AWS Identity and Access Management(IAM)を使用して、AWSリソースへのアクセスを制御するための機能です。ロールは、特定のAWSリソースにアクセスする権限をまとめたもので、ユーザーではなくエンティティ(例: EC2インスタンス、Lambda関数など)に付与されます。
EC2とは
Amazon Elastic Compute Cloud(EC2)は、Amazon Web Services(AWS)が提供するスケーラブルな仮想サーバー(インスタンス)を提供するクラウドコンピューティングサービスです。EC2を利用することで、物理的なハードウェアを用意することなく、必要に応じてコンピューティングリソースを迅速にスピンアップ(起動)およびスピンダウン(停止)することができます。これにより、開発者や企業はリソースを効率的に管理・運用でき、コストを最適化することが可能です。
PR-Agentとは
GitHub のプルリクエスト(PR)に対して自動レビューを行う AI ツールです。
pr-agentはローカルにクローンしたり、GitLab Webhookや、GitHubActionsで実行できます。今回はEC2にpr-agentをクローンしてソースから実行するようにしました。
pr-agentはデフォルトでChatGPT用に設計されていますが、Azure OpenAIにも対応しているため、カスタマイズが必要です。
クローンしてソースから実行
pr-agentのリポジトリをクローンします:
/pr-agentフォルダーに移動、仮想環境にインストールします。
シークレット テンプレート ファイルをコピーし、AzureOpenAI キーと GitHub ユーザー トークンを入力します。
スクリプトを実行します。
このpr_urlはslack Slash Commandから送信したurlです。improve以外にもコマンドは用意されていますが、今回はimproveを採用しました。
Azure OpenAIとは
Azure OpenAIは、マイクロソフトのクラウドプラットフォームであるAzure上で、OpenAIが開発した高度な人工知能(AI)技術を利用できるサービスです。このサービスを通じて、GPT(Generative Pre-trained Transformer)シリーズをはじめとする先進的な自然言語処理(NLP)モデルをAzure環境内で活用できます。このように、AzureとOpenAIの統合により、AIの力を利用したアプリケーションの開発やデプロイが容易になります。
最終的な実行結果はこちらになります。
実行後のGitHub
リクエストが成功すると、レビューの改善提案が作成されます。
実行後は次のような結果が得られます。ここに示した例では、4つの提案が表示されています。(以下、日本語で翻訳しています)
重要性のスコアが高いほど、リファクタリングが推奨される可能性が高まります。
トグルを開くと、添付画像のような具体的なアドバイスが表示されます。
最終的には、開発者がAIの提案を吟味し、最適な判断を下す能力が求められます。AIはあくまで補助的な存在であるため、開発者自身が状況を深く理解し、知識や経験に基づいた決定を行うことが重要です。AIの提案が完全ではないことを理解し、必要に応じて人間の視点を追加することで、コードレビューの質を高めることができます。
おわりに
GitHub Actionsを活用したワークフローの自動化については多くの情報が存在しますが、EC2インスタンス上にアプリをクローンする手順について詳しく説明されたものは見つけることができませんでしたので、本記事が皆様の作業効率向上に貢献できれば幸いです。
お悩みご相談ください
参考記事
https://pr-agent-docs.codium.ai/installation/locally/
https://api.slack.com/interactivity/slash-commands