GitHub PRの「何が変わったか」ではなく「なぜ変えたか」を要約させるLLMプロンプト
はじめに
GitHub Copilotや各種AIツールのおかげで、コードを書く速度は劇的に上がりました。しかし、「他人が書いたPRを読む時間」 や 「自分の変更理由をドキュメントに残す時間」 は依然としてボトルネックです。
そこで、GitHubのPR差分をLLM(Claude 3.5 Sonnet)に投げて自動要約するツールを自作しました。 その開発過程で、「単にdiffを投げても、役に立たない要約しか出てこない」 という壁にぶつかりました。
本記事では、エンジニアのレビューに耐えうる「意味のある要約」を出力させるためのプロンプトエンジニアリングの知見を共有します。
失敗例:単純な要約プロンプト
最初は以下のようなシンプルなプロンプトを使っていました。
以下のコードの変更点を要約してください。
[diffデータ]
出力結果(Bad)
src/auth.ts の15行目が変更されました。expiresIn 変数が 3600 から 86400 に変更されました。package.json に dayjs が追加されました。
これでは、「diffを見れば分かること」 を日本語に直しただけです。 レビュワーが知りたいのは「変数が変わった事実」ではなく、「トークンの有効期限が1時間から24時間に伸びた」という 意図(Intent) です。
改善のアプローチ
AIに「コードリーダー」ではなく「シニアエンジニア」として振る舞わせることで、抽象度の高い解釈を引き出します。
1. ペルソナと役割の定義
システムプロンプトで明確に役割を与えます。
あなたは経験豊富なシニアソフトウェアエンジニアです。
あなたの役割は、同僚のエンジニアが行ったコード変更(PR)をレビューし、
その「変更の意図」と「影響範囲」を簡潔にドキュメント化することです。
2. 「やってはいけないこと」の明示
AIは具体的すぎる説明をしがちなので、制約をかけます。
## 制約事項
- ファイルごとの逐語的な説明は避けてください。
- 行番号や変数名の羅列は禁止です。
- 「変更されました」で終わらせず、「〜するために変更しました」という形式を優先してください。
- 変更による「ユーザーへの影響」や「破壊的変更の有無」に言及してください。
3. Few-shot プロンプティング(成功例の提示)
これが最も効果的です。「理想的な出力」の例をAIに見せます。
## 出力例
【悪い例】
- UserController.tsを追加しました。
- getUserメソッドを実装しました。
【良い例】
- ユーザー情報取得APIを新規実装
- 認証済みユーザー自身のプロフィールのみ取得可能な設計に変更
- レスポンス速度向上のため、Redisキャッシュ層を導入
完成したプロンプト(実例)
最終的に、現在運用しているSaaS「Diff Note」で使用しているプロンプトの構成です。
あなたはシニアエンジニアです。以下のGitHub PRのdiffを読み、
多忙なレビュワーのために「3分で理解できるサマリー」を作成してください。
## 入力データ
Title: {{pr_title}}
Description: {{pr_body}}
Diff: {{diff_content}}
## 出力フォーマット
1. 🎯 **主な変更点**(3点以内、箇条書き)
2. 💥 **破壊的変更の有無**(あれば具体的に、なければ「なし」)
3. 🔍 **技術的な注目ポイント**(パフォーマンス、セキュリティ等)
## 注意点
- 実装詳細よりも「ビジネスロジックの変更」や「設計意図」を重視すること。
- 日本語で出力すること。
出力結果(Good)
主な変更点
このように、「なぜやったか(UX改善、バンドルサイズ削減)」 や 「どこを見るべきか(E2Eテスト)」 といった、エンジニア視点の洞察が含まれるようになりました。
実装の工夫:トークン節約
diffをそのまま投げるとトークン数が膨大になるため、前処理として以下を行っています。
- ロックファイルの除外:
package-lock.jsonやyarn.lockは無視する。 - SVG/画像ファイルの除外: テキスト解析に不要なため。
- 文字数制限: 1ファイルあたりのdiffが長すぎる場合は「(省略)」としてヘッダーのみ渡す。
おわりに
「AIにコードを読ませる」タスクは、プロンプト次第で出力の品質が天と地ほど変わります。 ポイントは 「diffの翻訳者」ではなく「コードの解釈者」 としてAIを定義することです。
この技術を使って、PRドキュメント自動生成サービスを個人開発しています。もし興味があれば覗いてみてください。
#紹介 この記事は以下のプロダクトを作成する過程で生まれました。ぜひ確認してみてください! https://diff-note.vercel.app/