使用 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 仍可访问 最多保留 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:用于设置用于采样的温度的可选字段。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 搜索和 支持的模型 知识。这有助于您管理延迟时间、质量和 性价比更高

动态检索预测得分和阈值

当您发送生成有依据的答案的请求时,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 结合使用 根据非结构化数据生成有依据的答案