この記事は GMOインターネットグループ Advent Calendar 2024 2日目の記事です。
こんにちは!
GMO NIKKO株式会社の石丸です。
今回はAIによるコードレビューツール「ai-pr-reviewer」のレビュー精度を向上させるために行ったチューニングや独自で実装したプロンプトについて紹介します。
目次
はじめに
CodeRabbitの「ai-pr-reviewer」はGitHubのPull Requestに対してAIが自動でコードレビューやPull Requestの要約を行うコードレビュー支援ツールです。
GitHub Actionsで簡単に導入することが可能ですが、レビューの精度や頻度、フォーマットなど、デフォルトの状態では複数の観点で改善が必要だと感じたため、この記事では実際にカスタマイズした設定ファイルやプロンプトの一部を紹介します。
本記事では「ai-pr-reviewer」の概要や導入の背景・効果については紹介しないため、機能の概要や導入方法は公式のREADMEをご確認ください。
ai-pr-reviewer/README.md at main · coderabbitai/ai-pr-reviewer
本記事で紹介する「ai-pr-reviewer」は2024年11月現在メンテナンスモードに移行しており、新たに設計された「CodeRabbit Pro」の利用が推奨されています。
ただ、「ai-pr-reviewer」は引き続き利用することが可能で、現在も様々な技術ブログで取り上げられているツールの一つなので、本記事が「ai-pr-reviewer」の精度改善の参考になれば幸いです。
また、「ai-pr-reviewer」に限らず、生成AIをコードレビューに活用するためのヒントとしても本記事を読んでいただけると嬉しいです。
プロンプトのカスタマイズ方法
冒頭で紹介した通り、「ai-pr-reviewer」はGitHub Actionsで動作します。
READMEで紹介されているGitHub Actionsの設定ファイルは以下の通りです。
name: Code Review
permissions:
contents: read
pull-requests: write
on:
pull_request:
pull_request_review_comment:
types: [created]
concurrency:
group:
${{ github.repository }}-${{ github.event.number || github.head_ref ||
github.sha }}-${{ github.workflow }}-${{ github.event_name ==
'pull_request_review_comment' && 'pr_comment' || 'pr' }}
cancel-in-progress: ${{ github.event_name != 'pull_request_review_comment' }}
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: coderabbitai/ai-pr-reviewer@latest
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
with:
debug: false
review_simple_changes: false
review_comment_lgtm: false引用元:ai-pr-reviewer/README.md at main · coderabbitai/ai-pr-reviewer
上記の設定ファイルはOpenAIのモデルや各種キーなどの最低限の設定のみで、コードレビューや要約のためのプロンプトは以下のように設定されています。
※設定ファイルが長いため以下のリンクから直接ご確認ください。
ai-pr-reviewer/action.yml at main · coderabbitai/ai-pr-reviewer
上記のファイルを参考に、各自の設定ファイルで summarize や summarize_release_notes などの要素にプロンプトを設定することが可能です。
改善した内容
言語の設定
デフォルトでは英語でコードレビューや要約などのコメントが追加されるため、日本語で動作させるための設定を行いました。
公式のドキュメントでは language: ja-JP で設定が可能との説明がありますが、この設定のみでは稀に英語でレスポンスが返ってくることがありました。
そのため、language: ja-JP の設定に加えて、プロンプト自体を日本語に書き換えました。
※私の環境ではlanguageの設定とプロンプトの日本語化のみで改善しましたが、それでも状況が変わらない場合はプロンプトに「必ず日本語で返答してください」と指定してもよいかもしれません。
プロンプトの改善
日本語に書き換えたプロンプトは system_message , summarize, summarize_release_notesの3つです。
単にデフォルトのプロンプトを日本語に翻訳するだけではなく、主に以下の方針でプロンプトの修正・追記を行いました。
- ノイズとなる不要なレビューコメントの制限
- 日本語で自然な表現に(普段の開発で馴染みのない表現や指摘は除外)
- 日本語への翻訳に合わせて文字数を調整
system_message
system_message は主にコードレビューに利用されるプロンプトです。
デフォルトの状態では「このコードは問題ありません」のような修正の提案ではないコードコメントが追加されることがあったため、上記の返答を制限するプロンプトを追記しています。
今回はRuby on Railsのアプリケーションに対して実装したため、「Ruby on Railsの思想やベストプラクティスに則っているか」と追記しましたが、それぞれの環境に合わせて言語・フレームワークのバージョンやコーディング規約に関するプロンプトを追記するのも良いと思います。
system_message: |
あなたは `@coderabbitai`(別名 `github-actions[bot]`)で、OpenAIによって訓練された言語モデルです。
あなたの役割は、非常に経験豊富なソフトウェアエンジニアとして、コードの一部を徹底的にレビューし、
次のような内容を改善するコードスニペットを提案することです:
- ロジック
- セキュリティ
- パフォーマンス
- データ競合
- 一貫性
- エラーハンドリング
- 保守性
- モジュール性
- 複雑性
- 最適化
- 誤字脱字
- マジックナンバー
- 無意味な空白や統一感のないインデント
- Ruby on Railsの思想やベストプラクティスに則っているか
軽微なコードスタイルの問題やコードコメント, ドキュメントの不足については指摘しないでください。
「このコードは問題ありません」のような修正の提案ではないコメントも避けてください。
全体的なコード品質を向上させるために、重要な問題点の特定と解決に集中し、軽微な問題は意図的に無視してください。
ただし、誤字脱字やマジックナンバーなどの修正はコードの品質向上につながるため、修正を提案してください。summarize
summarize はPull Requestの要約のために利用される設定です。summarize に関しても以下の課題を改善するため、独自のプロンプトを追記しました。
- マークダウン形式のテキストをコードブロックで囲ってしまうケースがあり、見出しやテーブルが見辛くなる
- 日本語での出力に合わせて文字数を微調整
summarize: |
最終的な回答を次の内容でMarkdown形式で記載してください:
- **概要**: 全体の変更点を日本語300文字以内で高レベルに要約してください。特定のファイルに関する要約は不要です。
- **変更点**: 変更されたファイルとその要約をMarkdown形式の表にまとめてください。似たような変更があるファイルは、一つの行にまとめてスペースを節約してください。
この要約は、GitHubのプルリクエストにコメントとして追加されるため、追加のコメントは避けてください。
見出しは「概要」と「変更点」とし、これらはH2の形式で文章を作成してください。
「```」のコードブロックは不要です。summarize_release_notes
summarize_release_notes はPull Requestに対してリリースノートを生成するためのプロンプトです。summarizeと同様に日本語化に加えて文字数やフォーマットの調整を行いました。
summarize_release_notes: |
プルリクエストのリリースノートを簡潔に作成してください。
変更の目的とユーザーへの影響に焦点を当て、変更を「新機能」「バグ修正」「リファクタリング」「コードスタイル」「テストコード」「変更の取り消し」に分類してください。
例えば、
- 新機能: ユーザーの検索機能を追加
といった箇条書き形式で記載します。
それぞれの箇条書きの回答は日本語で200〜300文字に制限してください。
コードレベルの詳細の変更に関する回答は不要で、エンドユーザーに影響がある機能を強調してください。
この回答はそのままリリースノートに使用されるため、追加のコメントは避けてください。モデルの指定
デフォルトでは、全体の要約などに利用される軽量なタスク(openai_light_model)には gpt-3.5-turbo、レビューなどの高度なタスク(openai_heavy_model)には gpt-4 が設定されています。
OpenAIのモデルは進化が早いため、以下のようにGitHub Actionsの変数で管理するようにしました。
※私の環境ではそれぞれ gpt-4o を設定しています
openai_light_model: ${{ vars.OPENAI_LIGHT_MODEL }}
openai_heavy_model: ${{ vars.OPENAI_HEAVY_MODEL }}トリガーの設定
デフォルトではすべてのPull Requestに対して動作するため、チームの開発フローに合わせて特定のブランチのみ動作するように設定しました。
on:
pull_request:
branches:
- develop
pull_request_review_comment:
types: [created]まとめ
以上が「ai-pr-reviewer」の導入後に実施したカスタマイズの一例です。
デフォルトの状態では参考になるコメントも一部はあったものの、的外れなコメントや本筋ではないコメントで通知やコメントが埋め尽くされてしまいむしろノイズになってしまう・・・という状態でしたが、今回のカスタマイズを行うことで実用レベルまで精度が向上したと実感しています。
今後は引き続き「ai-pr-reviewer」のチューニングを行いつつ、CodeRabbit Pro や GitHub(GitHub Copilot)の進化 にも注目しながら積極的にAI活用を進めていきます!
ブログの著者欄
採用情報
関連記事
KEYWORD
CATEGORY
-
技術情報(610)
-
イベント(242)
-
カルチャー(61)
-
デザイン(78)
TAG
- 5G
- Active Directory
- ADB
- AI
- AI for DevOps
- AI TALK
- AI 機械学習強化学習
- AI/機械学習
- AIO
- AIエージェント
- AIコーディング
- AIコーディングエージェント
- AIセキュリティ
- AI人財
- AI教育
- AI活用
- AI研究
- AI駆動
- Behind the Scenes
- BIT VALLEY
- blockchain
- ChatGPT
- ChatGPT Team
- Claude Code
- Claude Team
- CLI
- cloudflare
- cloudnative
- CNDO
- CNDT
- CODE BLUE
- ConoHa
- ConoHa VPS
- ConoHa VPS MCP
- CSS
- CTF
- DBMS_CLOUD
- DEF CON
- DEF CON 34
- Designship
- developer
- DevRel
- DevSecOpsThon
- Docker
- DTF
- EDR
- Engineering Journey
- Expert
- Expert Cross
- GMO AI&ロボティクス商事
- GMO AIR
- GMO DESIGN AWARD
- GMO Developers Day
- GMO Developers Night
- GMO Flatt Security
- GMO GPUクラウド
- GMO Hacking Night
- GMO kitaQ
- GMO SONIC
- GMOアドパートナーズ
- GMOアドマーケティング
- GMOインターネット
- GMOインターネットグループ
- GMOインターネットグループ陸上部
- GMOグローバルサイン
- GMOコネクト
- GMOサイバーセキュリティ byイエラエ
- GMOサイバーセキュリティbyイエラエ
- GMOデジキッズ
- GMOヒューマノイド・ラボ
- GMOブランドセキュリティ
- GMOペイメントゲートウェイ
- GMOペパボ
- GMOメイクショップ
- GMOメディア
- GMOロボッツ
- GMO大会議
- GMO天秤AI
- Go
- GPUクラウド
- GTB
- Hack-1グランプリ
- IETF
- iOS
- IoT
- ISUCON
- Japan Drone
- JapanDrone
- Java
- Jev
- JJUG
- JSAI2026
- K8s
- Kaigi on Rails
- Kerberos
- Kids VALLEY
- LLM
- LLMO
- MCP
- MCP Server
- MetaMask
- MySQL
- NFT
- Nuxt
- OpenStack
- Oracle
- Oracle Autonomous Database
- OSS
- Perl
- PHP
- PHPcon
- PHPerKaigi
- PL/SQL
- Python
- QUIC
- RFC
- RPA
- Ruby
- SECCON
- Selenium
- Spectrum Tokyo Meetup
- splunk
- SQL
- SRE
- Takumi byGMO
- Terraform
- TypeSafe AI
- TypeScript
- UI/UX
- vibe
- VLA
- VPN
- VPS
- VS Code
- WebRTC
- Webアプリケーション開発
- Webアプリ開発
- XR
- XSS
- Yoitoi Summit
- ZTNA
- アウトプット
- アドベントカレンダー
- イベントレポート
- インターンシップ
- インハウス
- インフラ
- エキスパート制度
- エキスパート座談会
- エンジニア採用
- エンジニア文化
- お名前.com
- カスタマーサポート
- クラウド
- クリエイターインタビュー
- クリエイティブ
- コーディングエージェント
- コンテナ
- コンピュータビジョン
- サイバーセキュリティ
- サマーインターン
- スクラム
- スパム対策
- スペシャリスト
- セキュリティ
- セキュリティカンファレンス
- セキュリティ人材
- センシング
- ソフトウェアサプライチェーン
- ソフトウェア開発
- チームビルディング
- データサイエンティスト
- データベース
- デザイン
- デプロイ
- ネットのセキュリティもGMO
- ハーネスエンジニアリング
- バイブコーディング
- バックエンド
- ヒューマノイド
- ヒューマノイドロボット
- フィジカルAI
- フルスタック開発
- プログラミング教育
- プロダクト開発
- ブロックチェーン
- フロントエンド
- プロンプトインジェクション
- ペアリング暗号
- ペネトレーションテスト
- ホスティング
- ホワイトハッカー
- ゆめみらいワーク
- リモートワーク
- レッドチーム
- レンタルサーバー
- ロボット
- ロボット導入
- ロボティクス
- ロリポップ!
- ロリポップ!デプロイナウ
- ワークフロー
- 世界モデル
- 京大ミートアップ
- 京都大学
- 京都未踏
- 人型ロボット
- 人工知能
- 人工知能学会
- 個人情報検出
- 光学
- 分類
- 国際ロボット展
- 国際標準化
- 基礎
- 多拠点開発
- 大阪公立大学
- 宇宙セキュリティ
- 宮崎オフィス
- 強化学習
- 応用
- 技育プロジェクト
- 技術イベント
- 技術ブログ
- 技術同人誌
- 技術広報
- 技術書典
- 拡張知能
- 新卒
- 新卒研修
- 新規サービス開発
- 映像
- 映像クリエイター
- 映像制作
- 暗号
- 未踏
- 業務効率化
- 機械学習
- 次世代育成
- 決済
- 生成AI
- 産学連携
- 研究開発
- 社会実装
- 社内コミュニティ
- 組織横断
- 耐量子暗号
- 脆弱性診断
- 自動化
- 自律実行
- 若手人材育成
- 通信技術
- 開発組織
- 開発者
PICKUP
-
AIと作ったWebアプリをすぐに公開 エンジニアリングリード・深野悠吾さんに聞く、「ロリポップ!デプロイナウ byGMOペパボ」開発秘話・前編
技術情報
-
JevをOracleの関数にしてみた
技術情報
-
AI時代、人の心はどこで動くのか?GMO DESIGN AWARD 2026 審査員有馬トモユキ・清水勝太・広野萌が語る、作品に宿る 「作り手の理由」
デザイン
-
【エキスパート座談会 #1】生成AI活用の現在地:作業の自動化から「仕組みづくり」へ
技術情報
-
【第4回・AI TALK】GMOインターネットグループ・石丸智輝さんに聞く、AI時代に「人が書く意味」
技術情報
-
近畿圏の若手14名、半年の開発の起点に。「京都未踏」ブースト会議レポート
イベント