GEMINI LABEN
SIRI — WWDC 2026で刷新版SiriがGoogle Geminiモデルで動くと確定。ただしEUではDMAによりiOS 27時点で提供されませんFLASH3.5 — Gemini 3.5 FlashがGA。エージェント・コーディングで持続的なフロンティア性能を発揮する最上位FlashモデルですIMAGE-GA — Gemini 3.1 Flash Image / 3.1 Pro Imageがネイティブ視覚モデルとしてGA。preview版は6/25に終了予定MANAGED-AGENTS — Gemini APIでManaged Agentsが公開プレビュー。Googleホストの隔離Linuxサンドボックスで自律エージェントを構築できますFILE-SEARCH — File Searchがマルチモーダル対応。gemini-embedding-2で画像のネイティブ埋め込み・検索が可能になりましたDEPRECATION — gemini-3.1-flash-image-preview / gemini-3-pro-image-previewは6/25に停止。GA版への移行をお早めにSIRI — WWDC 2026で刷新版SiriがGoogle Geminiモデルで動くと確定。ただしEUではDMAによりiOS 27時点で提供されませんFLASH3.5 — Gemini 3.5 FlashがGA。エージェント・コーディングで持続的なフロンティア性能を発揮する最上位FlashモデルですIMAGE-GA — Gemini 3.1 Flash Image / 3.1 Pro Imageがネイティブ視覚モデルとしてGA。preview版は6/25に終了予定MANAGED-AGENTS — Gemini APIでManaged Agentsが公開プレビュー。Googleホストの隔離Linuxサンドボックスで自律エージェントを構築できますFILE-SEARCH — File Searchがマルチモーダル対応。gemini-embedding-2で画像のネイティブ埋め込み・検索が可能になりましたDEPRECATION — gemini-3.1-flash-image-preview / gemini-3-pro-image-previewは6/25に停止。GA版への移行をお早めに
記事一覧/API / SDK
API / SDK/2026-04-14上級

Gemini API Embedding × ベクトルDB完全比較: Pinecone・Qdrant・pgvector・Cloud Spannerを本番で使い分けるガイド

Gemini text-embedding-004でPinecone・Qdrant・pgvector・Cloud Spanner Vectorを実測比較。コスト・レイテンシ・実装難易度を完全網羅した本番ベクトルDB選択ガイド。

gemini114embeddings12vector-database4pinecone2qdrantpgvector4rag22production90

プレミアム記事

RAGシステムを本番に持っていく直前、多くの開発者がこう悩む。「Pineconeはコストが気になります。pgvectorは管理が面倒そう。Qdrantは良いらしいが日本語情報が少ないです。Cloud Spannerはそもそも自分には高すぎる?」

各DBの個別チュートリアルは山ほど存在するが、同じGemini Embeddingモデルで4つを横断比較した実測ベースの選択ガイドはほとんど見当たらありません。

なぜベクトルDB選択が本番で決定的に重要なのか

誤った選択は2つの形で現れます。

コスト爆発: 検索クエリ数・ベクトル次元数・インデックスサイズの組み合わせによっては、マネージドサービスの月額が想定の10倍以上になることがあります。Pinecone Serverlessで100万クエリ/月の見積もりを出したが、ベクトル次元を1536から768に変えただけでコストが60%削減できたケースがあります。Geminiの text-embedding-004 はデフォルト768次元だが、これはサービス設計の早期から意識すべき数字です。

レイテンシの壁: チャットbotやリアルタイム検索では、ベクトル検索のP99レイテンシが100msを超えると体験が壊れます。データベースの選択とインデックス設定を間違えると、10万件程度のベクトルでも300ms以上かかるケースがあります。

Gemini text-embedding-004の仕様確認

比較の前提を揃えておく。

# Gemini text-embedding-004 基本情報と初期化
import google.generativeai as genai
import os
import time
 
# 利用可能な次元数: 256 / 512 / 768(デフォルト)
# 最大入力トークン: 2,048
# バッチサイズ上限: 100テキスト/リクエスト
 
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
 
def get_embedding(
    text: str,
    task_type: str = "RETRIEVAL_DOCUMENT",
    dimensions: int = 768
) -> list[float]:
    """単一テキストの埋め込みを取得する"""
    result = genai.embed_content(
        model="models/text-embedding-004",
        content=text,
        task_type=task_type,  # RETRIEVAL_DOCUMENT / RETRIEVAL_QUERY / SEMANTIC_SIMILARITY
        output_dimensionality=dimensions
    )
    return result["embedding"]
 
# 動作確認
doc_vec = get_embedding("Gemini APIの使い方", task_type="RETRIEVAL_DOCUMENT")
query_vec = get_embedding("APIの使い方を教えて", task_type="RETRIEVAL_QUERY")
print(f"次元数: {len(doc_vec)}")  # 出力: 次元数: 768

task_type の選択は見落とされがちだが重要です。ドキュメントをインデックスする際は RETRIEVAL_DOCUMENT、クエリを埋め込む際は RETRIEVAL_QUERY を使います。同じテキストでも異なるベクトルが生成され、コサイン類似度が平均3〜5%向上します。後から全ドキュメントを再インデックスするコストを考えると、最初から正しい task_type を使う点が肝心です。

