生成AIはコードレビューの夢を見るか? AIコードレビューを本格導入してみた話

はじめに

こんにちは、D-Marketing Academyのエンジニア責任者のttと申します。

今回CARTA Tech Blogに書かせていただくのも初めてのため、知らない人がほとんどだと思いますので、軽く弊社について紹介を。

D-Marketing Academy

D-Marketing Academyは2023年にCARTA HOLDINGSにジョインしたCARTAグループの事業会社です。ウェブマーケティングに関する動画を主軸に学習支援機能を提供するサービスを提供しています。

使用している主な技術スタックはAWS、PHP(Symfony)で、フロントエンドの一部はTypeScriptで書かれたReactなどを使用しています。

まだ出来てから3年目というのもありますが、CARTA HOLDINGの組織の中では多分断トツで人が少ないです。社員は自分も含めても数人となります。エンジニアは2024年5月現在はまだ自分一人で、ほぼ一人で開発から運用まで一通りの業務を行っています。

そろそろエンジニアも増やしたいなーと思っていたりもするので、弊社に興味がある方もそうではない方も、是非採用等に声をかけてもらえれば、と思いつつ・・・。

困っていること

エンジニアとして一人で働いていると、さまざまな困難に直面することがあります。

最近特に強く感じているのは、 コードレビューをしてくれる人がいない ということです。

コードレビューとは、自分が書いたコードを他の人に見てもらい、間違いや改善点を指摘してもらうことで、より品質の高いコードを書くための手法です。これは多くのチーム開発で一般的に行われています。

レビューをしてもらうために外部の力を借りてレビューをお願いすることもありますが、日常的な開発の中で自分のコードを他の人に見てもらうのは難しいのが現状です。

もちろん、自分で自分のコードを見直すセルフレビューも可能ですが、レビューの大きな利点である 客観的な視点での気づきや新たな学び を得ることはできません。

そこで、何か良い方法はないかと考えていたところ、「AIコードレビュー」 というものを知りました。

これは、OpenAIのGPT-4などの生成AIを使ってコードレビューを行うというものです。

「これは使えるかもしれない!」と感じ、実際に導入してみることにしました。

この記事では、このAIコードレビューが実際にどう役立ったか、そしてどれほどの効果があったかについて詳しくお話ししたいと思います。

AIコードレビューを導入してみた

AIコードレビューについても、既にいくつものOSSやサービスが既に公開されています。

複数のサービスを試していたのですが、最終的にPR-AgentというOSSをコードレビューツールとして導入することにしました。

github.com

選んだ理由として

  • OSSであり、AIコードレビューソフトウェアの中では一番スター数が多く、完成度も一番高いように見えた
  • 導入が簡単なこと
  • 開発が積極的に行われていること

などから、PR-Agentを選択しました。

PR-Agent は、Codium AI によって開発されているOSS(オープンソースソフトウェア)及びサービスです。OSS版はGitHubを使っていれば、GitHub Actionsを使用して簡単に導入することができます。

その他必要なものは、OpenAI APIのアクセストークンだけです。デフォルトではOpenAI GPT-4 Turboを使うように設定されており、そのままGPT-4の性能を活かすことができます。

アップデートも活発なので、盛り上がっているGPT-4oにも対応して使えるようになるはず。

追記: 発表当日にすぐ追加されました

設定は以下のような感じです。

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 }}
          github_action_config.auto_review: "true"
          github_action_config.auto_describe: "true"
          github_action_config.auto_improve: "true"
          pr_code_suggestions.commitable_code_suggestions: "true"
          pr_reviewer.extra_instructions: 'Please use Japanese in descriptions.'
          pr_description.extra_instructions: 'Please use Japanese in descriptions.'
          pr_code_suggestions.extra_instructions: 'Please use Japanese in descriptions.'

これを.github/workflows/pr-agent.ymlというファイルでコミットし、Actions Secret に OPENAI_KEY を追加してあげるとPull Requestを作成した時に自動的に動作するようになります。非常にお手軽ですよね。

この設定では、コードレビューをしてくれる以外にも、PRの概要の作成、変更ファイル説明の追加、GitHubラベルの付与、コード改善の提案といった機能を提供してくれます。

実際のレビュー

どんな感じでレビューしてくれているか、わかりやすいものを実際のPRから例として挙げてみます。本サービスはPHPを主軸としているので、PHPのコードを例にしています。

例1: バグの検出

このコードは打ち間違えでempty($data['ghosts']) && is_array($data['ghosts'])empty($data['ghosts'] && is_array($data['ghosts']))と書いてしまっています。

