Elasticsearch によるグラウンディング

このページでは、Elasticsearch インスタンスを使用してデータをグラウンディングする方法について説明します。

Elasticsearch を使用した Gemini のグラウンディング

グラウンディングでは、公開データセットと非公開データセットを使用して、大規模言語モデル(LLM)のレスポンスをグラウンディングするためのコンテキストと事実を提供します。Elasticsearch を使用してグラウンディングすると、既存の Elasticsearch インデックスを活用して Gemini の出力の品質と信頼性を高め、ハルシネーションを減らし、レスポンスをデータに関連付けることが可能です。これにより、次のような強力な RAG アプリケーションを構築できます。

  • 生成検索の要約
  • エンタープライズ データを活用して質問に答える chatbot
  • データに基づいてグラウンディングされたエージェント

一度に最大 10 個のデータソースに基づいて回答をグラウンディングできます。Elasticsearch によるグラウンディングと Google 検索によるグラウンディングを組み合わせると、モデルを世界中の知識、幅広いトピック、インターネット上の最新情報に接続できます。

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

次のモデルは、テキスト入力のみで Elasticsearch によるグラウンディングをサポートしています

Elasticsearch で検索テンプレートを設定する

このセクションでは、Elasticsearch インスタンスを使用して、インスタンスに保存されているデータをグラウンディングする方法について説明します。

ベスト プラクティス

グラウンディング レスポンスを最適化するには、検索テンプレートを作成する際に次の原則を適用します。

  • 関連性があり、有用なデータのみを含めます。たとえば、商品カタログで画像の URL を指定しても、プロンプトで URL が明示的に求められていない限り、LLM が商品のプロパティに関するプロンプトに回答するのに役立たない場合があります。同様に、エンベディング ベクトルの出力を避けます。

  • グラウンディングにより、プロンプトとの関連性が低い Elasticsearch の結果が削除されます。関連するすべてのコンテキストを取得するには、Elasticsearch の結果の数を増やす必要があります。

  • 結果データは 1 つのフィールドに格納することも、複数のフィールドに分散させることもできます。

サンプル テンプレート

検索テンプレートを使用できます。ただし、Elasticsearch グラウンディングで汎用 kNN 検索テンプレートを使用することをおすすめします。その他の検索テンプレートについては、GitHub リポジトリをご覧ください。

この Vertex AI でのセマンティック検索は、汎用 kNN 検索です。

    PUT _scripts/google-template-knn-multioutput
    {
      "script": {
        "lang": "mustache",
        "source": {
          "_source": {
            "excludes": [ "title_embedding", "description_embedding", "images"]
          },
            "size": "num_hits",
              "knn" : [
              {
                "field": "description_embedding",
                "k": 5,
                "num_candidates": 10,
                "query_vector_builder": {
                  "text_embedding": {
                    "model_id": "googlevertexai_embeddings_004",
                    "model_text": "query"
                  }
                },
                "boost": 0.4
              },
              {
                "field": "title_embedding",
                "k": 5,
                "num_candidates": 10,
                "query_vector_builder": {
                  "text_embedding": {
                    "model_id": "googlevertexai_embeddings_004",
                    "model_text": "query"
                }
              },
              "boost": 0.6
              }
              ]
        }
      }
    }

Elasticsearch を使用してグラウンディングされたレスポンスを生成する

このセクションでは、Vertex AI API を使用して LLM のレスポンスをグラウンディングする方法について説明します。

前提条件

Elasticsearch で LLM レスポンスをグラウンディングするには、次の操作を完了しておく必要があります。

  1. Vertex AI API を有効にする: Google Cloud プロジェクトで Vertex AI API が有効になっていることを確認します。

  2. Google Cloud CLI CLI をインストールしてログインする: gcloud CLI コマンドライン ツールをインストールして初期化します。

  3. Elasticsearch の設定: グラウンディングに使用する既存の Elasticsearch クラスタとインデックスを使用します。Elasticsearch の設定から次の情報を取得します。

    • エンドポイント: Elasticsearch クラスタの URL。
    • インデックス名: 検索するインデックスの名前(my-data-index など)。
    • API キー: Elasticsearch クラスタへのアクセスを許可する API キー。API キーは接頭辞 ApiKey で始まる必要があります。
  4. Elasticsearch 検索テンプレートを作成する: グラウンディングの結果データを返す参照テンプレートを使用する Elasticsearch データソースを使用します。

グラウンディングされた回答を生成する

コンソール

Google Cloud コンソールで Elasticsearch を使用してグラウンディングするには、次の操作を行います。

  1. Vertex AI Studio の [プロンプトを作成] ページに移動します。

    [プロンプトを作成] に移動

  2. [設定] パネルで、データをグラウンディングするには、[グラウンディング: お客様のデータ] 切り替えボタンをクリックします。

  3. [根拠づけのカスタマイズ] ペインで、[Elasticsearch] を選択します。

  4. [Elasticsearch エンドポイント] フィールドにエンドポイントを入力します。

  5. [Elasticsearch API Key] フィールドに「ApiKey YOUR_API_KEY」と入力します。

  6. [Elasticsearch インデックス] フィールドにインデックスを入力します。

  7. [Elasticsearch 検索テンプレート] フィールドに検索テンプレートを入力します。

  8. [ヒット数] スライダーをスライドして、ヒット数を調整します。

  9. [保存] をクリックします。

  10. プロンプトを入力します。

  11. [送信] をクリックします。

レスポンスを理解する

Vertex AI Studio または API を使用して Elasticsearch データストアにモデル プロンプトが正常にグラウンディングされた場合、モデルのレスポンスには引用とソース コンテンツを含むメタデータが含まれます。モデルのレスポンス内でソースの関連性が低い、または情報が不完全な場合、メタデータが提供されず、プロンプト レスポンスがグラウンディングされません。

Python

インストール

pip install --upgrade google-genai

詳しくは、SDK リファレンス ドキュメントをご覧ください。

Vertex AI で Gen AI SDK を使用するための環境変数を設定します。

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True

from google import genai
from google.genai.types import (
    GenerateContentConfig,
    Elasticsearch,
    Retrieval,
    Tool,
    HttpOptions,
)

client = genai.Client(http_options=HttpOptions(api_version="v1"))

# Replace with your Elasticsearch details
ELASTIC_SEARCH_ENDPOINT = "YOUR_ELASTICSEARCH_ENDPOINT"
ELASTIC_SEARCH_API_KEY = "YOUR_ELASTICSEARCH_API_KEY"
INDEX_NAME = "YOUR_INDEX_NAME"
SEARCH_TEMPLATE_NAME = "YOUR_SEARCH_TEMPLATE_NAME"
NUM_HITS = 5

tool = Tool(
    retrieval=Retrieval(
        external_api=Elasticsearch(
            api_spec="ELASTIC_SEARCH",
            endpoint=ELASTIC_SEARCH_ENDPOINT,
            api_auth={
                "apiKeyConfig": {
                    "apiKeyString": f"ApiKey {ELASTIC_SEARCH_API_KEY}"
                }
            },
            elastic_search_params={
                "index": INDEX_NAME,
                "searchTemplate": SEARCH_TEMPLATE_NAME,
                "numHits": NUM_HITS,
            },
        )
    )
)

response = client.models.generate_content(
    model="gemini-2.5-flash",  # Or another supported model
    contents="What are the main features of product X?", # Your query
    config=GenerateContentConfig(
        tools=[tool],
    ),
)

print(response.text)

REST

テキスト プロンプトを送信して Elasticsearch でグラウンディングするには、Vertex AI API に POST リクエストを送信します。少なくとも、リクエスト本文を指定する必要があります。次のように置き換えます。

  • PROMPT: グラウンディングするテキスト プロンプト。
  • ELASTIC_SEARCH_ENDPOINT: 使用する Elasticsearch リソースの絶対エンドポイント パス。
  • ELASTIC_SEARCH_API_KEY: Elasticsearch データ エンドポイントの API キー。
  • INDEX_NAME: グラウンディングに使用される Elasticsearch インデックスの名前。
  • SEARCH_TEMPLATE_NAME: グラウンディングに使用される Elasticsearch 検索テンプレート。
  • NUM_HITS: Elasticsearch データソースから返され、グラウンディングに使用された結果の数。

    HTTP メソッドと URL:

    POST https://LOCATION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:generateContent
    

    リクエストの本文(JSON):

      {
        "contents": [
          {
            "role": "user",
            "parts": [
              {
                "text": "PROMPT"
              }
            ]
          }
        ],
        "tools": [{
          "retrieval": {
            "externalApi": {
              "api_spec": "ELASTIC_SEARCH",
              "endpoint": "ELASTIC_SEARCH_ENDPOINT",
              "apiAuth": {
                "apiKeyConfig": {
                  "apiKeyString": "ApiKey ELASTIC_SEARCH_API_KEY"
                }
              },
              "elasticSearchParams": {
                "index": "INDEX_NAME",
                "searchTemplate": "SEARCH_TEMPLATE_NAME",
                "numHits": "NUM_HITS",
              }
            }
          }
        }]
      }
    

システム指示やマルチターン チャットなどの他の API フィールドの詳細については、生成 AI 初心者ガイドをご覧ください。

API リクエストを送信する

リクエスト本文を request.json という名前のファイルに保存できます。次に、POST API リクエストを実行し、次の置換を行います。

  • LOCATION: リクエストを処理するリージョン。グローバル エンドポイントを使用するには、エンドポイント名からロケーションを除外し、リソースのロケーションを global に構成します。
  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID の詳細については、プロジェクトの作成と管理をご覧ください。
  • MODEL_ID: マルチモーダル モデルのモデル ID。
  curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
  "https://LOCATION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:generateContent"

次のような JSON レスポンスが返されます。

  {
    "candidates": [
      {
        "content": {
          "role": "model",
          "parts": [
            {
              "text": "Based on the information ..."
            }
          ]
        },
        "finishReason": "STOP",
        "safetyRatings": [ "..." ],
        "groundingMetadata": {
          "groundingChunks": [
            {
              "retrievedContext": {
                "text": "ipsum lorem ..."
              }
            },
            {...},
            {...},
          ],
          "groundingSupports": [
            {
              "segment": {
                "startIndex": 25,
                "endIndex": 147,
                "text": "ipsum lorem ..."
              },
              "groundingChunkIndices": [1,2],
              "confidenceScores": [0.6626542, 0.82018316],
            },
          ],
        },
      }
    ],
  }

レスポンスを理解する

両方の API からのレスポンスには、LLM によって生成されたテキスト(候補)が含まれます。モデル プロンプトが Elasticsearch データソースに正常にグラウンディングされると、レスポンスにはグラウンディング メタデータが含まれます。このメタデータは、レスポンスのどの部分が Elasticsearch データから派生したかを識別します。ただし、このメタデータが提供されず、プロンプト レスポンスがグラウンディングされない場合もあります。その理由はいくつかあります。たとえば、ソースの関連性が低い、モデルのレスポンス内の情報が不完全である、などです。

出力データの内訳は次のとおりです。

  • ロール: グラウンディングされた回答の送信者。レスポンスには常にグラウンディングされたテキストが含まれるため、ロールは常に model になります。
  • テキスト: LLM によって生成されたグラウンディング済みの回答。
  • グラウンディング メタデータ: グラウンディング ソースに関する情報。次の要素が含まれます。
    • グラウンディング チャンク: 回答をサポートする Elasticsearch インデックスの結果のリスト。
    • グラウンディング サポート: 引用を表示するために使用できる、回答内の特定の主張に関する情報。
    • セグメント: グラウンディング チャンクで裏付けられたモデルの回答の一部。
    • グラウンディング チャンクのインデックス: このクレームに対応するグラウンディング チャンク リスト内のグラウンディング チャンクのインデックス。
    • 信頼スコア: 主張が提供されたグラウンディング チャンクのセットにおいてどの程度根拠があるかを示す 0~1 の数値。Gemini 2.5 Pro、Gemini 2.5 Flash 以降では使用できません。

次のステップ