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 の場合、テキストはグラウンディングされた回答です。リクエストでロールとテキストを指定する方法は、次のように決まります。

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

  • 根拠づけのソース: 回答の根拠となるソース。次のいずれかになります。

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

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

    • Vertex AI Search データストア: Vertex AI Search データストアのドキュメントで回答をグラウンディングします。

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

    指定できる根拠づけのソースは最大 10 個で、順序は任意です。たとえば、次の順序で次の数の根拠づけのソースを指定して、合計 10 個の根拠づけのソースを取得するとします。

    • それぞれに最大 100 個の事実テキストを含むことができる、3 つのインライン テキストソース
    • 6 つの Vertex AI Search データストア
    • それぞれに最大 100 個の事実テキストを含むことができる、4 つのインライン テキストソース

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

    根拠づけのソース インデックス
    インライン テキスト #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 モデル パラメータをご覧ください。

出力データ

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

  • ロール: グラウンディングされた回答の送信者。レスポンスには常に、グラウンディングされた回答のテキストが含まれます。したがって、レスポンスのロールは常にモデルです。

  • テキスト: グラウンディングされた回答。

  • グラウンディング スコア: 回答が特定のソースにおいてどの程度根拠があるかを示す [0, 1] の範囲の浮動小数点値。

  • グラウンディング メタデータ: 根拠づけのソースに関するメタデータ。グラウンディング メタデータには次の情報が含まれます。

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

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

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

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

シングルターンでグラウンディングされた回答を生成する

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

回答をインライン テキストと 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: モデルの Top-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 つの 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: モデルの Top-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: モデルの Top-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: モデルの Top-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: モデルの Top-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 でグラウンディング生成方法を使用して、非構造化データからグラウンディングされた回答を生成する方法を学習する。