はじめに
2026年3月10日、Google は Gemini Embedding 2 をパブリックプレビューとしてリリースしました。テキスト・画像・動画・音声・PDFを 単一のベクトル空間 に統合できる、Googleとして初のネイティブマルチモーダル埋め込みモデルです。
これまでのマルチモーダル検索システムは「画像を先にテキストに変換してからテキスト埋め込みモデルに渡す」という2段階パイプラインが一般的でした。Gemini Embedding 2はこの中間変換ステップを排除し、各モダリティを直接ベクトル化します。Googleパートナー企業 Sparkonomy の報告によると、この方式でレイテンシを最大70%削減した事例も公開されています。
本記事では、公開情報とドキュメントをもとに Gemini Embedding 2 の技術仕様・Python による実装方法・RAGへの応用パターンを解説します。
この記事で学べること
- Gemini Embedding 2 の技術的な仕組みと前モデルとの違い
- テキスト・画像・動画・音声の埋め込みを Python で実装する方法
- MRL(Matryoshka Representation Learning)による次元削減と活用戦略
- マルチモーダル RAG システムへの応用パターン
- 料金体系と移行時の注意点
対象読者
- RAG や意味検索システムを構築しているエンジニア
- マルチモーダル AI を API で活用したい開発者
- 既存の Gemini Embedding モデルからの移行を検討している方
前提環境
- Python 3.9 以上
- Gemini API キーまたは Google Cloud プロジェクト(Vertex AI)
-
pip install google-genai(新 SDK)
TL;DR
- Gemini Embedding 2(
gemini-embedding-2-preview)はテキスト・画像・動画・音声・PDFを単一ベクトル空間にマッピングする - 出力次元は最大 3,072。MRL により 128〜3,072 の範囲で柔軟に削減可能
- 前モデル(
gemini-embedding-001)との ベクトル空間は非互換 — 移行時は全データ再埋め込みが必要 - タスクタイプ(8種類)を指定することで精度が向上する
- 無料枠あり。有料はテキスト $0.20/1M トークン〜
Gemini Embedding 2 とは
ネイティブマルチモーダルの意味
「ネイティブ」という言葉には重要な意味があります。従来のマルチモーダル検索の多くは次の手順を踏んでいました。
- 画像や音声を LLM に渡してテキスト説明文を生成
- 生成されたテキストをテキスト専用の埋め込みモデルに通してベクトル化
この方式では、画像の色・構図・表情といった視覚的なニュアンスや、音声の韻律・トーンといった聴覚的な情報が中間テキスト化の段階で失われます。
Gemini Embedding 2 は Gemini アーキテクチャのマルチモーダル基盤を利用し、各モダリティを 共通のトランスフォーマーエンコーダ に直接通してベクトル化します。テキスト変換が不要なため情報損失が少なく、処理レイテンシも短縮されます。
前モデルとの比較
| 仕様 | gemini-embedding-001 | gemini-embedding-2-preview |
|---|---|---|
| 対応モダリティ | テキストのみ | テキスト・画像・動画・音声・PDF |
| 入力トークン上限 | 2,048 | 8,192 |
| 出力次元 | 3,072(MRL で 128〜3,072) | 3,072(MRL で 128〜3,072) |
| ベクトル空間 | — | 非互換(再埋め込みが必要) |
| 対応言語 | 英語中心 | 100言語以上 |
| ステータス | GA | パブリックプレビュー |
入力制限(モダリティ別)
| モダリティ | 上限 | 対応フォーマット |
|---|---|---|
| テキスト | 8,192 トークン | — |
| 画像 | 6枚/リクエスト | PNG, JPEG |
| 動画(音声なし) | 128秒/リクエスト(Vertex AI では120秒) | MP4, MOV |
| 動画(音声付き) | 80秒/リクエスト | MP4, MOV |
| 音声 | 80秒/リクエスト | MP3, WAV |
| 6ページ/リクエスト | application/pdf | |
| 総合上限 | 8,192 トークン(合算) | — |
長尺の動画や長文ドキュメントを扱う場合は、チャンキングして複数リクエストに分割する設計が必要です。
Python による実装
セットアップ
pip install google-genai
API キーは環境変数から読み込むのが推奨です。
export GEMINI_API_KEY="your-api-key"
テキスト埋め込み
from google import genai
from google.genai import types
client = genai.Client()
result = client.models.embed_content(
model="gemini-embedding-2-preview",
contents="Gemini Embedding 2 はマルチモーダル埋め込みモデルです。"
)
# 埋め込みベクトルを取得
vector = result.embeddings[0].values
print(f"次元数: {len(vector)}") # 3072
画像埋め込み
from google import genai
from google.genai import types
client = genai.Client()
with open("product-image.png", "rb") as f:
image_bytes = f.read()
result = client.models.embed_content(
model="gemini-embedding-2-preview",
contents=[
types.Part.from_bytes(
data=image_bytes,
mime_type="image/png",
)
]
)
image_vector = result.embeddings[0].values
print(f"画像ベクトルの次元数: {len(image_vector)}") # 3072
タスクタイプと次元削減の指定
タスクタイプを指定するとユースケースに最適化された埋め込みが得られます。また output_dimensionality でストレージコストを削減できます。
from google import genai
from google.genai import types
client = genai.Client()
# 検索クエリ用(RETRIEVAL_QUERY)
query_result = client.models.embed_content(
model="gemini-embedding-2-preview",
contents="東京でおすすめのランチスポット",
config=types.EmbedContentConfig(
task_type="RETRIEVAL_QUERY",
output_dimensionality=768 # 75%のストレージ削減、精度はほぼ同等
)
)
# インデックス登録用(RETRIEVAL_DOCUMENT)
doc_result = client.models.embed_content(
model="gemini-embedding-2-preview",
contents="新宿の老舗イタリアンレストランです。ランチコースは1,500円から。",
config=types.EmbedContentConfig(
task_type="RETRIEVAL_DOCUMENT",
output_dimensionality=768
)
)
タスクタイプ一覧
| タスクタイプ | 用途 |
|---|---|
RETRIEVAL_QUERY |
検索クエリのベクトル化 |
RETRIEVAL_DOCUMENT |
検索対象ドキュメントのインデックス登録 |
SEMANTIC_SIMILARITY |
2文書の類似度比較 |
CLASSIFICATION |
テキスト分類 |
CLUSTERING |
クラスタリング |
CODE_RETRIEVAL_QUERY |
コード検索クエリ |
QUESTION_ANSWERING |
質問応答 |
FACT_VERIFICATION |
ファクトチェック |
動画埋め込み(ファイルアップロード方式)
動画ファイルは先に Files API でアップロードしてから埋め込みを生成します。
import time
from google import genai
client = genai.Client()
# 動画をアップロード
video_file = client.files.upload(path="demo-video.mp4")
# 処理完了を待機
while video_file.state.name == "PROCESSING":
time.sleep(2)
video_file = client.files.get(name=video_file.name)
if video_file.state.name == "FAILED":
raise ValueError("動画の処理に失敗しました")
# 埋め込みを生成
result = client.models.embed_content(
model="gemini-embedding-2-preview",
contents=video_file
)
video_vector = result.embeddings[0].values
print(f"動画ベクトルの次元数: {len(video_vector)}")
マルチモーダルバッチ処理
複数モダリティを混在させてバッチ処理することもできます。
from google import genai
from google.genai import types
client = genai.Client()
# テキストと画像を同時に埋め込む
with open("item.jpg", "rb") as f:
image_bytes = f.read()
results = client.models.embed_content(
model="gemini-embedding-2-preview",
contents=[
"このシャツは綿100%で洗濯機洗いが可能です。",
types.Part.from_bytes(data=image_bytes, mime_type="image/jpeg"),
]
)
text_vector = results.embeddings[0].values
image_vector = results.embeddings[1].values
MRL(Matryoshka Representation Learning)の活用
MRL とは
MRL は、3,072次元ベクトルの先頭次元に最も重要な意味情報を集約するよう学習する手法です。ロシアのマトリョーシカ人形のように、高次元ベクトルの中に低次元ベクトルが入れ子になっているイメージです。
この特性を利用して、粗い低次元ベクトルで大量データをスクリーニングし、精密な高次元ベクトルで上位候補をリランキングする2段階検索アーキテクチャが実現できます。
2段階検索の実装例
from google import genai
from google.genai import types
client = genai.Client()
def embed_for_screening(text: str) -> list[float]:
"""粗いスクリーニング用(768次元)"""
result = client.models.embed_content(
model="gemini-embedding-2-preview",
contents=text,
config=types.EmbedContentConfig(
task_type="RETRIEVAL_QUERY",
output_dimensionality=768,
),
)
return result.embeddings[0].values
def embed_for_reranking(text: str) -> list[float]:
"""精密リランキング用(3072次元)"""
result = client.models.embed_content(
model="gemini-embedding-2-preview",
contents=text,
config=types.EmbedContentConfig(
task_type="RETRIEVAL_QUERY",
output_dimensionality=3072,
),
)
return result.embeddings[0].values
def cosine_similarity(v1: list[float], v2: list[float]) -> float:
import math
dot = sum(a * b for a, b in zip(v1, v2))
norm1 = math.sqrt(sum(a * a for a in v1))
norm2 = math.sqrt(sum(b * b for b in v2))
return dot / (norm1 * norm2) if norm1 and norm2 else 0.0
# 使用例
query = "Python で CSV を読み込む方法"
candidates = [
"Pandas を使った CSV ファイルの読み込み方法を解説します。",
"Python の組み込み csv モジュールによるファイル処理。",
"Excel ファイルを openpyxl で操作する方法。",
]
# Step 1: 768次元でスクリーニング
query_vec_768 = embed_for_screening(query)
candidate_vecs_768 = [embed_for_screening(c) for c in candidates]
scored = [
(cosine_similarity(query_vec_768, v), i)
for i, v in enumerate(candidate_vecs_768)
]
top2 = sorted(scored, reverse=True)[:2]
# Step 2: 3072次元でリランキング(上位2件のみ)
query_vec_3072 = embed_for_reranking(query)
reranked = []
for score, idx in top2:
vec_3072 = embed_for_reranking(candidates[idx])
reranked.append((cosine_similarity(query_vec_3072, vec_3072), candidates[idx]))
for score, text in sorted(reranked, reverse=True):
print(f"スコア: {score:.4f} — {text[:50]}")
マルチモーダル RAG への応用
単一インデックスで複数モダリティを検索
Gemini Embedding 2 の最大の特徴は、テキスト検索クエリで画像や動画を横断検索できる点です。
import json
from pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
# --- インデックス構築 ---
index = []
# テキストドキュメントをインデックス登録
documents = [
{"id": "doc1", "type": "text", "content": "在庫管理システムの設計ガイドです。"},
{"id": "doc2", "type": "text", "content": "注文処理フローの説明書。"},
]
for doc in documents:
result = client.models.embed_content(
model="gemini-embedding-2-preview",
contents=doc["content"],
config=types.EmbedContentConfig(task_type="RETRIEVAL_DOCUMENT"),
)
index.append({**doc, "vector": result.embeddings[0].values})
# 画像をインデックス登録
image_paths = Path("./product-images").glob("*.png")
for img_path in image_paths:
with open(img_path, "rb") as f:
image_bytes = f.read()
result = client.models.embed_content(
model="gemini-embedding-2-preview",
contents=[types.Part.from_bytes(data=image_bytes, mime_type="image/png")],
config=types.EmbedContentConfig(task_type="RETRIEVAL_DOCUMENT"),
)
index.append({
"id": img_path.stem,
"type": "image",
"content": str(img_path),
"vector": result.embeddings[0].values,
})
# --- 検索 ---
def search(query: str, top_k: int = 3) -> list[dict]:
query_result = client.models.embed_content(
model="gemini-embedding-2-preview",
contents=query,
config=types.EmbedContentConfig(task_type="RETRIEVAL_QUERY"),
)
query_vec = query_result.embeddings[0].values
scored = [
(cosine_similarity(query_vec, item["vector"]), item)
for item in index
]
return [item for _, item in sorted(scored, reverse=True)[:top_k]]
# テキストクエリで画像・テキスト横断検索
results = search("在庫管理の画面レイアウト")
for r in results:
print(f"[{r['type']}] {r['id']}: {r['content'][:60]}")
料金体系
Gemini API(Gemini Developer API)の料金は以下のとおりです(2026年3月時点、公式ドキュメントより)。
| モダリティ | 無料枠(レート制限あり) | 有料(従量課金) |
|---|---|---|
| テキスト | あり | $0.20 / 1M トークン |
| 画像 | あり | $0.45 / 1M トークン |
| 音声 | あり | $6.50 / 1M トークン |
| 動画 | あり | $12.00 / 1M トークン |
| バッチ処理 | — | 通常料金の 50% オフ |
無料枠のリクエスト数上限は Google AI Studio のダッシュボードで確認できます。プロトタイプ開発には無料枠で十分対応できます。
Vertex AI での提供は 2026年3月時点で
us-central1リージョンのみです。日本リージョン(asia-northeast1)は非対応です。
移行時の注意点
ベクトル空間の非互換
gemini-embedding-001 から gemini-embedding-2-preview への移行では、既存の全データを再埋め込みする必要があります。2つのモデルは出力するベクトル空間が異なるため、既存インデックスは互換性がありません。
移行計画として、以下を事前に検討することが推奨されます。
- データ量の把握: 全ドキュメント・画像・動画の件数とサイズを確認
- コストの試算: 料金表をもとに再埋め込みの費用を算出
- 並行運用期間: 新旧インデックスを並行稼働させ、結果品質を比較
- ロールバック計画: 問題発生時に旧インデックスに戻せる手順を準備
プレビュー版であることの考慮
gemini-embedding-2-preview は 2026年3月時点でパブリックプレビュー(Pre-GA)のため、SLA の保証や正式サポートの対象外となっています。本番環境への適用は GA リリース後を推奨します。
まとめ
Gemini Embedding 2 の主なポイントを整理します。
- テキスト・画像・動画・音声・PDFを ネイティブに単一ベクトル空間 へ変換する
- MRL により 128〜3,072次元を柔軟に選択可能。768次元で75%のストレージ削減が可能
- タスクタイプ(8種類)の指定で精度を最適化できる
- 前モデルとはベクトル空間が非互換 — 移行は全データ再埋め込みが必要
- 無料枠あり。プロトタイプ開発は無料で試せる
- 2026年3月時点でパブリックプレビュー。本番利用は GA 後が推奨
マルチモーダルな RAG システムや商品検索・メディア検索を設計している場合、中間テキスト変換パイプラインを廃止できるかどうかを評価する価値があります。



