背景
GitHub 公式が公開した actions/ai-inference
アクションで、ワークフロー内での AI モデルの利用が簡単になった。PR の変更内容を要約するワークフローを実装してみる。
GitHub 公式が公開した actions/ai-inference
アクションで、ワークフロー内での AI モデルの利用が簡単になった。PR の変更内容を要約するワークフローを実装してみる。
actions/ai-inference
アクションを利用したPR要約ワークフロー:
# .github/workflows/ai-summary.yml
name: Summarize PR
on:
pull_request:
types: [labeled] # 'labeled' イベントをトリガーとする
jobs:
summary:
# 'ai-summary' ラベルが付与された場合のみ実行
if: github.event.label.name == 'ai-summary'
runs-on: ubuntu-latest
# 必要な権限を設定
permissions:
pull-requests: write # PR へのコメント書き込み
models: read # AI モデルへのアクセス
contents: read # リポジトリコンテンツの読み取り
steps:
# リポジトリのコードをチェックアウト
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # 全履歴を取得して diff を正確に計算
# PR の差分を取得
- name: Fetch PR diff
id: fetch_diff
run: |
# ベースブランチとヘッドコミットの参照を取得
BASE_REF="origin/${{ github.event.pull_request.base.ref }}"
HEAD_SHA="${{ github.event.pull_request.head.sha }}"
echo "Base ref: ${BASE_REF}"
echo "Head SHA: ${HEAD_SHA}"
# ベースブランチとヘッドブランチの情報をフェッチ
git fetch origin ${{ github.event.pull_request.base.ref }}
git fetch origin ${{ github.event.pull_request.head.ref }}
# git diff コマンドで変更ファイルリストとステータスを取得
echo "Running git diff --name-status..."
CHANGED_FILES=$(git diff --name-status ${BASE_REF}...${HEAD_SHA})
if [ $? -ne 0 ]; then
echo "Error: git diff command failed."
exit 1
fi
echo "${CHANGED_FILES}"
# 取得した差分情報をステップ出力 'files' として設定
echo "Setting files output..."
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "files<<$EOF" >> $GITHUB_OUTPUT
echo "${CHANGED_FILES}" >> $GITHUB_OUTPUT
echo "$EOF" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # GitHub API アクセス用トークン
# AI 推論を実行
- name: Run AI inference
id: inference
uses: actions/ai-inference@v1
with:
max-tokens: 500 # 生成する最大トークン数 (後述の考察を参照)
prompt: |
PRの差分を分析し、**必ず下記の指定フォーマットに従い概要を日本語で生成してください。**
**全体で300トークンを目安に、各項目は最も重要な点に絞って簡潔に記述してください。**
```フォーマット
## PRレビュー概要
### 主な目的
{diffから推測される、この変更の**最も重要な目的やゴール**を1〜2文で記述}
### 範囲
{変更が加えられた**主要なファイル種別や機能領域**を簡潔に列挙}
### 影響範囲
{この変更によって特に注意すべき**影響(システム動作、UX、他機能等)**を1〜2点で記述}
```
```分析対象のPR Diff
${{ steps.fetch_diff.outputs.files }} # 前のステップで取得した差分情報を埋め込む
```
# PR にコメントを投稿
- name: Comment
uses: marocchino/sticky-pull-request-comment@v2
with:
header: ai-summary-comment # コメントを識別するためのヘッダー
message: ${{ steps.inference.outputs.response }} # AI が生成した要約
ラベル付与をトリガとして、PR差分を取得し、AIモデルで要約を生成、結果をPRコメントとして投稿する一連の処理を自動化する。
PR へのラベル付与 (pull_request
イベントの labeled
タイプ) をトリガとする。
トリガを labeled
イベントに限定することで、不要な AI 実行とトークン消費を抑制する。開発者が必要と判断したタイミングで ai-summary
ラベルを付与する運用が効果的だ。
summary
ジョブは、ai-summary
ラベルが付与された場合のみ実行される (if: github.event.label.name == 'ai-summary'
)。 実行に必要な権限(permissions
)を以下に設定する。
pull-requests: write
- PRへのコメント書き込みmodels: read
- AIモデルへのアクセスcontents: read
- リポジトリの読み取りリポジトリのチェックアウトactions/checkout@v4
でリポジトリをチェックアウト。fetch-depth: 0
を指定して全履歴を取得し、後続の git diff
コマンドが正確な差分を計算できるようにする。
PR差分の取得git diff --name-status
コマンドを実行し、PR のベースブランチとヘッドコミットの間の差分情報を取得する。--name-status
オプションにより、具体的にどのファイルが追加(A)
、変更(M)
、削除(D)
されたかという情報のみを取得する。
理想的には PR の完全なコード差分(Unified Diff 形式など)を AI に与えたいところだが、差分量が大きい場合に actions/ai-inference
アクションが「予期せぬエラー」を発生させる。あくまで「要約」を得るという目的から、現状ではファイル名と変更ステータスのみを入力情報として渡す実装としている。
取得した差分情報は、ステップ出力 files
に設定し、後続の AI 推論ステップのプロンプトに渡す。出力例:
A .github/workflows/ci-build.yml
D docs/old-feature-guide.md
D src/legacy/utils.js
M package-lock.json
M package.json
M src/components/UserProfile.jsx
M src/styles/variables.css
AI推論の実行actions/ai-inference@v1
アクションを使用して AI が推論し、PR の要約を生成する。
このアクションは内部的に GitHub Models を利用するが、GitHub Models は現在、学習・実験・概念実証(PoC)向けの提供である (Responsible use of GitHub Models 参照)。本番環境での利用には注意が必要である。
サンプルコードでは生成される応答の最大トークン数を max-tokens: 500
で指定している。この値は、プロンプト内で指示した目安(300トークン)に対して十分な余裕を持たせている。
上記の処理を実装したGitHub Actionsのワークフロー定義:
# .github/workflows/ai-summary.yml
name: Summarize PR
on:
pull_request:
types: [labeled] # 'labeled' イベントをトリガーとする
jobs:
summary:
# 'ai-summary' ラベルが付与された場合のみ実行
if: github.event.label.name == 'ai-summary'
runs-on: ubuntu-latest
# 必要な権限を設定
permissions:
pull-requests: write # PR へのコメント書き込み
models: read # AI モデルへのアクセス
contents: read # リポジトリコンテンツの読み取り
steps:
# リポジトリのコードをチェックアウト
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # 全履歴を取得して diff を正確に計算
# PR の差分を取得
- name: Fetch PR diff
id: fetch_diff
run: |
# ベースブランチとヘッドコミットの参照を取得
BASE_REF="origin/${{ github.event.pull_request.base.ref }}"
HEAD_SHA="${{ github.event.pull_request.head.sha }}"
echo "Base ref: ${BASE_REF}"
echo "Head SHA: ${HEAD_SHA}"
# ベースブランチとヘッドブランチの情報をフェッチ
git fetch origin ${{ github.event.pull_request.base.ref }}
git fetch origin ${{ github.event.pull_request.head.ref }}
# git diff コマンドで変更ファイルリストとステータスを取得
echo "Running git diff --name-status..."
CHANGED_FILES=$(git diff --name-status ${BASE_REF}...${HEAD_SHA})
if [ $? -ne 0 ]; then
echo "Error: git diff command failed."
exit 1
fi
echo "${CHANGED_FILES}"
# 取得した差分情報をステップ出力 'files' として設定
echo "Setting files output..."
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "files<<$EOF" >> $GITHUB_OUTPUT
echo "${CHANGED_FILES}" >> $GITHUB_OUTPUT
echo "$EOF" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # GitHub API アクセス用トークン
# AI 推論を実行
- name: Run AI inference
id: inference
uses: actions/ai-inference@v1
with:
max-tokens: 500 # 生成する最大トークン数 (後述の考察を参照)
prompt: |
PRの差分を分析し、**必ず下記の指定フォーマットに従い概要を日本語で生成してください。**
**全体で300トークンを目安に、各項目は最も重要な点に絞って簡潔に記述してください。**
```フォーマット
## PRレビュー概要
### 主な目的
{diffから推測される、この変更の**最も重要な目的やゴール**を1〜2文で記述}
### 範囲
{変更が加えられた**主要なファイル種別や機能領域**を簡潔に列挙}
### 影響範囲
{この変更によって特に注意すべき**影響(システム動作、UX、他機能等)**を1〜2点で記述}
```
```分析対象のPR Diff
${{ steps.fetch_diff.outputs.files }} # 前のステップで取得した差分情報を埋め込む
```
# PR にコメントを投稿
- name: Comment
uses: marocchino/sticky-pull-request-comment@v2
with:
header: ai-summary-comment # コメントを識別するためのヘッダー
message: ${{ steps.inference.outputs.response }} # AI が生成した要約
上記ワークフローによって PR に投稿されるコメントの例。これは、ファイル削除、設定変更、スタイル改善、ワークフロー追加を含む PR に対して生成された要約コメントである。
## PRレビュー概要
### 主な目的
この変更の主な目的は、リポジトリ内の不要ファイルを整理し、依存関係や設定ファイルを更新することで、プロジェクト全体の構成を改善することです。
### 範囲
- **ファイル削除**: 不要となったドキュメントファイルや古いコンポーネントファイルが削除されました。
- **設定変更**: パッケージ管理ファイル (`package.json`, `lockファイル`) やビルド設定が更新されました。
- **コード改善**: UIコンポーネントのスタイルや関連するカスタムフックが修正・改善されました。
- **新規ファイル**: CI/CDプロセスに関連する新しいワークフロー定義ファイル (`.github/workflows/`) が追加されました。
### 影響範囲
- **UI/UX**: スタイルやコンポーネントの変更により、一部画面の表示や挙動が変わる可能性があります。
- **開発プロセス**: 新しいワークフローの追加により、ビルドやデプロイのプロセスに影響が出る可能性があります。
要約コメントはレビュアーが PR の概要をすばやく把握するのに使える。特に大規模な変更を含む PR の場合、どこに注目すべきかが分かる。
actions/ai-inference
で、GitHub Actions ワークフロー内で AI モデルを利用した PR 要約機能を構築した。ai-summary
ラベルを付与するだけで要約が自動生成されるため、レビュアーの負担軽減やレビュープロセスの効率化につながる。
Copilot コード レビューもPRに概要(Overview)をコメントで残してくれる。今回作成したactions/ai-inference
を利用したPR要約機能と比較しておく。
Copilot | actions/ai-inference |
---|---|
![]() | ![]() |