通过以迭代方式调用 ML.GENERATE_EMBEDDING 来处理配额错误

本教程介绍如何使用 BigQuery bqutil.procedure.bqml_generate_embeddings 公共存储过程来迭代对 ML.GENERATE_EMBEDDING 函数的调用。通过以迭代方式调用函数,您可以解决因超出适用于函数的配额和限制而发生的任何可重试错误。

如需查看 GitHub 中 bqutil.procedure.bqml_generate_embeddings 存储过程的源代码,请参阅 bqml_generate_embeddings.sqlx。如需详细了解存储过程参数和用法,请参阅自述文件

本教程将指导您完成以下任务:

  • 创建基于 text-embedding-004 模型的远程模型
  • 通过 bqutil.procedure.bqml_generate_embeddings 存储过程,使用远程模型和 bigquery-public-data.bbc_news.fulltext 公共数据表迭代对 ML.GENERATE_EMBEDDING 函数的调用。

所需权限

  • 如需创建数据集,您需要拥有 bigquery.datasets.create Identity and Access Management (IAM) 权限。
  • 如需创建连接资源,您需要以下 IAM 权限:

    • bigquery.connections.create
    • bigquery.connections.get
  • 如需向连接的服务账号授予权限,您需要以下权限:

    • resourcemanager.projects.setIamPolicy
  • 如需创建模型,您需要以下权限:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • 如需运行推理,您需要以下权限:

    • bigquery.models.getData
    • bigquery.jobs.create

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Vertex AI: You incur costs for calls to the Vertex AI model.

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

如需详细了解 BigQuery 价格,请参阅 BigQuery 价格

如需详细了解 Vertex AI 价格,请参阅 Vertex AI 价格

准备工作

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

创建数据集

创建 BigQuery 数据集来存储模型和示例数据:

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

    前往 BigQuery 页面

  2. 探索器窗格中,点击您的项目名称。

  3. 点击 查看操作 > 创建数据集

  4. 创建数据集 页面上,执行以下操作:

    1. 数据集 ID 部分,输入 target_dataset

    2. 位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。

    3. 保持其余默认设置不变,然后点击创建数据集

创建连接

创建 Cloud 资源连接并获取连接的服务账号。在上一步中创建的数据集所在的位置创建连接。

从下列选项中选择一项:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 如需创建连接,请点击 添加,然后点击与外部数据源的连接

  3. 连接类型列表中,选择 Vertex AI 远程模型、远程函数和 BigLake(Cloud 资源)

  4. 连接 ID 字段中,输入连接的名称。

  5. 点击创建连接

  6. 点击转到连接

  7. 连接信息窗格中,复制服务账号 ID 以在后续步骤中使用。

bq

  1. 在命令行环境中,创建连接:

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID
    

    --project_id 参数会替换默认项目。

    替换以下内容:

    • REGION:您的连接区域
    • PROJECT_ID:您的 Google Cloud 项目 ID
    • CONNECTION_ID:您的连接的 ID

    当您创建连接资源时,BigQuery 会创建一个唯一的系统服务账号,并将其与该连接相关联。

    问题排查:如果您收到以下连接错误,请更新 Google Cloud SDK

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. 检索并复制服务账号 ID 以在后续步骤中使用:

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID
    

    输出类似于以下内容:

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

将以下部分附加到 main.tf 文件中。

 ## This creates a cloud resource connection.
 ## Note: The cloud resource nested object has only one output only field - serviceAccountId.
 resource "google_bigquery_connection" "connection" {
    connection_id = "CONNECTION_ID"
    project = "PROJECT_ID"
    location = "REGION"
    cloud_resource {}
}        
替换以下内容:

  • CONNECTION_ID:您的连接的 ID
  • PROJECT_ID:您的 Google Cloud 项目 ID
  • REGION:您的连接区域

向连接的服务账号授予权限

如需向连接的服务账号授予适当的角色以访问 Cloud Storage 和 Vertex AI 服务,请执行以下步骤:

  1. 前往 IAM 和管理页面。

    转到“IAM 和管理”

  2. 点击 授予访问权限

  3. 新的主账号字段中,输入您之前复制的服务账号 ID。

  4. 选择角色菜单中,选择 Vertex AI > Vertex AI User

  5. 点击保存

创建文本嵌入生成模型

创建一个代表托管式 Vertex AI text-embedding-004 模型的远程模型:

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

    转到 BigQuery

  2. 在查询编辑器中,运行以下语句:

    CREATE OR REPLACE MODEL `target_dataset.embedding_model`
      REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID`
      OPTIONS (ENDPOINT = 'text-embedding-004');
    

    替换以下内容:

    • LOCATION:连接位置。
    • CONNECTION_ID:BigQuery 连接的 ID。

      当您在 Google Cloud 控制台中查看连接详情时,它是连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如 projects/myproject/locations/connection_location/connections/myconnection

    查询需要几秒钟才能完成,之后 embedding 模型会显示在探索器窗格的 sample 数据集中。由于查询使用 CREATE MODEL 语句来创建模型,因此没有查询结果。

运行存储过程

运行 bqutil.procedure.bqml_generate_embeddings 存储过程,该存储过程会使用 target_dataset.embedding_model 模型和 bigquery-public-data.bbc_news.fulltext 公共数据表迭代对 ML.GENERATE_EMBEDDING 函数的调用:

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

    转到 BigQuery

  2. 在查询编辑器中,运行以下语句:

    CALL `bqutil.procedure.bqml_generate_embeddings`(
        "bigquery-public-data.bbc_news.fulltext",            -- source table
        "PROJECT_ID.target_dataset.news_body_embeddings",  -- destination table
        "PROJECT_ID.target_dataset.embedding_model",       -- model
        "body",                                              -- content column
        ["filename"],                                        -- key columns
        '{}'                                                 -- optional arguments encoded as a JSON string
    );
    

    PROJECT_ID 替换为您在本教程中使用的项目的 ID。

    存储过程会创建一个 target_dataset.news_body_embeddings 表,以包含 ML.GENERATE_EMBEDDING 函数的输出。

  3. 查询运行完毕后,确认 target_dataset.news_body_embeddings 表中没有包含可重试错误的行。在查询编辑器中,运行以下语句:

    SELECT *
    FROM `target_dataset.news_body_embeddings`
    WHERE ml_generate_embedding_status LIKE '%A retryable error occurred%';
    

    查询将返回消息 No data to display

清理

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.