GEMINI LABEN
FLASH — Gemini 3.5 Flashが一般提供(GA)に。エージェントやコーディングで持続的なフロンティア性能をうたいますAGENTS — Gemini APIにManaged Agentsがパブリックプレビュー。Googleホストの隔離Linuxサンドボックスで自律エージェントを実行できますWEBHOOK — イベント駆動のWebhooksが追加され、Batch APIや長時間処理のポーリングを置き換えられますSEARCH — File Searchがマルチモーダル対応に。gemini-embedding-2で画像も埋め込んで検索できますSUNSET — gemini-3.1-flash-image-preview・3-pro-image-previewは6/25に停止予定ですANTIGRAVITY — Antigravity Agentのマネージドエージェント(antigravity-preview-05-2026)がプレビュー提供されていますFLASH — Gemini 3.5 Flashが一般提供(GA)に。エージェントやコーディングで持続的なフロンティア性能をうたいますAGENTS — Gemini APIにManaged Agentsがパブリックプレビュー。Googleホストの隔離Linuxサンドボックスで自律エージェントを実行できますWEBHOOK — イベント駆動のWebhooksが追加され、Batch APIや長時間処理のポーリングを置き換えられますSEARCH — File Searchがマルチモーダル対応に。gemini-embedding-2で画像も埋め込んで検索できますSUNSET — gemini-3.1-flash-image-preview・3-pro-image-previewは6/25に停止予定ですANTIGRAVITY — Antigravity Agentのマネージドエージェント(antigravity-preview-05-2026)がプレビュー提供されています
記事一覧/高度な活用
高度な活用/2026-06-21上級

Gemini の Maps Grounding が本番で静かに外れるとき — アトリビューション義務・課金の境界・不発時のフォールバックの運用メモ

Gemini の Grounding with Google Maps を本番に載せた後で効いてくる落とし穴を運用視点でまとめます。グラウンディングの不発検知、アトリビューション表示の義務、課金が発生する境界、鮮度のずれに備えるフォールバックの実装です。

gemini86google-maps2grounding4vertex-ai6location-aipython90

プレミアム記事

Grounding with Google Maps をデモで動かすと、たいてい気持ちよく動きます。問題が出るのは、リリースして数日が経ち、ログを眺め始めてからです。回答は返ってくるのに地図情報が混ざっていない応答がぽつぽつ現れ、請求額は想定とずれ、ユーザーから「店の営業時間が違った」という報告が届く。どれもエラーにはならず、HTTP 200 のまま静かに起きます。

ここでは、レストラン検索や周辺情報のアシスタントを本番に載せたあとで実際に効いてくる四つの論点を、運用側のコードとともに整理します。セットアップの手順そのものより、「動いているように見えて外れている」状態をどう捕まえるかに重心を置きます。対象は、Vertex AI 経由で Maps Grounding を一度は動かしたことのある中級〜上級のエンジニアです。

なお、Maps Grounding は Vertex AI 経由でのみ動作し、通常の API キー認証の Gemini API では呼び出せません。対応モデルや料金の細目は更新が早いので、実装に入る前に Vertex AI 生成 AI の料金 と公式のツールドキュメントで最新の対応表を確認してください。本稿のコードは対応モデルを設定値として外に出し、差し替えやすくしてあります。

グラウンディングが「静かに不発する」のを検知する

最初に作り込むべきは、地図情報が使われたかどうかの判定です。Gemini は、クエリを位置情報の問い合わせと判断したときだけ Maps を参照します。判断が外れると、モデルは自分の内部知識だけで答えを作り、それらしい店名を返してきます。これが一番こわい失敗で、応答は流暢なのに裏取りがされていません。

判定の根拠は応答テキストではなく grounding_metadata に置きます。チャンクが一件も無ければ、その回答は地図に裏打ちされていないと見なします。

# grounding_guard.py
from dataclasses import dataclass
 
@dataclass
class GroundedResult:
    text: str
    sources: list[dict]
    grounded: bool          # 地図ソースが1件以上付いたか
    used_maps: bool         # 課金対象となる Maps 応答だったか
 
def inspect(response) -> GroundedResult:
    """応答から地図グラウンディングの有無を判定する。"""
    sources: list[dict] = []
    candidate = (response.candidates or [None])[0]
    metadata = getattr(candidate, "grounding_metadata", None) if candidate else None
 
    for chunk in getattr(metadata, "grounding_chunks", []) or []:
        web = getattr(chunk, "web", None)
        if web and getattr(web, "uri", None):
            sources.append({
                "title": getattr(web, "title", "") or "(無題)",
                "uri": web.uri,
                "place_id": getattr(web, "place_id", None),
            })
 
    grounded = len(sources) > 0
    return GroundedResult(
        text=response.text or "",
        sources=sources,
        grounded=grounded,
        used_maps=grounded,
    )

不発を検知したら、黙ってそのまま返さないことが肝心です。位置情報に裏打ちされていない旨を一言添えて返すか、用途によっては Places API の素朴な近接検索へ切り替えます。個人開発で位置情報アプリを運用している私自身も、ユーザーへ返す前にこの一言を必ず差し込む方針にしてから、「実在しない店を案内された」という種類の苦情がほぼ消えました。これは本番運用で最初に踏みがちな落とし穴で、流暢な誤答をそのまま信じてもらうより、断りを入れるほうがアプリへの信頼はむしろ上がります。

def to_user_payload(result: GroundedResult) -> dict:
    if result.grounded:
        return {"answer": result.text, "sources": result.sources, "verified": True}
    # 不発時: 地図裏付けが無いことを明示して返す
    note = "(注:今回の回答は地図のリアルタイム情報で確認できていません。営業状況は各店舗で再確認してください。)"
    return {"answer": f"{result.text}\n\n{note}", "sources": [], "verified": False}

不発はクエリの書き方にも左右されます。「カフェを教えて」のような抽象的な問いより、地名や施設名・「近くの」といった近接表現を含む問いのほうが地図参照が発火しやすい傾向があります。システムプロンプトで「場所を尋ねる問いには必ず地名か現在地を補ってから検索する」と促しておくと、不発率はある程度下げられます。ただしゼロにはならない前提で、上の検知層は残しておきます。

アトリビューションは「描画して初めて要件を満たす」

Maps Grounding を使う以上、参照したソースのアトリビューション表示は任意ではなく要件です。grounding_metadata を取得しただけでは足りず、ユーザーが見る画面に実際に描画されて初めて満たされます。抽出はできているのに UI 側で捨てている、という取りこぼしが本番で一番起きやすい箇所です。

# attribution.py
import html
 
def render_attribution(sources: list[dict]) -> str:
    """Maps ソースを安全にエスケープして表示用 HTML に変換する。"""
    if not sources:
        return ""
    items = "\n".join(
        f'  <li><a href="{html.escape(s["uri"])}" target="_blank" '
        f'rel="noopener noreferrer">{html.escape(s["title"])}</a></li>'
        for s in sources
    )
    return (
        '<div class="maps-attribution" '
        'style="font-size:13px;color:#5f6368;margin-top:12px;">\n'
        "  <span>情報提供元(Google Maps):</span>\n"
        f"  <ul style=\"margin:4px 0;padding-left:16px;\">\n{items}\n  </ul>\n"
        "</div>"
    )

titleuri は外部由来の文字列なので、必ずエスケープしてから埋め込みます。ここを生で渡すと、店名に紛れ込んだ記号でレイアウトが崩れたり、最悪の場合スクリプト混入の経路になります。

実装上もう一つ意識したいのは、対話型 UI で地図ウィジェットを出すかテキストのリンクで済ませるかの選択です。チャット形式でユーザーに地図を触ってもらいたい場合はウィジェット連携を有効にし、サーバー側で要約だけを返すバッチ処理ではテキストのアトリビューションで足ります。要件の正確な範囲は更新されることがあるため、ウィジェットの扱いとアトリビューションのスタイル規定は公式ドキュメントで都度確認するのが安全です。要点は、メタデータを取得したら必ずレンダリングまで一本の経路でつなぐことです。

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

この記事の続きを読む

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

この記事で得られること
grounding_metadata が空のまま返る『静かな不発』を検知し、位置情報の断りを添えて返すフォールバックの実装
Maps ソースのアトリビューションを欠かさず描画するための抽出・描画パターンと、課金が発生する応答の数え方
本番でレイテンシと鮮度のずれを吸収する、タイムアウト分離・キャッシュ境界・営業情報の再確認の運用設計
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

高度な活用2026-04-27
Gemini Computer Use の自己修復アーキテクチャ — 失敗するブラウザ自動化を本番で安定稼働させる設計パターン
Gemini Computer Use のブラウザ自動化を本番で運用すると、要素消失・モーダル割り込み・ネットワーク遅延で頻繁に失敗します。失敗を「自己修復」させる回復戦略を、検出・分類・リトライ・人間介入のレイヤーに分けて、Pythonの動くコードで設計します。
高度な活用2026-04-22
Gemini × DSPy で「プロンプト職人」から卒業する — プロンプト自動最適化パイプライン実装ガイド
Stanford 発の DSPy フレームワークと Gemini を組み合わせ、プロンプトを手書きする時代を終わらせる実装ガイド。Signature・Module・Optimizer の設計から、自作評価関数・本番パイプラインまでをコード付きで解説します。
API / SDK2026-06-19
Gemini API の Google Maps グラウンディングで位置情報AIを作る — 料金とソース表示の義務を踏まえた実装メモ
Gemini API の Google Maps グラウンディングで「近くのおすすめ」を実装する手順を、$25/1K の課金設計と出典表示の義務までまとめた、個人開発者向けの運用メモです。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →