GEMINI LABEN
FLASH35 — Gemini 3.5 Flashが一般提供となり、gemini-flash-latestが指す実体になりました。日常的な生成を速く安価にこなせますAGENTS — Gemini APIのManaged Agentsがpublic previewに。Google管理の隔離Linuxサンドボックスで自律的なエージェントを構築できますMEDIA — Nano Banana 2 Lite(画像)とGemini Omni Flash(動画・会話的編集)がAI Studio・API・Enterprise Agent Platformで利用可能にTTS — gemini-3.1-flash-tts-previewの音声生成がstreamGenerateContent経由でストリーミング対応になりましたTRANSLATE — 新しい音声モデルが70以上の言語を自動判別し、話者の自然な抑揚を保ったままライブ音声翻訳を行いますSPENDCAP — AI Studioにプロジェクト単位の費用上限が導入され、支出を安全側に抑えられるようになりましたFLASH35 — Gemini 3.5 Flashが一般提供となり、gemini-flash-latestが指す実体になりました。日常的な生成を速く安価にこなせますAGENTS — Gemini APIのManaged Agentsがpublic previewに。Google管理の隔離Linuxサンドボックスで自律的なエージェントを構築できますMEDIA — Nano Banana 2 Lite(画像)とGemini Omni Flash(動画・会話的編集)がAI Studio・API・Enterprise Agent Platformで利用可能にTTS — gemini-3.1-flash-tts-previewの音声生成がstreamGenerateContent経由でストリーミング対応になりましたTRANSLATE — 新しい音声モデルが70以上の言語を自動判別し、話者の自然な抑揚を保ったままライブ音声翻訳を行いますSPENDCAP — AI Studioにプロジェクト単位の費用上限が導入され、支出を安全側に抑えられるようになりました
記事一覧/高度な活用
高度な活用/2026-06-27上級

Gemini Deep Research のレポートを鵜呑みにしない — MCP連携時に引用元を機械検証してから取り込む受け入れゲート

Deep ResearchがMCPで自前データに繋がった今、返ってきたレポートを自動取り込みする前に、引用が信頼ソースへ解決できるかを機械検証する受け入れゲートを実装します。許可リスト・根拠カバレッジ率・却下理由の記録まで動くコードで設計します。

Gemini74Deep Research6MCP4File Search6検証2

プレミアム記事

2026年6月27日の更新で、Deep Research の新版が MCP サーバー連携と File Search に対応しました。これまで公開情報を広く調べてくれる機能だったものが、自前のデータストアや手元の MCP ツールを「根拠」として参照できるようになった、という変化です。個人開発で運用の自動化を回している立場からすると、これは素直に嬉しい更新でした。自分のドキュメントやログを根拠に調べ物をさせて、その結果をそのまま下書きパイプラインに流せそうに見えるからです。

ただ、実際に組み込もうとして最初に立ち止まったのは「返ってきたレポートを、本当にそのまま取り込んでよいのか」という点でした。Deep Research の出力は引用つきの散文です。引用がついていると一見もっともらしく読めますが、その引用が本当に自分の信頼しているソースに解決できるのか、それとも外部の出所不明なページや、実体のない参照に紐づいているのかは、文面を眺めただけでは判別できません。無人で取り込む構成では、ここが抜けると「もっともらしいが根拠の怪しい文章」が静かに蓄積していきます。

以下では、Deep Research のレポートを自動取り込みする手前に挟む「受け入れゲート」を実装します。中身は、引用を構造で取り出し、信頼ソースの許可リストへ解決できるかを確かめ、根拠カバレッジ率がしきい値を下回ったら取り込みを止める、という3段構えです。ゲートのコアは外部 API の形に依存しない素の検証ロジックなので、Deep Research の SDK が細部で変わっても作り直さずに済みます。

そのまま信じてしまう構成の、どこが危ういのか

Deep Research を MCP に繋ぐと、調査の根拠として「自分の File Search ストアの文書」と「外部 Web」の両方が混ざり得ます。レポート本文には主張があり、その主張に引用が添えられます。問題は、引用の出所が三種類に分かれることです。ひとつは自分の信頼ソース(許可リストに載っている File Search の文書 ID や自分が許可したドメイン)。ふたつめは外部の知らないドメイン。みっつめは、解決しようとしても実体に辿り着けない引用です。

無人取り込みで事故るのは、二番目と三番目が混じったまま「引用あり=信頼できる」と扱ってしまうときです。とくに三番目は厄介で、引用が形式上は付いているのに、その media_id やページ番号、URL が実際のソースに解決できない、というケースが混ざります。人がレビューしていれば「これは出典が変だ」と気づきますが、自動化ではそのまま通ります。

ですから受け入れゲートで確かめたいのは、レポートの読みやすさでも文章の長さでもなく、たったひとつ「個々の引用が、信頼できるソースへ実際に解決できるか」です。これを主張ごとに集計し、解決できた割合(根拠カバレッジ率)で取り込みの可否を決めます。

