駅奪取チームの id:kimkim0106 です。
駅奪取チームで Qodo Merge(旧:PR-Agent) を使ってみた感想の記事になります。
結論から言いますと、人間のレビューや作業をある程度代替できており、業務の効率化につながっていると感じました。
Qodo Merge とは
Qodo 社(旧:Codium-AI 社)が提供する、AI コードレビューツールです。
さまざまな LLM モデルを使ってコードレビューができるほか、GitHub や GitLab などの API を使用してプルリクエストにコメントをしてくれます。
導入背景
駅奪取チームは限られたエンジニアで開発と運用を行っており、コードレビューはチームメンバー間で分担して行っています。 しかし、チームメンバーの入れ替わりにより、コードレビューできる人が少なくなり、負荷が増大していました。
また、定期的にリードタイムを計測しているのですが、ファーストレビューの遅延によりリードタイムが伸び、ユーザへの価値提供が遅くなり始めていました。
そこで、コードレビューの負担軽減を図るために Qodo Merge を検証することになりました。
検証内容
以下の点を期待して検証を行いました。
- リードタイムの短縮
- コードレビュー完了までの時間を短縮することで改善を見込める
- 品質の向上
- コードレビューの見落とし等を防ぐ
- 不具合や障害を減らす
ただし、人間によるレビューを代替することは考えていません。 あくまで、AI による補助的なコードレビューを事前に実施し、レビュワーの負担を軽減することが目的です。
また、モデル変更によるレビュー精度の比較を行いました。 今回検証に用いたモデルは以下の 3 つです。
- OpenAI GPT-4o (OpenAI API)
- Anthropic Claude 3 Haiku (Amazon Bedrock)
- Anthropic Claude 3.5 Sonnet (Amazon Bedrock)
設定内容
プルリクエスト作成時に GitHub Actions で自動実行するように設定しました。
設定方法は公式ドキュメントの通りですが、リポジトリに IP アドレスによるアクセス制限があるため社内のサーバにて Self-hosted Runner で動かしています。
レビュー結果を日本語で出力させるため、以下のような Extra Instructions を設定しています。
PR_REVIEWER.EXTRA_INSTRUCTIONS: "日本語で記述してください。" PR_DESCRIPTION.EXTRA_INSTRUCTIONS: "日本語で記述してください。" PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS: "日本語で記述してください。" PR_IMPROVE_COMPONENT.EXTRA_INSTRUCTIONS: "日本語で記述してください。"
また、初期設定だと、レビューしやすさなどのラベルが付与されるのですが、チームが独自に設定しているラベルの視認性が低下するため、無効にしています。 無効にしてもプルリクエスト内で確認できるため、とくに問題はありません。
PR_REVIEWER.ENABLE_REVIEW_LABELS_SECURITY: false PR_REVIEWER.ENABLE_REVIEW_LABELS_EFFORT: false PR_DESCRIPTION.PUBLISH_LABELS: false
検証結果
コードレビューの負担軽減に貢献しており、導入する価値があると感じました。 一方で課題もあり、人間のコードレビューを完全に代替することは難しそうです。
以下に実際に使ってみた PR のスクショを貼っておきます。 なお、使用しているモデルは Claude 3.5 Sonnet です。
このような差分のある PR を Qodo Merge にかけてみます。
PR を作成すると、ユーザーが記載した内容の下に Description や Changes walkthrough を生成してくれます。 プロンプトを設定しているので日本語で表示されます。
また、PR Reviewer Guide として、レビューしやすさなどの情報を出してくれます。
PR Code Suggestions では、変更の提案についてスコアを含めて行ってくれます。
総評
- 良かった点
- 一般的な内容に対する指摘がありがたい
- 例外をキャッチしているか
- コードの可読性の向上させる改善
- プルリクエストの変更内容のサマリーを日本語で出してくれる
- GitHub Copilot pull request summaries は英語しかサポートされていない
- 一般的な内容に対する指摘がありがたい
- 悪かった点
- たまに致命的なハルシネーションがある
- 変更内容と逆のことをサマリーを出してくる
- 参考にできないレビューを返すこともある
- 差分しか見てくれないので、別モジュールまで実装を追いかけてくれない
- たまに致命的なハルシネーションがある
モデルによるレビュー精度
モデルによって、レビュー精度は左右されることもわかりました。
チームメンバーによる評価が高かった順は以下のとおりです。
Claude 3.5 Sonnet > GPT-4o > Claude 3 Haiku
コスト
プルリクエスト 1 件あたりのコストを算出しました。 Claude 3.5 Sonnet は GPT-4o よりも安く、レビュー精度が高いため、コストパフォーマンスに優れていました。
モデル名 | コスト(ドル/件) |
---|---|
GPT-4o | $ 0.3 |
Claude 3.5 Sonnet | $ 0.15 |
Claude 3 Haiku | $ 0.1 |
チームメンバーへのヒアリング
チームメンバーにもヒアリングを行いました。
検証を行った順番で掲載しています。
GPT-4o
良かった点
- プルリクエストの変更内容のサマリーを日本語で出してくれる
- 日本語なので、読みやすい
- GitHub Copilot にも似たような機能があるが、英語でしか出せない
- 変更内容の説明は PR-Agent に任せ、意図のみ記載する、という形で棲み分けができて、効率が良くなった
- 日本語なので、読みやすい
- 一般的な注意すべき点をレビュー・サジェストしてくれる
- 例外をキャッチしているか
- こう書くと行数が減る・ネストが深くならない・再利用性が高まるなど
- レビューだけでなく、suggestion のコードを書いてくれるので助かる
- 見る目が一つ増えた
- 特に人間が読み落としそうな浅くて些細な箇所はありがたかった
悪かった点
- 変更内容のサマリーに、たまに致命的なハルシネーションがあるので、100%信頼はできなさそう
- 変更内容と逆のことを出してきたことがあった
- 一般的な内容に対する指摘はありがたい
- 誰向けのどういった機能か、といった文脈で不要と判断した実装はいろいろある
- けど、それは本当に不要か?といったことを考えさせてくれる
- 参考にできない指摘もちらほらある
- 間違っている理由を考えることで見える視点もあるだろうから、それはそれでよいけどノイズにはなる
- どうしても 2, 3 個は suggest したいのか、無理くりなものもあるような
- 差分しか見てくれないので、別モジュールまで実装を追いかけてくれない
- 「正しく実装されているか確認してください」みたいなレビューしかしてくれない
- 追いかけて返り値とかまでチェックしてくれるとうれしかったが、そこまでは厳しそう
Claude 3 Haiku
良かった点
- とくになし
悪かった点
- 「Respond in Japanese」とか「日本語で記述してください。」をプロンプトに入れても日本語で答えてくれない
- 冗長になる書き方を提案したり、使わない変数をテンプレートに渡す提案をしたり、あまり有益でない提案が多かった
- そもそも差分すら認識できておらず、レビューとして成立しない
Claude 3.5 Sonnet
良かった点
- GPT-4o に比べ、ちょうどいい粒度の description を生成してくれる
- ハルシネーションも少ないので、概要の手書きを PR-Agent に置き換えることができ、時短になった
- 誤った提案は他のモデルよりは少ない印象
- typo を指摘してくれて助かった
- description が比較的正確だと思った
悪かった点
- あまりない
- 存在しないコードを作ってそれに対してレビューをする?ことがあって混乱した
ネクストアクション
Qodo Merge 導入によって、業務効率化の効果が出ているかを検証したいと思っています。 直近のリードタイムは改善して来ているのですが、Qodo Merge 導入によるものなのかはまだ明確ではありません。
また、さらに新しいモデルに入れ替えて検証したいと思っています。 LLM の評価指標には色々とありますが、アップグレード後の Claude 3.5 Sonnet や OpenAI o1-mini あたりが、現在使っている Claude 3.5 Sonnet よりも高かったので、次はこれらを試してみたいです。
モバファクでは中途採用・新卒採用ともに絶賛募集中です。
会社の情報については、モバファクブログでも発信しています。
技術好きな方、モバファクにご興味をお持ちの方は、ぜひご応募ください!
・モバファクブログ:https://corpcomn.mobilefactory.jp/
・採用サイト:https://recruit.mobilefactory.jp/