◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/API / SDK
◈ API / SDK/2026-07-09中級

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

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

gemini119embedding10RAG15semantic-search4gemini-api287

✦ プレミアム記事

壁紙アプリのタグ検索を 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-09-04
ループ音源のプチノイズは、Gemini に聴かせる前に波形の端で切り分けられます
環境音のループ再生で折り返しだけがプチッと鳴る。音声理解に丸ごと投げる前に、波形の端の段差を内部の変化量で正規化してふるい分ける手順と、配布形式への変換で継ぎ目が作り直される落とし穴をまとめました。
◈ API / SDK2026-08-23
アプリに載せる AI 機能を、実行時呼び出しから配布前の一括処理に寄せました
アプリに Gemini を組み込むとき、実行時に呼ぶか配布前に呼び終えるかで呼び出し回数の増え方が変わります。素材数に比例させる設計へ切り替えた判断基準と、冪等な一括処理の実装をまとめました。
◈ API / SDK2026-08-22
メディエーショングループが20を超えたとき、設定の抜けをどう見つけるか
広告メディエーションのグループが増えると、設定の抜けや型のずれが静かに溜まります。設定を1枚の表に正規化して機械でずれを確定させ、判断が必要なセルだけを Gemini に渡す分担にした手順をまとめました。