Google 検索によるグラウンディング

Google 検索によるグラウンディングは、Gemini モデルを一般公開されているリアルタイムの ウェブ コンテンツに接続します。これにより、モデルはより正確で最新の回答を提供し、ナレッジ カットオフを超えて検証可能なソースを引用できます。

Google 検索によるグラウンディングには、次のようなメリットがあります。

  • 事実の正確性の向上: 実世界の情報を基に 回答することで、モデルのハルシネーションを減らします。
  • リアルタイムの情報へのアクセス: 最近のイベント やトピックに関する質問に回答します。
  • ソースの提供: モデルの主張のソースを表示することで、ユーザーの信頼を得たり、ユーザーが 関連サイトを閲覧できるようにします。
  • より複雑なタスクの完了: 推論タスクを支援するために、アーティファクトや関連する画像、 動画、その他のメディアを取得します。
  • 地域や言語に固有の回答の改善: 地域固有の 情報を検索したり、コンテンツの正確な翻訳をサポートしたりします。

サポートされているモデル

  • gemini-3.1-pro-preview
  • gemini-3-flash-preview
  • gemini-3.1-flash-lite-preview
  • gemini-3-pro-image-preview(別名「Nano Banana Pro」)
  • gemini-3.1-flash-image-preview(別名「Nano Banana 2」)
  • gemini-2.5-pro
  • gemini-2.5-flash
  • gemini-2.5-flash-lite
  • gemini-2.0-flash-001(および自動更新されるエイリアス gemini-2.0-flash

サポートされている言語

対応言語については、Gemini モデルをご覧ください。

Google 検索でモデルをグラウンディングする

Gemini API プロバイダをクリックして、このページでプロバイダ固有のコンテンツとコードを表示します。

GenerativeModel インスタンスを作成するときに、モデルが回答の生成に使用できる tool として GoogleSearch を指定します。

Swift


import FirebaseAILogic

// Initialize the Gemini Developer API backend service
let ai = FirebaseAI.firebaseAI(backend: .googleAI())

// Create a `GenerativeModel` instance with a model that supports your use case
let model = ai.generativeModel(
    modelName: "GEMINI_MODEL_NAME",
    // Provide Google Search as a tool that the model can use to generate its response
    tools: [Tool.googleSearch()]
)

let response = try await model.generateContent("Who won the euro 2024?")
print(response.text ?? "No text in response.")

// Make sure to comply with the "Grounding with Google Search" usage requirements,
// which includes how you use and display the grounded result

Kotlin


// Initialize the Gemini Developer API backend service
// Create a `GenerativeModel` instance with a model that supports your use case
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
    modelName = "GEMINI_MODEL_NAME",
    // Provide Google Search as a tool that the model can use to generate its response
    tools = listOf(Tool.googleSearch())
)

val response = model.generateContent("Who won the euro 2024?")
print(response.text)

// Make sure to comply with the "Grounding with Google Search" usage requirements,
// which includes how you use and display the grounded result

Java


// Initialize the Gemini Developer API backend service
// Create a `GenerativeModel` instance with a model that supports your use case
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
                .generativeModel("GEMINI_MODEL_NAME",
                        null,
                        null,
                        // Provide Google Search as a tool that the model can use to generate its response
                        List.of(Tool.GoogleSearch()));

// Use the GenerativeModelFutures Java compatibility layer which offers
// support for ListenableFuture and Publisher APIs
GenerativeModelFutures model = GenerativeModelFutures.from(ai);

ListenableFuture response = model.generateContent("Who won the euro 2024?");
  Futures.addCallback(response, new FutureCallback() {
      @Override
      public void onSuccess(GenerateContentResponse result) {
          String resultText = result.getText();
          System.out.println(resultText);
      }

      @Override
      public void onFailure(Throwable t) {
          t.printStackTrace();
      }
  }, executor);

// Make sure to comply with the "Grounding with Google Search" usage requirements,
// which includes how you use and display the grounded result

Web


import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend } from "firebase/ai";

// TODO(developer) Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
  // ...
};

// Initialize FirebaseApp
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Gemini Developer API backend service
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Create a `GenerativeModel` instance with a model that supports your use case
const model = getGenerativeModel(
  ai,
  {
    model: "GEMINI_MODEL_NAME",
    // Provide Google Search as a tool that the model can use to generate its response
    tools: [{ googleSearch: {} }]
  }
);

const result = await model.generateContent("Who won the euro 2024?");

console.log(result.response.text());

// Make sure to comply with the "Grounding with Google Search" usage requirements,
// which includes how you use and display the grounded result

Dart


