创建搜索数据存储区

要创建数据存储区并注入用于搜索的数据,请转到 来源:

要改为从第三方数据源同步数据,请参阅 连接第三方数据源

使用网站内容创建数据存储区

请按照以下步骤创建数据存储区并为网站编制索引。

若要在创建网站数据存储区后使用该存储区,您必须将其附加到已启用企业版功能的应用。您可以为应用启用企业版 。这会产生额外费用。请参阅 创建搜索应用高级功能简介

控制台

如需使用 Google Cloud 控制台创建数据存储区并编入网站索引,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 在导航菜单中,点击数据存储区

  3. 点击创建数据存储区

  4. 来源页面上,选择网站内容

  5. 选择是否要为此数据存储区开启高级网站索引编制功能。 此选项以后无法开启或关闭。

    高级网站索引编制功能提供搜索摘要、搜索跟进和提取式回答等其他功能。使用高级网站索引编制功能会产生额外费用,并且要求您验证要编入索引的任何网站的域名所有权。如需了解详情,请参阅 高级网站索引编制价格

  6. 要包括的网站字段中,输入与您要包含在数据存储区中的网站匹配的网址模式。包含一个网址 每行一个网址格式,不带逗号分隔符。例如 www.example.com/docs/*

  7. 可选:在要排除的网站字段中,输入您要排除的网址格式 要从数据存储区中排除的数据。

    要查看您可以包含或排除的网址格式的数量,请参阅网站数据

  8. 点击继续

  9. 为数据存储区选择一个位置。必须启用高级网站索引编制功能,才能选择地理位置。

  10. 输入数据存储区的名称。

  11. 点击创建。Vertex AI Search 会创建数据存储区,并在数据存储区页面上显示您的数据存储区。

  12. 如需查看数据存储区相关信息,请点击名称列中的数据存储区名称。系统随即会显示您的数据存储区页面。

    • 如果您启用了高级网站索引编制功能,系统会显示一条警告消息,提示您 您需要验证数据存储区中的网域。
    • 如果您配额不足(您指定的网站中的网页数量超出了项目的“每个项目的文档数量”配额),系统会显示一条额外的警告,提示您升级配额。
  13. 如需验证数据存储区中网址模式的网域,请按照验证网站网域页面上的说明操作。

  14. 如需升级配额,请按以下步骤操作:

    1. 点击升级配额。系统会显示 Google Cloud 控制台的 IAM 和管理页面。
    2. 请按照 Google Cloud 文档中的申请更高配额限制部分中的说明操作。要增加的配额是 Discovery Engine API 服务中的文档数量
    3. 提交提高配额上限的申请后,请返回 Agent Builder 页面,然后点击导航菜单中的 Data Stores
    4. 名称列中点击数据存储区的名称。状态 列表示正在将超出配额的网站编入索引。如果网址的状态列显示为已编入索引,则该网址或网址格式可以使用高级网站索引编制功能。

    如需了解详情,请参阅网页的配额 索引中的“配额和限制”部分页面。

Python

有关详情,请参阅 Vertex AI Agent Builder Python API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入网站

from google.api_core.client_options import ClientOptions

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# uri_pattern = "https://cloud.google.com/generative-ai-app-builder/docs/*"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.SiteSearchEngineServiceClient(
    client_options=client_options
)

# The full resource name of the data store
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}
site_search_engine = client.site_search_engine_path(
    project=project_id, location=location, data_store=data_store_id
)

# Target Site to index
target_site = discoveryengine.TargetSite(
    provided_uri_pattern=uri_pattern,
    # Options: INCLUDE, EXCLUDE
    type_=discoveryengine.TargetSite.Type.INCLUDE,
    exact_match=False,
)

# Make the request
operation = client.create_target_site(
    parent=site_search_engine,
    target_site=target_site,
)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.CreateTargetSiteMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

后续步骤

  • 如需将您的网站数据存储区关联到应用,请使用 Enterprise 创建应用 功能,然后按照 创建搜索应用

  • 要预览在您的应用和数据存储区均已下载完毕后,搜索结果会如何显示 设置,请参阅 获取搜索结果

从 BigQuery 导入

您可以通过以下两种方式从 BigQuery 表创建数据存储区:

  • 一次性提取:您可以将 BigQuery 表中的数据导入到 和数据存储区。除非您手动刷新数据,否则数据存储区中的数据不会发生变化。

  • 定期提取:您可以从一个或多个 BigQuery 表导入数据,并设置同步频率,以确定数据存储区使用 BigQuery 数据集中的最新数据进行更新的频率。

下表对导入 BigQuery 的两种方法进行了比较 导出到 Vertex AI Search 数据存储区。

一次性提取 定期提取
已正式发布 (GA)。 公开预览版。
必须手动刷新数据。 数据每 1 天、3 天或 5 天自动更新一次。无法手动刷新数据。
Vertex AI Search 基于 Vertex AI Search 会为 BigQuery 数据集创建一个数据连接器,并为指定的每个表创建一个数据存储区(称为实体数据存储区)。对于每项数据 因此这两个表必须具有相同的数据类型(例如, 结构化)并且位于同一 BigQuery 数据集中。
首先,可以将多个表中的数据合并到一个数据存储区中 从一个表注入数据,然后从另一个来源提取更多数据,或者 BigQuery 表。 由于不支持手动数据导入,因此实体中的数据 数据存储区只能源自一个 BigQuery 表。
支持数据源访问权限控制。 不支持数据源访问控制。导入的数据可以 包含访问权限控制,但不遵循这些控制措施。
您可以使用 Google Cloud 控制台或 API。 您必须使用控制台创建数据连接器及其实体数据存储区。
符合 CMEK 要求。 不符合 CMEK。

从 BigQuery 导入一次

如需从 BigQuery 表中提取数据,请按照以下步骤使用 Google Cloud 控制台或 API 创建数据存储区并提取数据。

在导入数据之前,请查看 准备数据以便提取

控制台

如需使用 Google Cloud 控制台从 BigQuery 提取数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 前往数据存储区页面。

  3. 点击新建数据存储区

  4. 来源页面上,选择 BigQuery

  5. 选择您要导入的数据类型

  6. 点击一次

  7. BigQuery 路径字段中,点击浏览,选择您准备好提取的表,然后点击选择。或者,您也可以直接在 BigQuery 路径字段中输入表位置。

  8. 点击继续

  9. 如果您要一次性导入结构化数据,请执行以下操作:

    1. 将字段映射到关键属性。

    2. 如果架构中缺少重要字段,请使用添加新字段进行添加。

      有关详情,请参阅关于自动检测和 修改

    3. 点击继续

  10. 为数据存储区选择一个区域。

  11. 输入数据存储区的名称。

  12. 点击创建

  13. 如需查看注入的状态,请前往数据存储区页面 ,然后点击您的数据存储区名称,在其数据页面上查看关于该数据存储区的详细信息。 当活动标签页上的状态列从进行中更改为导入已完成时,提取操作即告完成。

    提取过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。

REST

使用命令行创建数据存储区并从中导入数据 BigQuery 按照以下步骤操作。

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DATA_STORE_DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"]
    }'
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • DATA_STORE_ID:您要创建的 Vertex AI Search 数据存储区的 ID。此 ID 只能包含小写字母、数字、下划线和连字符。
    • DATA_STORE_DISPLAY_NAME:您要创建的 Vertex AI Search 数据存储区的显示名称。

    可选:如果您要上传非结构化数据,并且想要配置文档解析或为 RAG 启用文档分块,请指定 documentProcessingConfig 对象并将其包含在数据存储区创建请求中。配置 如果您要提取扫描的 PDF,建议您使用适用于 PDF 的 OCR 解析器。如需了解如何配置解析或分块选项,请参阅解析和分块文档

  2. 从 BigQuery 导入数据。

    如果您定义了架构,请确保数据符合该架构。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
    -d '{
      "bigquerySource": {
        "projectId": "PROJECT_ID",
        "datasetId":"DATASET_ID",
        "tableId": "TABLE_ID",
        "dataSchema": "DATA_SCHEMA",
        "aclEnabled": "BOOLEAN"
      },
      "reconciliationMode": "RECONCILIATION_MODE",
      "autoGenerateIds": "AUTO_GENERATE_IDS",
      "idField": "ID_FIELD",
      "errorConfig": {
        "gcsPrefix": "ERROR_DIRECTORY"
      }
    }'
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • DATA_STORE_ID:Vertex AI Search 数据存储区的 ID。
    • DATASET_ID:BigQuery 数据集的 ID。
    • TABLE_ID:BigQuery 表的 ID。
      • 如果 BigQuery 表不在 PROJECT_ID 下,您需要向服务账号 service-<project number>@gcp-sa-discoveryengine.iam.gserviceaccount.com 授予 BigQuery 表的“BigQuery Data Viewer”权限。例如,如果您要将 BigQuery 表从源项目“123”导入目标项目“456”,请为项目“123”下的 BigQuery 表授予 service-456@gcp-sa-discoveryengine.iam.gserviceaccount.com 权限。
    • DATA_SCHEMA:可选。值为 documentcustom。默认值为 document
      • document:您使用的 BigQuery 表必须符合准备数据以供提取中提供的默认 BigQuery 架构。您可以自行定义每个文档的 ID 同时将所有数据封装在 jsonData 字符串中。
      • custom:任何 BigQuery 表 Vertex AI Search 会自动 为导入的每个文档生成 ID。
    • ERROR_DIRECTORY:可选。Cloud Storage 目录 获取有关导入的错误信息,例如 gs://<your-gcs-bucket>/directory/import_errors。Google 建议将此字段留空,以便 Vertex AI Search 自动创建临时目录。
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 BigQuery 到数据存储区的数据增量刷新。这会执行更新/插入操作,该操作会添加新文档,并将现有文档替换为具有相同 ID 的更新文档。指定 FULL 会导致 数据存储区文档。也就是说, 有文档会添加到您的数据存储区,而未添加到数据存储区中的文档 会从您的数据存储区中移除。如果您想自动删除不再需要的文档,FULL 模式会很有用。
    • AUTO_GENERATE_IDS:可选。指定是否自动生成文档 ID。如果设置为 true,则文档 ID 是基于载荷的哈希值生成的请注意,生成的 文档 ID 可能不会在多次导入时保持一致。如果 您将通过多次导入自动生成 ID,Google 高度 建议将 reconciliationMode 设置为 FULL 以保持 文档 ID 保持一致。

      仅当 bigquerySource.dataSchema 设置为 custom 时,才指定 autoGenerateIds。否则,INVALID_ARGUMENT 错误为 返回。如果您未指定 autoGenerateIds 或将其设置为 false,则必须指定 idField。否则,文档将无法导入。

    • ID_FIELD:可选。指定哪些字段是文档 ID。对于 BigQuery 源文件:idField 表示 BigQuery 中列的名称 表。

      仅在满足以下条件时指定 idField:(1) 设置了 bigquerySource.dataSchema 设为 custom,且 (2) auto_generate_ids 设为 false 或 未指定。否则,系统将返回 INVALID_ARGUMENT 错误。

      BigQuery 列名称的值必须为字符串类型,必须介于 1 到 63 个字符之间,并且必须符合 RFC-1034 的要求。否则,文档将无法导入。

C#

如需了解详情,请参阅 Vertex AI Agent Builder C# API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

using Google.Cloud.DiscoveryEngine.V1;
using Google.LongRunning;

public sealed partial class GeneratedDataStoreServiceClientSnippets
{
    /// <summary>Snippet for CreateDataStore</summary>
    /// <remarks>
    /// This snippet has been automatically generated and should be regarded as a code template only.
    /// It will require modifications to work:
    /// - It may require correct/in-range values for request initialization.
    /// - It may require specifying regional endpoints when creating the service client as shown in
    ///   https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint.
    /// </remarks>
    public void CreateDataStoreRequestObject()
    {
        // Create client
        DataStoreServiceClient dataStoreServiceClient = DataStoreServiceClient.Create();
        // Initialize request argument(s)
        CreateDataStoreRequest request = new CreateDataStoreRequest
        {
            ParentAsCollectionName = CollectionName.FromProjectLocationCollection("[PROJECT]", "[LOCATION]", "[COLLECTION]"),
            DataStore = new DataStore(),
            DataStoreId = "",
            CreateAdvancedSiteSearch = false,
            SkipDefaultSchemaCreation = false,
        };
        // Make the request
        Operation<DataStore, CreateDataStoreMetadata> response = dataStoreServiceClient.CreateDataStore(request);

        // Poll until the returned long-running operation is complete
        Operation<DataStore, CreateDataStoreMetadata> completedResponse = response.PollUntilCompleted();
        // Retrieve the operation result
        DataStore result = completedResponse.Result;

        // Or get the name of the operation
        string operationName = response.Name;
        // This name can be stored, then the long-running operation retrieved later by name
        Operation<DataStore, CreateDataStoreMetadata> retrievedResponse = dataStoreServiceClient.PollOnceCreateDataStore(operationName);
        // Check if the retrieved long-running operation has completed
        if (retrievedResponse.IsCompleted)
        {
            // If it has completed, then access the result
            DataStore retrievedResult = retrievedResponse.Result;
        }
    }
}

导入文档

using Google.Cloud.DiscoveryEngine.V1;
using Google.LongRunning;
using Google.Protobuf.WellKnownTypes;

public sealed partial class GeneratedDocumentServiceClientSnippets
{
    /// <summary>Snippet for ImportDocuments</summary>
    /// <remarks>
    /// This snippet has been automatically generated and should be regarded as a code template only.
    /// It will require modifications to work:
    /// - It may require correct/in-range values for request initialization.
    /// - It may require specifying regional endpoints when creating the service client as shown in
    ///   https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint.
    /// </remarks>
    public void ImportDocumentsRequestObject()
    {
        // Create client
        DocumentServiceClient documentServiceClient = DocumentServiceClient.Create();
        // Initialize request argument(s)
        ImportDocumentsRequest request = new ImportDocumentsRequest
        {
            ParentAsBranchName = BranchName.FromProjectLocationDataStoreBranch("[PROJECT]", "[LOCATION]", "[DATA_STORE]", "[BRANCH]"),
            InlineSource = new ImportDocumentsRequest.Types.InlineSource(),
            ErrorConfig = new ImportErrorConfig(),
            ReconciliationMode = ImportDocumentsRequest.Types.ReconciliationMode.Unspecified,
            UpdateMask = new FieldMask(),
            AutoGenerateIds = false,
            IdField = "",
        };
        // Make the request
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> response = documentServiceClient.ImportDocuments(request);

        // Poll until the returned long-running operation is complete
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> completedResponse = response.PollUntilCompleted();
        // Retrieve the operation result
        ImportDocumentsResponse result = completedResponse.Result;

        // Or get the name of the operation
        string operationName = response.Name;
        // This name can be stored, then the long-running operation retrieved later by name
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> retrievedResponse = documentServiceClient.PollOnceImportDocuments(operationName);
        // Check if the retrieved long-running operation has completed
        if (retrievedResponse.IsCompleted)
        {
            // If it has completed, then access the result
            ImportDocumentsResponse retrievedResult = retrievedResponse.Result;
        }
    }
}

Go

如需了解详情,请参阅 Vertex AI Agent Builder Go API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


package main

import (
	"context"

	discoveryengine "cloud.google.com/go/discoveryengine/apiv1"
	discoveryenginepb "cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb"
)

func main() {
	ctx := context.Background()
	// This snippet has been automatically generated and should be regarded as a code template only.
	// It will require modifications to work:
	// - It may require correct/in-range values for request initialization.
	// - It may require specifying regional endpoints when creating the service client as shown in:
	//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options
	c, err := discoveryengine.NewDataStoreClient(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	defer c.Close()

	req := &discoveryenginepb.CreateDataStoreRequest{
		// TODO: Fill request struct fields.
		// See https://pkg.go.dev/cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb#CreateDataStoreRequest.
	}
	op, err := c.CreateDataStore(ctx, req)
	if err != nil {
		// TODO: Handle error.
	}

	resp, err := op.Wait(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	// TODO: Use resp.
	_ = resp
}

导入文档


package main

import (
	"context"

	discoveryengine "cloud.google.com/go/discoveryengine/apiv1"
	discoveryenginepb "cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb"
)

func main() {
	ctx := context.Background()
	// This snippet has been automatically generated and should be regarded as a code template only.
	// It will require modifications to work:
	// - It may require correct/in-range values for request initialization.
	// - It may require specifying regional endpoints when creating the service client as shown in:
	//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options
	c, err := discoveryengine.NewDocumentClient(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	defer c.Close()

	req := &discoveryenginepb.ImportDocumentsRequest{
		// TODO: Fill request struct fields.
		// See https://pkg.go.dev/cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb#ImportDocumentsRequest.
	}
	op, err := c.ImportDocuments(ctx, req)
	if err != nil {
		// TODO: Handle error.
	}

	resp, err := op.Wait(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	// TODO: Use resp.
	_ = resp
}

Java

有关详情,请参阅 Vertex AI Agent Builder Java API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

import com.google.cloud.discoveryengine.v1.CollectionName;
import com.google.cloud.discoveryengine.v1.CreateDataStoreRequest;
import com.google.cloud.discoveryengine.v1.DataStore;
import com.google.cloud.discoveryengine.v1.DataStoreServiceClient;

public class SyncCreateDataStore {

  public static void main(String[] args) throws Exception {
    syncCreateDataStore();
  }

  public static void syncCreateDataStore() throws Exception {
    // This snippet has been automatically generated and should be regarded as a code template only.
    // It will require modifications to work:
    // - It may require correct/in-range values for request initialization.
    // - It may require specifying regional endpoints when creating the service client as shown in
    // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
    try (DataStoreServiceClient dataStoreServiceClient = DataStoreServiceClient.create()) {
      CreateDataStoreRequest request =
          CreateDataStoreRequest.newBuilder()
              .setParent(CollectionName.of("[PROJECT]", "[LOCATION]", "[COLLECTION]").toString())
              .setDataStore(DataStore.newBuilder().build())
              .setDataStoreId("dataStoreId929489618")
              .setCreateAdvancedSiteSearch(true)
              .setSkipDefaultSchemaCreation(true)
              .build();
      DataStore response = dataStoreServiceClient.createDataStoreAsync(request).get();
    }
  }
}

导入文档

import com.google.cloud.discoveryengine.v1.BranchName;
import com.google.cloud.discoveryengine.v1.DocumentServiceClient;
import com.google.cloud.discoveryengine.v1.ImportDocumentsRequest;
import com.google.cloud.discoveryengine.v1.ImportDocumentsResponse;
import com.google.cloud.discoveryengine.v1.ImportErrorConfig;
import com.google.protobuf.FieldMask;

public class SyncImportDocuments {

  public static void main(String[] args) throws Exception {
    syncImportDocuments();
  }

  public static void syncImportDocuments() throws Exception {
    // This snippet has been automatically generated and should be regarded as a code template only.
    // It will require modifications to work:
    // - It may require correct/in-range values for request initialization.
    // - It may require specifying regional endpoints when creating the service client as shown in
    // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
    try (DocumentServiceClient documentServiceClient = DocumentServiceClient.create()) {
      ImportDocumentsRequest request =
          ImportDocumentsRequest.newBuilder()
              .setParent(
                  BranchName.ofProjectLocationDataStoreBranchName(
                          "[PROJECT]", "[LOCATION]", "[DATA_STORE]", "[BRANCH]")
                      .toString())
              .setErrorConfig(ImportErrorConfig.newBuilder().build())
              .setUpdateMask(FieldMask.newBuilder().build())
              .setAutoGenerateIds(true)
              .setIdField("idField1629396127")
              .build();
      ImportDocumentsResponse response = documentServiceClient.importDocumentsAsync(request).get();
    }
  }
}

Node.js

如需了解详情,请参阅 Vertex AI Agent Builder Node.js API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

/**
 * This snippet has been automatically generated and should be regarded as a code template only.
 * It will require modifications to work.
 * It may require correct/in-range values for request initialization.
 * TODO(developer): Uncomment these variables before running the sample.
 */
/**
 *  Required. The parent resource name, such as
 *  `projects/{project}/locations/{location}/collections/{collection}`.
 */
// const parent = 'abc123'
/**
 *  Required. The DataStore google.cloud.discoveryengine.v1.DataStore  to
 *  create.
 */
// const dataStore = {}
/**
 *  Required. The ID to use for the
 *  DataStore google.cloud.discoveryengine.v1.DataStore, which will become
 *  the final component of the
 *  DataStore google.cloud.discoveryengine.v1.DataStore's resource name.
 *  This field must conform to RFC-1034 (https://tools.ietf.org/html/rfc1034)
 *  standard with a length limit of 63 characters. Otherwise, an
 *  INVALID_ARGUMENT error is returned.
 */
// const dataStoreId = 'abc123'
/**
 *  A boolean flag indicating whether user want to directly create an advanced
 *  data store for site search.
 *  If the data store is not configured as site
 *  search (GENERIC vertical and PUBLIC_WEBSITE content_config), this flag will
 *  be ignored.
 */
// const createAdvancedSiteSearch = true
/**
 *  A boolean flag indicating whether to skip the default schema creation for
 *  the data store. Only enable this flag if you are certain that the default
 *  schema is incompatible with your use case.
 *  If set to true, you must manually create a schema for the data store before
 *  any documents can be ingested.
 *  This flag cannot be specified if `data_store.starting_schema` is specified.
 */
// const skipDefaultSchemaCreation = true

// Imports the Discoveryengine library
const {DataStoreServiceClient} = require('@google-cloud/discoveryengine').v1;

// Instantiates a client
const discoveryengineClient = new DataStoreServiceClient();

async function callCreateDataStore() {
  // Construct request
  const request = {
    parent,
    dataStore,
    dataStoreId,
  };

  // Run request
  const [operation] = await discoveryengineClient.createDataStore(request);
  const [response] = await operation.promise();
  console.log(response);
}

callCreateDataStore();

导入文档

/**
 * This snippet has been automatically generated and should be regarded as a code template only.
 * It will require modifications to work.
 * It may require correct/in-range values for request initialization.
 * TODO(developer): Uncomment these variables before running the sample.
 */
/**
 *  The Inline source for the input content for documents.
 */
// const inlineSource = {}
/**
 *  Cloud Storage location for the input content.
 */
// const gcsSource = {}
/**
 *  BigQuery input source.
 */
// const bigquerySource = {}
/**
 *  FhirStore input source.
 */
// const fhirStoreSource = {}
/**
 *  Spanner input source.
 */
// const spannerSource = {}
/**
 *  Cloud SQL input source.
 */
// const cloudSqlSource = {}
/**
 *  Firestore input source.
 */
// const firestoreSource = {}
/**
 *  AlloyDB input source.
 */
// const alloyDbSource = {}
/**
 *  Cloud Bigtable input source.
 */
// const bigtableSource = {}
/**
 *  Required. The parent branch resource name, such as
 *  `projects/{project}/locations/{location}/collections/{collection}/dataStores/{data_store}/branches/{branch}`.
 *  Requires create/update permission.
 */
// const parent = 'abc123'
/**
 *  The desired location of errors incurred during the Import.
 */
// const errorConfig = {}
/**
 *  The mode of reconciliation between existing documents and the documents to
 *  be imported. Defaults to
 *  ReconciliationMode.INCREMENTAL google.cloud.discoveryengine.v1.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL.
 */
// const reconciliationMode = {}
/**
 *  Indicates which fields in the provided imported documents to update. If
 *  not set, the default is to update all fields.
 */
// const updateMask = {}
/**
 *  Whether to automatically generate IDs for the documents if absent.
 *  If set to `true`,
 *  Document.id google.cloud.discoveryengine.v1.Document.id s are
 *  automatically generated based on the hash of the payload, where IDs may not
 *  be consistent during multiple imports. In which case
 *  ReconciliationMode.FULL google.cloud.discoveryengine.v1.ImportDocumentsRequest.ReconciliationMode.FULL 
 *  is highly recommended to avoid duplicate contents. If unset or set to
 *  `false`, Document.id google.cloud.discoveryengine.v1.Document.id s have
 *  to be specified using
 *  id_field google.cloud.discoveryengine.v1.ImportDocumentsRequest.id_field,
 *  otherwise, documents without IDs fail to be imported.
 *  Supported data sources:
 *  * GcsSource google.cloud.discoveryengine.v1.GcsSource.
 *  GcsSource.data_schema google.cloud.discoveryengine.v1.GcsSource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * BigQuerySource google.cloud.discoveryengine.v1.BigQuerySource.
 *  BigQuerySource.data_schema google.cloud.discoveryengine.v1.BigQuerySource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * SpannerSource google.cloud.discoveryengine.v1.SpannerSource.
 *  * CloudSqlSource google.cloud.discoveryengine.v1.CloudSqlSource.
 *  * FirestoreSource google.cloud.discoveryengine.v1.FirestoreSource.
 *  * BigtableSource google.cloud.discoveryengine.v1.BigtableSource.
 */
// const autoGenerateIds = true
/**
 *  The field indicates the ID field or column to be used as unique IDs of
 *  the documents.
 *  For GcsSource google.cloud.discoveryengine.v1.GcsSource  it is the key of
 *  the JSON field. For instance, `my_id` for JSON `{"my_id": "some_uuid"}`.
 *  For others, it may be the column name of the table where the unique ids are
 *  stored.
 *  The values of the JSON field or the table column are used as the
 *  Document.id google.cloud.discoveryengine.v1.Document.id s. The JSON field
 *  or the table column must be of string type, and the values must be set as
 *  valid strings conform to RFC-1034 (https://tools.ietf.org/html/rfc1034)
 *  with 1-63 characters. Otherwise, documents without valid IDs fail to be
 *  imported.
 *  Only set this field when
 *  auto_generate_ids google.cloud.discoveryengine.v1.ImportDocumentsRequest.auto_generate_ids 
 *  is unset or set as `false`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  If it is unset, a default value `_id` is used when importing from the
 *  allowed data sources.
 *  Supported data sources:
 *  * GcsSource google.cloud.discoveryengine.v1.GcsSource.
 *  GcsSource.data_schema google.cloud.discoveryengine.v1.GcsSource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * BigQuerySource google.cloud.discoveryengine.v1.BigQuerySource.
 *  BigQuerySource.data_schema google.cloud.discoveryengine.v1.BigQuerySource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * SpannerSource google.cloud.discoveryengine.v1.SpannerSource.
 *  * CloudSqlSource google.cloud.discoveryengine.v1.CloudSqlSource.
 *  * FirestoreSource google.cloud.discoveryengine.v1.FirestoreSource.
 *  * BigtableSource google.cloud.discoveryengine.v1.BigtableSource.
 */
// const idField = 'abc123'

// Imports the Discoveryengine library
const {DocumentServiceClient} = require('@google-cloud/discoveryengine').v1;

// Instantiates a client
const discoveryengineClient = new DocumentServiceClient();

async function callImportDocuments() {
  // Construct request
  const request = {
    parent,
  };

  // Run request
  const [operation] = await discoveryengineClient.importDocuments(request);
  const [response] = await operation.promise();
  console.log(response);
}

callImportDocuments();

Python

如需了解详情,请参阅 Vertex AI Agent Builder Python API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# bigquery_dataset = "YOUR_BIGQUERY_DATASET"
# bigquery_table = "YOUR_BIGQUERY_TABLE"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    bigquery_source=discoveryengine.BigQuerySource(
        project_id=project_id,
        dataset_id=bigquery_dataset,
        table_id=bigquery_table,
        data_schema="custom",
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

Ruby

有关详情,请参阅 Vertex AI Agent Builder Ruby API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

require "google/cloud/discovery_engine/v1"

##
# Snippet for the create_data_store call in the DataStoreService service
#
# This snippet has been automatically generated and should be regarded as a code
# template only. It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
# client as shown in https://cloud.google.com/ruby/docs/reference.
#
# This is an auto-generated example demonstrating basic usage of
# Google::Cloud::DiscoveryEngine::V1::DataStoreService::Client#create_data_store.
#
def create_data_store
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Cloud::DiscoveryEngine::V1::DataStoreService::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Cloud::DiscoveryEngine::V1::CreateDataStoreRequest.new

  # Call the create_data_store method.
  result = client.create_data_store request

  # The returned object is of type Gapic::Operation. You can use it to
  # check the status of an operation, cancel it, or wait for results.
  # Here is how to wait for a response.
  result.wait_until_done! timeout: 60
  if result.response?
    p result.response
  else
    puts "No response received."
  end
end

导入文档

require "google/cloud/discovery_engine/v1"

##
# Snippet for the import_documents call in the DocumentService service
#
# This snippet has been automatically generated and should be regarded as a code
# template only. It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
# client as shown in https://cloud.google.com/ruby/docs/reference.
#
# This is an auto-generated example demonstrating basic usage of
# Google::Cloud::DiscoveryEngine::V1::DocumentService::Client#import_documents.
#
def import_documents
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Cloud::DiscoveryEngine::V1::DocumentService::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Cloud::DiscoveryEngine::V1::ImportDocumentsRequest.new

  # Call the import_documents method.
  result = client.import_documents request

  # The returned object is of type Gapic::Operation. You can use it to
  # check the status of an operation, cancel it, or wait for results.
  # Here is how to wait for a response.
  result.wait_until_done! timeout: 60
  if result.response?
    p result.response
  else
    puts "No response received."
  end
end

通过定期同步功能连接到 BigQuery

在导入数据之前,请查看 准备数据以便提取

以下步骤介绍了如何创建将 包含 Vertex AI Search 数据的 BigQuery 数据集 以及如何在数据集上为每个所需的数据存储区指定表 要创建的活动。数据连接器的子数据存储区称为实体数据存储区。

数据集中的数据会定期同步到实体数据存储区。您可以 指定每天、每三天或每五天同步一次。

控制台

如需使用 Google Cloud 控制台创建一个连接器,以便定期将 BigQuery 数据集中的数据同步到 Vertex AI Search,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 在导航菜单中,点击 Data Stores

  3. 点击创建数据存储区

  4. 来源页面上,选择 BigQuery

  5. 选择要导入的数据类型。

  6. 点击周期性

  7. 选择同步频率,即 Vertex AI Search 连接器与 BigQuery 数据集同步的频率。您可以稍后更改频率。

  8. BigQuery 数据集路径字段中,点击浏览,然后选择数据集 这个列表包含您已为准备 提取。或者,直接输入表格位置 (在 BigQuery 路径字段中)。路径格式为 projectname.datasetname

  9. 要同步的表字段中,点击浏览,然后选择包含要存储到数据存储区中的数据的表。

  10. 数据集中包含要用于其他表的其他表 数据存储区,请点击添加表,然后指定这些表。

  11. 点击继续

  12. 为数据存储区选择一个区域,输入数据连接器的名称,然后点击创建

    现在,您已创建数据连接器,该连接器会定期将数据与 BigQuery 数据集同步。此外,您已经创建了一个或多个实体 和数据存储区。数据存储区与 BigQuery 同名 表格。

  13. 如需查看注入的状态,请前往数据存储区页面 然后点击数据连接器名称,即可在其数据部分中查看有关该连接器的详细信息 页面 >数据注入活动标签页。当系统显示 活动标签从进行中变为成功,第一个 提取完成。

    根据数据的大小,数据注入可能需要花费数天时间 从几分钟到几小时

设置数据源并首次导入数据后,数据存储区 会按照您在设置期间选择的频率同步来自该来源的数据。 数据连接器创建后约 1 小时,首次同步将进行。 然后,系统会在大约 24 小时、72 小时或 120 小时后进行下一次同步。

后续步骤

  • 如需将数据存储区附加到应用,请创建应用并选择数据存储区 请遵循 创建搜索应用

  • 要预览在您的应用和数据存储区均已下载完毕后,搜索结果会如何显示 设置,请参阅 获取搜索结果

从 Cloud Storage 导入

您可以通过以下两种方式从 Cloud Storage 表创建数据存储区:

  • 一次性提取:您将数据从 Cloud Storage 文件夹或文件导入数据存储区。数据存储区中的数据不会改变,除非您 您可以手动刷新数据

  • 定期提取:您从 Cloud Storage 文件夹或文件导入数据,并设置同步频率,以确定数据存储区使用来自该 Cloud Storage 位置的最新数据进行更新的频率。

下表对导入 Cloud Storage 的两种方法进行了比较 导出到 Vertex AI Search 数据存储区。

一次性提取 定期提取
已正式发布 (GA)。 公开预览版。
必须手动刷新数据。 数据每 1 天、3 天或 5 天自动更新一次。无法手动刷新数据。
Vertex AI Search 基于 Cloud Storage 中的文件夹或文件。 Vertex AI Search 会创建一个数据连接器,以及 它会将数据存储区(称为实体数据存储区)与 指定的文件或文件夹。每个 Cloud Storage 数据连接器可以有一个实体数据存储区。
您可以先从一个 Cloud Storage 位置提取数据,然后再从另一个位置提取更多数据,以便将来自多个文件、文件夹和存储桶的数据合并到一个数据存储区中。 由于不支持手动导入数据,实体数据存储区中的数据只能来自一个 Cloud Storage 文件或文件夹。
支持数据源访问权限控制。如需了解详情,请参阅 数据源访问权限控制 不支持数据源访问权限控制。导入的数据可以 包含访问权限控制,但不遵循这些控制措施。
您可以使用 Google Cloud 控制台或 API。 您必须使用控制台创建数据连接器及其实体数据存储区。
符合 CMEK 标准 不符合 CMEK 要求。

从 Cloud Storage 导入一次

如需从 Cloud Storage 提取数据,请按照以下步骤使用 Google Cloud 控制台或 API 创建数据存储区并提取数据。

在导入数据之前,请参阅准备数据以便提取

控制台

如需使用控制台从 Cloud Storage 存储桶中注入数据,请按以下说明操作 步骤:

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 前往数据存储区页面。

  3. 点击新建数据存储区

  4. 来源页面上,选择 Cloud Storage

  5. 选择要导入的文件夹或文件部分,选择 文件夹文件

  6. 点击浏览,然后选择您拥有的数据 准备提取,然后点击选择。 或者,直接在 gs:// 字段中输入位置。

  7. 选择要导入的数据类型。

  8. 点击继续

  9. 如果您要一次性导入结构化数据,请执行以下操作:

    1. 将字段映射到关键属性。

    2. 如果架构中缺少重要字段,请使用新增 字段进行添加。

      有关详情,请参阅关于自动检测和 修改

    3. 点击继续

  10. 为数据存储区选择一个区域。

  11. 为数据存储区输入名称。

  12. 可选:如果您选择了非结构化文档,则可以为文档选择解析和分块选项。如需比较解析器,请参阅解析文档。有关分块的信息,请参阅分块文档 RAG

    OCR 解析器和布局解析器可能会产生额外费用。请参阅文档 AI 功能价格

    要选择解析器,请展开文档处理选项,然后指定 解析器选项。

  13. 点击创建

  14. 如需查看数据注入的状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详细信息。当活动标签页上的状态列从进行中更改为导入已完成时,提取操作即告完成。

    提取过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。

REST

使用命令行创建数据存储区并从中注入数据 Cloud Storage,请按以下步骤操作。

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DATA_STORE_DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
      "contentConfig": "CONTENT_REQUIRED",
    }'
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • DATA_STORE_ID:您要创建的 Vertex AI Search 数据存储区的 ID。此 ID 只能包含小写字母、数字、下划线和连字符。
    • DATA_STORE_DISPLAY_NAME:Vertex AI 的显示名 搜索要创建的数据存储区。

    可选:如需配置文档解析或为 RAG 启用文档分块,请指定 documentProcessingConfig 对象并将其包含在数据存储区创建请求中。配置 如果您要提取扫描的 PDF,建议您使用适用于 PDF 的 OCR 解析器。如需了解如何配置解析或分块选项,请参阅解析和分块文档

  2. 从 Cloud Storage 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "gcsSource": {
          "inputUris": ["INPUT_FILE_PATTERN_1", "INPUT_FILE_PATTERN_2"],
          "dataSchema": "DATA_SCHEMA",
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
        "errorConfig": {
          "gcsPrefix": "ERROR_DIRECTORY"
        }
      }'
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • DATA_STORE_ID:Vertex AI Search 数据存储区的 ID。
    • INPUT_FILE_PATTERN:Cloud Storage 中的文件格式 包含您的文档。

      对于结构化数据或包含元数据的非结构化数据, 输入文件格式的一个示例是 gs://<your-gcs-bucket>/directory/object.json以及 与一个或多个文件匹配的格式是 gs://<your-gcs-bucket>/directory/*.json

      对于非结构化文档,示例如下:gs://<your-gcs-bucket>/directory/*.pdf。每个匹配的文件 会变成一个文档

      如果 <your-gcs-bucket> 不属于 PROJECT_ID,您需要向服务账号 service-<project number>@gcp-sa-discoveryengine.iam.gserviceaccount.com 授予对 Cloud Storage 存储桶的“Storage Object Viewer”权限。例如,如果您要将 Cloud Storage 存储桶从源项目“123”导入目标项目“456”,请向 service-456@gcp-sa-discoveryengine.iam.gserviceaccount.com 授予对项目“123”下的 Cloud Storage 存储桶的权限。

    • DATA_SCHEMA:可选。值为 documentcustomcsvcontent。默认值为 document

      • document:上传带有以下项的元数据的非结构化数据: 非结构化文档。文件中的每一行都必须采用以下某种格式。您可以定义每个文档的 ID:

        • { "id": "<your-id>", "jsonData": "<JSON string>", "content": { "mimeType": "<application/pdf or text/html>", "uri": "gs://<your-gcs-bucket>/directory/filename.pdf" } }
        • { "id": "<your-id>", "structData": <JSON object>, "content": { "mimeType": "<application/pdf or text/html>", "uri": "gs://<your-gcs-bucket>/directory/filename.pdf" } }
      • custom:上传结构化文档的 JSON。数据 按架构进行整理您可以指定架构;否则,系统会自动检测架构。您可以将文档的 JSON 字符串以一致的格式直接放入每行中,Vertex AI Search 会自动为导入的每份文档生成 ID。

      • content:上传非结构化文档(PDF、HTML、DOC、TXT、PPTX)。系统会自动为每个文档生成 ID, 编码为十六进制字符串的 SHA256(GCS_URI) 的前 128 位。您可以指定多个输入文件格式,但匹配的文件不得超过 10 万个文件的限制。

      • csv:在 CSV 文件中加入标题行, 每个标头映射到一个文档字段使用 inputUris 字段指定 CSV 文件的路径。

    • ERROR_DIRECTORY:可选。Cloud Storage 目录 获取有关导入的错误信息,例如 gs://<your-gcs-bucket>/directory/import_errors。Google 建议将此字段留空,以便 Vertex AI Search 自动创建临时目录。

    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会将 Cloud Storage 中的数据增量刷新到 和数据存储区。这会执行更新/插入操作,该操作会添加新文档,并将现有文档替换为具有相同 ID 的更新文档。如果指定 FULL,则会对 中的文档执行完全 rebase 操作 和数据存储区。换句话说,系统会将新文档和更新后的文档添加到您的数据存储区,并将 Cloud Storage 中不存在的文档从您的数据存储区中移除。如果您想自动删除不再需要的文档,FULL 模式会很有用。

    • AUTO_GENERATE_IDS:可选。指定是否自动生成文档 ID。如果设置为 true,则文档 ID 是基于载荷的哈希值生成的请注意,生成的 文档 ID 可能不会在多次导入时保持一致。如果您在多次导入时自动生成 ID,Google 强烈建议您将 reconciliationMode 设置为 FULL,以保持文档 ID 的一致性。

      仅当 gcsSource.dataSchema 设置为以下内容时,才指定 autoGenerateIds customcsv。否则,INVALID_ARGUMENT 错误为 返回。如果您未指定 autoGenerateIds 或将其设置为 false,您必须指定 idField。否则,文档将无法 导入。

    • ID_FIELD:可选。指定哪些字段 文档 ID。对于 Cloud Storage 来源文档,idField 用于在 JSON 字段(即文档 ID)中指定名称。对于 例如,如果 {"my_id":"some_uuid"} 是某个 指定 "idField":"my_id"。这会将名称为 "my_id" 的所有 JSON 字段标识为文档 ID。

      仅当满足以下条件时,才应指定此字段:(1) gcsSource.dataSchema 设置为 customcsv,并且 (2) auto_generate_ids 设置为 false 或未指定。否则,系统会返回 INVALID_ARGUMENT 错误。

      请注意,Cloud Storage JSON 字段的值必须为 字符串类型,长度必须介于 1 到 63 个字符之间,并且必须符合 RFC-1034。否则, 个文档未能导入。

      请注意,id_field 指定的 JSON 字段名称必须为 字符串类型,长度必须介于 1 到 63 个字符之间,并且必须符合 至 RFC-1034。否则, 个文档未能导入。

C#

有关详情,请参阅 Vertex AI Agent Builder C# API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

using Google.Cloud.DiscoveryEngine.V1;
using Google.LongRunning;

public sealed partial class GeneratedDataStoreServiceClientSnippets
{
    /// <summary>Snippet for CreateDataStore</summary>
    /// <remarks>
    /// This snippet has been automatically generated and should be regarded as a code template only.
    /// It will require modifications to work:
    /// - It may require correct/in-range values for request initialization.
    /// - It may require specifying regional endpoints when creating the service client as shown in
    ///   https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint.
    /// </remarks>
    public void CreateDataStoreRequestObject()
    {
        // Create client
        DataStoreServiceClient dataStoreServiceClient = DataStoreServiceClient.Create();
        // Initialize request argument(s)
        CreateDataStoreRequest request = new CreateDataStoreRequest
        {
            ParentAsCollectionName = CollectionName.FromProjectLocationCollection("[PROJECT]", "[LOCATION]", "[COLLECTION]"),
            DataStore = new DataStore(),
            DataStoreId = "",
            CreateAdvancedSiteSearch = false,
            SkipDefaultSchemaCreation = false,
        };
        // Make the request
        Operation<DataStore, CreateDataStoreMetadata> response = dataStoreServiceClient.CreateDataStore(request);

        // Poll until the returned long-running operation is complete
        Operation<DataStore, CreateDataStoreMetadata> completedResponse = response.PollUntilCompleted();
        // Retrieve the operation result
        DataStore result = completedResponse.Result;

        // Or get the name of the operation
        string operationName = response.Name;
        // This name can be stored, then the long-running operation retrieved later by name
        Operation<DataStore, CreateDataStoreMetadata> retrievedResponse = dataStoreServiceClient.PollOnceCreateDataStore(operationName);
        // Check if the retrieved long-running operation has completed
        if (retrievedResponse.IsCompleted)
        {
            // If it has completed, then access the result
            DataStore retrievedResult = retrievedResponse.Result;
        }
    }
}

导入文档

using Google.Cloud.DiscoveryEngine.V1;
using Google.LongRunning;
using Google.Protobuf.WellKnownTypes;

public sealed partial class GeneratedDocumentServiceClientSnippets
{
    /// <summary>Snippet for ImportDocuments</summary>
    /// <remarks>
    /// This snippet has been automatically generated and should be regarded as a code template only.
    /// It will require modifications to work:
    /// - It may require correct/in-range values for request initialization.
    /// - It may require specifying regional endpoints when creating the service client as shown in
    ///   https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint.
    /// </remarks>
    public void ImportDocumentsRequestObject()
    {
        // Create client
        DocumentServiceClient documentServiceClient = DocumentServiceClient.Create();
        // Initialize request argument(s)
        ImportDocumentsRequest request = new ImportDocumentsRequest
        {
            ParentAsBranchName = BranchName.FromProjectLocationDataStoreBranch("[PROJECT]", "[LOCATION]", "[DATA_STORE]", "[BRANCH]"),
            InlineSource = new ImportDocumentsRequest.Types.InlineSource(),
            ErrorConfig = new ImportErrorConfig(),
            ReconciliationMode = ImportDocumentsRequest.Types.ReconciliationMode.Unspecified,
            UpdateMask = new FieldMask(),
            AutoGenerateIds = false,
            IdField = "",
        };
        // Make the request
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> response = documentServiceClient.ImportDocuments(request);

        // Poll until the returned long-running operation is complete
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> completedResponse = response.PollUntilCompleted();
        // Retrieve the operation result
        ImportDocumentsResponse result = completedResponse.Result;

        // Or get the name of the operation
        string operationName = response.Name;
        // This name can be stored, then the long-running operation retrieved later by name
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> retrievedResponse = documentServiceClient.PollOnceImportDocuments(operationName);
        // Check if the retrieved long-running operation has completed
        if (retrievedResponse.IsCompleted)
        {
            // If it has completed, then access the result
            ImportDocumentsResponse retrievedResult = retrievedResponse.Result;
        }
    }
}

Go

如需了解详情,请参阅 Vertex AI Agent Builder Go API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


package main

import (
	"context"

	discoveryengine "cloud.google.com/go/discoveryengine/apiv1"
	discoveryenginepb "cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb"
)

func main() {
	ctx := context.Background()
	// This snippet has been automatically generated and should be regarded as a code template only.
	// It will require modifications to work:
	// - It may require correct/in-range values for request initialization.
	// - It may require specifying regional endpoints when creating the service client as shown in:
	//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options
	c, err := discoveryengine.NewDataStoreClient(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	defer c.Close()

	req := &discoveryenginepb.CreateDataStoreRequest{
		// TODO: Fill request struct fields.
		// See https://pkg.go.dev/cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb#CreateDataStoreRequest.
	}
	op, err := c.CreateDataStore(ctx, req)
	if err != nil {
		// TODO: Handle error.
	}

	resp, err := op.Wait(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	// TODO: Use resp.
	_ = resp
}

导入文档


package main

import (
	"context"

	discoveryengine "cloud.google.com/go/discoveryengine/apiv1"
	discoveryenginepb "cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb"
)

func main() {
	ctx := context.Background()
	// This snippet has been automatically generated and should be regarded as a code template only.
	// It will require modifications to work:
	// - It may require correct/in-range values for request initialization.
	// - It may require specifying regional endpoints when creating the service client as shown in:
	//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options
	c, err := discoveryengine.NewDocumentClient(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	defer c.Close()

	req := &discoveryenginepb.ImportDocumentsRequest{
		// TODO: Fill request struct fields.
		// See https://pkg.go.dev/cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb#ImportDocumentsRequest.
	}
	op, err := c.ImportDocuments(ctx, req)
	if err != nil {
		// TODO: Handle error.
	}

	resp, err := op.Wait(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	// TODO: Use resp.
	_ = resp
}

Java

如需了解详情,请参阅 Vertex AI Agent Builder Java API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

import com.google.cloud.discoveryengine.v1.CollectionName;
import com.google.cloud.discoveryengine.v1.CreateDataStoreRequest;
import com.google.cloud.discoveryengine.v1.DataStore;
import com.google.cloud.discoveryengine.v1.DataStoreServiceClient;

public class SyncCreateDataStore {

  public static void main(String[] args) throws Exception {
    syncCreateDataStore();
  }

  public static void syncCreateDataStore() throws Exception {
    // This snippet has been automatically generated and should be regarded as a code template only.
    // It will require modifications to work:
    // - It may require correct/in-range values for request initialization.
    // - It may require specifying regional endpoints when creating the service client as shown in
    // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
    try (DataStoreServiceClient dataStoreServiceClient = DataStoreServiceClient.create()) {
      CreateDataStoreRequest request =
          CreateDataStoreRequest.newBuilder()
              .setParent(CollectionName.of("[PROJECT]", "[LOCATION]", "[COLLECTION]").toString())
              .setDataStore(DataStore.newBuilder().build())
              .setDataStoreId("dataStoreId929489618")
              .setCreateAdvancedSiteSearch(true)
              .setSkipDefaultSchemaCreation(true)
              .build();
      DataStore response = dataStoreServiceClient.createDataStoreAsync(request).get();
    }
  }
}

导入文档

import com.google.cloud.discoveryengine.v1.BranchName;
import com.google.cloud.discoveryengine.v1.DocumentServiceClient;
import com.google.cloud.discoveryengine.v1.ImportDocumentsRequest;
import com.google.cloud.discoveryengine.v1.ImportDocumentsResponse;
import com.google.cloud.discoveryengine.v1.ImportErrorConfig;
import com.google.protobuf.FieldMask;

public class SyncImportDocuments {

  public static void main(String[] args) throws Exception {
    syncImportDocuments();
  }

  public static void syncImportDocuments() throws Exception {
    // This snippet has been automatically generated and should be regarded as a code template only.
    // It will require modifications to work:
    // - It may require correct/in-range values for request initialization.
    // - It may require specifying regional endpoints when creating the service client as shown in
    // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
    try (DocumentServiceClient documentServiceClient = DocumentServiceClient.create()) {
      ImportDocumentsRequest request =
          ImportDocumentsRequest.newBuilder()
              .setParent(
                  BranchName.ofProjectLocationDataStoreBranchName(
                          "[PROJECT]", "[LOCATION]", "[DATA_STORE]", "[BRANCH]")
                      .toString())
              .setErrorConfig(ImportErrorConfig.newBuilder().build())
              .setUpdateMask(FieldMask.newBuilder().build())
              .setAutoGenerateIds(true)
              .setIdField("idField1629396127")
              .build();
      ImportDocumentsResponse response = documentServiceClient.importDocumentsAsync(request).get();
    }
  }
}

Node.js

如需了解详情,请参阅 Vertex AI Agent Builder Node.js API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

/**
 * This snippet has been automatically generated and should be regarded as a code template only.
 * It will require modifications to work.
 * It may require correct/in-range values for request initialization.
 * TODO(developer): Uncomment these variables before running the sample.
 */
/**
 *  Required. The parent resource name, such as
 *  `projects/{project}/locations/{location}/collections/{collection}`.
 */
// const parent = 'abc123'
/**
 *  Required. The DataStore google.cloud.discoveryengine.v1.DataStore  to
 *  create.
 */
// const dataStore = {}
/**
 *  Required. The ID to use for the
 *  DataStore google.cloud.discoveryengine.v1.DataStore, which will become
 *  the final component of the
 *  DataStore google.cloud.discoveryengine.v1.DataStore's resource name.
 *  This field must conform to RFC-1034 (https://tools.ietf.org/html/rfc1034)
 *  standard with a length limit of 63 characters. Otherwise, an
 *  INVALID_ARGUMENT error is returned.
 */
// const dataStoreId = 'abc123'
/**
 *  A boolean flag indicating whether user want to directly create an advanced
 *  data store for site search.
 *  If the data store is not configured as site
 *  search (GENERIC vertical and PUBLIC_WEBSITE content_config), this flag will
 *  be ignored.
 */
// const createAdvancedSiteSearch = true
/**
 *  A boolean flag indicating whether to skip the default schema creation for
 *  the data store. Only enable this flag if you are certain that the default
 *  schema is incompatible with your use case.
 *  If set to true, you must manually create a schema for the data store before
 *  any documents can be ingested.
 *  This flag cannot be specified if `data_store.starting_schema` is specified.
 */
// const skipDefaultSchemaCreation = true

// Imports the Discoveryengine library
const {DataStoreServiceClient} = require('@google-cloud/discoveryengine').v1;

// Instantiates a client
const discoveryengineClient = new DataStoreServiceClient();

async function callCreateDataStore() {
  // Construct request
  const request = {
    parent,
    dataStore,
    dataStoreId,
  };

  // Run request
  const [operation] = await discoveryengineClient.createDataStore(request);
  const [response] = await operation.promise();
  console.log(response);
}

callCreateDataStore();

导入文档

/**
 * This snippet has been automatically generated and should be regarded as a code template only.
 * It will require modifications to work.
 * It may require correct/in-range values for request initialization.
 * TODO(developer): Uncomment these variables before running the sample.
 */
/**
 *  The Inline source for the input content for documents.
 */
// const inlineSource = {}
/**
 *  Cloud Storage location for the input content.
 */
// const gcsSource = {}
/**
 *  BigQuery input source.
 */
// const bigquerySource = {}
/**
 *  FhirStore input source.
 */
// const fhirStoreSource = {}
/**
 *  Spanner input source.
 */
// const spannerSource = {}
/**
 *  Cloud SQL input source.
 */
// const cloudSqlSource = {}
/**
 *  Firestore input source.
 */
// const firestoreSource = {}
/**
 *  AlloyDB input source.
 */
// const alloyDbSource = {}
/**
 *  Cloud Bigtable input source.
 */
// const bigtableSource = {}
/**
 *  Required. The parent branch resource name, such as
 *  `projects/{project}/locations/{location}/collections/{collection}/dataStores/{data_store}/branches/{branch}`.
 *  Requires create/update permission.
 */
// const parent = 'abc123'
/**
 *  The desired location of errors incurred during the Import.
 */
// const errorConfig = {}
/**
 *  The mode of reconciliation between existing documents and the documents to
 *  be imported. Defaults to
 *  ReconciliationMode.INCREMENTAL google.cloud.discoveryengine.v1.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL.
 */
// const reconciliationMode = {}
/**
 *  Indicates which fields in the provided imported documents to update. If
 *  not set, the default is to update all fields.
 */
// const updateMask = {}
/**
 *  Whether to automatically generate IDs for the documents if absent.
 *  If set to `true`,
 *  Document.id google.cloud.discoveryengine.v1.Document.id s are
 *  automatically generated based on the hash of the payload, where IDs may not
 *  be consistent during multiple imports. In which case
 *  ReconciliationMode.FULL google.cloud.discoveryengine.v1.ImportDocumentsRequest.ReconciliationMode.FULL 
 *  is highly recommended to avoid duplicate contents. If unset or set to
 *  `false`, Document.id google.cloud.discoveryengine.v1.Document.id s have
 *  to be specified using
 *  id_field google.cloud.discoveryengine.v1.ImportDocumentsRequest.id_field,
 *  otherwise, documents without IDs fail to be imported.
 *  Supported data sources:
 *  * GcsSource google.cloud.discoveryengine.v1.GcsSource.
 *  GcsSource.data_schema google.cloud.discoveryengine.v1.GcsSource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * BigQuerySource google.cloud.discoveryengine.v1.BigQuerySource.
 *  BigQuerySource.data_schema google.cloud.discoveryengine.v1.BigQuerySource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * SpannerSource google.cloud.discoveryengine.v1.SpannerSource.
 *  * CloudSqlSource google.cloud.discoveryengine.v1.CloudSqlSource.
 *  * FirestoreSource google.cloud.discoveryengine.v1.FirestoreSource.
 *  * BigtableSource google.cloud.discoveryengine.v1.BigtableSource.
 */
// const autoGenerateIds = true
/**
 *  The field indicates the ID field or column to be used as unique IDs of
 *  the documents.
 *  For GcsSource google.cloud.discoveryengine.v1.GcsSource  it is the key of
 *  the JSON field. For instance, `my_id` for JSON `{"my_id": "some_uuid"}`.
 *  For others, it may be the column name of the table where the unique ids are
 *  stored.
 *  The values of the JSON field or the table column are used as the
 *  Document.id google.cloud.discoveryengine.v1.Document.id s. The JSON field
 *  or the table column must be of string type, and the values must be set as
 *  valid strings conform to RFC-1034 (https://tools.ietf.org/html/rfc1034)
 *  with 1-63 characters. Otherwise, documents without valid IDs fail to be
 *  imported.
 *  Only set this field when
 *  auto_generate_ids google.cloud.discoveryengine.v1.ImportDocumentsRequest.auto_generate_ids 
 *  is unset or set as `false`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  If it is unset, a default value `_id` is used when importing from the
 *  allowed data sources.
 *  Supported data sources:
 *  * GcsSource google.cloud.discoveryengine.v1.GcsSource.
 *  GcsSource.data_schema google.cloud.discoveryengine.v1.GcsSource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * BigQuerySource google.cloud.discoveryengine.v1.BigQuerySource.
 *  BigQuerySource.data_schema google.cloud.discoveryengine.v1.BigQuerySource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * SpannerSource google.cloud.discoveryengine.v1.SpannerSource.
 *  * CloudSqlSource google.cloud.discoveryengine.v1.CloudSqlSource.
 *  * FirestoreSource google.cloud.discoveryengine.v1.FirestoreSource.
 *  * BigtableSource google.cloud.discoveryengine.v1.BigtableSource.
 */
// const idField = 'abc123'

// Imports the Discoveryengine library
const {DocumentServiceClient} = require('@google-cloud/discoveryengine').v1;

// Instantiates a client
const discoveryengineClient = new DocumentServiceClient();

async function callImportDocuments() {
  // Construct request
  const request = {
    parent,
  };

  // Run request
  const [operation] = await discoveryengineClient.importDocuments(request);
  const [response] = await operation.promise();
  console.log(response);
}

callImportDocuments();

Python

如需了解详情,请参阅 Vertex AI Agent Builder Python API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"

# Examples:
# - Unstructured documents
#   - `gs://bucket/directory/file.pdf`
#   - `gs://bucket/directory/*.pdf`
# - Unstructured documents with JSONL Metadata
#   - `gs://bucket/directory/file.json`
# - Unstructured documents with CSV Metadata
#   - `gs://bucket/directory/file.csv`
# gcs_uri = "YOUR_GCS_PATH"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    gcs_source=discoveryengine.GcsSource(
        # Multiple URIs are supported
        input_uris=[gcs_uri],
        # Options:
        # - `content` - Unstructured documents (PDF, HTML, DOC, TXT, PPTX)
        # - `custom` - Unstructured documents with custom JSONL metadata
        # - `document` - Structured documents in the discoveryengine.Document format.
        # - `csv` - Unstructured documents with CSV metadata
        data_schema="content",
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

Ruby

如需了解详情,请参阅 Vertex AI Agent Builder Ruby API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

require "google/cloud/discovery_engine/v1"

##
# Snippet for the create_data_store call in the DataStoreService service
#
# This snippet has been automatically generated and should be regarded as a code
# template only. It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
# client as shown in https://cloud.google.com/ruby/docs/reference.
#
# This is an auto-generated example demonstrating basic usage of
# Google::Cloud::DiscoveryEngine::V1::DataStoreService::Client#create_data_store.
#
def create_data_store
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Cloud::DiscoveryEngine::V1::DataStoreService::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Cloud::DiscoveryEngine::V1::CreateDataStoreRequest.new

  # Call the create_data_store method.
  result = client.create_data_store request

  # The returned object is of type Gapic::Operation. You can use it to
  # check the status of an operation, cancel it, or wait for results.
  # Here is how to wait for a response.
  result.wait_until_done! timeout: 60
  if result.response?
    p result.response
  else
    puts "No response received."
  end
end

导入文档

require "google/cloud/discovery_engine/v1"

##
# Snippet for the import_documents call in the DocumentService service
#
# This snippet has been automatically generated and should be regarded as a code
# template only. It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
# client as shown in https://cloud.google.com/ruby/docs/reference.
#
# This is an auto-generated example demonstrating basic usage of
# Google::Cloud::DiscoveryEngine::V1::DocumentService::Client#import_documents.
#
def import_documents
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Cloud::DiscoveryEngine::V1::DocumentService::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Cloud::DiscoveryEngine::V1::ImportDocumentsRequest.new

  # Call the import_documents method.
  result = client.import_documents request

  # The returned object is of type Gapic::Operation. You can use it to
  # check the status of an operation, cancel it, or wait for results.
  # Here is how to wait for a response.
  result.wait_until_done! timeout: 60
  if result.response?
    p result.response
  else
    puts "No response received."
  end
end

连接到 Cloud Storage 并定期同步

在导入数据之前,请查看 准备数据以便提取

以下步骤介绍了如何创建将 包含 Vertex AI Search 数据的 Cloud Storage 位置 以及如何为数据指定该位置中的文件夹或文件 您要创建的存储区。作为数据连接器子项的数据存储区 称为实体数据存储区。

数据会定期同步到实体数据存储区。您可以指定每天、每三天或每五天同步一次。

控制台

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 前往数据存储区页面。

  3. 点击创建数据存储区

  4. 来源页面上,选择 Cloud Storage

  5. 选择要导入的数据类型。

  6. 点击周期性

  7. 选择同步频率,即 Vertex AI Search Connector 与 Cloud Storage 位置同步的频率。您可以稍后更改频率。

  8. 选择要导入的文件夹或文件部分,选择文件夹文件

  9. 点击浏览,选择您准备好提取的数据,然后点击选择。或者,直接在 gs:// 字段中输入地理位置。

  10. 点击继续

  11. 为数据连接器选择一个区域。

  12. 为数据连接器输入名称。

  13. 可选:如果您选择了非结构化文档,则可以选择“解析”和 分块选项要比较不同的解析器,请参阅解析 文档。有关分块的信息,请参阅分块文档 RAG

    OCR 解析器和布局解析器可能会产生额外费用。请参阅文档 AI 功能价格

    如需选择解析器,请展开文档处理选项,然后指定要使用的解析器选项。

  14. 点击创建

    现在,您已创建数据连接器,该连接器会定期将数据与 Cloud Storage 位置同步。您还创建了一个实体 名为 gcs_store 的数据存储区。

  15. 如需查看数据提取状态,请前往数据存储区页面,然后点击数据连接器名称,在其数据页面上查看相关详细信息

    数据注入活动标签页。当数据提取活动标签页上的状态列从进行中更改为成功时,第一次提取即告完成。

    提取过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。

首次设置数据源并导入数据后,系统会 系统会以您在设置期间选择的频率从该来源同步数据。 数据连接器创建后约 1 小时,首次同步将进行。 然后,系统会在大约 24 小时、72 小时或 120 小时后进行下一次同步。

后续步骤

  • 如需将数据存储区附加到应用,请创建应用并选择数据存储区 请遵循 创建搜索应用

  • 要预览在您的应用和数据存储区均已下载完毕后,搜索结果会如何显示 设置,请参阅 获取搜索结果

从 Google 云端硬盘同步

如需从 Google 云端硬盘同步数据,请按照以下步骤使用 Google Cloud 控制台创建数据存储区并提取数据。

创建数据存储区后,Google 云端硬盘中的数据会持续同步到 Vertex AI Search。

准备工作:

  • 您必须使用 您计划 连接。Vertex AI Search 会使用您的 Google Workspace 客户 ID 连接到 Google 云端硬盘。

  • 为 Google 云端硬盘设置访问权限控制。相关信息 有关如何设置访问权限控制的信息,请参阅 使用数据源访问权限控制

控制台

要使用控制台使 Google 云端硬盘数据可供搜索,请按以下步骤操作: 步骤:

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 前往数据存储区页面。

  3. 点击新建数据存储区

  4. 来源页面上,选择 Google 云端硬盘

  5. 为数据存储区选择一个区域。

  6. 为数据存储区输入名称。

  7. 点击创建。提取过程可能需要较长时间,具体取决于您的数据的大小 几分钟到几小时请至少等待 1 小时再使用您的 供搜索的数据存储区。

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 要预览在您的应用和数据存储区均已下载完毕后,搜索结果会如何显示 设置,请参阅 获取搜索结果

从 Cloud SQL 导入

如需从 Cloud SQL 注入数据,请按以下步骤设置 访问 Cloud SQL、创建数据存储区和注入数据。

为 Cloud SQL 实例设置暂存存储桶访问权限

从 Cloud SQL 注入数据时,数据会首先暂存到 Cloud Storage 存储桶。请按照以下步骤为 Cloud SQL 实例授予对 Cloud Storage 存储桶的访问权限。

  1. 在 Google Cloud 控制台中,转到 SQL 页面。

    SQL

  2. 点击您计划从中导入数据的 Cloud SQL 实例。

  3. 复制实例服务账号的标识符,该标识符类似于电子邮件地址,例如 p9876-abcd33f@gcp-sa-cloud-sql.iam.gserviceaccount.com

  4. 前往 IAM 和管理页面。

    IAM 和管理

  5. 点击授予访问权限

  6. 新的主账号部分,输入实例的服务账号标识符并 选择 Cloud Storage >Storage Admin 角色。

  7. 点击保存

下一步:

通过其他项目设置 Cloud SQL 访问权限

如需向 Vertex AI Search 授予对其他项目中的 Cloud SQL 数据的访问权限,请按以下步骤操作:

  1. 将以下 PROJECT_NUMBER 变量替换为 Vertex AI Search 项目编号,然后将 代码块。这是您的 Vertex AI Search 服务账号标识符:

    service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com`
    
  2. 前往 IAM 和管理页面。

    IAM 和管理

  3. IAM 和管理页面 然后点击授予访问权限

  4. 新的主账号中,输入服务账号的标识符,然后选择 Cloud SQL > Cloud SQL Viewer 角色。

  5. 点击保存

接下来,转到从 Cloud SQL 导入数据

从 Cloud SQL 导入数据

控制台

如需使用控制台从 Cloud SQL 提取数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 前往数据存储区页面。

  3. 点击新建数据存储区

  4. 来源页面上,选择 Cloud SQL

  5. 指定您计划导入的数据的项目 ID、实例 ID、数据库 ID 和表 ID。

  6. 点击浏览,然后选择一个中间 Cloud Storage 位置以 导出数据,然后点击选择。或者,直接在 gs:// 字段中输入位置。

  7. 选择是否启用无服务器导出功能。无服务器导出会产生额外费用。如需了解无服务器导出,请参阅最大限度地减少 数据导出作业的性能影响 Cloud SQL 文档。

  8. 点击继续

  9. 为数据存储区选择一个区域。

  10. 输入数据存储区的名称。

  11. 点击创建

  12. 如需查看数据注入的状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详细信息。当活动标签页上的状态列从进行中更改为导入已完成时,提取操作即告完成。

    提取过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。

REST

如需使用命令行创建数据存储区并从 Cloud SQL 提取数据,请按以下步骤操作:

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
    }'
    

    替换以下内容:

    • PROJECT_ID:您的项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • DISPLAY_NAME:数据存储区的显示名称。这可能会 显示在 Google Cloud 控制台中。
  2. 从 Cloud SQL 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "cloudSqlSource": {
          "projectId": "SQL_PROJECT_ID",
          "instanceId": "INSTANCE_ID",
          "databaseId": "DATABASE_ID",
          "tableId": "TABLE_ID",
          "gcsStagingDir": "STAGING_DIRECTORY"
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
      }'
    

    替换以下内容:

    • PROJECT_ID:您的 Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • SQL_PROJECT_ID:您的 Cloud SQL 项目的 ID。
    • INSTANCE_ID:您的 Cloud SQL 实例的 ID。
    • DATABASE_ID:您的 Cloud SQL 数据库的 ID。
    • TABLE_ID:Cloud SQL 表的 ID。
    • STAGING_DIRECTORY:可选。Cloud Storage 目录,例如 gs://<your-gcs-bucket>/directory/import_errors
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 Cloud SQL 到数据存储空间的数据增量刷新。这会执行更新/插入操作,该操作会添加新文档,并将现有文档替换为具有相同 ID 的更新文档。指定 FULL 会导致数据存储区中的文档完全重新基准。换言之,新文档和更新文档将添加到您的数据中 而 Cloud SQL 以外的文档则会被移除 来自数据存储区如果您想执行以下操作,FULL 模式会很有帮助: 自动删除您不再需要的文档。

Python

有关详情,请参阅 Vertex AI Agent Builder Python API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# sql_project_id = "YOUR_SQL_PROJECT_ID"
# sql_instance_id = "YOUR_SQL_INSTANCE_ID"
# sql_database_id = "YOUR_SQL_DATABASE_ID"
# sql_table_id = "YOUR_SQL_TABLE_ID"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    cloud_sql_source=discoveryengine.CloudSqlSource(
        project_id=sql_project_id,
        instance_id=sql_instance_id,
        database_id=sql_database_id,
        table_id=sql_table_id,
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 要预览在您的应用和数据存储区均已下载完毕后,搜索结果会如何显示 设置,请参阅 获取搜索结果

从 Spanner 导入

如需从 Spanner 注入数据,请按照以下步骤创建 数据存储区并使用 Google Cloud 控制台或 API 注入数据。

通过其他项目设置 Spanner 访问权限

如果您的 Spanner 数据与 Vertex AI Search 位于同一项目中,请跳至从 Spanner 导入数据

如需向 Vertex AI Search 授予对其他项目中的 Spanner 数据的访问权限,请按以下步骤操作:

  1. 将以下 PROJECT_NUMBER 变量替换为您的 Vertex AI Search 项目编号,然后复制此代码块的内容。这是您的 Vertex AI Search 服务账号 标识符:

    service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com
    
  2. 前往 IAM 和管理页面。

    IAM 和管理员

  3. IAM 和管理页面上切换到您的 Spanner 项目,然后点击授予访问权限

  4. 新的主账号中,输入服务账号的标识符,然后选择以下任一选项:

    • 如果您在导入期间不使用数据提升功能,请选择 Cloud Spanner > Cloud Spanner Database Reader 角色。
    • 如果您计划在导入期间使用数据提升功能,请选择 Cloud Spanner > Cloud Spanner Database Admin 角色,或具有 Cloud Spanner Database Readerspanner.databases.useDataBoost 权限的自定义角色。如需了解 Data Boost,请参阅 Spanner 文档中的 Data Boost 概览
  5. 点击保存

接下来,前往从 Spanner 导入数据

从 Spanner 导入数据

控制台

如需使用控制台从 Spanner 提取数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 前往数据存储区页面。

  3. 点击新建数据存储区

  4. 来源页面上,选择 Cloud Spanner

  5. 指定您计划导入的数据的项目 ID、实例 ID、数据库 ID 和表 ID。

  6. 选择是否开启 Data Boost。如需了解 Data Boost,请参阅 Spanner 文档中的 Data Boost 概览

  7. 点击继续

  8. 为数据存储区选择一个区域。

  9. 输入数据存储区的名称。

  10. 点击创建

  11. 如需查看数据注入的状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详细信息。当活动标签页上的状态列从进行中更改为导入已完成时,提取操作即告完成。

    提取过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。

REST

使用命令行创建数据存储区并从中注入数据 请按照以下步骤操作:

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
      "contentConfig": "CONTENT_REQUIRED",
    }'
    

    替换以下内容:

    • PROJECT_ID:您的 Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • DISPLAY_NAME:数据存储区的显示名。这可能会 显示在 Google Cloud 控制台中。
  2. 从 Spanner 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "cloudSpannerSource": {
          "projectId": "SPANNER_PROJECT_ID",
          "instanceId": "INSTANCE_ID",
          "databaseId": "DATABASE_ID",
          "tableId": "TABLE_ID",
          "enableDataBoost": "DATA_BOOST_BOOLEAN"
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
      }'
    

    替换以下内容:

    • PROJECT_ID:您的 Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。
    • SPANNER_PROJECT_ID:Spanner 的 ID 项目。
    • INSTANCE_ID:您的 Spanner 实例的 ID。
    • DATABASE_ID:您的 Spanner 数据库的 ID。
    • TABLE_ID:您的 Spanner 表的 ID。
    • DATA_BOOST_BOOLEAN:可选。是否开启 Data Boost。 如需了解 Data Boost,请参阅 Spanner 文档中的 Data Boost 概览
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会从以下来源中增量刷新数据: Spanner 迁移到您的数据存储区。这会执行更新/插入操作 该操作,添加新文档并替换现有文档 具有相同 ID 的更新文档。指定 FULL 会导致数据存储区中的文档完全重新基准。换句话说,系统会将新文档和更新后的文档添加到您的数据存储区,并将 Spanner 中不存在的文档从您的数据存储区中移除。如果您想自动删除不再需要的文档,FULL 模式会很有用。
    • AUTO_GENERATE_IDS:可选。指定是否 自动生成文档 ID。如果设置为 true,则文档 ID 是基于载荷的哈希值生成的请注意,在多次导入后,生成的文档 ID 可能不会保持一致。如果您在多次导入时自动生成 ID,Google 强烈建议您将 reconciliationMode 设置为 FULL,以保持文档 ID 的一致性。

    • ID_FIELD:可选。指定哪些字段 文档 ID。

Python

有关详情,请参阅 Vertex AI Agent Builder Python API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# spanner_project_id = "YOUR_SPANNER_PROJECT_ID"
# spanner_instance_id = "YOUR_SPANNER_INSTANCE_ID"
# spanner_database_id = "YOUR_SPANNER_DATABASE_ID"
# spanner_table_id = "YOUR_SPANNER_TABLE_ID"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    spanner_source=discoveryengine.SpannerSource(
        project_id=spanner_project_id,
        instance_id=spanner_instance_id,
        database_id=spanner_database_id,
        table_id=spanner_table_id,
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 要预览在您的应用和数据存储区均已下载完毕后,搜索结果会如何显示 设置,请参阅 获取搜索结果

从 Firestore 导入

如需从 Firestore 注入数据,请按照以下步骤创建 数据存储区并使用 Google Cloud 控制台或 API 注入数据。

如果您的 Firestore 数据与 Vertex AI Search,请参阅从 Firestore

如果您的 Firestore 数据与 Vertex AI Search 项目,请参阅设置 Firestore 访问权限

通过其他项目设置 Firestore 访问权限

如需向 Vertex AI Search 授予对其他项目中的 Firestore 数据的访问权限,请按以下步骤操作:

  1. 将以下 PROJECT_NUMBER 变量替换为 Vertex AI Search 项目编号,然后将此 代码块。这是您的 Vertex AI Search 服务账号标识符:

    service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com
    
  2. 前往 IAM 和管理页面。

    IAM 和管理员

  3. IAM 和管理页面上切换到您的 Firestore 项目,然后点击授予访问权限

  4. 对于新主账号,输入实例的服务账号标识符,然后选择 Datastore > Cloud Datastore Import Export Admin 角色。

  5. 点击保存

  6. 切换回 Vertex AI Search 项目。

接下来,前往从 Firestore 导入数据

从 Firestore 导入数据

控制台

如需使用控制台从 Firestore 提取数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 前往数据存储区页面。

  3. 点击新建数据存储区

  4. Source(来源)页面上,选择 Firestore

  5. 指定您要创建的数据的项目 ID、数据库 ID 和集合 ID 计划导入的数据。

  6. 点击继续

  7. 为数据存储区选择一个区域。

  8. 输入数据存储区的名称。

  9. 点击创建

  10. 如需查看数据注入的状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详细信息。当活动标签页上的状态列从进行中更改为导入已完成时,提取操作即告完成。

    提取过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。

REST

使用命令行创建数据存储区并从中注入数据 Firestore 中,请按以下步骤操作:

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
    }'
    

    替换以下内容:

    • PROJECT_ID:您的项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • DISPLAY_NAME:数据存储区的显示名。这可能会 显示在 Google Cloud 控制台中。
  2. 从 Firestore 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "firestoreSource": {
          "projectId": "FIRESTORE_PROJECT_ID",
          "databaseId": "DATABASE_ID",
          "collectionId": "COLLECTION_ID",
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
      }'
    

    替换以下内容:

    • PROJECT_ID:您的 Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 可以 只能包含小写字母、数字、下划线和连字符。
    • FIRESTORE_PROJECT_ID:您的 Firestore 项目。
    • DATABASE_ID:您的 Firestore 数据库的 ID。
    • COLLECTION_ID:您的 Firestore 集合的 ID。
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 Firestore 到数据存储区以增量方式刷新数据。这会执行更新/插入操作,该操作会添加新文档,并将现有文档替换为具有相同 ID 的更新文档。指定 FULL 会导致数据存储区中的文档完全重新基准。换句话说,系统会将新文档和更新后的文档添加到您的数据存储区,并从您的数据存储区中移除 Firestore 中不存在的文档。如果您想执行以下操作,FULL 模式会很有帮助: 自动删除您不再需要的文档。
    • AUTO_GENERATE_IDS:可选。指定是否 自动生成文档 ID。如果设置为 true,文档 ID 将根据载荷的哈希生成。请注意,在多次导入后,生成的文档 ID 可能不会保持一致。如果 您将通过多次导入自动生成 ID,Google 高度 建议将 reconciliationMode 设置为 FULL 以保持 文档 ID 保持一致。
    • ID_FIELD:可选。指定哪些字段是文档 ID。

Python

有关详情,请参阅 Vertex AI Agent Builder Python API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# firestore_project_id = "YOUR_FIRESTORE_PROJECT_ID"
# firestore_database_id = "YOUR_FIRESTORE_DATABASE_ID"
# firestore_collection_id = "YOUR_FIRESTORE_COLLECTION_ID"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    firestore_source=discoveryengine.FirestoreSource(
        project_id=firestore_project_id,
        database_id=firestore_database_id,
        collection_id=firestore_collection_id,
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 要预览在您的应用和数据存储区均已下载完毕后,搜索结果会如何显示 设置,请参阅 获取搜索结果

从 Bigtable 导入

如需从 Bigtable 注入数据,请按照以下步骤创建 数据存储区并使用该 API 注入数据。

设置 Bigtable 访问权限

如需向 Vertex AI Search 授予对其他项目中的 Bigtable 数据的访问权限,请按以下步骤操作:

  1. 将以下 PROJECT_NUMBER 变量替换为 Vertex AI Search 项目编号,然后将此 代码块。这是您的 Vertex AI Search 服务账号标识符:

    service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com`
    
  2. 前往 IAM 和管理页面。

    IAM 和管理

  3. IAM 和管理页面上切换到您的 Bigtable 项目,然后点击授予访问权限

  4. 新的主账号部分,输入实例的服务账号标识符并 选择 Bigtable >Bigtable Reader 角色。

  5. 点击保存

  6. 切换回 Vertex AI Search 项目。

接下来,转到从 Bigtable 导入数据

从 Bigtable 导入数据

REST

使用命令行创建数据存储区并从中注入数据 Bigtable,请按以下步骤操作:

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
    }'
    

    替换以下内容:

    • PROJECT_ID:您的项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • DISPLAY_NAME:数据存储区的显示名称。这可能会 显示在 Google Cloud 控制台中。
  2. 从 Bigtable 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "bigtableSource ": {
          "projectId": "BIGTABLE_PROJECT_ID",
          "instanceId": "INSTANCE_ID",
          "tableId": "TABLE_ID",
          "bigtableOptions": {
            "keyFieldName": "KEY_FIELD_NAME",
            "families": {
              "key": "KEY",
              "value": {
                "fieldName": "FIELD_NAME",
                "encoding": "ENCODING",
                "type": "TYPE",
                "columns": [
                  {
                    "qualifier": "QUALIFIER",
                    "fieldName": "FIELD_NAME",
                    "encoding": "COLUMN_ENCODING",
                    "type": "COLUMN_VALUES_TYPE"
                  }
                ]
              }
             }
             ...
          }
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
      }'
    

    替换以下内容:

    • PROJECT_ID:您的 Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • BIGTABLE_PROJECT_ID:您的 Bigtable 项目中。
    • INSTANCE_ID:您的 Bigtable 实例的 ID。
    • TABLE_ID:Bigtable 表的 ID。
    • KEY_FIELD_NAME:可选,但建议提供。提取到 Vertex AI Search 后要用于行键值的字段名称。
    • KEY:必填。列族键的字符串值。
    • ENCODING:可选。当值的类型不是 STRING 时,值的编码模式。您可以通过在 columns 中列出该列并为其指定编码,为特定列替换此值。
    • COLUMN_TYPE:可选。此列中值的类型 系列。
    • QUALIFIER:必填。列的限定符。
    • FIELD_NAME:可选,但建议提供。要使用的字段名称 提取到 Vertex AI Search 后的结果。
    • COLUMN_ENCODING:可选。值的编码模式 (当类型不是 STRING 时)。
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 Bigtable 到数据存储区增量刷新数据。这会执行更新/插入操作,该操作会添加新文档,并将现有文档替换为具有相同 ID 的更新文档。指定 FULL 会导致数据存储区中的文档完全重新基准。换句话说,系统会将新文档和更新后的文档添加到您的数据存储区,并将 Bigtable 中不存在的文档从您的数据存储区中移除。如果您FULL 希望自动删除您不再需要的文档。
    • AUTO_GENERATE_IDS:可选。指定是否 自动生成文档 ID。如果设置为 true,则文档 ID 是基于载荷的哈希值生成的请注意,在多次导入后,生成的文档 ID 可能不会保持一致。如果 您将通过多次导入自动生成 ID,Google 高度 建议将 reconciliationMode 设置为 FULL 以保持 文档 ID 保持一致。

      仅当 bigquerySource.dataSchema 为以下值时,才指定 autoGenerateIds: 已设置为 custom。否则,系统将返回 INVALID_ARGUMENT 错误。如果您未指定 autoGenerateIds 或将其设置为 false,则必须指定 idField。否则,文档将无法 导入。

    • ID_FIELD:可选。指定哪些字段是文档 ID。

Python

如需了解详情,请参阅 Vertex AI Agent Builder Python API 参考文档

如需向 Vertex AI Agent Builder 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# bigtable_project_id = "YOUR_BIGTABLE_PROJECT_ID"
# bigtable_instance_id = "YOUR_BIGTABLE_INSTANCE_ID"
# bigtable_table_id = "YOUR_BIGTABLE_TABLE_ID"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

bigtable_options = discoveryengine.BigtableOptions(
    families={
        "family_name_1": discoveryengine.BigtableOptions.BigtableColumnFamily(
            type_=discoveryengine.BigtableOptions.Type.STRING,
            encoding=discoveryengine.BigtableOptions.Encoding.TEXT,
            columns=[
                discoveryengine.BigtableOptions.BigtableColumn(
                    qualifier="qualifier_1".encode("utf-8"),
                    field_name="field_name_1",
                ),
            ],
        ),
        "family_name_2": discoveryengine.BigtableOptions.BigtableColumnFamily(
            type_=discoveryengine.BigtableOptions.Type.INTEGER,
            encoding=discoveryengine.BigtableOptions.Encoding.BINARY,
        ),
    }
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    bigtable_source=discoveryengine.BigtableSource(
        project_id=bigtable_project_id,
        instance_id=bigtable_instance_id,
        table_id=bigtable_table_id,
        bigtable_options=bigtable_options,
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

后续步骤

  • 如需将数据存储区附加到应用,请创建应用并选择数据存储区 请遵循 创建搜索应用

  • 如需预览设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

从 AlloyDB for PostgreSQL 导入

如需从 AlloyDB for PostgreSQL 注入数据,请按照以下步骤创建 数据存储区并使用 Google Cloud 控制台或 API 注入数据。

如果您的 AlloyDB for PostgreSQL 数据与 Vertex AI Search 项目位于同一项目中,请参阅从 AlloyDB for PostgreSQL 导入数据

如果您的 AlloyDB for PostgreSQL 数据位于与 Vertex AI Search 项目不同的项目中,请参阅设置 AlloyDB for PostgreSQL 访问权限

通过其他项目设置 AlloyDB for PostgreSQL 访问权限

为了让 Vertex AI Search 能够访问 请按以下步骤操作:

  1. 将以下 PROJECT_NUMBER 变量替换为您的 Vertex AI Search 项目编号,然后复制此代码块的内容。这是您的 Vertex AI Search 服务账号标识符:

    service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com
    
  2. 切换到您的 AlloyDB for PostgreSQL 数据所在的 Google Cloud 项目 资源。

  3. 转到 IAM 页面。

    IAM

  4. 点击授予访问权限

  5. 新主账号中,输入 Vertex AI Search 服务账号标识符,然后选择 Cloud AlloyDB > Cloud AlloyDB Admin 角色。

  6. 点击保存

  7. 切换回您的 Vertex AI Search 项目。

接下来,前往从 AlloyDB for PostgreSQL 导入数据

从 AlloyDB for PostgreSQL 导入数据

控制台

如需使用控制台从 AlloyDB for PostgreSQL 提取数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 在导航菜单中,点击 Data Stores

  3. 点击创建数据存储区

  4. 来源页面上,选择 AlloyDB

  5. 指定您计划导入的数据的项目 ID、位置 ID、集群 ID、数据库 ID 和表 ID。

  6. 点击继续

  7. 为数据存储区选择一个区域。

  8. 输入数据存储区的名称。

  9. 点击创建

  10. 如需查看数据注入的状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详细信息。当活动标签页上的状态列从进行中更改为导入已完成时,提取操作即告完成。

    提取过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。

REST

使用命令行创建数据存储区并从中注入数据 AlloyDB for PostgreSQL,请按以下步骤操作:

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
    }'
    

    替换以下内容:

    • PROJECT_ID:您的项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • DISPLAY_NAME:数据存储区的显示名。这可能会显示在 Google Cloud 控制台中。
  2. 从 AlloyDB for PostgreSQL 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "alloydbSource": {
          "projectId": "ALLOYDB_PROJECT_ID",
          "locationId": "LOCATION_ID",
          "clusterId": "CLUSTER_ID",
          "databaseId": "DATABASE_ID",
          "tableId": "TABLE_ID",
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
      }'
    

    替换以下内容:

    • PROJECT_ID:您的 Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • ALLOYDB_PROJECT_ID:您的 AlloyDB for PostgreSQL 项目。
    • LOCATION_ID:您的 AlloyDB for PostgreSQL 位置的 ID。
    • CLUSTER_ID:您的 AlloyDB for PostgreSQL 的 ID 集群。
    • DATABASE_ID:您的 AlloyDB for PostgreSQL 的 ID 数据库。
    • TABLE_ID:您的 AlloyDB for PostgreSQL 表的 ID。
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 AlloyDB for PostgreSQL 到数据存储空间的数据增量刷新。此操作会执行更新/插入操作,这会添加新文档和 将现有文档替换为具有相同 ID 的更新文档。 指定 FULL 会导致数据存储区中的文档完全重新基准。换言之,新文档和更新文档将添加到您的数据中 并移除 AlloyDB for PostgreSQL 中不存在的文档 来自数据存储区如果您想执行以下操作,FULL 模式会很有帮助: 自动删除您不再需要的文档。
    • AUTO_GENERATE_IDS:可选。指定是否 自动生成文档 ID。如果设置为 true,文档 ID 将根据载荷的哈希生成。请注意,在多次导入后,生成的文档 ID 可能不会保持一致。如果 您将通过多次导入自动生成 ID,Google 高度 建议将 reconciliationMode 设置为 FULL 以保持 文档 ID 保持一致。
    • ID_FIELD:可选。指定哪些字段 文档 ID。

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 要预览在您的应用和数据存储区均已下载完毕后,搜索结果会如何显示 设置,请参阅 获取搜索结果

使用 API 上传结构化 JSON 数据

要使用 API 直接上传 JSON 文档或对象,请按以下步骤操作。

在导入数据之前, 准备数据以便提取

REST

如需使用命令行创建数据存储区并导入结构化 JSON 数据,请按以下步骤操作。

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DATA_STORE_DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"]
    }'
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • DATA_STORE_ID:您要创建的 Vertex AI Search 数据存储区的 ID。此 ID 只能包含小写字母、数字、下划线和连字符。
    • DATA_STORE_DISPLAY_NAME:Vertex AI 的显示名 搜索要创建的数据存储区。
  2. 导入结构化数据。

    您可以通过以下几种方法上传数据,包括:

    • 上传 JSON 文档。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents?documentId=DOCUMENT_ID" \
      -d '{
        "jsonData": "JSON_DOCUMENT_STRING"
      }'
      

      替换以下内容:

      • DOCUMENT_ID:文档的唯一 ID。 此 ID 最多可包含 63 个字符,并且只能包含小写字母、数字、下划线和连字符。
      • JSON_DOCUMENT_STRING:将 JSON 文档作为单个字符串。此值必须符合您在上一步中提供的 JSON 架构,例如:

        { \"title\": \"test title\", \"categories\": [\"cat_1\", \"cat_2\"], \"uri\": \"test uri\"}
        
    • 上传 JSON 对象。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents?documentId=DOCUMENT_ID" \
      -d '{
        "structData": JSON_DOCUMENT_OBJECT
      }'
      

      JSON_DOCUMENT_OBJECT 替换为 JSON 文档作为 JSON 对象。此架构必须符合您提供的 JSON 架构 之前的步骤中的 - 例如:

      ```json
      {
        "title": "test title",
        "categories": [
          "cat_1",
          "cat_2"
        ],
        "uri": "test uri"
      }
      ```
      
    • 使用 JSON 文档进行更新。

      curl -X PATCH \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents/DOCUMENT_ID" \
      -d '{
        "jsonData": "JSON_DOCUMENT_STRING"
      }'
      
    • 使用 JSON 对象进行更新。

      curl -X PATCH \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents/DOCUMENT_ID" \
      -d '{
        "structData": JSON_DOCUMENT_OBJECT
      }'
      

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 要预览在您的应用和数据存储区均已下载完毕后,搜索结果会如何显示 设置,请参阅 获取搜索结果

排查数据注入问题

如果您在进行数据注入时遇到问题,请查看以下提示:

  • 如果您使用的是客户管理的加密密钥,并且数据导入失败(并显示错误消息 The caller does not have permission),请确保已向 Cloud Storage 服务代理授予相应密钥的 CryptoKey Encrypter/Decrypter IAM 角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter)。如需了解详情,请参阅 “由客户管理的加密”中的准备工作 密钥”。

  • 如果您使用的是高级网站索引编制功能以及 比您的预期低得多,则您需要检查 以便编入索引,并确保指定的网址格式涵盖 要编入索引的网页,并根据需要展开它们。例如,如果 您使用了 *.en.example.com/*,则可能需要将 *.example.com/* 添加到 您希望编入索引的网站

使用 Terraform 创建数据存储区

您可以使用 Terraform 创建空数据存储区。在空数据存储区之后 可以使用 Google Cloud 控制台将数据注入数据存储区 或 API 命令

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

如需使用 Terraform 创建空数据存储区,请参阅 google_discovery_engine_data_store