【RAG不要】Gemini APIの「Google検索グラウンディング」をPythonで実装!常に最新情報を持つAIエージェント構築ガイド

LLM(大規模言語モデル)を実務で活用する際、避けて通れないのが「情報の風化」と「ハルシネーション(嘘の回答)」です。これらを解決するアプローチとして、外部データベースと連携するRAG(Retrieval-Augmented Generation)が主流ですが、データの準備、ベクトルDBの構築、チャンク分割のチューニングなど、導入と運用には高いコストがかかります。

そこで注目されているのが、Googleが提供するGemini APIの「Google検索グラウンディング」(Google Search Grounding)機能です。

この機能を使えば、面倒なRAGの仕組みを一から構築することなく、LLMがリアルタイムにGoogle検索を実行し、最新のWeb情報を元に回答を生成してくれます。本記事では、Pythonを用いたGoogle検索グラウンディングの具体的な実装手順と、参照元ソース付きのAIエージェント構築方法を徹底的に解説します。


Google検索グラウンディングとは?RAGとの違い

Google検索グラウンディング」とは、Gemini APIのモデルが回答を生成する際、Google検索の検索結果をリアルタイムで参照(グラウンディング)し、正確で最新の情報に基づいた回答を出力する機能です。

RAGとグラウンディングの違い

比較項目独自のRAGシステムGemini Google検索グラウンディング
主な情報源社内文書、プライベートな独自データWeb上の公開情報、最新ニュース
構築難易度高い(ベクトルDB、埋め込み、検索パイプラインが必要)極めて低い(APIオプションを1行追加するだけ)
運用コストデータの更新、データベース維持コストが必要API利用料のみ(追加のDB管理が不要)
信頼性自社データに特化Google検索のインデックスに基づき最新かつ広範

社外秘の独自文書を参照させたい場合はRAGが必須ですが、「最新のニュース」「技術トレンド」「市場の動向」といったWeb上の公開情報を元に回答させたい場合、RAGを自作するのは明らかにオーバーエンジニアリングです。GeminiのGoogle検索グラウンディングを使えば、わずか数行のコードで「常に最新情報を持つAIエージェント」が完成します。


開発環境の準備

今回は、Googleが推奨している新しいSDKである google-genai を使用して実装を行います。

1. ライブラリのインストール

まずは、必要なPythonパッケージをインストールします。古い google-generativeai ではなく、新しい google-genai を使用することに注意してください。

pip install google-genai pydantic

2. APIキーの取得と環境変数の設定

Gemini APIを利用するには、Google AI StudioからAPIキーを取得する必要があります。 APIキーを取得したら、環境変数に設定します。

macOS/Linuxの場合:

export GEMINI_API_KEY="your-api-key-here"

Windows (PowerShell) の場合:

$env:GEMINI_API_KEY="your-api-key-here"

PythonによるGoogle検索グラウンディングの基本実装

それでは、実際にPythonコードを書いていきましょう。ここでは最新モデルである「gemini-2.0-flash」を使用し、Google検索を有効にしてクエリを投げます。

基本的な実装コード

import os
from google import genai
from google.genai import types

def generate_with_search(prompt: str):
    # クライアントの初期化(環境変数 GEMINI_API_KEY が自動で読み込まれます)
    client = genai.Client()

    # Google検索ツールを有効化
    config = types.GenerateContentConfig(
        tools=[types.Tool(google_search=types.GoogleSearch())],
        temperature=0.2, # ファクトチェック重視のため低めに設定
    )

    print(f"質問: {prompt}\n")
    print("AIがGoogle検索を実行して回答を生成中...")

    # モデルの呼び出し
    response = client.models.generate_content(
        model='gemini-2.0-flash',
        contents=prompt,
        config=config,
    )

    # 回答の表示
    print("\n【回答】")
    print(response.text)

    # グラウンディング情報の確認
    print_grounding_metadata(response)

def print_grounding_metadata(response):
    \"\"\"回答の根拠となったWebページの情報を表示するヘルパー関数\"\"\"
    try:
        # candidates[0].grounding_metadata から情報を取得
        metadata = response.candidates[0].grounding_metadata
        if not metadata or not metadata.grounding_chunks:
            print("\n※この回答には検索グラウンディング情報は使用されませんでした。")
            return

        print("\n【参照ソース(ソースリンク)】")
        for chunk in metadata.grounding_chunks:
            if chunk.web:
                title = chunk.web.title
                url = chunk.web.uri
                print(f"- {title}: {url}")
                
        # 検索キーワードの表示
        if metadata.web_search_queries:
            queries = ", ".join(metadata.web_search_queries)
            print(f"\n【実行された検索クエリ】\n  {queries}")

    except Exception as e:
        print(f"\nメタデータの取得中にエラーが発生しました: {e}")

if __name__ == \"__main__\":
    # 最新のニュースやトレンドに関する質問
    query = "現在の日本の内閣総理大臣の名前と、最近行われた主な政策について教えてください。"
    generate_with_search(query)

コードの解説

  1. google-genai SDKの利用: 従来のSDKから刷新され、from google import genai を使って直感的な実装が可能になりました。
  2. google_search ツールの指定: types.GenerateContentConfig 内の tools 引数に types.Tool(google_search=types.GoogleSearch()) を渡すだけで、自動で検索クエリの判断からWeb検索、コンテキストの統合までを行ってくれます。公式の詳細は Google Gemini API ドキュメント を参照してください。
  3. メタデータの抽出: response.candidates[0].grounding_metadata には、モデルが実際に検索した際のキーワードや、回答の根拠にしたWebサイトのタイトル、URL(URI)が格納されています。これを解析することで、ハルシネーションを防ぎつつユーザーに情報のソースを明示できます。

【応用】ソースリンク付きAIチャットエージェント

次に、過去の会話履歴を保持しながら、常に最新情報を検索して回答し、最後にマークダウン形式で「参照元リンク」を綺麗に出力するインタラクティブなチャットエージェントを構築してみましょう。

from google import genai
from google.genai import types

def run_chat_agent():
    client = genai.Client()
    
    # 検索グラウンディングを有効にしたチャットセッションの開始
    chat = client.chats.create(
        model="gemini-2.0-flash",
        config=types.GenerateContentConfig(
            tools=[types.Tool(google_search=types.GoogleSearch())],
            system_instruction="あなたは常に最新のWeb情報を元に回答する優秀なアシスタントです。回答の根拠となる情報がある場合は、回答の最後に必ず参照元リンクを提示してください。"
        )
    )
    
    print("=== Google検索機能付き AIチャットエージェント ===")
    print("終了するには 'quit' または 'exit' と入力してください。\n")
    
    while True:
        user_input = input("あなた: ")
        if user_input.lower() in ['quit', 'exit']:
            print("チャットを終了します。")
            break
            
        if not user_input.strip():
            continue
            
        try:
            # メッセージの送信
            response = chat.send_message(user_input)
            print(f"\nAI: {response.text}")
            
            # グラウンディングメタデータから参照元の表示
            metadata = response.candidates[0].grounding_metadata
            if metadata and metadata.grounding_chunks:
                print("\n[ソース元]")
                seen_urls = set()
                for chunk in metadata.grounding_chunks:
                    if chunk.web and chunk.web.uri not in seen_urls:
                        print(f" - [{chunk.web.title}]({chunk.web.uri})")
                        seen_urls.add(chunk.web.uri)
            print("-" * 50)
            
        except Exception as e:
            print(f"エラーが発生しました: {e}")

if __name__ == \"__main__\":
    run_chat_agent()

このエージェントをサーバーやVPSで常時稼働させることで、SlackやDiscordなどのチャットツールと連携した強力なオリジナルAIエージェントに発展させることができます。具体的なVPSでの常時稼働エージェント構築手順については、Claude搭載AIエージェントをVPSで常時稼働させる開発手順 で詳しく解説しています。

また、Gemini APIのWebSocketを用いたリアルタイム通信に興味がある方は、Gemini 2.0 Multimodal Live APIのPython実装ガイド もあわせて参考にしてください。


トラブルシューティング:よくあるエラーと解決策

実装中に遭遇しやすいエラーとその原因、解決策を整理しました。

1. ImportError または AttributeError が発生する

症状: from google import genai がインポートできない、もしくは client.models が存在しないというエラーが出る。

  • 原因: 過去の古いSDKである google-generativeai と、新しい google-genai が競合している、あるいは古いSDKしかインストールされていない可能性があります。
  • 解決策: 以下のコマンドで一度環境を整理し、最新のSDKをインストールし直してください。
    pip uninstall google-generativeai google-genai
    pip install google-genai
    

2. 検索メタデータ (grounding_metadata) が常に空になる

症状: 検索が必要な質問をしているにもかかわらず、回答に grounding_metadata が含まれない。

  • 原因:
    1. 使用しているモデルが検索グラウンディングに対応していない(例: 古い gemini-1.0-pro などを使用している)。
    2. APIの設定(config)が正しくモデルに渡されていない。
  • 解決策: モデルに gemini-2.0-flash または gemini-1.5-pro を指定しているか確認してください。また、generate_content の呼び出し時に config=config を忘れていないかコードを再チェックしてください。

3. APIキーが認識されない (API_KEY_INVALID 等)

症状: 実行時に GoogleGenAIError や認証エラーが発生する。

  • 原因: 環境変数の名前が間違っている、または環境変数が現在のターミナルセッションに反映されていません。
  • 解決策: SDKは自動的に GEMINI_API_KEY という名前の環境変数を探します。つづりが正しいか確認し、ターミナルを再起動するか、以下のようにコード内で直接キーを指定してクライアントを初期化してください。
    client = genai.Client(api_key="YOUR_ACTUAL_API_KEY")
    

まとめ

Gemini APIの「Google検索グラウンディング」を使用すれば、データ収集の手間やベクトルデータベースのインフラコストをかけることなく、高精度で最新情報に基づいたAIアプリケーションを瞬時に開発できます。

RAGをゼロから構築すると、インフラ費用だけでなくデータのクリーニングや検索アルゴリズムの調整に膨大な時間が奪われます。まずはGeminiのGoogle検索グラウンディングを活用し、スモールステップで最新情報を扱えるエージェントを作ってみることを強くおすすめします。