【失敗談】Gemini 2.0 APIでグーグル検索によるグラウンディング機能を使おうとして2日間潰した話
結論を3行で
- Gemini APIに検索させると、Brave APIでURLを取得してスクレイピングするよりも早くて便利らしいと知る
- 公式のサンプルはGemini 1.5 モデル用。2.0以降のやり方を探すのに2日間かかる
- 解決した後に親切な方がnoteに書いてるのを知って力抜ける
最初にそのnoteの記事も紹介しておきます。
事の経緯
ある時、Xで「Brave APIを使うよりもGeminiに検索させた方が速くて便利」って話を見かけて、自分でもやってみたくなった、というのがすべてです。
(うろ覚えですが)その方はサンプルのコードをスクショか何かでアップされていて、それを真似て、Google Colabで実装したところ検索ができました。
「あ、これめっちゃ便利じゃん!」
ってことで、Colab上で自作のDeep Researchみたいなのを作ったりしてました。
ただ、Colabだとどうしてもクリック、クリック・・・と手作業感が残るため、「ローカルに移して定時実行など使って完全自動化したい」と思い始めたのが、今回の2日間のきっかけです。
いろいろ躓いたところ
「ColabとローカルのPythonでAPIキーって渡し方違うよね?どうやってわたせばいいんだろう?」ってAIに聞いたところ、「このライブラリを入れてこうすれば動くよ!」って出てきたものが、動かなかったってところから迷宮入りです。
ここから先は、今回トラブったところをChatGPT o3にまとめてもらったものをざっくりと貼っていきます。
結論から述べると、「SDKの開発速度が速すぎて、ドキュメントの更新やAIの知識が追いついてない」だそうです。
モデル世代とツール名がズレてた
これはGoogleの公式ページに書いてたサンプル例を丸ごと取り入れようとしたらトラブったところですかね。
「検索グラウンディングを構成する」って項目にはAPIキーの渡し方が書いておらず、「スタートガイド」のほうにはキーの扱い含めて記載があります。ですが、こっちはGemini 1.5モデルのみって記載で指定したモデルと合わないってオチですね。
SDK バージョン混在
というわけで、1.5用のコードに2.0のモデルを設定して、「これ動かないけど」ってAIに投げると、ライブラリが足りないとかいろいろ言われます。だいたいgoogle-generativeaiを入れろと言われるのですけど、そうすると違う部分でエラーが出るんですよね。
そんな感じで迷宮入り。
環境変数名 vs 直接キー
スキル不足をごまかす苦しい言い訳すると、普段はGemini使ってなかったのです。。。せめてキーの渡し方ぐらいはサンプルに書いておいて欲しいですw
generation_config の置き場所ミス
当初はGeminiの公式チャットとか使ってましたが、このあたりからChatGPT o3に丸投げです。
これはo3が出してくれたソースコードが間違ってたって部分で、ローカルで実行→エラーの出力をそのまま渡して再検索って形でだいぶ頑張ってもらいました。
URL の取り方を勘違い
これもo3が出してくれたソースコードが間違ってたって部分。print(resp)でrespの中身をすべて表示させ、そこからリンクだけ取り出してもらう形に作ってもらいました
実際に動作したコード例
以下は実際に動作したソースコード例です。
ソースコード
import os
import requests
from dotenv import load_dotenv
from google import genai
from google.genai import types
# APIキーを呼び出し
load_dotenv()
client = genai.Client(api_key=os.getenv("GEMINI_API_KEY"))
# Google 検索ツールを宣言
search_tool = types.Tool(
google_search=types.GoogleSearch()
)
# 最新情報を取得して表示させる処理
resp = client.models.generate_content(
model='gemini-2.0-flash-001',
contents='2025年5月12日の米国株について教えて',
config=types.GenerateContentConfig(
tools=[search_tool],
temperature=0.6
)
)
print(resp.text)
# ここから取得したURLをわかりやすく表示させる処理(ちょっと遅い)
cand = resp.candidates[0]
urls = []
cleaned = []
gm = getattr(cand, "grounding_metadata", None)
if gm and gm.grounding_chunks:
for chunk in gm.grounding_chunks:
if chunk.web and chunk.web.uri:
urls.append(chunk.web.uri)
for u in urls:
r = requests.get(u, allow_redirects=True, timeout=5)
cleaned.append(r.url)
print(cleaned)
使ってるライブラリのバージョンは
python = "^3.12"
dotenv = "^0.9.9"
google-genai = "^1.14.0"
これを実行すると、以下のように最新情報を取得できます。
あれ?すでにnoteでサンプルあるじゃんね?
というわけで、「おっしゃー!!できたー!!これ、Zennとかに残しておこうかな」と思いつつ、XのTLで「Gemini API 検索」で調べたら、冒頭の方のnoteが出てきたのがオチですね。
やっぱり誰かが先に通ってるものですね。
とはいえ、せっかくだし書いておけば後々役立つっしょってことで、ここに書いておくことにしておきました。まさか、こんな形でZennのアカウント作るなんてw
また見てね!
また、記事を書くのでフォローしてね!
Xはお金の話中心です
Discussion