PHPの文法的にはエラーにならず、目視でも気づきにくいため見逃していたものをAIが検出してくれました。

これを多分人間で気づける人は少ないのでは無いでしょうか?

例2: パフォーマンスの問題

また、不具合だけでは無く、パフォーマンス観点のレビューもしてくれます。

これは単純なN+1問題が起きるパフォーマンスの良くないコードですが、AIがN+1問題を指摘してくれています。

(※N+1問題とは、データベースのクエリを1回のリクエストで複数回発行してしまうことにより、データベースへの負荷やレスポンスタイムの遅延を引き起こす問題のことです)

後は型の不一致やエラーハンドリングが不適切であると指摘してくれることも多いです。PHPは動的型付けなので、型の不一致を完全に防ぐことは難しいですが、AIが指摘してくれることで、早期発見ができるのは非常にありがたいです。

使ってみて実際どうなの?

既に正式に導入して1ヶ月程度が経ち、約10PRほどAIコードレビューを実行しつつ開発を続けてきました。その中での利点と欠点を以下にまとめてみました。

利点

  • OpenAI APIキーのみですぐ導入できる
  • レビューする速度が非常に速い(大体5分程度)
    • GPT-4oになってさらに早くなり、1,2分程度になりました!
  • レビュー精度に関しては内部的に使用している生成AIに依存する
  • 大きな規模のPRでも問題無くレビューしてくれる
  • コードレビュー上でAIに質問することも可能
  • PRレビュー以外でもいろんなドキュメントを自動的に作成してくれて便利

欠点

  • 1,2割くらいはあてにならない、全く意味を成さないレビューがある
    • これは使用している生成AIに左右されるため、今後誤りは減っていくと推測される
  • システム的な都合、ドメイン的な都合を理解することが難しい
    • これもRAG(生成AIを使用した検索機能)などを併用することによって改善される可能性はある
  • 物理的なコストがかかる(コードの規模にもよるが、1回あたり1ドル程度)

AIコードレビューは人間コードレビューを超えるか?

今のところは、一部は超えている所はありますが、完全に人間が不要になる、という判断にはならないであろう と思います。

AIコードレビューは、人間が見落とすようなミスを見つけ、よりよいコードの提案をしてくれているように見えることができる一方で、

自分のセルフレビュー目線だと「その変更がベストなの?」「何を言っているのかわからない」というようなレビューも少し見受けられます。

たまに意図と正反対の提案をすることもあり・・・そのためまだ何も考えずに、AIのレビューをそのまま採用することは危険かなと感じています。 まだAIに仕事を奪われなくて済みそうです。

ドメイン知識の問題

また人間が持つドメイン知識や、コードの背景にある意図を理解することが難しいという問題があります。

特に長く運用しているサービスになると、コードの背景にある意図が非常に重要になってきますので、その辺りは今のAIコードレビューでは難しいところがあると思います。

しかし、生成AIは日々進化しており、今後はこのような問題も少しずつ解決されていく可能性は高いです。

AIコードレビューが人間コードレビューを超えるところ

AIコードレビューの利点は、人間が行うよりも圧倒的な速さにあると思っています。 1つのPRを人間に依頼すると、数時間から場合によっては数日かかることもありますが、AIコードレビューは数分で終わります。

これはどんなに卓越したエンジニアであっても、勝てる人はまずいないと思います。

正直めちゃくちゃ大きな利点であり、まだ少ない人数で高速に開発を回しているフェーズの会社にとっては、この恩恵を受けることができるのは非常にありがたいです。

そのため、AIコードレビューは人間の代替ではなく、補助としての位置づけが今のところは適しているかなと思います。

今後、完全に人間の代替としてのAIコードレビューが実現される日が来るかもしれませんが、複雑な業務で利用できるようになるにはまだ時間がかかると思います。

おわりに

実際の開発ではAIのレビューを自分が確認して、意に沿っていればレビューを適用するという流れをしています。

セルフレビューに近いですが、レビュー自体はAIが行っているため、自分が気づかなかった部分や書き間違いなどを検出できており、コードレビューとしては充分に機能していると感じています。

実際、これによりリリースする時の精神的な負担の軽減、先ほど挙げたような早期のバグの発見やコードの品質向上など、多くのメリットがあります。

欠点も存在しますが、今後のAIの進化により改善されていくということを考えると、今後はAIによるコードレビューはますます普及していくのではないかと思います。

ということで、同じような課題感を持っている方は、是非AIコードレビューを導入してみてはいかがでしょうか?