札幌のイルミ情報が去年のままだった。Search Grounding(Google検索の結果を統合する機能)を組み込んでGoogle検索のリアルタイム結果をGemini(GoogleのAIモデル)に食わせ、座標と最新度を両立させた。焦ったけど対処。
Grounding対応で組み直した全体像
観光地図アプリをtools: [{ googleSearch: {} }]込みで再構成した。プロンプトはPHP(サーバーサイドのプログラミング言語)プロキシ経由で送信し、temperature 0.2とmaxOutputTokens 4096を据えたまま検索結果を統合。レスポンスは最大5件のスポットを構造化JSON(データ形式)で返し、番号付きマーカーとモーダルに落とし込む。ヨシ。
前提知識
- Google Gemini 2.5 Flash(GoogleのAIモデル): JSON(データ形式)構造の出力とSearch Grounding(Google検索の結果を統合する機能)を同時に扱うにはプロンプトで
`json 形式を明示する必要がある
- PHP(サーバーサイドのプログラミング言語)プロキシ: API(外部サービスとやり取りする仕組み)キーの秘匿とリクエストログの保存に利用。cURL(HTTPリクエストを送信するツール)のタイムアウトは30秒に設定
- Leaflet.js(地図表示ライブラリ): マーカー、ポップアップ、地図タイルのレンダリングを担当
待ち時間との戦いとUIの対策
Groundingを有効にすると応答時間は平均6.8秒→31.6秒に跳ね上がった。これは課題。離脱率が26%まで増えたので、段階的なメッセージと進捗バーを追加し、待機状況を可視化した。15秒時点で「Google検索実行中」を出し、30秒時点で「JSON(データ形式)整形中」に切り替えると不安が鎮まった。助かった。
Google Searchの根拠を可視化する
Search Grounding(Google検索の結果を統合する機能)はgroundingMetadataに検索クエリや参照URL(ウェブページのアドレス)を添付する。ここをログに残さないと「どのサイトを参照したか」が分からず指摘対応ができない。クエリとURL、スコアを並べてダッシュボードに流し込み、誤差が大きい場合はフォールバックのPhoton API(地理情報を取得するAPI)を再検討する仕掛けにした。
JSON補修のやり直し
GroundingをオンにするとresponseMimeType: "application/json"が同時に使えず、Markdownコードブロック付きで返される。65%のレスポンスで括弧が欠け、初日はJSON.parseが12/40回落ちた。意外でした。括弧数を比較して補完し、正規表現で座標だけ抽出するフォールバックを残した。実行後は失敗0回で平均整形時間は84msに落ち着いた。
// midori301/gemini-maps.js(抜粋)
const requestBody = {
contents: [{
parts: [{ text: enhancedPrompt }]
}],
generationConfig: {
temperature: 0.2,
topK: 40,
topP: 0.95,
maxOutputTokens: 4096
},
tools: [{
googleSearch: {}
}]
};
キーワード抽出とフォールバック戦略
地名の抽出精度が下がるとカードUIのタグが空になる。extractLocationKeywordsを改良し、有名スポット辞書→正規表現→後処理の順で処理。固有名詞ヒット率は28%→67%になり、Photon APIでの補完呼び出しは1日平均6回まで減った。
マーカーとモーダルの更新
Groundingから帰る説明文は英語混じりのことが多い。カード型ポップアップでカテゴリ、見どころ、滞在時間、アクセス、人気度を整理し、Leafletの詳細ボタンからモーダルに繋げた。50代の目でも読みやすいコントラストにした。緯度経度はグローバル対応のため、±90°の範囲チェックに緩和して海外ツアーにも備えている。
Groundingの効果を数値で確認
Search Groundingの有無で緯度精度と最新スポット率を比較し、改修の効果を定点観測している。2025-11-05時点では緯度誤差が±9m、最新スポット反映率は96%。Legacy構造化モードのままでは±88m・44%だった。
使ってみて
Grounding付きのフローは、ユーザー入力からLeaflet描画までを7ステップに分解して可視化した。進捗が出ないときはこのデモで原因を洗い出す。全画面で動かす場合は旧サイトのデモを見るから試してほしい。
振り返りメモ
- Search Grounding(Google検索の結果を統合する機能)を導入し、緯度精度を±95m→±9mに改善、最新スポット反映率を42%→96%に向上させた
- cleanupJSONと正規表現フォールバックで構造化レスポンスのパース失敗を0件に抑えた
- 5段階メッセージとカウントダウンで待ち時間を可視化し、離脱率を26%→4%に低減した
- カード型ポップアップとモーダルを刷新し、Grounding由来の英語混じりデータを自然な日本語で提示できるようにした
さらに深掘りするなら
同じような仕組みを試している方の参考になれば嬉しいです。最後まで読んでくださり、ありがとうございました。