◉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-06-23上級

File Search のストアが本番で静かに陳腐化する — カタログ同期とドリフト検知を実装した運用メモ

File Search に一度カタログを流し込んで終わりにすると、配信を止めたアセットを案内する『古い回答』が本番で返り始めます。ハッシュ差分の増分取り込みと、削除を割り切るブルーグリーン再構築、そして定期ドリフト検知までを実装で整理しました。

gemini119file-search4rag21gemini-embedding-27production105

✦ プレミアム記事

File Search に壁紙カタログを一度流し込んで満足していたら、二週間ほど経った頃に「その壁紙はすでに配信を終了しています」という案内が本番で返ってきて青ざめました。アセット自体は App Store と Google Play の更新で差し替え済みなのに、File Search のストアの中身は最初に取り込んだ日のまま止まっていたのです。

File Search の入門記事は「ファイルを入れればグラウンディングできる」ところで終わります。けれども個人開発で実際に運用してみると、難しいのは最初の取り込みではなく、正本(source of truth)が変わり続けるのにストアだけが古いスナップショットのまま取り残されることでした。この記事は、その「静かな陳腐化」を止めるために私自身が組んだ同期パイプラインの記録です。

ストアは「作った時点のスナップショット」でしかない

まず前提を揃えます。File Search のストア(FileSearchStore)は、取り込んだ瞬間の内容を gemini-embedding-2 で索引化した塊です。便利なのは、自前でベクトルDBを立てたりチャンク分割を設計したりせずに、テキストも画像も同じストアに入れて引用元つきで回答を返せる点です。マルチモーダル対応で、壁紙のような画像アセットをそのまま入れられるようになったのは大きな前進でした。

ただし、ストアは取り込んだ後に放っておくと更新されません。正本のカタログ側で起きる変化は、おおむね次の3種類です。

  • 追加: 新しい壁紙を配信した。ストアにはまだ無い。
  • 更新: 既存アセットのメタ情報(タイトル・カテゴリ・配信状況)を書き換えた。ストアの中身は古い。
  • 削除: 配信を終了した。ストアには「もう無いもの」が残っている。

このうち一番こわいのは削除です。追加や更新は「新しい回答が出ない」だけで済みますが、削除されたアセットがストアに残っていると、AIは実在しないものを自信たっぷりに案内します。冒頭の事故がまさにこれでした。

正本とストアのズレを「マニフェスト」で可視化する

ズレを止める前に、まず「いま何がどうズレているか」を機械的に分かる形にします。私はストアを直接のぞきにいくのではなく、正本側からマニフェストを作る方針にしました。各アセットの内容ハッシュを取り、前回同期したマニフェストと比べれば、差分は単純な集合演算で出ます。

# build_manifest.py
# 正本カタログ(DBやファイル一覧)から「ID → 内容ハッシュ」の辞書を作る。
# ストアの中身に依存せず、正本だけを根拠にするのがポイント。
import hashlib
import json
from pathlib import Path
 
 
def asset_fingerprint(asset: dict) -> str:
    """配信状況・タイトル・カテゴリ・本体ファイルのハッシュをまとめて1つの指紋にする。
    どれか1つでも変われば指紋が変わり、更新として検出できる。"""
    h = hashlib.sha256()
    h.update(asset["status"].encode())          # active / retired
    h.update(asset["title"].encode())
    h.update(asset["category"].encode())
    # 画像本体はファイルのバイト列をそのままハッシュ(メタだけでなく中身も見る)
    h.update(Path(asset["image_path"]).read_bytes())
    return h.hexdigest()
 
 
def build_manifest(catalog: list[dict]) -> dict[str, str]:
    # 配信中のものだけを索引対象にする。retired はそもそも入れない。
    return {
        a["id"]: asset_fingerprint(a)
        for a in catalog
        if a["status"] == "active"
    }
 
 
if __name__ == "__main__":
    catalog = json.loads(Path("catalog.json").read_text())
    manifest = build_manifest(catalog)
    Path("manifest.current.json").write_text(json.dumps(manifest, indent=2))
    print(f"manifest entries: {len(manifest)}")
    # 期待する出力例: manifest entries: 3127

ここで「メタ情報だけでなく画像本体のバイト列もハッシュに含める」のが地味に効きます。タイトルは同じまま画像だけ差し替えるリリースが意外と多く、メタだけ見ていると更新を取りこぼすからです。

✦

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

この記事の続きを読む

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

この記事で得られること
✦File Search のストアが元カタログとズレて『もう無いものを案内する』問題を、ハッシュ差分の増分取り込みで止められるようになります
✦数千件規模のアセットを毎リリース入れ替えても、ブルーグリーンでストアを作り直してポインタを切り替えれば、クエリを止めずに新しい索引へ移せます
✦正本とストアがどれだけズレているかを毎晩はかるドリフト検知スクリプトを、そのまま自分のパイプラインに組み込めます
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◈ API / SDK2026-05-11
Gemini 3 Pro × Firebase Cloud Messaging で個人アプリのプッシュ通知をパーソナライズ配信する本番運用ガイド
個人開発のアプリでプッシュ通知の開封率が頭打ちになっている方へ。Gemini 3 Pro でユーザーの最終操作・課金状態・好みに応じた文面を生成し、Firebase Cloud Messaging で配信する本番設計を、実装コード・コスト試算・落とし穴まで含めて整理しました。
◈ API / SDK2026-05-01
Geminiで作る出典付きRAG ― ハルシネーションを止める引用生成と検証パイプラインの設計
Gemini API を使った RAG に「信頼できる出典」を組み込むための実装パターンを、構造化出力・検証アルゴリズム・UI 表示まで通しで解説します。ハルシネーションを定量的に検出する仕組みも含めて、本番投入できる形で紹介します。
◈ API / SDK2026-04-28
Gemini Embeddings × リランカーで本番RAGの精度を底上げする — Vertex AI Ranking と LLM-as-judge の使い分け
Embeddings だけでは取りこぼす「上位3件は当たり前に合うのに5件目以降に正解が埋もれる」問題を、Vertex AI Ranking API と Gemini を使ったリランカーで解決する本番アーキテクチャを実装コード付きで解説します。