本番対応バッチ処理クライアント: 全DBで使う共通基盤

各DBの比較に入る前に、本番環境で欠かせないバッチ処理基盤を先に作る。1件ずつAPIを呼ぶと、1万件の埋め込みに10〜15分かかります。バッチ処理・リトライ・レート制限を実装した共通クライアントを用意しておくことで、どのDBを選んでも使い回せる。

from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
 
class GeminiEmbeddingClient:
    """本番対応Gemini Embeddingクライアント"""
 
    def __init__(self, api_key: str, dimensions: int = 768):
        genai.configure(api_key=api_key)
        self.dimensions = dimensions
        self.max_batch = 100       # APIの上限
        self.rpm_limit = 1000      # 有料プランの上限(無料: 100 RPM)
        self._request_times: list[float] = []
 
    def _throttle(self):
        """60秒ウィンドウでRPM制限を守る"""
        now = time.time()
        self._request_times = [t for t in self._request_times if now - t < 60]
        if len(self._request_times) >= self.rpm_limit:
            sleep_time = 60 - (now - self._request_times[0]) + 0.1
            time.sleep(sleep_time)
        self._request_times.append(time.time())
 
    @retry(
        stop=stop_after_attempt(3),
        wait=wait_exponential(multiplier=1, min=2, max=30),
        retry=retry_if_exception_type(Exception),
        reraise=True
    )
    def _embed_batch_raw(self, texts: list[str], task_type: str) -> list[list[float]]:
        """バッチ埋め込みの内部実装(リトライ付き)"""
        self._throttle()
        result = genai.embed_content(
            model="models/text-embedding-004",
            content=texts,
            task_type=task_type,
            output_dimensionality=self.dimensions
        )
        return result["embedding"]
 
    def embed_documents(self, texts: list[str], show_progress: bool = True) -> list[list[float]]:
        """ドキュメントリストの埋め込み(RETRIEVAL_DOCUMENT)"""
        return self._embed_all(texts, "RETRIEVAL_DOCUMENT", show_progress)
 
    def embed_query(self, query: str) -> list[float]:
        """クエリの埋め込み(RETRIEVAL_QUERY)"""
        return self._embed_batch_raw([query], "RETRIEVAL_QUERY")[0]
 
    def _embed_all(self, texts: list[str], task_type: str, show_progress: bool) -> list[list[float]]:
        embeddings = []
        total = len(texts)
        for i in range(0, total, self.max_batch):
            batch = texts[i:i + self.max_batch]
            try:
                embeddings.extend(self._embed_batch_raw(batch, task_type))
            except Exception as e:
                # バッチ失敗時は1件ずつにフォールバック
                print(f"バッチ失敗({i}{i+len(batch)}件): {e}")
                for text in batch:
                    try:
                        embeddings.append(self._embed_batch_raw([text], task_type)[0])
                    except Exception as e2:
                        print(f"  個別処理も失敗: {e2} → ゼロベクトルで代替")
                        embeddings.append([0.0] * self.dimensions)
            if show_progress:
                print(f"  進捗: {min(i + self.max_batch, total)}/{total}件")
        return embeddings
 
# 初期化
client = GeminiEmbeddingClient(api_key=os.environ["GEMINI_API_KEY"])

このクライアントはリトライ(指数バックオフ)・レート制限・バッチフォールバックを備える。以降の全DB実装でこれを共通利用します。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
4大ベクトルDBを同じGemini Embeddingモデルで実測比較し、プロジェクト規模別の最適解をすぐ判断できる
エラーハンドリング・リトライ・バッチ処理を含む本番対応コードをコピー&ペーストで利用できる
月100万クエリ規模のRAGでコストを70%削減したベクトルDB選択・設定ノウハウを体系的に習得できる
Stripe による安全な決済 · いつでもキャンセル可能
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API / SDK2026-04-03
Gemini Embedding API × Pinecone でRAGシステムを本番構築する
Gemini Embedding APIとPineconeを組み合わせてRAGシステムを構築する手順を解説。インデックス設計からクエリ最適化、本番運用のコスト管理まで実践的なPythonコードで学べます。
API / SDK2026-03-29
Gemini Embeddings API で構築する本番環境セマンティック検索システム — 設計・実装・運用の全工程
Gemini Embeddings API を活用したセマンティック検索システムの設計から本番運用まで。ベクトルDB選定、リランキング、レコメンドエンジン、コスト最適化を実践コード付きで徹底解説。
API / SDK2026-04-28
Gemini Embeddings × リランカーで本番RAGの精度を底上げする — Vertex AI Ranking と LLM-as-judge の使い分け
Embeddings だけでは取りこぼす「上位3件は当たり前に合うのに5件目以降に正解が埋もれる」問題を、Vertex AI Ranking API と Gemini を使ったリランカーで解決する本番アーキテクチャを実装コード付きで解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →