見出し画像

AIレビューツールのPR-Agentを導入してみた

この記事はnote株式会社 Advent Calendar 2023の23日目の記事です。

こんにちは、あたまがきんに君です。今日は珍しく、ITエンジニアとしての記事を書こうと思います。トピックは、弊チームが抱えていたPRレビューの課題感とその解決手段としてPR-Agentを導入した話をします。

PRレビューの課題

レビュー待ちのPRがリリースのボトルネックにならないようにしたい

私が作成したレビュー待ちのPRは一番多い時で23個溜まっていました。自分以外のチームメンバーが2人で、リリース承認までに必要なレビュワーが2人だったので、チーム総動員でPRのレビューをしなければなりませんでした。その結果、レビュワーのリソースが不足してしまいどんどんPRが溜まってしまいました。

PRが溜まってしまうということは、リードタイムやデプロイ頻度に負の影響を与えているので、開発生産性の観点からは好ましくない状態になります。

また、遠い昔のPRにレビューコメントをいただいたとしても、思い出すことにも労力が必要になるため、個人としても生産性が下がってしまいます。

ケアレスミスによって発生するコミュニケーションを減らしたい

レビュワーがせっかく時間を割いてくれたのに、こちら側のケアレスミス(テストの追加し忘れや、文言のミスやtypoなど)で差し戻されて、再度レビューをお願いすることがたまにありました。

気をつけていれば必要のないコミュニケーションですが、セルフレビューだけではケアレスミスは無くしきれないと思います。また、こういったケアレスミスの指摘に関しては、レビュワー側も気を遣ったりするので、コミュニケーションコストが意外と高かったりします。

PRのディスクリプションを書く時間を削減したい

弊チームはそれぞれが異なる領域の機能開発をしていたので、レビュー負荷が高かったです。そのため、少しでもレビュワーのリソースを削減するためにPRをできるだけ細かく分割しつつ、ディスクリプションを丁寧に書く必要がありました。

そうなると、PRのディスクリプションを書く時間が増えるので、なんとかこの時間を減らすことができれば良いなと思っていました。

そこでPR-Agentの導入を検討

PR-Agentとは

Codium AI によってオープンソースで開発されている 大規模言語モデル を使ったプルリクエストを便利にするためのAIツールです。PRの自動レビューやレビューコメント追加、ディスクリプションの作成、コード提案などの様々なタスクが実行できます。

要するに、今までは0次レビュー(セルフレビュー)までは自分でできましたが、1次レビューまで自分で完結できるようになります。

これを提案して、リリース承認に必要なレビュワーの人数を1人減らせるところまで持っていけたら最高だなと思っていました。

実際に手元で試してみてAIに指摘されたこと

  • formの方がstringよりemailの方が適切だよ

  • エラーハンドリングがあった方が良いよ

  • エラーメッセージ等はハードコードするんじゃなくて設定ファイルから読んだ方がいいよ

  • コメントアウトに誤字があります

  • 支払い方法の表示ロジックが複雑になっています。リファクタした方がいいかも。

  • 正規表現が用いられているけどちゃんとテストしたの?

思ったよりちゃんと指摘してくれるし、どんなに情けないミスを指摘されても、機械に言われるとノーダメージってところが良いですね。

PR-Agentの導入について

こちらの記事を参考にGithub Actionsのself-hosted-runnerで動かすことにしました。

上記の記事ではPR作成時に実行されるようですが、弊社ではトリガーはPrReview, PrDescribe, PrImproveというラベルを付与したタイミングにしました。またレビューやディスクリプションの作成、コード提案が完了したときは、付与したラベルを削除して、PrReviewDone, PrDescribeDone, PrImproveDoneというラベルを付与するようにしました。

jobs:
  pr_agent_review:
    runs-on: self-hosted
    if: contains(github.event.pull_request.labels.*.name, 'PrReview')
    permissions:
      issues: write
      pull-requests: write
      contents: write
    name: Run AI source code review by PR-Agent
    steps:

      (中身は省略)

      - name: Remove PrReview label
        if: always()
        uses: actions-ecosystem/action-remove-labels@v1
        with:
          labels: PrReview

      - name: Add PrReviewDone label if succeeded
        if: success()
        uses: actions-ecosystem/action-add-labels@v1
        with:
          labels: PrReviewDone

PR-Agent導入における検討事項

PR-Agentに限らず、生成AI系のツールを導入する上で考慮しなければならない点がいくつかあります。

AIに読み込ませる情報(今回はソースコードやブランチの情報)が情報セキュリティのガイドラインにおいてどのレベルの秘匿情報になるか

  • 弊社で定められているガイドラインでソースコードが何情報に当たるかをチェック

  • 生成AI系のツール導入のガイドラインがあったので目を通す

  • 情報セキュリティ部門に確認

OpenAIのAPI Keyをどのように管理するかや、万が一漏れた場合の対処をどうするか

  • Azure OpenAIを利用すればアクセス制限やRate Limitが設定できる

  • 万が一漏れても、github actionsのself-hosted-runnerのIPでアクセス制限をかけるようにするから問題ない

費用対効果

  • 1ヶ月あたりのPR数と1PRあたりに何回リクエストするか

 -> ここはgithubの指定期間にマージされたPRを検索すれば出ます

  • 1回のリクエストあたりのトークンサイズはどれくらいか

 -> PR-AgentはMaxのトークンサイズが設定できます

  • どんなうまみがあるか

-> リリース承認に必要なレビュワーを1人減らすという方針で考えていたので、レビュワーのリソースを半減できると考えたらだいぶお得

今後の課題

まずは使ってもらって、声を集めて一つずつ改修していくことをやりたいです。

今見えている範囲で言えば、設定ファイルからカスタム指示を出せるので、プロンプトをカスタマイズしていきたいのと、PRのディスクリプションのアウトプットフォーマットを弊社のPRディスクリプション作成のガイドラインにフィットさせたいなと思っています。

あとは、ドメインや弊社の実装ルールを加味した上でのレビューは返ってこないので、究極は弊社のコードを全て学習した上でレビューを行ってくれるAIレビュワーを作りたいですね。

最後に

実は、PR-Agentを導入しようとしていたタイミングでちょうど、リリース承認に必要なレビュワー数を1人にしようという方針になったのでPR-Agentの導入とは関係なく私の目的は達成されました。

ただ、レビュワーの責任が増えてしまったり、見落としがあったり、ケアレスミスによって発生するコミュニケーションを減らせたりすると思うので、そういった部分のカバーにはなると思います。

皆さんもぜひ導入を検討してみてください。

よろしければサポートお願いいたします。いただいたサポートはクリエイターとしての活動費に使わせていただきます!