店名 Web 検索の試行知見¶
2026-08-16 に、支出保存前の店名を Gemini の Google Search grounding で正規化する実装を一度入れた。
無料枠まわりの制約が運用に合わなかったため、同日中に revert した(8f49287)。
コードには残っていない。
再実装するときの判断材料として、ここで得た事実だけを残す。
いまの結論¶
店名の Web 検索は 現状オフ である。
解釈(interpret)だけが Gemini を使う。
無料枠のまま「モデル指定+ Google Search grounding」で店名を安定して取るのは難しい、という判断である。 理由は次節のとおり、モデルの通常 RPD と Search Grounding の枠が別であり、かつ新規キーでは 2.5 系が使えないためである。
試したこと¶
- 支出 create の直前に、別呼び出しで店名を grounding 付き generateContent する
- 曖昧なときは Discord で番号選択する
- 「記録しないで」で DB 非保存のプレビュー経路を足し、検索だけ試せるようにする
- 解釈用と検索用でモデルチェーンを分ける(
MERCHANT_LOOKUP_MODELS)
いずれも revert 済みである。
無料枠・モデルで詰まった点¶
通常の RPD と Search Grounding は別¶
AI Studio の「モデルごとのレート制限」で 通常の RPD が空いていても、grounding 付き呼び出しが 429 RESOURCE_EXHAUSTED になることがある。
Gemini 3 系では、無料枠で Search Grounding が使えない、または grounding 専用クォータが先に枯れる、という報告が多い。 ダッシュボードではモデル行の RPD だけ見て「使えるはず」と判断しない。 Search Grounding の行も見る。
確認用: レート制限(直近28日)
解釈のあとに検索すると枠を二回食う¶
1 通の Discord メッセージで、だいたい次の 2 回 API を叩く。
interpret(structured JSON)- 店名検索(grounding)
gemini-3.5-flash の無料 RPD はごく小さい(実測で 20/日前後)。
解釈だけで枯れると、フォールバックに落ちる。
検索まで同じ日に重ねると、さらに厳しい。
新規キーでは 2.5 Flash Lite が 404¶
gemini-2.5-flash-lite はドキュメント上まだ存在するが、このプロジェクトの API キーでは次のエラーになった。
「無料の Search 枠がある 2.5 に逃げればよい」は、新規キーでは成立しないことがある。
廃止・弱いフォールバック¶
| モデル | 観測 |
|---|---|
gemini-1.5-flash |
404 NOT_FOUND(generateContent 不可) |
gemini-3.5-flash |
無料 RPD が極小。すぐ 429 |
gemini-3.5-flash-lite |
解釈フォールバックとして実運用で 200 を確認 |
gemini-3.1-flash-lite |
モデル自体は呼べるが、grounding で 429 になった |
解釈フォールバックに検索専用モデルを重ねると、1 通で同じモデルを連続で叩いて 429 になりやすい。 役割を分けるなら、解釈チェーンと検索チェーンでモデルを共有しない。
JSON schema と grounding の相性¶
response_mime_type=application/json や response_schema を 同じ呼び出し に付けると、一部モデルでは Google Search grounding が黙って無効化される。
HTTP は 200 のまま、記憶だけで店名をエコーする、という見え方になる。
プロンプト本文で「JSON だけ返せ」と書くだけでも、同様に grounding が弱まる/無効になる報告がある。 検索させるなら tools のみで一度呼び、整形は別呼び出し、という二段が安全側である。
別経路の候補(未採用)¶
| 経路 | 利点 | コスト |
|---|---|---|
| Gemini 課金+ grounding | いまの設計に近い | Gemini 側の従量・ティア |
| Google Places / Custom Search | モデル枠に依存しない | 別 API・別課金 |
| 検索なし(人手の店名のまま) | 単純 | 正規化されない |
「モデル非依存の検索」は可能だが、Places 等は Gemini 無料枠の延長ではない。
再実装するときの最低条件¶
次を満たせないうちは、また同じところで止まる。
- Search Grounding(または Places 等)が、この API キーで実際に成功する呼び出しを journal で確認済みであること
- 解釈用モデルと検索用モデル(または検索 API)の枠が、1 日の想定通数で足りること
- 失敗時に「特定できへん」と枠切れ・404 を混同しないこと(ログと Discord で理由を分ける)
起動直後のログで、実際に使うモデルチェーンを出すこと。 AI Studio の利用が増えないのに Discord だけ 429 なら、別モデルを叩いているか、古いプロセスの可能性が高い。
運用メモ(解釈まわり)¶
店名検索とは独立に、いまの運用で使える観察である。
gemini-1.5-flash をフォールバック末尾に残しても、404 で実質無効である。
gemini-3.5-flash の日次枠を使い切った日は、一時的に GEMINI_MODEL=gemini-3.5-flash-lite にすると会話自体は続けやすい。