使用 AI.GENERATE_TABLE 函数生成结构化数据

本文档介绍了如何使用 Gemini Pro 1.5、Gemini Flash 1.5 或 Gemini Flash 2.0 模型生成结构化数据,然后使用 SQL 架构设置模型的回答格式。

为此,请完成以下任务:

所需权限

  • 如需创建连接,您需要拥有以下 Identity and Access Management (IAM) 角色的成员资格:

    • roles/bigquery.connectionAdmin
  • 如需向连接的服务账号授予权限,您需要以下权限:

    • resourcemanager.projects.setIamPolicy
  • 如需使用 BigQuery ML 创建模型,您需要以下 IAM 权限:

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

    • 表的 bigquery.tables.getData 权限
    • 模型的 bigquery.models.getData 权限
    • bigquery.jobs.create

准备工作

  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

创建连接

创建 Cloud 资源连接并获取连接的服务账号。

从下列选项中选择一项:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器窗格中,点击 添加数据

    系统随即会打开添加数据对话框。

  3. 过滤条件窗格中的数据源类型部分,选择商务应用

    或者,在搜索数据源字段中,输入 Vertex AI

  4. 精选数据源部分中,点击 Vertex AI

  5. 点击 Vertex AI 模型:BigQuery 联合解决方案卡片。

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

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

  8. 点击创建连接

  9. 点击转到连接

  10. 连接信息窗格中,复制服务账号 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

使用 google_bigquery_connection 资源。

如需向 BigQuery 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为客户端库设置身份验证

以下示例在 US 区域中创建一个名为 my_cloud_resource_connection 的 Cloud 资源连接:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

向服务账号授予访问权限

向连接的服务账号授予 Vertex AI User 角色。

如果您打算在创建远程模型时将端点指定为网址(例如 endpoint = 'https://us-central1-aiplatform.googleapis.com/v1/projects/myproject/locations/us-central1/publishers/google/models/gemini-1.5-flash'),请在网址中指定的项目中授予此角色。

如果您打算在创建远程模型时使用模型名称指定端点(例如 endpoint = 'gemini-1.5-flash'),请在打算创建远程模型的项目中授予此角色。

在其他项目中授予此角色会导致错误 bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource

如需授予该角色,请按以下步骤操作:

控制台

  1. 前往 IAM 和管理页面。

    转到“IAM 和管理”

  2. 点击 Add

    系统随即会打开添加主账号对话框。

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

  4. 选择角色字段中,选择 Vertex AI,然后选择 Vertex AI User

  5. 点击保存

gcloud

使用 gcloud projects add-iam-policy-binding 命令

gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None

请替换以下内容:

  • PROJECT_NUMBER:您的项目编号
  • MEMBER:您之前复制的服务账号 ID

创建 BigQuery 机器学习远程模型

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

    转到 BigQuery

  2. 使用 SQL 编辑器创建远程模型

    CREATE OR REPLACE MODEL
    `PROJECT_ID.DATASET_ID.MODEL_NAME`
    REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
    OPTIONS (ENDPOINT = 'ENDPOINT');

    替换以下内容:

    • PROJECT_ID:您的项目 ID
    • DATASET_ID:包含模型的数据集的 ID。 此数据集必须与您使用的连接位于同一位置
    • MODEL_NAME:模型的名称
    • REGION:连接使用的区域
    • CONNECTION_ID:BigQuery 连接的 ID

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

    • ENDPOINT:要使用的 Gemini 模型的名称。支持以下模型:
      • gemini-2.0-flash-001
      • gemini-1.5-flash-001
      • gemini-1.5-flash-002
      • gemini-1.5-pro-001
      • gemini-1.5-pro-002
      如需了解详情,请参阅 ENDPOINT

生成结构化数据

AI.GENERATE_TABLE 函数与远程模型结合使用并使用表列中的提示数据来生成结构化数据:

SELECT *
FROM AI.GENERATE_TABLE(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  [TABLE `PROJECT_ID.DATASET_ID.TABLE_NAME` / (PROMPT_QUERY)],
  STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature,
  TOP_P AS top_p, STOP_SEQUENCES AS stop_sequences,
  SAFETY_SETTINGS AS safety_settings,
  OUTPUT_SCHEMA AS output_schema)
);

请替换以下内容:

  • PROJECT_ID:您的项目 ID。
  • DATASET_ID:包含该模型的数据集的 ID。
  • MODEL_NAME:模型的名称。
  • TABLE_NAME:包含提示的表的名称。该表必须具有名为 prompt 的列,或者您可以通过别名来使用其他名称的列。
  • PROMPT_QUERY:用于生成提示数据的 GoogleSQL 查询。提示值本身可以从列中提取,也可以将其指定为包含任意数量的字符串和列名称子字段的结构体值。例如:SELECT ('Analyze the sentiment in ', feedback_column, 'using the following categories: positive, negative, neutral') AS prompt
  • TOKENS:一个 INT64 值,用于设置回答中可生成的词元数上限。此值必须在范围 [1,8192] 内。指定较低的值可获得较短的回答,指定较高的值可获得较长的回答。默认值为 128
  • TEMPERATURE[0.0,2.0] 范围内的一个 FLOAT64 值,用于控制词元选择的随机程度。默认值为 1.0

    较低的 temperature 值适合需要更具确定性和较少开放性或创造性回答的提示,而较高的 temperature 值可以产生更具多样性或创造性的结果。temperature 的值为 0 表示确定性,即始终选择概率最高的回答。

  • TOP_P:范围 [0.0,1.0] 内的一个 FLOAT64 值,用于确定所选词元的概率。指定较低的值可获得随机程度较低的回答,指定较高的值可获得随机程度较高的回答。默认值为 0.95
  • STOP_SEQUENCES:一个 ARRAY<STRING> 值,如果模型的回答中包含指定的字符串,则用于移除这些字符串。字符串需要完全匹配,包括大小写。默认值为空数组。
  • SAFETY_SETTINGS:一个 ARRAY<STRUCT<STRING AS category, STRING AS threshold>> 值,用于配置内容安全阈值以过滤回答。结构体中的第一个元素指定危害类别,结构体中的第二个元素指定相应的屏蔽阈值。模型会过滤掉违反这些设置的内容。您只能指定每个类别一次。例如,您不能同时指定 STRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_MEDIUM_AND_ABOVE' AS threshold)STRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_ONLY_HIGH' AS threshold)。如果给定类别没有安全设置,则系统会使用 BLOCK_MEDIUM_AND_ABOVE 安全设置。

    支持的类别如下:

    • HARM_CATEGORY_HATE_SPEECH
    • HARM_CATEGORY_DANGEROUS_CONTENT
    • HARM_CATEGORY_HARASSMENT
    • HARM_CATEGORY_SEXUALLY_EXPLICIT

    支持的阈值如下:

    • BLOCK_NONE受限
    • BLOCK_LOW_AND_ABOVE
    • BLOCK_MEDIUM_AND_ABOVE(默认)
    • BLOCK_ONLY_HIGH
    • HARM_BLOCK_THRESHOLD_UNSPECIFIED

    如需了解详情,请参阅危害类别如何配置内容过滤器

  • OUTPUT_SCHEMA:一个 STRING 值,用于指定模型回答的格式。output_schema 值必须是 SQL 架构定义,类似于 CREATE TABLE 语句中使用的定义。 支持以下数据类型:
    • INT64
    • FLOAT64
    • BOOL
    • STRING
    • ARRAY
    • STRUCT

    对于 Gemini 1.5 模型,仅当您确定返回值不会是舍入值时,才应指定 FLOAT64 数据类型。 这些模型有时可能会针对舍入数字返回 INT64 值,而不是 FLOAT64 值,例如 2 而不是 2.0,这可能会导致查询中出现解析错误。

    使用 output_schema 参数根据表中的提示生成结构化数据时,请务必了解提示数据,以便指定适当的架构。

    例如,假设您要分析包含以下字段的表格中的电影评论内容:

    • movie_id
    • review
    • 提示

    然后,您可以通过运行类似以下的查询来创建提示文本:

    UPDATE mydataset.movie_review
    SET prompt = CONCAT('Extract the key words and key sentiment from the text below: ', review)
    WHERE review IS NOT NULL;

    您可以指定与 "keywords ARRAY<STRING>, sentiment STRING" AS output_schema 类似的 output_schema 值。

示例

以下示例展示了一个请求,该请求会从表中获取提示数据,并提供 SQL 架构来设置模型响应的格式:

SELECT
*
FROM
AI.GENERATE_TABLE( MODEL `mydataset.gemini_model`,
  TABLE `mydataset.mytable`,
  STRUCT("keywords ARRAY<STRING>, sentiment STRING" AS output_schema));

以下示例展示了一个请求,该请求会从查询中获取提示数据,并提供 SQL 架构来设置模型响应的格式:

SELECT *
FROM
  AI.GENERATE_TABLE(
    MODEL `mydataset.gemini_model`,
    (
      SELECT
        'John Smith is a 20-year old single man living at 1234 NW 45th St, Kirkland WA, 98033. He has two phone numbers 123-123-1234, and 234-234-2345. He is 200.5 pounds.'
          AS prompt
    ),
    STRUCT("address STRUCT<street_address STRING, city STRING, state STRING, zip_code STRING>, age INT64, is_married BOOL, name STRING, phone_number ARRAY<STRING>, weight_in_pounds FLOAT64"
        AS output_schema, 8192 AS max_output_tokens));