import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_ai/firebase_ai.dart';
import 'firebase_options.dart';

// Initialize FirebaseApp
await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);

// Initialize the Gemini Developer API backend service
// Create a `GenerativeModel` instance with a model that supports your use case
final model = FirebaseAI.googleAI().generativeModel(
  model: 'GEMINI_MODEL_NAME',
  // Provide Google Search as a tool that the model can use to generate its response
  tools: [
    Tool.googleSearch(),
  ],
);

final response = await model.generateContent([Content.text("Who won the euro 2024?")]);
print(response.text);

// Make sure to comply with the "Grounding with Google Search" usage requirements,
// which includes how you use and display the grounded result

Unity


using Firebase;
using Firebase.AI;

// Initialize the Gemini Developer API backend service
var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());

// Create a `GenerativeModel` instance with a model that supports your use case
var model = ai.GetGenerativeModel(
  modelName: "GEMINI_MODEL_NAME",
  // Provide Google Search as a tool that the model can use to generate its response
  tools: new[] { new Tool(new GoogleSearch()) }
);

var response = await model.GenerateContentAsync("Who won the euro 2024?");
UnityEngine.Debug.Log(response.Text ?? "No text in response.");

// Make sure to comply with the "Grounding with Google Search" usage requirements,
// which includes how you use and display the grounded result

ユースケースとアプリに適したモデル を選択する方法をご覧ください。

最適な結果を得るには、温度 1.0(すべての 2.5 モデルのデフォルト)を使用します。モデルの構成で Temperature を設定する方法をご覧ください。

Google 検索によるグラウンディングの仕組み

GoogleSearch ツールを使用すると、モデルは情報の検索、処理、引用のワークフロー全体を自動的に処理します。

モデルのワークフローは次のとおりです。

  1. プロンプトを受け取る: アプリは、Gemini モデル に、GoogleSearch ツールが有効になっているプロンプトを送信します。
  2. プロンプトを分析する: モデルはプロンプトを分析し、 Google 検索で回答を改善できるかどうかを判断します。
  3. Google 検索にクエリを送信する: 必要に応じて、モデルは自動的に 1 つ以上の検索クエリを生成して実行します。
  4. 検索結果を処理する: モデルは Google 検索 の結果を処理し、元のプロンプトに対する回答を作成します。
  5. 「グラウンディングされた検索結果」を返す: モデルは、Google 検索の結果に基づいてグラウンディングされた、最終的なユーザー フレンドリーな回答を返します。この回答には、モデルのテキスト回答と、検索クエリ、ウェブ検索結果、ソースを含む groundingMetadata が含まれます。

Google 検索をモデルのツールとして提供しても、モデルが常に Google 検索ツールを使用して回答を生成する必要はありません。このような場合、回答には groundingMetadata オブジェクトが含まれないため、「グラウンディングされた検索結果」にはなりません。

Google 検索によるグラウンディングでモデルが Google 検索とやり取りする仕組みを示す図

グラウンディングされた検索結果について

モデルが Google 検索の結果に基づいて回答をグラウンディングする場合、回答には groundingMetadata オブジェクトが含まれます。このオブジェクトには、主張の検証やアプリでの豊富なソース エクスペリエンスの構築に不可欠な構造化データが含まれています。

「グラウンディングされた検索結果」の groundingMetadata オブジェクトには、次の情報が含まれます。

  • webSearchQueries: Google 検索に送信された検索クエリの配列。この情報は、モデルの推論プロセスのデバッグと理解に役立ちます。

  • searchEntryPoint: 必要な「Google 検索の候補」をレンダリングするための HTML と CSS が含まれています。選択した API プロバイダ(Gemini Developer API または Vertex AI Gemini API)の「Google 検索によるグラウンディング」の使用要件(サービス固有の規約のサービス規約 セクションを参照)を遵守する必要があります。グラウンディングされた検索結果の 使用方法と表示方法 については、このページの後半をご覧ください。

  • groundingChunks: ウェブソース(urititle)を含むオブジェクトの配列。

  • groundingSupports: モデルの回答 textgroundingChunks のソースに接続するチャンクの配列。各チャンクは、テキスト segmentstartIndexendIndex で定義)を 1 つ以上の groundingChunkIndices にリンクします。このフィールドは、インライン ソースリンクの作成に役立ちます。 グラウンディングされた検索結果の 使用方法と表示方法 については、このページの後半をご覧ください。

以下に、groundingMetadata オブジェクトを含むレスポンスの例を示します。

{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "Spain won Euro 2024, defeating England 2-1 in the final. This victory marks Spain's record fourth European Championship title."
          }
        ],
        "role": "model"
      },
      "groundingMetadata": {
        "webSearchQueries": [
          "UEFA Euro 2024 winner",
          "who won euro 2024"
        ],
        "searchEntryPoint": {
          "renderedContent": "<!-- HTML and CSS for the search widget -->"
        },
        "groundingChunks": [
          {"web": {"uri": "https://vertexaisearch.cloud.google.com.....", "title": "aljazeera.com"}},
          {"web": {"uri": "https://vertexaisearch.cloud.google.com.....", "title": "uefa.com"}}
        ],
        "groundingSupports": [
          {
            "segment": {"startIndex": 0, "endIndex": 85, "text": "Spain won Euro 2024, defeatin..."},
            "groundingChunkIndices": [0]
          },
          {
            "segment": {"startIndex": 86, "endIndex": 210, "text": "This victory marks Spain's..."},
            "groundingChunkIndices": [0, 1]
          }
        ]
      }
    }
  ]
}

グラウンディングされた検索結果を使用、表示する

モデルが Google 検索ツールを使用して回答を生成する場合、回答に groundingMetadata オブジェクトが提供されます。

Google 検索の候補を表示することは必須です。また、ソースを表示することも必須です。

Google 検索ツールの使用要件を遵守するだけでなく、この情報を表示することで、ユーザーとエンドユーザーが回答を検証し、さらに学習するための手段を追加できます。

Gemini API

(必須)Google 検索の候補を表示する

回答に「Google 検索の候補」が含まれている場合は、Google 検索の候補の表示方法を含め、「Google 検索によるグラウンディング」の使用要件を遵守する必要があります。

groundingMetadata オブジェクトには「Google 検索の候補」が含まれています。具体的には、searchEntryPoint フィールドに renderedContent フィールドが含まれています。このフィールドには、準拠する HTML と CSS のスタイルが指定されています。これを実装すると、アプリで検索候補を表示できます。

Google 検索の候補の表示と動作の要件に関する詳細情報を Google Cloudドキュメントでご確認ください。この詳細な ガイダンスは Vertex AI Gemini API ドキュメントに記載されていますが、ガイダンスは Gemini Developer API プロバイダにも適用されます。

この セクションの後半で、コードサンプルの例をご覧ください。

@media(prefers-color-scheme)

(必須)ソースを表示する

groundingMetadata オブジェクトには、構造化されたソースデータ(具体的には groundingSupports フィールドと groundingChunks フィールド)が含まれています。この情報を使用して、モデルのステートメントを UI 内のソースに直接リンクします(インラインと集計)。

この セクションの後半で、コードサンプルの例をご覧ください。

コードサンプルの例

これらのコードサンプルは、グラウンディングされた検索結果の使用と表示に関する一般的なパターンを示しています。 ただし、特定の実装がコンプライアンス要件に準拠していることを確認するのは、お客様の責任です。

Swift

// ...

// Get the model's response
let text = response.text

// Get the grounding metadata
if let candidate = response.candidates.first,
   let groundingMetadata = candidate.groundingMetadata {
  // REQUIRED - display Google Search suggestions
  // (renderedContent contains HTML and CSS for the search widget)
  if let renderedContent = groundingMetadata.searchEntryPoint?.renderedContent {
    // TODO(developer): Display Google Search suggestions using a WebView
  }

  // REQUIRED - display sources
  let groundingChunks = groundingMetadata.groundingChunks
  for chunk in groundingMetadata.groundingChunks {
    if let web = chunk.web {
      let title = web.title  // for example, "uefa.com"
      let uri = web.uri  // for example, "https://vertexaisearch.cloud.google.com..."
      // TODO(developer): show source in the UI
    }
  }
}

Kotlin

// ...

// Get the model's response
val text = response.text

// Get the grounding metadata
val groundingMetadata = response.candidates.firstOrNull()?.groundingMetadata

// REQUIRED - display Google Search suggestions
// (renderedContent contains HTML and CSS for the search widget)
val renderedContent = groundingMetadata?.searchEntryPoint?.renderedContent
if (renderedContent != null) {
    // TODO(developer): Display Google Search suggestions using a WebView
}

// REQUIRED - display sources
val groundingChunks = groundingMetadata?.groundingChunks
groundingChunks?.let { chunks ->
  for (chunk in chunks) {
  	val title = chunk.web?.title  // for example, "uefa.com"
	val uri = chunk.web?.uri  // for example, "https://vertexaisearch.cloud.google.com..."
// TODO(developer): show source in the UI
  }
}

Java

// ...

Futures.addCallback(response, new FutureCallback() {
  @Override
  public void onSuccess(GenerateContentResponse result) {
  // Get the model's response
  String text = result.getText();

  // Get the grounding metadata
  GroundingMetadata groundingMetadata =
  result.getCandidates()[0].getGroundingMetadata();

  if (groundingMetadata != null) {
    // REQUIRED - display Google Search suggestions
  // (renderedContent contains HTML and CSS for the search widget)
    String renderedContent =
  groundingMetadata.getSearchEntryPoint().getRenderedContent();
    if (renderedContent != null) {
      // TODO(developer): Display Google Search suggestions using a WebView
    }

    // REQUIRED - display sources
    List chunks = groundingMetadata.getGroundingChunks();
    if (chunks != null) {
      for(GroundingChunk chunk : chunks) {
        WebGroundingChunk web = chunk.getWeb();
        if (web != null) {
          String title = web.getTitle();  // for example, "uefa.com"
          String uri = web.getUri();  // for example, "https://vertexaisearch.cloud.google.com..."
          // TODO(developer): show sources in the UI
        }
      }
    }
  }
  }

  @Override
  public void onFailure(Throwable t) {
  t.printStackTrace();
  }
  }, executor);

Web

// ...

// Get the model's text response
const text = result.response.text();

// Get the grounding metadata
const groundingMetadata = result.response.candidates?.[0]?.groundingMetadata;

// REQUIRED - display Google Search suggestions
// (renderedContent contains HTML and CSS for the search widget)
const renderedContent = groundingMetadata?.searchEntryPoint?.renderedContent;
if (renderedContent) {
  // TODO(developer): render this HTML and CSS in the UI
}

// REQUIRED - display sources
const groundingChunks = groundingMetadata?.groundingChunks;
if (groundingChunks) {
  for (const chunk of groundingChunks) {
    const title = chunk.web?.title;  // for example, "uefa.com"
    const uri = chunk.web?.uri;  // for example, "https://vertexaisearch.cloud.google.com..."
    // TODO(developer): show sources in the UI
  }
}

Dart

// ...

// Get the model's response
final text = response.text;

// Get the grounding metadata
final groundingMetadata = response.candidates.first.groundingMetadata;

// REQUIRED - display Google Search suggestions
// (renderedContent contains HTML and CSS for the search widget)
final renderedContent = groundingMetadata?.searchEntryPoint?.renderedContent;
if (renderedContent != null) {
    // TODO(developer): Display Google Search suggestions using a WebView
}

// REQUIRED - display sources
final groundingChunks = groundingMetadata?.groundingChunks;
if (groundingChunks != null) {
  for (var chunk in groundingChunks) {
    final title = chunk.web?.title;  // for example, "uefa.com"
    final uri = chunk.web?.uri;  // for example, "https://vertexaisearch.cloud.google.com..."
    // TODO(developer): show sources in the UI
  }
}

Unity

// ...

// Get the model's response
var text = response.Text;

// Get the grounding metadata
var groundingMetadata = response.Candidates.First().GroundingMetadata.Value;

// REQUIRED - display Google Search suggestions
// (renderedContent contains HTML and CSS for the search widget)
if (groundingMetadata.SearchEntryPoint.HasValue) {
    var renderedContent = groundingMetadata.SearchEntryPoint.Value.RenderedContent;
    // TODO(developer): Display Google Search suggestions using a WebView
}

// REQUIRED - display sources
foreach(GroundingChunk chunk in groundingMetadata.GroundingChunks) {
    var title = chunk.Web.Value.Title;  // for example, "uefa.com"
    var uri = chunk.Web.Value.Uri;  // for example, "https://vertexaisearch.cloud.google.com..."
    // TODO(developer): show sources in the UI
}

Firebase コンソールでのグラウンディングされた検索結果と AI モニタリング

Firebase コンソールで AI モニタリングを有効にすると、レスポンスは Cloud Logging に保存されます。FirebaseCloud Loggingデフォルトでは、このデータの保持期間は 30 日間です。

この保持期間、または設定したカスタム 期間が、特定のユースケースと、選択した Gemini API プロバイダの追加の コンプライアンス要件(サービス固有の規約のサービス規約セクションを参照)に完全に準拠していることを確認するのは、お客様の責任です。Gemini Developer APIVertex AI Gemini APIこれらの要件を満たすには、 の保持期間を調整する必要があります。Cloud Logging

料金と上限

選択した Gemini API プロバイダのドキュメント(Gemini Developer API | Vertex AI Gemini API)で、 Google 検索によるグラウンディングの料金、モデルの可用性、上限を確認してください。