生成AIを活用した広告レポート自動化による工数削減
株式会社CyberACEの開発チームにて、広告レポート作成に生成AIを活用し工数削減に取り組んだ事例です。
現場の課題感から、Dify+Python APIを組み合わせた仕組みを構築し、レポート自動化を実現した流れをまとめました。
生成AIを使った広告レポート自動化による工数削減
1. なぜ始めたのか
広告運用チームの作業内容を精査したところ、広告レポートの作成に時間を取られていることが判明し「時間のかかる業務を自動化し、生産性を向上させる」プロジェクトが開始しました。
具体的には、従来は以下のような手作業が発生していました。
-
データ収集とレポート作成: アシスタントが複数の社内システムから実績データを取得し、手動でレポートを作成後、担当者へ展開。
-
内容の確認と文章作成: 担当者がレポートの内容をチェックし、クライアント向けの文章を作成。
-
最終化と送付: 担当者が完成したレポートをPDFに変換し、Slackでクライアントへ送付。
2. どのように解決したか
既存の広告運用システムはAWSを利用しており、そのシステムに機能追加する形で実装を進めました。
下記のようなイメージで数値レポートを動的に生成し、生成AIで要約を作成しました。

実装フロー
アプローチのポイント
-
生成AIモデル(Dify API経由で呼び出し)
- 広告運用実績データからレポートの要約を作成するワークフローをDifyで作成
- 広告知識のあるビジネスメンバーがプロンプトの調整をGUI上でできるように選定しました。
- DifyはCyberAgentグループ内でセルフホスティングされているため、Dify自体のバージョンアップなどの基盤運用作業をCyberACEの開発チームで実施する必要がない点も選定のポイントになりました。
- 広告運用実績データからレポートの要約を作成するワークフローをDifyで作成
-
レポート生成API(チーム開発、python-pptx利用)
- PowerPointテンプレート+JSONを渡して動的にPPTファイルを生成、PDF変換まで実施
- レポートの要約文作成は生成AIで行いますが、PowerPointファイルの生成自体はPython (python-pptx) で実装したAPIを利用しています。
生成AIに直接PowerPointファイルを作らせることもできますが、レイアウトの崩れや意図しないフォーマット変更など、出力が不安定になる懸念がありました。そこで、テンプレートにデータを流し込む確実な方法を採用し、常に同じ品質のレポートを保証できるようにしました。
-
Slack配信まで自動化
- Slackへの配信は、レビューと修正のフローも考慮しています。
- 社内での最終確認: 完成したPDFを自動で社内チャンネルに送付します。
- クライアントへの送付: 内容に問題がなければ、そのままクライアントへ提出します。
- 修正対応: 修正が必要な場合は、元となるPowerPointファイルを出力し、担当者が簡単に手直しできるようにしています。
- Slackへの配信は、レビューと修正のフローも考慮しています。
3. 成果と工夫
工数削減効果
従来1社あたり85分かかっていた作業を 約10分 に短縮できました。
| 工程 | 以前 | 現在 |
|---|---|---|
| 雛形作成・展開 | アシスタントによる作業(20分) | 自動化(0分) |
| 文面作成・修正 | 担当者による作業(60分) | 担当者が確認・修正のみ(約10分) |
| PDF変換・展開 | 担当者による作業(5分) | 自動化(0分) |
| 合計 | 85分/1社 | 10分/1社 |
工夫した点
-
リリースフローの整備
- Difyのワークフローについても開発・検証・本番の3環境を用意
- リグレッションチェックを通して安定稼働を確保
-
レポート生成の仕組み
-
レポート生成APIは、python-pptx を利用して構築しました。事前に用意したPowerPointテンプレート内のオブジェクト名(
shape.name)とJSONのnameフィールドをマッチングさせて置換していくシンプルな仕組みです。これにより、AIによる出力の揺らぎを抑えつつ、常に定型のフォーマットでレポートを生成できます。# テキストを扱うshapeオブジェクトを処理するイメージ def process_text(shape: BaseShape, replace_text: str) -> None: # コメントの場合はテキストフレームの書式を維持しながらテキストを置き換える if shape.name == "dynamic_comment" or shape.name == "required_dynamic_comment": format_text_frame(shape, replace_text, "游ゴシック Regular (本文)") else: escaped_pattern = re.escape(shape.text) new_text = re.sub(escaped_pattern, replace_text, shape.text) paragraphs = shape.text_frame.paragraphs replace_paragraph_text(paragraphs[0], new_text)
-
-
チームでの分業
- DifyのGUIは非エンジニアでも直感的にプロンプトを編集できるため、ビジネスメンバー自身が広告の専門知識を直接プロンプトに反映し、高速なPDCAを回すことができました。
4. 他の方法との比較
生成AIで直接レポートを吐き出す方式もありますが「要約=生成AI」「レポート生成=Python API」と役割を分担しました。
AIの柔軟さを活かしつつ出力形式の一貫性も確保できた点が良かったと考えています。
5. 今後の展望
要約の品質についてはまだ調整が必要な部分もあるためKPI解釈の精度向上をしたり、LLM-as-a-Judge (生成された文章の品質を、別のLLMに評価させる手法)等を取り入れ、要約品質を自動チェックする仕組みなども導入していきたいと考えています。
まとめ
今回の取り組みで、手作業だったレポート作成は10分で完了するようになりました。
まだ改善の余地はありますが、時間のかかる作業を自動化し、「人が考えるべき時間」を少しだけ生み出せたと感じています。
株式会社CyberACEのテックブログです。開発チームが日々の業務で得た技術的な学びや知見を発信します。主な技術スタック: TypeScript, Go, React, Next.js, AWS, GCP cyberace.co.jp
Discussion