レポートを構造で受け取る

検証を機械でやるには、まず引用を散文から取り出して構造にする必要があります。Deep Research を Interactions API 経由で呼ぶときは、ツールとして自分の MCP コネクタと File Search を渡し、出力に grounding メタデータを含めて受け取る形になります。下記はリクエストの骨格です。フィールド名は2026年6月の changelog に沿っていますが、利用中の SDK バージョンに合わせて微調整してください。検証の本体は次節以降の純粋なロジックなので、ここが多少変わってもゲートは作り直しになりません。

from google import genai
from google.genai import types
 
client = genai.Client()
 
# Deep Research を「自前データ優先」で走らせる骨格
# - 自分の MCP サーバーと File Search を根拠ソースとして渡す
op = client.interactions.create(
    model="gemini-flash-latest",  # 3.5 Flash GA。下調べ用途は速度とコストが効く
    agent="deep-research",
    input="社内の運用ログを根拠に、今月の自動投稿の失敗傾向をまとめてください",
    tools=[
        types.Tool(file_search=types.FileSearch(
            file_search_store_names=["projects/me/locations/global/fileSearchStores/ops-logs"],
        )),
        types.Tool(mcp=types.McpConnector(
            server_url="https://mcp.example.internal/ops",
            allowed_tools=["search_runs", "get_run"],
        )),
    ],
    config=types.InteractionConfig(
        include_grounding_metadata=True,  # 引用を構造で受け取る
        background=True,                  # 長時間処理は webhook で受ける
    ),
)

ここで大切なのは include_grounding_metadata=True です。これがないと、引用は本文中の脚注的な表現としてしか得られず、機械検証が一気に難しくなります。構造化された引用が取れれば、後段は素直なデータ処理になります。

受け取り側では、レポートを「主張(claim)」と「その主張に紐づく引用(citations)」の配列として正規化します。引用は出所の種類によって持っている情報が違うので、共通の形に寄せておきます。

from dataclasses import dataclass, field
 
@dataclass
class Citation:
    kind: str                       # "file_search" | "web" | "mcp"
    doc_id: str | None = None       # File Search の文書 ID
    media_id: str | None = None     # 視覚引用の media_id
    page_numbers: list[int] = field(default_factory=list)
    url: str | None = None          # web / mcp の出所 URL
 
@dataclass
class Claim:
    text: str
    citations: list[Citation]
 
def normalize_report(grounding) -> list[Claim]:
    claims: list[Claim] = []
    for seg in grounding.segments:
        cites = []
        for c in seg.citations:
            cites.append(Citation(
                kind=c.source_type,
                doc_id=getattr(c, "document_id", None),
                media_id=getattr(c, "media_id", None),
                page_numbers=list(getattr(c, "page_numbers", []) or []),
                url=getattr(c, "uri", None),
            ))
        claims.append(Claim(text=seg.text, citations=cites))
    return claims

この normalize_report を通すと、レポートが「主張と引用のリスト」という、検証しやすい形になります。ここから先は外部 API に触れません。

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

この記事の続きを読む

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

この記事で得られること
Deep Research の grounding メタデータ(doc_id / media_id / page_numbers)を構造で受け取り、信頼ソースへの解決可否で判定する具体実装
File Search 文書IDと許可ドメインの許可リスト照合、根拠カバレッジ率(初期しきい値 0.85)による縮退ロジック
却下理由(doc_id_not_allowed / media_unresolvable / domain_not_allowed)をSQLiteに記録し毎晩見直す運用設計
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

高度な活用2026-07-10
ADK アシスタントが三日前の約束を静かに忘れていた — 会話圧縮の記憶欠落を再現テストで炙り出す
Google ADK と Gemini で会話履歴を圧縮すると、コストは下がる代わりにアシスタントの記憶が静かに欠けていきます。リコールプローブという再現テストで欠落を数値化し、圧縮戦略を根拠を持って選ぶまでの実装手順をまとめました。
高度な活用2026-07-08
Managed Agent の実行中に知識ベースが書き換わる問題 — File Search を実行エポックで固定する一貫性設計
Managed Agents の自律実行中に File Search ストアが更新されると、同じ実行の中で古い根拠と新しい根拠が混ざります。MVCCに倣った実行エポックの固定で、エージェント1回分の根拠を一貫させる設計と実装をまとめました。
高度な活用2026-07-08
複数アプリのFAQを1つの File Search ストアに同居させる — customMetadata と chunk 設定で検索を分ける
複数アプリのFAQを1つの File Search ストアにまとめると、metadataFilter が無言で空を返したり、回答がチャンク境界で割れて引用されなかったりします。customMetadata の設計、AIP-160 フィルタ構文の落とし穴、chunkingConfig の実測チューニングを実装ベースでまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →