はじめに

画像をベクトル化するというテーマをもとに、Googleが提供する2つのAI APIの明確な用途の違いが見えてきました。
GoogleのAI機能を使うと言っても、現在、API Keyで手軽に使えるGemini APIと、Google Cloud上で堅牢に運用するVertex AIが存在します。
本記事では、両APIの違い、それぞれのメリット・デメリットを、「画像ベクトル化」という具体的なタスクを通して比較し、
プロトタイピングから本番環境へスケールする際の正しいAPI選択方法を詳しく解説します。

比較対象のAPI

Gemini API (gemini-embedding-001)

  • 提供形態: Google AI Studio経由
  • 認証方式: API Key
  • 対象ユーザー: 個人開発者、プロトタイピング
  • 特徴: 簡単にセットアップ可能
    ※画像専用のモデルが存在しないので上記モデルを使用

Vertex AI Multimodal Embedding API (multimodalembedding@001)

  • 提供形態: Google Cloud Vertex AI
  • 認証方式: サービスアカウント(IAM)
  • 対象ユーザー: エンタープライズ、本番環境
  • 特徴: 堅牢で高精度

主要な違い一覧

スペック比較表

項目 Gemini API Vertex AI
ベクトル次元 768次元 1408次元
認証方式 API Key サービスアカウント
セットアップ 5分 15分
画像サイズ制限 36KB(Base64後) 大きい画像対応
処理方式 Base64エンコード ファイルベース
エラーメッセージ 曖昧 詳細
料金 従量課金 従量課金
SLA なし あり
本番環境適性

認証方式の違い

Gemini API: シンプルなAPI Key認証

メリット

  • ✅ すぐに始められる
  • ✅ 環境変数1つで完結
  • ✅ プロトタイピングに最適

デメリット

  • ❌ API Keyの管理が必要
  • ❌ 権限制御が粗い
  • ❌ 本番環境では不安
import google.generativeai as genai

# 環境変数から読み込むだけ
genai.configure(api_key=os.environ.get('GOOGLE_API_KEY'))
model = genai.GenerativeModel('models/embedding-001')

Vertex AI: エンタープライズ向けサービスアカウント認証

メリット

  • ✅ IAMによる細かい権限制御
  • ✅ サービスアカウントの監査ログ
  • ✅ 本番環境で安心

デメリット

  • ❌ 初期セットアップが複雑
  • ❌ プロジェクトが必要
  • ❌ JSONキーファイルの管理
import vertexai
from vertexai.vision_models import MultiModalEmbeddingModel, Image as VertexImage

# プロジェクトとリージョンを指定
vertexai.init(project="YOUR_PROJECT_ID", location="us-central1")
model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding@001")

Dockerでの認証設定比較:

# Gemini API - シンプル
services:
  backend:
    environment:
      - GOOGLE_API_KEY=your_api_key

# Vertex AI - 堅牢
services:
  backend:
    environment:
      - GCP_PROJECT_ID=your-project-id
      - GCP_LOCATION=us-central1
      - GOOGLE_APPLICATION_CREDENTIALS=/app/credentials.json
    volumes:
      - /path/to/service-account-key.json:/app/credentials.json:ro

ベクトル次元の違い

これは検索精度に直結する最も重要な違いです。

API 次元数 特徴
Gemini API 768次元 標準的な精度
Vertex AI 1408次元 より細かい特徴を表現可能

影響範囲:

-- データベーススキーマも異なる
CREATE TABLE images_gemini (
    embedding VECTOR(768)  -- Gemini API
);

CREATE TABLE images_vertex_ai (
    embedding VECTOR(1408)  -- Vertex AI
);

重要: 異なる次元のベクトルは比較できません!

画像処理の違い

Gemini API: Base64エンコード方式

import base64

def encode_image(image_path):
    with open(image_path, 'rb') as f:
        image_bytes = f.read()
    # Base64エンコードが必要
    return base64.b64encode(image_bytes).decode('utf-8')

問題点

  • ❌ Base64エンコードでサイズが約1.33倍に増加
  • ペイロード制限: 36KB → 実質27KBの画像まで
  • ❌ 大きな画像は処理できない

実際のエラー

ERROR: 400 Request payload size exceeds the limit: 36000 bytes

Vertex AI: ファイルベース方式

def _prepare_image_file(self, image_source):
    """画像を一時ファイルとして準備"""
    temp_file = tempfile.NamedTemporaryFile(suffix='.jpg', delete=False)

    img = Image.open(image_source)

    # RGB形式に変換
    if img.mode != 'RGB':
        img = img.convert('RGB')

    # 必要に応じてリサイズ
    max_dimension = 1024
    if max(img.width, img.height) > max_dimension:
        ratio = max_dimension / max(img.width, img.height)
        new_size = (int(img.width * ratio), int(img.height * ratio))
        img = img.resize(new_size, Image.Resampling.LANCZOS)

    # 一時ファイルに保存
    img.save(temp_file.name, format='JPEG', quality=95, optimize=True)

    return temp_file.name

メリット

  • ✅ より大きな画像に対応
  • ✅ Base64エンコード不要
  • ✅ 柔軟なリサイズ処理

実装コードの違い

Gemini API実装例

