AI技術の急速な進化により、AIエージェントに「バナー広告を作って」と依頼するだけで、自律的に素材を集めて完成品を出力する仕組みが実用段階に入っています。
本記事では、AWS環境からGCPへのキーレス認証(Workload Identity Federation)を利用してバナーを自動生成する、2つのアプローチ(test2a.py と test2b.py)のコードと、実際に生成されたバナー画像のクオリティを徹底的に比較します。どちらの手法がより優れているのか、実装コードと出力結果の両面から検証しましょう。
1. 2つのアプローチの概要と共通点
今回比較する test2a.py と test2b.py は、どちらも以下の優れた共通機能を持っています。
- GCPキーレス認証(Workload Identity Federation)の採用:サービスアカウントの秘密鍵ファイル(JSON)を使わず、AWSの一時的な認証情報(IAMロール)を利用してGCP(Vertex AI / BigQuery)に安全にアクセスします。
- MCP(Model Context Protocol)の活用:Google AnalyticsやBigQueryといった外部ツールを、標準化されたプロトコル経由でAIエージェントから操作可能にしています。
- 自律的なバナー生成:人間が与えるのは「バナーの目的(テキスト)」のみで、AIが自律的にデザインを構成します。
しかし、「バナーをどのように描画・合成するか」という核心部分において、両者は全く異なるアーキテクチャを採用しています。
2. コード構造と設計アプローチの比較
【test2a.py】LLMによる企画 + PILによる泥臭い合成
test2a.py では、LLMの役割を「企画(キャッチコピーの策定と画像検索クエリの抽出)」に限定しています。実際の描画処理は、Pythonの画像処理ライブラリである PIL (Pillow) を使ってプログラミングで泥臭く実装しています。
処理の流れ
Gemini 2.5 Flashにバナーの目的を投げ、キャッチコピーと画像検索用の英語クエリをJSONで返させる。- 検索されたWeb上の画像素材をダウンロードする。
- PILを使用し、画像を背景として配置。さらにフォント読み込み、日本語の文字折り返しロジック(
_wrap関数)、影付け処理などの描画ロジックを自前で実行する。
メリットとデメリット
- メリット:フォントサイズや折り返し位置、ロゴの配置などをコード側でミリ単位で制御できる。日本語が不自然に化けるリスクが非常に低い。
- デメリット:テキストの折り返しや配置のために膨大なコード(
_wrapや_render_bannerなど)を記述する必要があり、実装が著しく面倒。また、デザインが「写真の上に文字を載せただけ」のシンプルなものになりがち。
【test2b.py】最新マルチモーダルモデルによるダイレクト画像生成
test2b.py では、Vertex AIの最新画像生成・マルチモーダルモデル(gemini-3.1-flash-image-preview / 通称:Nano Banana)を採用しています。画像内に日本語テキストを埋め込む高度な処理も含めて、すべてをLLM(モデル)側へ丸投げします。
処理の流れ
google-genaiSDKを利用し、Web検索(Google Search Grounding)を有効にしたLLMを呼び出す。- LLM自身が最新のトレンドや素材を自律的に検索する。
response_modalities=["TEXT", "IMAGE"]を設定し、LLMに直接「バナー画像(バイナリ)」と「デザインメモ(テキスト)」を同時に出力させる。- 受け取った画像バイトデータをローカルに保存する。
メリットとデメリット
- メリット:PILを使った面倒な描画ロジックや文字折り返しロジックが一切不要。コード量が極めてシンプル。さらに、プロのデザイナーが作成したかのような次元の違うハイクオリティなバナーが手に入る。
- デメリット:モデルの生成コストがやや高くなることと、稀に文字に不自然な歪みやスペルミスが生じる可能性がある(ただし、最新のGemini 3.1世代ではこの問題が劇的に改善されています)。
3. 生成されたバナー結果の比較
実際に2つのスクリプトを実行して出力されたバナーを見てみましょう。その差は一目瞭然です。
test2a.py の生成結果
test2a.py では、指定された画像素材の上にプログラムでテキストを合成しています。
(画像0: test2a.pyで生成されたバナー。スニーカーを履いた人物の足元写真の上に、白文字で「駆け出す夏、足元から。軽やかステップで、新しい季節を掴もう!」とシンプルに合成されている。)
非常にすっきりとしていますが、良くも悪くも「プログラマーがコードで機械的に合成したバナー」という印象を拭えません。デザイン的な華やかさや、目を引くキャンペーン感は薄いと言えます。
test2b.py の生成結果
一方、test2b.py で最新モデル(Nano Banana)が直接出力したバナーがこちらです。
(画像1: test2b.pyで生成されたバナー。水しぶきや波のエフェクト、近未来的なスニーカーの立体画像が配置され、「夏の新作スニーカー発売告知」「夏を、駆け抜けろ。」「MODEL A / MODEL B」の価格表示、発売日や店舗・オンライン表記、オレンジ色の「詳細はこちら」ボタンまで網羅された、プロ並みのグラフィックデザインバナー。)
文字の美しさ、レイアウトのダイナミックさ、配色、エフェクトのクオリティなど、どれをとってもプロのWebデザイナーが数時間かけて作ったレベルに達しています。これがプログラムの泥臭い描画処理なしで、LLMへのテキスト指示だけで1枚絵として出力されたという点は、驚異的と言うほかありません。
4. どちらが優れているか? 結論
結論として、デザインのクオリティと開発効率の観点から、test2b.py の「LLMダイレクト画像生成アプローチ」が圧倒的に優れています。
| 評価軸 | test2a.py (ロジック合成型) | test2b.py (AI直生型) | 勝者 |
|---|---|---|---|
| デザインの美しさ | 普通(テンプレート的) | 極めて高い(プロ級) | test2b |
| コードの簡潔さ | 複雑(数百行の描画処理) | 非常にシンプル(API呼出のみ) | test2b |
| 日本語テキストの安定性 | 完璧(ローカルフォント描画) | 概ね良好(稀にブレあり) | test2a |
| 開発・保守の容易さ | メンテナンスコスト高 | 容易(プロンプト調整のみ) | test2b |
実務で「クリック率(CTR)を高める魅力的な広告クリエイティブ」を高速で大量生産したい場合、test2b.py のように Vertex AI(Gemini 3.1 Flash Image Preview 等)のグラウンディング&画像生成機能に丸投げするアプローチ を選択するのが最も賢明です。文字のコントロールを厳密に行いたい特定のシステム要件がない限り、PILでせっせとコードを書く時代は終わりを告げたと言えるでしょう。