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で一般提供されています
記事一覧/高度な活用
高度な活用/2026-07-08上級

Managed Agent の実行中に知識ベースが書き換わる問題 — File Search を実行エポックで固定する一貫性設計

Managed Agents の自律実行中に File Search ストアが更新されると、同じ実行の中で古い根拠と新しい根拠が混ざります。MVCCに倣った実行エポックの固定で、エージェント1回分の根拠を一貫させる設計と実装をまとめました。

Gemini API173Managed Agents5File Search6RAG14アーキテクチャ11

プレミアム記事

深夜のバッチが吐いたエージェントの実行トレースを追っていて、手が止まりました。

生成された成果物は、ある社内向けドキュメントの記述を根拠に結論を出しています。ところが、そのドキュメントは同じ時刻に走っていた別の更新処理で、すでに retired 扱いにしたはずのものでした。エージェントの前半では旧版を引き、後半では新版を引いている。1回の実行の中で、根拠が入れ替わっていたのです。

Managed Agents が Google ホストの隔離サンドボックスで自律的に走るようになり、File Search はマルチモーダル対応の GA へと進みました。実行環境を預けられる安心感の裏で、見落としやすい落とし穴があります。エージェントの1回の実行は数十秒から数分に及び、その間もナレッジベースは動き続けているということです。

ここで扱うのは、エージェント実行を「一貫したスナップショット」として扱うための設計です。実装まで含めて整理いたします。データベースの世界で言うところの、MVCC(多版型同時実行制御)の発想を File Search に持ち込む試みでもあります。個人開発でアプリを回している私自身にとって、実行環境を預けられる流れは歓迎したいものです。ただ、根拠の一貫性だけは自分の手で握っておきたい。そう感じた記録でもあります。

なぜエージェント実行に一貫性の境界が要るのか

単発の質問応答であれば、この問題は表面化しません。検索して、答えて、終わり。所要時間はミリ秒単位で、その間にストアが書き換わる確率は低いからです。

エージェントの実行は事情が違います。計画を立て、複数回検索し、途中でコードを実行し、また検索する。この一連の流れが一つの「トランザクション」のように振る舞うにもかかわらず、途中の各検索は独立して最新のストアを見にいきます。

結果として、次のような不整合が生まれます。

時刻エージェント側ストア側読み取り結果
T0実行開始・doc-A を検索doc-A v1(旧版)
T1doc-A を v2 に更新、v1 を retire
T2doc-A を再検索doc-A v2(新版)
T3v1 と v2 を混ぜて結論生成矛盾した成果物

これは分散システムでいう「破れた読み取り(torn read)」です。読み取りの一貫性が保証されないと、エージェントは自分の推論の前提が途中で崩れたことに気づけません。

ポイントは、これを完全な同時実行制御で解こうとしないことです。ストアへの書き込みを止めてエージェントを走らせるのは非現実的で、収益の入り口である本番アプリを止めることになります。必要なのは、書き込みは自由に続けさせたまま、読み手であるエージェントには「実行を始めた瞬間の世界」を見せ続ける仕組みです。

メタデータに版管理を持たせる

File Search はチャンクにメタデータを付与でき、検索時にフィルタをかけられます。この機構を版管理に転用します。

各チャンクに、有効期間を表す2つのフィールドを持たせます。

  • active_from: そのチャンクが有効になった論理時刻(単調増加する整数エポック)
  • retired_at: 無効化された論理時刻。現役なら大きな番兵値(例: 9999999999)

更新は「上書き」ではなく「旧版を retire して新版を追加する」操作に置き換えます。削除も物理削除ではなく retired_at を現在エポックに設定するソフトデリートです。こうすると、過去のどの時点の状態も、フィルタ式だけで復元できます。

エポックは実時刻ではなく、書き込みごとに増える論理カウンタを使います。実時刻はクロックのずれで逆転しうるからです。単一のカウンタ(例えば Firestore のトランザクショナルなインクリメント、または KV の原子的加算)を「版発行器」として1本用意します。

# 版発行器: 書き込みのたびに単調増加するエポックを払い出す
# KV の原子的インクリメントを想定(Firestore / Redis / Durable Object いずれでも可)
 
def next_epoch(kv) -> int:
    # 原子的加算。並行書き込みでも重複しない単調増加値を返す
    return kv.incr("filesearch:epoch")
 
def now_epoch(kv) -> int:
    v = kv.get("filesearch:epoch")
    return int(v) if v is not None else 0

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

この記事の続きを読む

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

この記事で得られること
実行エポックを固定して、エージェント1回分の検索結果を一貫したスナップショットに揃える具体的な実装
更新・削除をソフトデリート化する書き込み側の設計と、剪定タイミングのコスト試算
実行中に根拠がずれたときのドリフト検知とフェイルセーフの組み方
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

高度な活用2026-07-08
複数アプリのFAQを1つの File Search ストアに同居させる — customMetadata と chunk 設定で検索を分ける
複数アプリのFAQを1つの File Search ストアにまとめると、metadataFilter が無言で空を返したり、回答がチャンク境界で割れて引用されなかったりします。customMetadata の設計、AIP-160 フィルタ構文の落とし穴、chunkingConfig の実測チューニングを実装ベースでまとめました。
高度な活用2026-05-31
Gemini Embedding モデルを切り替える日:無停止リインデックスの設計
埋め込みモデルを新しくすると、過去に作った全ベクトルが使えなくなります。サービスを止めずに数十万件のベクトルを作り直す二重インデックス方式を、再開可能な再生成ジョブとクエリ側の抽象化層のコード付きで設計します。
高度な活用2026-07-03
夜間バッチが朝の 429 を連れてくる — 1 プロジェクト内で対話機能の Gemini クォータを守る優先度つきアドミッション制御
同一プロジェクトの RPM/TPM をバルク処理と対話機能が奪い合う問題を、機能タグつき計測と優先度つきトークンバケットで解消した設計と実測を記録します。429率3.2%→0.03%。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →