フォーム読み込み中
共通プラットフォーム開発本部の安澤です。
生成AIの進化が目まぐるしい今日、新しいモデルの追加や古いモデルの廃止だけでなく、新機能の公開や制約事項の追加、価格体系の変更など、とにかく多岐に渡る情報が毎日のように更新されています。特にOpenAIやGeminiのような注目モデルのリリース情報は、毎日のように新しい発表があります。このように情報が頻繁に更新される中で、効率的に情報を把握し対応することが求められます。しかし、これらの膨大な情報を人手で確認するには限界があり、対応が遅れてしまうと、技術の進化に置いていかれてしまいます。
今回は、特定のWebページの更新情報を毎日自動でチェックし、差分の検出、AIによる要約、そしてSlackへの通知という一連のフローを実現したシステムについて、その実装方法の概要を詳細に紹介します。また、このシステムを運用して1年が経ちましたので効果についても紹介します。
本システムの導入前は、更新箇所の手動特定や日々の確認作業が煩雑で、重要な情報をリアルタイムに把握できないことが課題でした。しかし、システム導入後は更新の見逃しリスクが大幅に低減され、確認業務にかかる時間も削減されるなど、業務効率が大きく向上しました。
以下では具体的な改善内容や数値的な効果と併せてシステムの概要を詳しく解説します。
私が所属するチームは Azure OpenAI を活用したチャットツールの開発を任されており、新しいモデルや API バージョンのリリース、モデルの使用可能リージョンが追加されるなど、さまざまな最新情報をウォッチしています。お客さまよりも早くキャッチして、結果としてより良いサービスを適時に提供できるように努めています。しかし、これらの情報は更新が早く、その量も多いため、リアルタイム性と正確性を追求していると難しさが有りました。
このような背景から、今回導入したシステムを開発することになりました。
導入前は、確認対象のWebページに更新フィード機能がなく、最新情報をリアルタイムで把握することが困難で、新しいモデルのリリースや廃止の更新が発生しても、その情報を見逃すこともしばしばありました。また、情報の多くは他部署からの連絡や、たまたま見かけたドキュメントに頼っていたため、キャッチアップが属人化していました。
ドキュメントの変更点は不明瞭なため、一部の変更を検知するためにも、全体を読み直す必要がありました。この方法では重要な情報を見逃しやすく、確認に多くの時間と労力がかかります。そのため、全ての更新情報を網羅することは困難でした。
私たちのチームでは、前述の業務課題を解決するために、以下の自動化システムを導入しました。Azure OpenAIの公式ドキュメントはMicrosoft Learn上で公開されています。Microsoft LearnはGitHubで管理されているため(詳細)、Azure OpenAIの更新情報を監視するだけであればGitHubのコミットログを追跡することで差分内容を把握できます。
しかし、生成AIの急速な進化に伴い Azure OpenAI 以外のサービスについても監視する必要性が生じることを見越し、より汎用的にWebページを監視できる仕組みを構築することを目指しました。
システム概要と動作フローは以下のようになっています。
GitHub Actionsを用いて、月曜日から金曜日までの毎日午前9時に致傷のWebページをスクレイピングするタスクを実行するように設定します。
MicrosoftとGoogleの公式ドキュメントのページをBeautifulSoupまたはSeleniumを使用してスクレイピングします。
GitHub上で見やすくするため、スクレイピングしたページはHTMLからMarkdownに変換します。Markdownへの変換にはmarkdownifyを使用しました。
スクレイピングするページはconfig.jsonファイルで設定します。以下のサンプルを参照してください。
urlにはスクレイピングしたいページのリストを、selectorには取得したいHTML要素のclassを指定します。
{
"microsoft-learn": {
"urls": [
"https://learn.microsoft.com/en-us/azure/ai-services/openai/whats-new",
"https://learn.microsoft.com/en-us/azure/ai-services/openai/api-version-deprecation"
],
"selector": "content"
},
"google-gemini": {
"urls": ["https://ai.google.dev/gemini-api/docs/models/gemini"],
"selector": "devsite-article-body"
}
}
スクレイピングした結果を保存し、masterブランチに記録された前回時点のドキュメント情報と比較して差分があった場合にはプルリクエスト(以下、PR)が自動で作成されるようにしました。
PRはMarkdownのテンプレートを作成し、手動で行う必要のあるタスクを明記します。
PRの作成に関しては、マージされない状態のPRが「存在するか」、「存在しないか」で処理を分岐させています。
PRのマージが更新検知当日中にできない場合があり、既存のPRが存在するときもmasterと差分比較をし、差分があれば差分検知側のブランチに変更を適用し直す(コミットが上書きされる)と、変更が発生した日付を特定するのが難しくなっていました。また、毎回masterから変更を検出する実装では、実行のたびに同じ変更が再度検出され、昨日検出した差分が今日も通知されるという問題がありました。このため、実行するブランチを判定し、差分を実行日ごとに記録することで、詳細な履歴管理を実現しました。
前回の実行時に作成されたPRがあるかを確認し、実行時にPRがmasterブランチにマージされていない場合、そのPRのブランチ(update-document)から差分を検出します。その後、検出した差分はPRを上書きせず、コミットとして記録します。
- name: Check for existing pull request
env:
GH_TOKEN: ${{ github.token }}
run: |
pr=$(gh pr list --head update-document --json number --jq '.[].number')
if [ -z "$pr" ]; then
echo "pr_exists=false" >> $GITHUB_ENV
else
echo "pr_exists=true" >> $GITHUB_ENV
echo "pr_number=$pr" >> $GITHUB_ENV
fi
- name: Determine branch to use
run: |
git fetch origin
if [ "$pr_exists" = "true" ]; then
git checkout -B update-document origin/update-document
echo "use update-document branch"
else
git checkout master
echo "use master branch"
fi
python -m app
- id: date
run: echo "date=$(date +%Y-%m-%d)" >> $GITHUB_OUTPUT
- name: Check for changes in git diff
if: env.pr_exists == 'true'
id: git_diff
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git add .
if git diff --cached --quiet; then
echo "result=no_changes" >> $GITHUB_OUTPUT
else
echo "result=changes" >> $GITHUB_OUTPUT
fi
- if: steps.git_diff.outputs.result == 'changes'
run: |
git commit -m "Update Document - ${{ steps.date.outputs.date }}"
git push origin HEAD
以前より、作業担当者が作成するPR内でPR-Agentを使用し、差分の要約を生成するケースが多く見られました。PR-Agentを参考に、今回のシステムでもAzure Open AIを活用してドキュメントの差分を要約する機能を実装することにしました。また、当チームは生成AIを扱う部署であるため、社内でのAI活用を行いたいという点もありました。
PR-Agentに関しては、別記事 GitHub Copilotを使わずに生成AIを活用してセキュアに開発効率化した話 を参照してください。
ページ全体と検出した差分を、Azure Open AIに送信します。変更前の部分には文章の先頭に - を、変更後の部分には + を付けた形式にします。
送信内容から更新内容を下記PR-Agentを参考に作成したTomlファイルを元に箇条書きで要約させます。
監視対象のドキュメントは英語なので、プロンプトで要約を日本語で出力するように指定しています。
[document_diff_summary_prompt]
system="""You are a language model designed to summarize changes in technical documents.
Your task is to provide a concise summary of the changes made in the document, with a focus on additions (lines starting with '+'). The output should be in Japanese.
- Focus on the new content (lines starting with '+').
- Provide a summary of the changes in Japanese.
- Make sure the summary is accurate, clear, and concise.
- Include any important details or technical terms that were introduced in the changes.
- Do not add any unrelated information.
Make sure the summary adheres to the following format:
- Use bullet points.
- Make sure each point starts with a hyphen (-).
- the summary is written in natural Japanese and suitable for technical documentation.
"""
user="""The Document Diff:
======
{{ diff|trim }}
======
Note that lines in the diff body are prefixed with a symbol that represents the type of change: '-' for deletions, '+' for additions.
The Summary (in Japanese):
"""
ここまでで通知に必要な情報がすべて揃ったので、Slackに通知していきます。
通知する内容は、検出した差分とAIで生成した要約、作成されたPRのURLとしました。
SlackのWorkflowsで指定したチャネルに通知されるように設定します。
通知を確認した作業担当者はPRの差分内容を確認し、重要なトピックを関係者に広報した後、PRをマージします。
作成されたPRのURLの通知に関しては、作業担当者も一緒にメンションするようにしています。
以前は作業担当者が明確に決まっておらず、Slack 通知に気づいた人が自主的に対応するという運用指針でした。しかし実際に運用してみると、各自に他のタスクがあり時間を取れないことや、チーム全員が作業方法を把握していないという状況から、特定の人しか作業をしていないという状況に陥りました。結果として、作業が当日中に行えず、広報が遅延することがしばしば発生していました。
そこで、担当者をローテーションで明確に管理し、各人にタスクを割り当てることで作業の効率化を図りました。
通知する担当者を決定します。まず、「最後にupdate-documentブランチからmasterブランチへマージした担当者」を取得し、担当者リストから通知する担当者を決定します。
- name: Get previously merged
run: |
git fetch origin master --depth=10
prev_assign=$(git log origin/master --merges --grep=update-document -n 1 --pretty=format:'%an')
echo "$prev_assign"
echo "PREV_ASSIGN_USER=$prev_assign" >> $GITHUB_ENV
作成されたPRのURLをSlackに通知する際に、決定した担当者をメンションします
担当者リストはGitHub Actionsのvariablesを利用して以下のフォーマットで管理しています。
{
"担当者AのGithubのアカウント名": "担当者AのSlackで登録しているメールアドレス",
"担当者BのGithubのアカウント名": "担当者BのSlackで登録しているメールアドレス",
...
}
チームにヒアリングを行い、システム導入により以下のような改善結果が得られたことがわかりました。
差分の把握が容易になり、情報の見落としが減った
他部門からの指摘を待たず能動的に情報を取得・提供できるようになった
要約が通知されるようになり、担当日以外でも概要を把握しやすくなった
要約の精度が向上し、実際の更新内容との差異確認が容易になった
担当者がローテーションすることでメンバー全員が作業を行えるようになり、業務負担が均等に分散された
更新を検出した当日に作業に着手するようになり、更新内容が小さいうちに迅速に対応できるようになった
初期システム導入時に約1時間かかっていた作業が、改修後のシステムでは約30分程度に短縮され、45%の時間削減を実現した
初期開発時のシステムでは関連部署への情報周知に3〜5日(平均3.5日)を要していたが、現在は即日対応が可能になった
これらの定性的および定量的な効果から、システム導入とその後の改修がチームの生産性と効率性に大きく寄与していることが確認できました。
この記事では、公式ドキュメントの更新情報を自動でスクレイピングし、差分を検出、AIによる要約、そしてSlackへの通知という一連のフローを実現したシステムについて、その実装方法の概要と効果を紹介しました。
このシステムにより、生成AIの進化が目まぐるしい今日において、最新情報を迅速かつ正確に把握し、対応するためのツールとしてチームに大いに貢献しています。開発者としてこの点を非常に喜ばしく感じています。
以前は、複数のSlackチャネルへの更新情報の周知を手動で行っていましたが、現在ではSlackのワークフローによって自動化され、さらに効率が向上しました。
今後も手動で行っている作業を減らし、さらなる業務効率化を目指していきたいと考えています!
最後までお読みいただきありがとうございました。
条件に該当するページがございません