使用 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 分为两个阶段:

  1. 检索:快速获取最相关的事实可能是常见的搜索问题。借助 RAG,您可以快速检索生成回答所需的重要事实。
  2. 生成:LLM 使用检索到的数据生成有依据的回答。

因此,基于事实的回答生成方法会从基准来源检索事实,并生成基于事实的回答。

输入数据

基于事实的回答生成方法需要在请求中提供以下输入:

  • 角色:给定文本的发件人,可以是用户 (user) 或模型 (model)。

  • 文本:当角色为 user 时,文本是提示;当角色为 model 时,文本是基于事实的回答。您在请求中指定角色和文本的方式如下所示:

    • 对于单轮回答生成,用户在请求中发送提示文本,模型在响应中发送回答文本。
    • 对于生成多轮对话回答,请求包含所有之前对话轮的提示-回答对,以及当前对话轮中用户的提示文本。因此,在这种请求中,提示文本的角色为 user,答案文本的角色为 model
  • 系统说明:提示的前言,用于控制模型的行为并相应地修改输出。例如,您可以为生成的回答添加角色,或指示模型以特定方式设置输出文本的格式。如需生成多轮回答,您必须为每轮提供系统说明。如需了解详情,请参阅使用系统说明

  • 依据来源:回答的依据来源,可以是以下一个或多个来源:

    • Google 搜索:以 Google 搜索结果作为回答依据。如果基准来源是 Google 搜索,您可以指定具有动态检索阈值的动态检索配置。如需了解详情,请参阅动态检索

    • 内嵌文本:根据请求中提供的事实文本来回答问题。事实文本是用户提供的陈述,系统会将其视为与给定请求相关的事实。该模型不会检查事实文本的真实性。您最多可以在每个内嵌文本来源中提供 100 条事实文本。您可以使用元属性(例如标题、作者和 URI)来支持事实文本。在引用支持回答的代码段时,这些元属性会在响应中返回。

    • Vertex AI Search 数据存储区:以 Vertex AI Search 数据存储区中的文档为依据来回答问题。您不能将网站搜索数据存储区指定为基准来源。

    在给定请求中,您可以同时提供内嵌文本来源和 Vertex AI Search 数据存储区来源。您无法将 Google 搜索与这两种来源结合使用。因此,如果您想使用 Google 搜索结果为回答建立依据,则必须发送单独的要求,指定 Google 搜索为唯一的依据来源。

    您最多可以提供 10 个接地源,且顺序不限。例如,假设您按以下顺序提供以下数量的接地源,以便总共获得 10 个接地源:

    • 三个内嵌文本来源,每个来源最多可包含 100 条事实文本
    • 六个 Vertex AI Search 数据存储区
    • 四个内嵌文本来源,每个来源最多可包含 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 模型参数

输出数据

模型生成的回答称为候选回答,其中包含以下数据。输出中可能不包含所有字段。

  • 角色:提供实用回答的发件人。响应始终包含基于事实的回答文本。因此,响应中的角色始终是模型。

  • 文本:接地回答。

  • 根基得分:一个介于 [0, 1] 范围内的浮点值,表示回答与给定来源的契合度。

  • 接地元数据:与接地源相关的元数据。基准元数据包含以下信息:

    • 支持的段落:支持相应答案的段落列表。每个支持分块都会分配一个支持分块索引,这在跟踪来源时非常有用。每个支持分块都包含以下内容:

      • 文本块:从提取回答或回答部分(称为声明文本)的来源中逐字引用的部分文本。此字段可能并不总是存在于响应中。
      • 来源:在请求中为来源分配的编号。
      • 来源元数据:与分块相关的元数据。来源元数据可以是以下任一项,具体取决于来源:

        • 对于内嵌来源,元数据可以是请求中指定的其他详细信息,例如标题、作者或 URI。
        • 对于 Vertex AI Search 数据存储区,元数据可以是文档 ID、文档标题、URI(Cloud Storage 位置)或页码。
        • 对于“使用 Google 搜索建立依据”功能,在生成有依据的结果时,元数据中会包含一个 URI,该 URI 会重定向到用于生成有依据的结果的内容的发布商。元数据还包含发布商的网域。在生成基于地理位置的结果后,所提供的 URI 最多可供访问 30 天。
    • 归因支持:答案中断言的归因信息。接地支持包含以下信息:

      • 声明文本:通过支持信息块文本得到证实的回答或回答的一部分。
      • 支持块索引:为支持块分配的索引,其顺序与支持块在支持块列表中的显示顺序相同。
      • 网络搜索查询:Google 搜索建议的建议搜索查询。
      • 搜索建议:如果您在响应中收到 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:用于设置用于采样的温度的可选字段。Google 建议将温度设为 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 生成单轮回答的示例

在以下示例中,请求指定了以下基准来源:一个内嵌文本事实和一个 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 搜索生成有依据的回答

您可以使用公开提供的 Web 数据作为生成的回答的依据。

动态检索

您可以在请求中使用动态检索功能,选择何时停用“依托 Google 搜索进行接地”。如果提示不需要依托 Google 搜索提供回答,并且受支持的模型可以根据自己的知识提供回答,而不依托接地,这会非常有用。这有助于您更有效地管理延迟时间、质量和费用。

动态检索预测得分和阈值

当您发出生成基于事实的回答的请求时,Vertex AI Agent Builder 会为问题分配一个预测得分。预测得分是一个介于 [0,1] 范围内的浮点值。其价值取决于问题是否可以通过使用 Google 搜索中的最新信息来为回答提供依据。因此,如果提示要求回答基于网络上的最新事实,则预测得分较高;如果提示只需要模型生成的回答,则预测得分较低。

下面是一些问题及其预测得分示例。

提示 预测分数 评论
“写一首关于牡丹的诗歌” 0.13 模型可以依赖其知识,并且答案不需要依据
“为 2 岁儿童推荐玩具” 0.36 模型可以依赖其知识,并且答案不需要依据
“您能提供亚洲风味的鳄梨酱食谱吗?” 0.55 Google 搜索可以给出以事实为依据的回答,但并非严格要求必须进行接地;模型知识可能已经足够
“什么是 Agent Builder?How is grounding billed in Agent Builder?" 0.72 要求 Google 搜索生成有依据的回答
“谁赢得了最新的 F1 大奖赛?” 0.97 要求 Google 搜索生成有依据的回答

在基于事实的回答生成请求中,您可以指定带有阈值的动态检索配置。阈值是一个介于 [0,1] 范围内的浮点值,默认为 0.7。如果阈值为零,则回答始终基于 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:用于设置用于采样的温度的可选字段。Google 建议将温度设为 0.0。如需了解详情,请参阅 Gemini 模型参数
    • TOP_P:可选字段,用于为模型设置 top-P 值。如需了解详情,请参阅 Gemini 模型参数
    • TOP_K:一个可选字段,用于为模型设置 top-K 值。如需了解详情,请参阅 Gemini 模型参数
    • DYNAMIC_RETRIEVAL_THRESHOLD:可选字段,用于设置调用动态检索配置的阈值。该值是一个介于 [0,1] 范围内的浮点值。如果您添加了 dynamicRetrievalConfig 字段,但未设置 predictorthreshold 字段,则阈值默认为 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:用于设置用于采样的温度的可选字段。Google 建议将温度设为 0.0。如需了解详情,请参阅 Gemini 模型参数
    • TOP_P:可选字段,用于为模型设置 top-P 值。如需了解详情,请参阅 Gemini 模型参数
    • TOP_K:一个可选字段,用于为模型设置 top-K 值。如需了解详情,请参阅 Gemini 模型参数
  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:用户在第二轮中的提示文本。
    • SYSTEM_INSTRUCTION_TURN_2:一个可选字段,用于提供序言或一些额外的上下文。如需生成多轮回答,您必须为每轮提供系统指令。
    • MODEL_ID:一个可选字段,用于设置您要用于生成标准回答的 Gemini 模型的模型 ID。如需查看可用模型 ID 的列表,请参阅支持的模型
    • TEMPERATURE:用于设置用于采样的温度的可选字段。Google 建议将温度设为 0.0。如需了解详情,请参阅 Gemini 模型参数
    • TOP_P:可选字段,用于为模型设置 top-P 值。如需了解详情,请参阅 Gemini 模型参数
    • TOP_K:一个可选字段,用于为模型设置 top-K 值。如需了解详情,请参阅 Gemini 模型参数
  3. 重复此过程即可获得更多后续答案。在每次对话中,添加用户之前的所有提示,后跟模型的对应回答。

多轮回答生成示例

在以下示例中,请求指定了三个内嵌事实文本作为基准来源,以便在两轮对话中生成回答。此示例使用 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. 作为后续跟进,发送第二个提示。添加用户的第一个问题,然后添加模型的对应回答作为上下文。

    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:用于设置用于采样的温度的可选字段。Google 建议将温度设为 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 搭配使用,以根据非结构化数据生成接地回答