class GeminiImageVectorizer:
    def __init__(self):
        api_key = os.environ.get('GOOGLE_API_KEY')
        if not api_key:
            raise ValueError("GOOGLE_API_KEY environment variable is not set")

        genai.configure(api_key=api_key)
        self.model = genai.GenerativeModel('models/embedding-001')

    def vectorize_image(self, image_path):
        # Base64エンコードが必要
        with open(image_path, 'rb') as f:
            image_data = base64.b64encode(f.read()).decode('utf-8')

        result = self.model.embed_content(
            content={"image": image_data}
        )

        return result.embedding  # 768次元

Vertex AI実装例

class VertexAIImageVectorizer:
    def __init__(self):
        project_id = os.environ.get('GCP_PROJECT_ID')
        location = os.environ.get('GCP_LOCATION', 'us-central1')

        vertexai.init(project=project_id, location=location)
        self.model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding@001")

    def vectorize_image(self, image_path):
        # ファイルパスを直接使用
        temp_file = self._prepare_image_file(image_path)

        try:
            image = VertexImage.load_from_file(temp_file)
            embeddings = self.model.get_embeddings(image=image)
            return embeddings.image_embedding  # 1408次元
        finally:
            # 一時ファイルを削除
            if os.path.exists(temp_file):
                os.unlink(temp_file)

セットアップ方法の比較

Gemini APIのセットアップ

ステップ1: API Keyを取得

1. https://ai.google.dev/ にアクセス
2. "Get API Key" をクリック
3. 新しいプロジェクトを作成またはキーを作成
4. API Keyをコピー

ステップ2: 環境変数を設定

# .envファイルまたはdocker-compose.yml
GOOGLE_API_KEY=your_api_key_here

ステップ3: 依存関係をインストール

pip install google-generativeai

完了! すぐに使い始められます。

Vertex AIのセットアップ

ステップ1: プロジェクトを作成

1. https://console.cloud.google.com/ にアクセス
2. 新しいプロジェクトを作成
3. プロジェクトIDをメモ

ステップ2: Vertex AI APIを有効化

1. APIとサービス > ライブラリ
2. "Vertex AI API" を検索
3. 有効化をクリック

ステップ3: サービスアカウントを作成

1. IAMと管理 > サービスアカウント
2. サービスアカウントを作成
3. 権限を付与: "Vertex AI User"
4. JSONキーをダウンロード

ステップ4: 環境変数とボリュームを設定

# docker/compose.yml
services:
  backend:
    environment:
      - GCP_PROJECT_ID=your-project-id
      - GCP_LOCATION=us-central1
      - GOOGLE_APPLICATION_CREDENTIALS=/app/credentials.json
    volumes:
      - /path/to/service-account-key.json:/app/credentials.json:ro

ステップ5: 依存関係をインストール

pip install google-cloud-aiplatform vertexai

ステップ6: コンテナを再ビルド

docker compose down
docker compose build --no-cache backend
docker compose up -d

セットアップの難易度

項目 Gemini API Vertex AI
プロジェクト 不要 必須
課金設定 不要 必須
IAM設定 不要 必須
難易度 ⭐ 簡単 ⭐⭐⭐ やや複雑

コスト比較

Gemini API(2025年10月時点)

画像エンベディング: 1,000リクエストあたり約$0.03

Vertex AI(2025年10月時点)

画像エンベディング: 1,000リクエストあたり約$0.025

コストはほぼ同じ(Vertex AIがわずかに安い)

実際の検索精度の違い

Gemini APIでは大きい画像が扱えずリサイズ及びBase64エンコードが必要なため、
Vertex AIの精度と比較するとかなり悪い結果に。
Gemini APIは画像エンコード専用のモデルではないので当然と言えば当然の結果となりました。

まとめ

Gemini API

メリット

  • ✅ 簡単にセットアップできる
  • ✅ すぐに試せる
  • ✅ プロトタイピングに最適

デメリット

  • ❌ ペイロードサイズ制限(36KB)
  • ❌ 本番環境には不向き
  • ❌ エラーハンドリングが弱い

Gemini APIを選ぶべきケース

こんな場合におすすめ

  • プロトタイピング・概念実証
  • 個人プロジェクト
  • すぐに始めたい
  • 小さい画像のみを扱う
  • 検索精度は標準レベルで十分

避けるべきケース:

  • 本番環境での運用
  • 大きな画像を扱う
  • エンタープライズ要件
  • 高精度が必要

Vertex AI Multimodal Embedding API

メリット

  • ✅ 高精度(1408次元)
  • ✅ 大きな画像に対応
  • ✅ エンタープライズ対応
  • ✅ 堅牢な認証
  • ✅ 詳細なエラーメッセージ

デメリット

  • ❌ セットアップがやや複雑
  • ❌ プロジェクトが必要

Vertex AIを選ぶべきケース

こんな場合におすすめ

  • 本番環境での運用
  • エンタープライズ要件
  • 大きな画像を扱う
  • 高精度な検索が必要
  • 堅牢な認証が必要
  • SLAが必要

避けるべきケース

  • すぐに試したいだけ
  • プロジェクトを作りたくない
  • シンプルさ重視

Gemini APIは、API Key認証による手軽さに特化しており、PoCや小規模な検証といった用途に向いています。
一方、画像ベクトル化のような高精度(1408次元)かつスケーラブルな作り込みが必要な高度な処理は、IAM認証やSLAが提供されるVertex AIに集約されていることが明確にわかりました。
この特徴と、シンプルさ vs 堅牢性という軸を活かして、開発フェーズに合ったAPIを選択されるのが最善です。