GEMINI LABEN
SPARK — GoogleのエージェントアシスタントGemini SparkがmacOSのGeminiアプリに登場し、タスクを自律的に代行しますBRIEF — Personal Intelligenceを活用したDaily BriefがGmailやカレンダーから優先事項をまとめ、次の一手を提案しますMODEL — Gemini 3.5 FlashがGA(正式版)となり、100万トークンのコンテキストで低コスト・高速な処理に対応しますGROWTH — Geminiアプリの月間アクティブユーザーが9億人を突破し、1年前の4億人から大きく成長しましたAPPS — SparkはGoogle TasksやGoogle Keepと連携し、話題をリアルタイムに追いかけられるようになりましたENTERPRISE — Gemini 3.5 FlashがGlobal・US・EUのGemini Enterpriseで一般提供されていますSPARK — GoogleのエージェントアシスタントGemini SparkがmacOSのGeminiアプリに登場し、タスクを自律的に代行しますBRIEF — Personal Intelligenceを活用したDaily BriefがGmailやカレンダーから優先事項をまとめ、次の一手を提案しますMODEL — Gemini 3.5 FlashがGA(正式版)となり、100万トークンのコンテキストで低コスト・高速な処理に対応しますGROWTH — Geminiアプリの月間アクティブユーザーが9億人を突破し、1年前の4億人から大きく成長しましたAPPS — SparkはGoogle TasksやGoogle Keepと連携し、話題をリアルタイムに追いかけられるようになりましたENTERPRISE — Gemini 3.5 FlashがGlobal・US・EUのGemini Enterpriseで一般提供されています
記事一覧/API / SDK
API / SDK/2026-07-09中級

gemini-embedding-2 の検索精度が伸びないとき、最初に task_type を疑う

gemini-embedding-2 の検索が惜しい外れ方をするとき、原因は task_type の指定漏れや不一致であることが多いです。ドキュメントとクエリで用途を揃え、再現率を取り戻す実装と検証手順をまとめました。

gemini97embedding10RAG15semantic-search4gemini-api270

プレミアム記事

壁紙アプリのタグ検索を gemini-embedding-2 で作り直したとき、結果が「間違ってはいないけれど、惜しい」外れ方をしました。「夕焼け 海」で引いたのに、上位に来るのは夕焼けの山や、海だけの写真。欲しかった一枚は7番目にいる。精度がゼロなら実装ミスを疑いますが、惜しいときほど原因が見えにくいものです。

半日ほどインデックスの正規化やチャンク設計を見直して、最後に気づいたのが task_type でした。ドキュメントもクエリも task_type を指定せずに埋め込んでいたのです。ここを揃えた瞬間、さきほどの一枚が2番目に上がってきました。

同じ現象は、gemini-embedding-2 が GA になって「テキストも画像も同じモデルで埋め込める」ようになった今、むしろ増えていると感じます。モデルを差し替える機会が増えたぶん、task_type の指定が引き継がれずに落ちるからです。原因と直し方を、私自身が測った差とともに順に整理していきます。

task_type は「何のための埋め込みか」をモデルに伝えている

埋め込みモデルは、渡したテキストをベクトルに変換します。ただ、同じ文でも「検索される側のドキュメント」として使うのか、「検索する側のクエリ」として使うのかで、最適なベクトルの向きは微妙に異なります。

task_type は、その用途をモデルに明示するパラメータです。gemini-embedding-2 では、ドキュメントとクエリで別々に最適化された埋め込みを得られます。指定しないと汎用的な埋め込みになり、検索という非対称なタスク(短いクエリで長いドキュメントを引く)に最適化されません。

ここが直感に反するところです。クエリとドキュメントは同じ空間で比較するのだから、同じ扱いにすべきだと考えてしまいます。実際には、非対称なタスクでは「クエリ用」と「ドキュメント用」を別々に指定したほうが、コサイン類似度の順位が安定します。

よくある間違い:ドキュメントもクエリも task_type なしで埋め込む

最初に私がやっていたのが、これです。インデックス作成時も検索時も、同じ関数で task_type を渡さずに埋め込んでいました。

from google import genai
 
client = genai.Client()  # GEMINI_API_KEY は環境変数から読み込みます
 
def embed_plain(text: str) -> list[float]:
    # task_type を指定していない = 用途不明の汎用埋め込み
    resp = client.models.embed_content(
        model="gemini-embedding-2",
        contents=text,
    )
    return resp.embeddings[0].values
 
# インデックスも検索も同じ関数を使ってしまう
doc_vec = embed_plain("夕焼けに染まる海辺の風景写真")
query_vec = embed_plain("夕焼け 海")

このコード自体はエラーになりません。だから厄介なのです。検索は動くし、それらしい結果も返ってきます。ただ、非対称タスクに最適化されていないぶん、順位がぼやけます。「精度が出ない」ではなく「惜しい」という症状は、この状態でよく現れます。

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

この記事の続きを読む

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

この記事で得られること
検索結果が惜しい外れ方をしていた人が、task_type を揃えるだけで再現率を取り戻せる
RETRIEVAL_DOCUMENT と RETRIEVAL_QUERY をコピペで正しく使い分ける実装を手に入れられる
小さなゴールデンセットで task_type を A/B 検証する習慣を、自分のプロジェクトに導入できる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

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

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

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

関連記事

API / SDK2026-07-04
公開前に「意味が近すぎる過去記事」を弾く — Gemini Embedding でトピック共食いを防ぐ類似ゲート
記事数が数百本を超えると、新しく書いた記事が過去記事と検索面で共食いを起こします。gemini-embedding-2 で本文の意味ベクトルを持ち、公開前にコサイン類似で近すぎる既存記事を弾くゲートを、動くコードと閾値の決め方まで実装します。
API / SDK2026-06-29
Gemini API の自動パイプラインで、静かに消える失敗ジョブを取りこぼさない設計
無人で回る Gemini API のバッチが1件だけ静かに落ちて気づかない——その取りこぼしを止めるデッドレター保存と安全な再投入の最小実装を、コピペで動くコードと運用判断つきでまとめました。
API / SDK2026-06-26
Gemini 3.1 Flash Image で日本語テキスト入り画像を安定生成する ― OCR検証ゲート付きパイプライン
プレビュー停止後の GA 版 gemini-3.1-flash-image で、画像内の日本語テキストが崩れる問題に向き合います。生成→OCR検証→再生成/合成フォールバックの二段構えを、動くコードと無人運用のリトライ設計まで含めて記録しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →