使用 AI.GENERATE_TABLE 函数生成结构化数据
本文档介绍了如何使用 Gemini Pro 1.5、Gemini Flash 1.5 或 Gemini Flash 2.0 模型生成结构化数据,然后使用 SQL 架构设置模型的回答格式。
为此,请完成以下任务:
- 创建表示托管式 Vertex AI Gemini 1.5 或 2.0 模型的 BigQuery ML 远程模型。
- 将模型与
AI.GENERATE_TABLE
函数搭配使用,根据标准表中的数据生成结构化数据。
所需权限
如需创建连接,您需要拥有以下 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
- 表的
准备工作
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
创建连接
创建 Cloud 资源连接并获取连接的服务账号。
从下列选项中选择一项:
控制台
转到 BigQuery 页面。
在浏览器窗格中,点击
添加数据。系统随即会打开添加数据对话框。
在过滤条件窗格中的数据源类型部分,选择商务应用。
或者,在搜索数据源字段中,输入
Vertex AI
。在精选数据源部分中,点击 Vertex AI。
点击 Vertex AI 模型:BigQuery 联合解决方案卡片。
在连接类型列表中,选择 Vertex AI 远程模型、远程函数和 BigLake(Cloud 资源)。
在连接 ID 字段中,输入连接的名称。
点击创建连接。
点击转到连接。
在连接信息窗格中,复制服务账号 ID 以在后续步骤中使用。
bq
在命令行环境中,创建连接:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
--project_id
参数会替换默认项目。替换以下内容:
REGION
:您的连接区域PROJECT_ID
:您的 Google Cloud 项目 IDCONNECTION_ID
:您的连接的 ID
当您创建连接资源时,BigQuery 会创建一个唯一的系统服务账号,并将其与该连接相关联。
问题排查:如果您收到以下连接错误,请更新 Google Cloud SDK:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
检索并复制服务账号 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 资源连接:
如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。
准备 Cloud Shell
- 启动 Cloud Shell。
-
设置要应用 Terraform 配置的默认 Google Cloud 项目。
您只需为每个项目运行一次以下命令,即可在任何目录中运行它。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。
准备目录
每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。
-
在 Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有
.tf
扩展名,例如main.tf
。在本教程中,该文件称为main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。
将示例代码复制到新创建的
main.tf
中。(可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。
- 查看和修改要应用到您的环境的示例参数。
- 保存更改。
-
初始化 Terraform。您只需为每个目录执行一次此操作。
terraform init
(可选)如需使用最新的 Google 提供程序版本,请添加
-upgrade
选项:terraform init -upgrade
应用更改
-
查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
terraform plan
根据需要更正配置。
-
通过运行以下命令并在提示符处输入
yes
来应用 Terraform 配置:terraform apply
等待 Terraform 显示“应用完成!”消息。
- 打开您的 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
。
如需授予该角色,请按以下步骤操作:
控制台
前往 IAM 和管理页面。
点击
Add。系统随即会打开添加主账号对话框。
在新的主账号字段中,输入您之前复制的服务账号 ID。
在选择角色字段中,选择 Vertex AI,然后选择 Vertex AI User。
点击保存。
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 机器学习远程模型
在 Google Cloud 控制台中,前往 BigQuery 页面。
使用 SQL 编辑器创建远程模型:
CREATE OR REPLACE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME` REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID` OPTIONS (ENDPOINT = 'ENDPOINT');
替换以下内容:
PROJECT_ID
:您的项目 IDDATASET_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));