RAG を使用して根拠のある回答を生成する

Vertex AI Agent Builder の検索拡張生成(RAG)機能の一部として、次のグラウンディング ソースに基づいてプロンプトにグラウンディングされた回答を生成できます。

  • Google 検索: モデルを世界中の知識、幅広いトピック、インターネット上の最新情報に接続する場合は、Google 検索でグラウンディングを使用します。Google 検索によるグラウンディングは動的取得をサポートしており、必要に応じてのみ Google 検索でグラウンディング付きの検索結果を生成できます。そのため、動的取得構成では、プロンプトに最近のイベントに関する知識が必要かどうかを評価し、Google 検索によるグラウンディングを有効にします。詳細については、動的取得をご覧ください。
  • インライン テキスト: インライン テキストによるグラウンディングを使用すると、リクエストで指定された事実テキストと呼ばれるテキストの断片に回答をグラウンディングできます。事実テキストは、特定のリクエストに対して事実であるとみなされる、ユーザー提供のステートメントです。このモデルは、事実のテキストの信頼性を確認しません。
  • Vertex AI Search データストア: Vertex AI Search データストアからエンタープライズ ドキュメントにモデルを接続する場合は、Vertex AI Search でグラウンディングを使用します。

このページでは、次のアプローチを使用して、これらの根拠づけのソースに基づいて根拠のある回答を生成する方法について説明します。

また、モデルから回答をストリーミングすることもできます。ストリーミングによる根拠のある回答の生成は試験運用版の機能です。

アプリケーションに合わせて、他の方法で根拠のある回答を生成することもできます。詳細については、検索と RAG エクスペリエンスの構築に使用する Vertex AI API をご覧ください。

用語

根拠に基づく回答生成方法を使用する前に、入力と出力、リクエストの構造化方法、RAG 関連の用語を理解しておくことをおすすめします。

RAG の用語

RAG は、大規模言語モデル(LLM)が選択したデータソースに対する根拠のある回答を生成できるようにする手法です。RAG には 2 つのステージがあります。

  1. 取得: 最も関連性の高い事実をすばやく取得することは、一般的な検索の問題です。RAG を使用すると、回答の生成に重要な事実をすばやく取得できます。
  2. 生成: 取得された事実は、LLM によって根拠のある回答の生成に使用されます。

したがって、根拠に基づく回答の生成方法は、グラウンディング ソースから事実を取得し、根拠に基づく回答を生成します。

入力データ

根拠に基づく回答生成方法では、リクエストに次の入力が必要です。

  • ロール: 特定のテキストの送信者(ユーザー(user)またはモデル(model))。

  • テキスト: ロールが user の場合、テキストはプロンプトであり、ロールが model の場合、テキストは根拠のある回答です。リクエストでロールとテキストを指定する方法は、次のように決まります。

    • 1 ターンの回答生成では、ユーザーがリクエストでプロンプト テキストを送信し、モデルがレスポンスで回答テキストを送信します。
    • マルチターンの回答生成の場合、リクエストには、前のすべてのターンのプロンプトと回答のペアと、現在のターンのユーザーからのプロンプト テキストが含まれます。したがって、このようなリクエストでは、プロンプト テキストのロールが user で、回答テキストのロールが model になります。
  • システム インストラクション: モデルの動作を制御し、それに応じて出力を変更するプロンプトの前置き。たとえば、生成された回答にペルソナを追加したり、出力テキストを特定の方法でフォーマットするようにモデルに指示したりできます。複数ターンの回答生成では、各ターンのシステム インストラクションを提供する必要があります。詳細については、システム メッセージを使用するをご覧ください。

  • 根拠となる情報源: 回答の根拠となる情報源。次のいずれかになります。

    • Google 検索: Google 検索結果に基づいて回答をグラウンディングします。接地ソースが Google 検索の場合は、動的取得しきい値を指定して動的取得構成を指定できます。詳細については、動的取得をご覧ください。

    • インライン テキスト: リクエストで提供された事実テキストに基づいて回答を作成します。事実テキストは、特定のリクエストに対して事実であるとみなされる、ユーザー提供のステートメントです。このモデルは、事実のテキストの信頼性を確認しません。各インライン テキストソースに指定できる事実テキストは最大 100 個です。ファクトテキストは、タイトル、作成者、URI などのメタ属性を使用してサポートできます。これらのメタ属性は、回答をサポートするチャンクを引用するときにレスポンスで返されます。

    • Vertex AI Search データストア: Vertex AI Search データストアのドキュメントで回答を根拠づけます。

    1 つのリクエストで、インライン テキスト ソースと Vertex AI Search データストア ソースの両方を指定できます。Google 検索をこれらのいずれかのソースと組み合わせることはできません。そのため、Google 検索の検索結果に基づいて回答を生成する場合、Google 検索を唯一の参照元として指定する別のリクエストを送信する必要があります。

    指定できる接地電源は最大 10 個で、順序は任意です。たとえば、次の順序で次の数で接地源を指定して、合計 10 個の接地源を取得するとします。

    • 3 つのインライン テキストソース(各ソースに最大 100 個の事実テキストを含めることができます)
    • 6 つの Vertex AI Search データストア
    • 4 つのインライン テキストソース(各ソースに最大 100 個の事実テキストを含めることができます)

    各ソースには、リクエストで指定された順序でインデックスが割り当てられます。たとえば、リクエストでソースの組み合わせを指定した場合、ソース インデックスは次の表に示すように割り当てられます。

    根拠づけのソース インデックス
    インライン テキスト #1 0
    インライン テキスト #2 1
    Vertex AI Search データストア #1 2
    インライン テキスト #3 3
    Vertex AI Search データストア #2 4

    このインデックスはレスポンスで引用され、来歴をトレースする際に役立ちます。

  • 生成仕様: 次の情報で構成されるモデル構成の仕様。

    • モデル ID: 回答の生成に使用する Vertex AI Gemini モデルを指定します。根拠のある回答の生成に使用できるモデルの一覧については、サポートされているモデルをご覧ください。
    • モデル パラメータ: 使用するモデルに設定できるパラメータを指定します。これらのパラメータは、言語、温度、top-P、top-K です。これらのパラメータの詳細については、Gemini モデル パラメータをご覧ください。

出力データ

モデルが生成したレスポンスは候補と呼ばれ、次のデータが含まれます。すべてのフィールドが出力に含まれるとは限りません。

  • ロール: 根拠のある回答の送信者。レスポンスには常に、根拠のある回答テキストが含まれます。したがって、レスポンスのロールは常にモデルです。

  • Text: グラウンディングされた回答。

  • Grounding スコア: 特定のソースに回答がどの程度根拠づけられたかを示す [0, 1] の範囲内の浮動小数点値。

  • 接地メタデータ: 接地ソースに関するメタデータ。接地メタデータには次の情報が含まれます。

    • サポート チャンク: 回答をサポートするチャンクのリスト。各サポート チャンクにサポート チャンク インデックスが割り当てられます。これは、来歴をトレースする際に役立ちます。各サポート チャンクには次のものが含まれます。

      • チャンク テキスト: 回答または回答の一部(主張テキスト)が抽出されたソースからそのまま引用されたテキストの一部。このフィールドはレスポンスに必ず存在するとは限りません。
      • ソース: リクエスト内のソースに割り当てられたインデックス。
      • ソース メタデータ: チャンクに関するメタデータ。ソースに応じて、ソースメタデータは次のいずれかになります。

        • インライン ソースの場合、メタデータは、タイトル、作成者、URI など、リクエストで指定された追加の詳細情報にすることができます。
        • Vertex AI Search データストアの場合、メタデータにはドキュメント ID、ドキュメントのタイトル、URI(Cloud Storage のロケーション)、ページ番号などがあります。
        • Google 検索によるグラウンディングでは、グラウンディングされた結果が生成されると、メタデータに、グラウンディングされた結果の生成に使用されたコンテンツのパブリッシャーにリダイレクトする URI が含まれます。メタデータには、パブリッシャーのドメインも含まれます。指定された URI には、グラウンドされた結果の生成後 30 日間アクセスできます。
    • Grounding サポート: 回答内の主張の Grounding 情報。接地サポートには次の情報が含まれます。

      • 申し立てのテキスト: サポート チャンク テキストで裏付けられた回答または回答の一部。
      • サポート チャンク インデックス: サポート チャンクのリストにチャンクが表示される順序で、サポート チャンクに割り当てられたインデックス。
      • ウェブ検索クエリ: Google 検索候補の検索クエリの候補。
      • 検索候補: レスポンスとともに Google 検索候補が返された場合、そのレスポンスは「グラウンディング付きの検索結果」であり、Google 検索によるグラウンディングのサービス規約が適用されます。詳しくは、サービス利用規約 をご覧ください。searchEntryPoint フィールド内の renderedContent フィールドは、Google 検索の候補を実装するための提供コードです。Google 検索の候補を使用するには、Google 検索の候補を使用するをご覧ください。

1 つのターンで根拠のある回答を生成する

このセクションでは、次のソースに基づいて回答を生成する方法について説明します。

回答をインライン テキストと Vertex AI Search データストアにグラウンディングする

次のサンプルは、インライン テキストと Vertex AI Search データストアを根拠付けソースとして指定して、プロンプト テキストを送信する方法を示しています。このサンプルでは、generateGroundedContent メソッドを使用します。

REST

  1. 次の curl リクエストでプロンプトを送信します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION"
       }
    },
    "groundingSpec": {
     "groundingSources": [
       {
         "inlineSource": {
           "groundingFacts": [
             {
               "factText": "FACT_TEXT_1",
               "attributes": {
                 "title": "TITLE_1",
                 "uri": "URI_1",
                 "author": "AUTHOR_1"
               }
             }
           ]
         }
       },
       {
         "inlineSource": {
           "groundingFacts": [
             {
               "factText": "FACT_TEXT_2",
               "attributes": {
                 "title": "TITLE_2",
                 "uri": "URI_2"
               }
             },
             {
               "factText": "FACT_TEXT_3",
               "attributes": {
                 "title": "TITLE_3",
                 "uri": "URI_3"
               }
             }
           ]
         }
       },
       {
         "searchSource": {
           "servingConfig": "projects/PROJECT_NUMBER/locations/global/collections/default_collection/engines/APP_ID_1/servingConfigs/default_search"
         }
       },
       {
         "searchSource": {
           "servingConfig": "projects/PROJECT_NUMBER/locations/global/collections/default_collection/engines/APP_ID_2/servingConfigs/default_search"
         }
       }
      ]
    },
    "generationSpec": {
      "modelId": "MODEL_ID",
      "temperature": TEMPERATURE,
      "topP": TOP_P,
      "topK": TOP_K
    }
    }'
    

    以下を置き換えます。

    • PROJECT_NUMBER: Google Cloud プロジェクトの番号。
    • PROMPT_TEXT: ユーザーからのプロンプト。
    • SYSTEM_INSTRUCTION: プレアブルまたは追加のコンテキストを指定するオプションのフィールド。
    • FACT_TEXT_N: 回答を裏付けるインライン テキスト。指定できるファクトテキストは最大 100 個です。
    • TITLE_N: インライン テキストのタイトル メタ属性を設定するオプション フィールド。
    • URI_N: インライン テキストの URI メタ属性を設定するオプション フィールド。
    • AUTHOR_N: インライン テキストの作成者メタ属性を設定するオプション フィールド。
    • APP_ID_N: Vertex AI Search アプリの ID。
    • MODEL_ID: グラウンドド アンサーの生成に使用する Gemini モデルのモデル ID を設定するオプション フィールド。使用可能なモデル ID の一覧については、サポートされているモデルをご覧ください。
    • TEMPERATURE: サンプリングに使用する温度を設定するオプションのフィールド。温度は 0.0 をおすすめします。詳細については、Gemini モデル パラメータをご覧ください。
    • TOP_P: モデルの top-P 値を設定するオプション フィールド。詳細については、Gemini モデル パラメータをご覧ください。
    • TOP_K: モデルのトップ K 値を設定するオプション フィールド。詳細については、Gemini モデル パラメータをご覧ください。

Python

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_number = "YOUR_PROJECT_NUMBER"
# engine_id = "YOUR_ENGINE_ID"

client = discoveryengine.GroundedGenerationServiceClient()

request = discoveryengine.GenerateGroundedContentRequest(
    # The full resource name of the location.
    # Format: projects/{project_number}/locations/{location}
    location=client.common_location_path(project=project_number, location="global"),
    generation_spec=discoveryengine.GenerateGroundedContentRequest.GenerationSpec(
        model_id="gemini-1.5-flash",
    ),
    # Conversation between user and model
    contents=[
        discoveryengine.GroundedGenerationContent(
            role="user",
            parts=[
                discoveryengine.GroundedGenerationContent.Part(
                    text="How did Google do in 2020? Where can I find BigQuery docs?"
                )
            ],
        )
    ],
    system_instruction=discoveryengine.GroundedGenerationContent(
        parts=[
            discoveryengine.GroundedGenerationContent.Part(
                text="Add a smiley emoji after the answer."
            )
        ],
    ),
    # What to ground on.
    grounding_spec=discoveryengine.GenerateGroundedContentRequest.GroundingSpec(
        grounding_sources=[
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                inline_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.InlineSource(
                    grounding_facts=[
                        discoveryengine.GroundingFact(
                            fact_text=(
                                "The BigQuery documentation can be found at https://cloud.google.com/bigquery/docs/introduction"
                            ),
                            attributes={
                                "title": "BigQuery Overview",
                                "uri": "https://cloud.google.com/bigquery/docs/introduction",
                            },
                        ),
                    ]
                ),
            ),
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                search_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.SearchSource(
                    # The full resource name of the serving config for a Vertex AI Search App
                    serving_config=f"projects/{project_number}/locations/global/collections/default_collection/engines/{engine_id}/servingConfigs/default_search",
                ),
            ),
        ]
    ),
)
response = client.generate_grounded_content(request)

# Handle the response
print(response)

インライン テキストと Vertex AI Search に基づく 1 ターンの回答生成の例

次の例では、リクエストで、1 つのインライン テキスト ファクトと 1 つの Vertex AI Search データストアという、次のグラウンディング ソースを指定しています。このサンプルでは、generateGroundedContent メソッドを使用します。この例では、システム指示を使用して、回答をスマイル 絵文字で終了しています。

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
-d '
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "How did google do in 2020? Where can I find Bigquery docs?"
        }
      ]
    }
  ],
  "systemInstruction": {
      "parts": {
          "text": "Add a smiley emoji after the answer."
      }
  },
  "groundingSpec": {
    "groundingSources": [
      {
        "inline_source": {
          "grounding_facts": [
            {
              "fact_text": "The BigQuery documentation can be found at https://cloud.google.com/bigquery/docs/introduction",
              "attributes": {
                "title": "BigQuery Overview",
                "uri": "https://cloud.google.com/bigquery/docs/introduction"
              }
            }
          ]
        }
      },
      {
        "searchSource": {
          "servingConfig": "projects/123456/locations/global/collections/default_collection/engines/app_id_example/servingConfigs/default_search"
        }
      }
    ]
  },
  "generationSpec": {
    "modelId": "gemini-1.5-flash"
  }
}'

Google 検索で根拠のある回答を生成する

生成されたレスポンスを一般公開されているウェブデータでグラウンディングできます。

動的取得

リクエストで動的取得を使用すると、Google 検索でグラウンディングをオフにするタイミングを選択できます。これは、プロンプトで Google 検索に基づく回答が不要で、サポートされているモデルがグラウンドなしで知識に基づく回答を提供できる場合に便利です。これにより、レイテンシ、品質、コストをより効果的に管理できます。

動的取得の予測スコアとしきい値

根拠のある回答を生成するためのリクエストを送信すると、Vertex AI Agent Builder はプロンプトに予測スコアを割り当てます。予測スコアは、[0,1] の範囲内の浮動小数点値です。その価値は、プロンプトが Google 検索の最新情報に基づいて回答をグラウンディングできるかどうかによって異なります。したがって、ウェブ上の最新の事実に基づく回答が必要なプロンプトでは予測スコアが高くなり、モデル生成の回答で十分なプロンプトでは予測スコアが低くなります。

以下に、いくつかのプロンプトとその予測スコアの例を示します。

プロンプト 予測スコア コメント
「牡丹の詩を書いて」 0.13 モデルは知識に依存でき、回答にグラウンディングは必要ありません
「2 歳の子供向けのおもちゃを教えて」 0.36 モデルは知識に依存でき、回答にグラウンディングは必要ありません
「アジア風のグアカモーレのレシピを教えてください。」 0.55 Google 検索はグラウンディングされた回答を提供できますが、グラウンディングは厳密には必要ではなく、モデルの知識で十分な場合もあります。
「Agent Builder とは何ですか?Agent Builder でグラウンディングはどのように課金されますか?」 0.72 Google 検索で根拠のある回答を生成する必要があります
「前回の F1 グランプリで優勝したのは誰?」 0.97 Google 検索で根拠のある回答を生成できる

回答生成リクエストで、しきい値を指定して動的取得構成を指定できます。しきい値は [0,1] の範囲の浮動小数点値で、デフォルトは 0.7 です。しきい値が 0 の場合、レスポンスは常に Google 検索にグラウンディングされます。しきい値の他のすべての値には、次のことが適用されます。

  • 予測スコアがしきい値以上の場合、回答は Google 検索に基づいています。しきい値が低いほど、Google 検索によるグラウンディングを使用して生成されたレスポンスが含まれるプロンプトが増えます。
  • 予測スコアがしきい値未満の場合、モデルは回答を生成できますが、Google 検索でグラウンディングされません。

ビジネスニーズに合った適切なしきい値を見つけるには、想定されるクエリの代表的なセットを作成します。次に、レスポンスの予測スコアに基づいてクエリを並べ替え、ユースケースに適したしきい値を選択できます。

Google 検索で回答をグラウンディングする

次のサンプルは、Google 検索を基盤ソースとして指定して、プロンプトから基盤となる回答を生成する方法を示しています。このサンプルでは、generateGroundedContent メソッドを使用します。

REST

  1. 次の curl リクエストでプロンプトを送信します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION"
       }
    },
    "groundingSpec": {
     "groundingSources": [
     {
         "googleSearchSource": {
              "dynamicRetrievalConfig": {
                  "predictor":{
                      "threshold": DYNAMIC_RETRIEVAL_THRESHOLD
                  }
              }
         }
     }
    ]
    },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }'
    

    以下を置き換えます。

    • PROJECT_NUMBER: Google Cloud プロジェクトの番号。
    • PROMPT_TEXT: ユーザーからのプロンプト。
    • SYSTEM_INSTRUCTION: プレアブルまたは追加のコンテキストを指定するオプションのフィールド。
    • MODEL_ID: グラウンドド アンサーの生成に使用する Gemini モデルのモデル ID を設定するオプション フィールド。使用可能なモデル ID の一覧については、サポートされているモデルをご覧ください。
    • TEMPERATURE: サンプリングに使用する温度を設定するオプションのフィールド。温度は 0.0 をおすすめします。詳細については、Gemini モデル パラメータをご覧ください。
    • TOP_P: モデルの top-P 値を設定するオプション フィールド。詳細については、Gemini モデル パラメータをご覧ください。
    • TOP_K: モデルのトップ K 値を設定するオプション フィールド。詳細については、Gemini モデル パラメータをご覧ください。
    • DYNAMIC_RETRIEVAL_THRESHOLD: 動的取得構成を呼び出すしきい値を設定するオプション フィールド。範囲は [0,1] の浮動小数点値です。dynamicRetrievalConfig フィールドを追加しても、predictor フィールドまたは threshold フィールドを設定していない場合、しきい値はデフォルトで 0.7 になります。dynamicRetrievalConfig フィールドを設定しないと、回答は常に根拠に基づくものになります。

Python

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_number = "YOUR_PROJECT_NUMBER"

client = discoveryengine.GroundedGenerationServiceClient()

request = discoveryengine.GenerateGroundedContentRequest(
    # The full resource name of the location.
    # Format: projects/{project_number}/locations/{location}
    location=client.common_location_path(project=project_number, location="global"),
    generation_spec=discoveryengine.GenerateGroundedContentRequest.GenerationSpec(
        model_id="gemini-1.5-flash",
    ),
    # Conversation between user and model
    contents=[
        discoveryengine.GroundedGenerationContent(
            role="user",
            parts=[
                discoveryengine.GroundedGenerationContent.Part(
                    text="How much is Google stock?"
                )
            ],
        )
    ],
    system_instruction=discoveryengine.GroundedGenerationContent(
        parts=[
            discoveryengine.GroundedGenerationContent.Part(text="Be comprehensive.")
        ],
    ),
    # What to ground on.
    grounding_spec=discoveryengine.GenerateGroundedContentRequest.GroundingSpec(
        grounding_sources=[
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                google_search_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.GoogleSearchSource(
                    # Optional: For Dynamic Retrieval
                    dynamic_retrieval_config=discoveryengine.GenerateGroundedContentRequest.DynamicRetrievalConfiguration(
                        predictor=discoveryengine.GenerateGroundedContentRequest.DynamicRetrievalConfiguration.DynamicRetrievalPredictor(
                            threshold=0.7
                        )
                    )
                )
            ),
        ]
    ),
)
response = client.generate_grounded_content(request)

# Handle the response
print(response)

次の例では、リクエストで Google 検索をグラウンドング ソースとして指定しています。このサンプルでは、generateGroundedContent メソッドを使用します。この例では、システム指示を使用して、回答をスマイル 絵文字で終了しています。

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
-d '
{
"contents": [{
  "role": "user",
  "parts": [{
    "text": "What is vertex ai agent builder?"
}]
}],
"systemInstruction": {
   "parts": {
      "text": "Add a smiley emoji after the answer."
   }
},
"groundingSpec": {
  "groundingSources": [
  {
      "googleSearchSource": {
        "dynamicRetrievalConfig": {
               "predictor":{
                   "threshold": 0.6
               }
           }
      }
  }
 ]
},
"generationSpec": {
  "modelId": "gemini-1.5-flash"
}
}
'

複数のターンで根拠のある回答を生成する

マルチターンの回答生成では、各リクエストで、ユーザーとモデルの間で交換されたすべてのテキストを送信する必要があります。これにより、連続性が確保され、最新のプロンプトの回答を生成するためのコンテキストが維持されます。

マルチターン回答生成によって根拠のある回答を取得する手順は次のとおりです。

REST

次のサンプルは、複数のターンにわたってフォローアップ プロンプト テキストを送信する方法を示しています。これらのサンプルでは、generateGroundedContent メソッドを使用して、Google 検索で回答をグラウンディングします。同様の手順で、他の根拠ソースを使用して根拠のある回答を生成できます。

  1. 次の curl リクエストで最初のプロンプトを送信します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT_TURN_1"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION_TURN_1"
       }
    },
    "groundingSpec": {
     "groundingSources": [
       {
         "googleSearchSource": {}
       }
     ]
    },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }'
    

    以下を置き換えます。

    • PROJECT_NUMBER: Google Cloud プロジェクトの番号。
    • PROMPT_TEXT_TURN_1: 最初のターンのユーザーからのプロンプト テキスト。
    • SYSTEM_INSTRUCTION_TURN_1: プレアブルまたは追加のコンテキストを指定するオプションのフィールド。マルチターンの回答生成では、各ターンのシステム指示を指定する必要があります。
    • MODEL_ID: グラウンドド アンサーの生成に使用する Gemini モデルのモデル ID を設定するオプション フィールド。使用可能なモデル ID の一覧については、サポートされているモデルをご覧ください。
    • TEMPERATURE: サンプリングに使用する温度を設定するオプションのフィールド。温度は 0.0 をおすすめします。詳細については、Gemini モデル パラメータをご覧ください。
    • TOP_P: モデルの top-P 値を設定するオプション フィールド。詳細については、Gemini モデル パラメータをご覧ください。
    • TOP_K: モデルのトップ K 値を設定するオプション フィールド。詳細については、Gemini モデル パラメータをご覧ください。
  2. 2 つ目のプロンプトをフォローアップとして送信します。ユーザーからの最初のプロンプトを追加し、コンテキストとしてモデルからの対応する回答を追加します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT_TURN_1"
         }
       ]
     },
     {
       "role": "model",
       "parts": [
         {
           "text": "ANSWER_TEXT_TURN_1"
         }
       ]
     },
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT_TURN_2"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION_TURN_2"
       }
    },
    "groundingSpec": {
     "groundingSources": [
       {
         "googleSearchSource": {}
       }
     ]
    },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }'
    

    以下を置き換えます。

    • PROJECT_NUMBER: Google Cloud プロジェクトの番号。
    • PROMPT_TEXT_TURN_1: 最初のターンのユーザーからのプロンプト テキスト。
    • ANSWER_TEXT_TURN_1: 最初のターンのモデルからの回答テキスト。
    • PROMPT_TEXT_TURN_2: 2 番目のターンのユーザーからのプロンプト テキスト。
    • SYSTEM_INSTRUCTION_TURN_2: プレアブルまたは追加のコンテキストを指定するオプションのフィールド。マルチターンの回答生成では、各ターンのシステム指示を指定する必要があります。
    • MODEL_ID: グラウンドド アンサーの生成に使用する Gemini モデルのモデル ID を設定するオプション フィールド。使用可能なモデル ID の一覧については、サポートされているモデルをご覧ください。
    • TEMPERATURE: サンプリングに使用する温度を設定するオプションのフィールド。温度は 0.0 をおすすめします。詳細については、Gemini モデル パラメータをご覧ください。
    • TOP_P: モデルの top-P 値を設定するオプション フィールド。詳細については、Gemini モデル パラメータをご覧ください。
    • TOP_K: モデルのトップ K 値を設定するオプション フィールド。詳細については、Gemini モデル パラメータをご覧ください。
  3. このプロセスを繰り返して、フォローアップの回答を取得します。各ターンで、ユーザーからの以前のプロンプトをすべて追加し、その後にモデルからの対応する回答を追加します。

マルチターン回答生成の例

次の例では、リクエストで 3 つのインライン事実テキストを根拠ソースとして指定し、2 ターンにわたって回答を生成します。このサンプルでは、generateGroundedContent メソッドを使用します。この例では、システム指示を使用して、最初のターンの回答を笑顔の絵文字で終了しています。

REST

  1. 次の curl リクエストで最初のプロンプトを送信します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "Summarize what happened in 2023 in one paragraph."
         }
       ]
     }
    ],
    "systemInstruction": {
      "parts": {
          "text": "Add a smiley emoji after the answer."
      }
    },
    "grounding_spec": {
     "grounding_sources": [
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the world population surpassed 8 billion. This milestone marked a significant moment in human history, highlighting both the rapid growth of our species and the challenges of resource management and sustainability in the years to come.",
               "attributes": {
                 "title": "title_1",
                 "uri": "some-uri-1"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, global e-commerce sales reached an estimated $5.7 trillion. The continued rise of online shopping solidified its position as a dominant force in retail, with major implications for traditional brick-and-mortar stores and the logistics networks supporting worldwide deliveries.",
               "attributes": {
                 "title": "title_2",
                 "uri": "some-uri-2"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the global average surface temperature was approximately 0.2 degrees Celsius higher than the 20th-century average. This continued the worrying trend of global warming, underscoring the urgency of worldwide climate initiatives, carbon reduction efforts, and investment in renewable energy sources.",
               "attributes": {
                 "title": "title_3",
                 "uri": "some-uri-3"
               }
             }
           ]
         }
       }
     ]
    },
    "generationSpec": {
     "modelId": "gemini-1.5-flash"
    }
    }'
    
  2. 2 つ目のプロンプトをフォローアップとして送信します。ユーザーからの最初のプロンプトを追加し、コンテキストとしてモデルからの対応する回答を追加します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "Summarize what happened in 2023 in one paragraph."
         }
       ]
     },
     {
       "role": "model",
       "parts": [
         {
           "text": "In 2023, the global average surface temperature increased, the world population surpassed 8 billion, and global e-commerce sales reached an estimated $5.7 trillion.  😊 \n"
         }
       ]
     },
     {
       "role": "user",
       "parts": [
         {
           "text": "Rephrase the answer in an abstracted list."
         }
       ]
     }
    ],
    "grounding_spec": {
     "grounding_sources": [
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the world population surpassed 8 billion. This milestone marked a significant moment in human history, highlighting both the rapid growth of our species and the challenges of resource management and sustainability in the years to come.",
               "attributes": {
                 "title": "title_1",
                 "uri": "some-uri-1"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, global e-commerce sales reached an estimated $5.7 trillion. The continued rise of online shopping solidified its position as a dominant force in retail, with major implications for traditional brick-and-mortar stores and the logistics networks supporting worldwide deliveries.",
               "attributes": {
                 "title": "title_2",
                 "uri": "some-uri-2"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the global average surface temperature was approximately 0.2 degrees Celsius higher than the 20th-century average. This continued the worrying trend of global warming, underscoring the urgency of worldwide climate initiatives, carbon reduction efforts, and investment in renewable energy sources.",
               "attributes": {
                 "title": "title_3",
                 "uri": "some-uri-3"
               }
             }
           ]
         }
       }
     ]
    },
    "generationSpec": {
     "modelId": "gemini-1.5-flash"
    }
    }'
    

グラウンディングされた回答をストリーミングする

モデルから回答をストリーミングすることもできます。これは、回答が特に長く、レスポンス全体を一度に送信すると大幅な遅延が発生するユースケースで役立ちます。回答をストリーミングすると、レスポンスが回答テキストの連続した部分を含む複数の候補の配列に分割されます。

ストリーミングされた根拠のある回答を取得する手順は次のとおりです。

REST

次のサンプルは、根拠のある回答をストリーミングする方法を示しています。このサンプルでは、streamGenerateGroundedContent メソッドを使用して、動的取得構成なしで Google 検索で回答を取得します。同様の手順で、他の根拠づけソースを使用して根拠に基づく回答を生成できます。

  1. 次の curl リクエストでプロンプトを送信します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_NUMBER/locations/global:streamGenerateGroundedContent" \
    -d '
    [
    {
     "contents": [
       {
         "role": "user",
         "parts": [
           {
             "text": "PROMPT_TEXT"
           }
         ]
       }
     ],
     "systemInstruction": {
         "parts": {
             "text": "SYSTEM_INSTRUCTION"
         }
     },
     "groundingSpec": {
       "groundingSources": [
         {
           "googleSearchSource": {}
         }
       ]
     },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }
    ]'
    

    以下を置き換えます。

    • PROJECT_NUMBER: Google Cloud プロジェクトの番号。
    • PROMPT_TEXT: ユーザーからのプロンプト。
    • SYSTEM_INSTRUCTION: プレアブルまたは追加のコンテキストを指定するオプションのフィールド。
    • MODEL_ID: グラウンドド アンサーの生成に使用する Gemini モデルのモデル ID を設定するオプション フィールド。使用可能なモデル ID の一覧については、サポートされているモデルをご覧ください。
    • TEMPERATURE: サンプリングに使用する温度を設定するオプションのフィールド。温度は 0.0 をおすすめします。詳細については、Gemini モデル パラメータをご覧ください。
    • TOP_P: モデルの top-P 値を設定するオプション フィールド。詳細については、Gemini モデル パラメータをご覧ください。
    • TOP_K: モデルのトップ K 値を設定するオプション フィールド。詳細については、Gemini モデル パラメータをご覧ください。

Python

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"

client = discoveryengine.GroundedGenerationServiceClient()

request = discoveryengine.GenerateGroundedContentRequest(
    # The full resource name of the location.
    # Format: projects/{project_number}/locations/{location}
    location=client.common_location_path(project=project_number, location="global"),
    generation_spec=discoveryengine.GenerateGroundedContentRequest.GenerationSpec(
        model_id="gemini-1.5-flash",
    ),
    # Conversation between user and model
    contents=[
        discoveryengine.GroundedGenerationContent(
            role="user",
            parts=[
                discoveryengine.GroundedGenerationContent.Part(
                    text="Summarize how to delete a data store in Vertex AI Agent Builder?"
                )
            ],
        )
    ],
    grounding_spec=discoveryengine.GenerateGroundedContentRequest.GroundingSpec(
        grounding_sources=[
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                google_search_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.GoogleSearchSource()
            ),
        ]
    ),
)
responses = client.stream_generate_grounded_content(iter([request]))

for response in responses:
    # Handle the response
    print(response)

グラウンディングされた回答のストリーミングの例

次の例では、リクエストで Google 検索をグラウンドング ソースとして指定し、動的取得構成なしで回答をストリーミングします。ストリーミングされた回答は、複数のレスポンス候補に分散されます。このサンプルでは、streamGenerateGroundedContent メソッドを使用します。

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1alpha/projects/123456/locations/global:streamGenerateGroundedContent" \
-d '
[
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Summarize How to delete a data store in Vertex AI Agent Builder?"
        }
      ]
    }
  ],
  "groundingSpec": {
    "groundingSources": [
      {
        "googleSearchSource": {}
      }
    ]
  },
  "generationSpec": {
    "modelId": "gemini-1.5-flash"
  }
}
]'

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

次のモデルはグラウンディングに対応しています。

  • Gemini 1.5 Pro(テキスト入力のみ)
  • テキスト入力のみの Gemini 1.5 Flash
  • テキスト入力のみの Gemini 1.0 Pro

これらの Gemini モデルの詳細については、Gemini モデルのバージョンとライフサイクルをご覧ください。

generateGroundedContent メソッドを呼び出すときには、次のモデル ID を使用できます。

モデル ID 自動更新対象
default
gemini-1.0-pro
gemini-1.0-pro-001 ×
gemini-1.0-pro-002 ×
gemini-1.5-flash
gemini-1.5-flash-001 ×
gemini-1.5-pro
gemini-1.5-pro-001 ×

次のステップ

他の RAG API でグラウンディング生成方法を使用して、非構造化データからグラウンディングされた回答を生成する方法を学びます。