使用数据调优模型
本文档介绍了如何创建引用 Vertex AI 模型的 BigQuery ML 远程模型,然后配置该模型以执行监督调优。Vertex AI 模型必须是以下模型之一:
gemini-1.5-pro-002
gemini-1.5-flash-002
gemini-1.0-pro-002
(预览版)
创建远程模型后,您可以使用 ML.EVALUATE
函数来评估模型并确认模型的性能是否适合您的应用场景。然后,您可以将该模型与 ML.GENERATE_TEXT
函数结合使用来分析 BigQuery 表中的文本。
如需了解详情,请参阅 Vertex AI Gemini API 模型监督式调优。
所需权限
如需创建连接,您需要拥有以下 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,Vertex AI, and Compute Engine APIs.
创建连接
创建 Cloud 资源连接并获取连接的服务账号。
从下列选项中选择一项:
控制台
转到 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 的权限。未授予权限会导致错误。从下列选项中选择一项:
控制台
前往 IAM 和管理页面。
点击
授予访问权限。在新的主账号部分,输入您之前复制的服务账号 ID。
点击选择角色
在过滤条件中,输入
Vertex AI Service Agent
,然后选择该角色。点击保存。
gcloud
使用 gcloud projects add-iam-policy-binding
命令:
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.serviceAgent' --condition=None
替换以下内容:
PROJECT_NUMBER
:您的项目编号。MEMBER
:您之前复制的服务账号 ID。
与您的连接关联的服务账号是 BigQuery 连接委托服务代理的实例,因此可以为其分配服务代理角色。
创建使用监督式调优的模型
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下查询以创建远程模型:
CREATE OR REPLACE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME` REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID` OPTIONS ( ENDPOINT = 'ENDPOINT', MAX_ITERATIONS = MAX_ITERATIONS, LEARNING_RATE_MULTIPLIER = LEARNING_RATE_MULTIPLIER, DATA_SPLIT_METHOD = 'DATA_SPLIT_METHOD', DATA_SPLIT_EVAL_FRACTION = DATA_SPLIT_EVAL_FRACTION, DATA_SPLIT_COL = 'DATA_SPLIT_COL', EVALUATION_TASK = 'EVALUATION_TASK', PROMPT_COL = 'INPUT_PROMPT_COL', INPUT_LABEL_COLS = INPUT_LABEL_COLS) AS SELECT PROMPT_COLUMN, LABEL_COLUMN FROM `TABLE_PROJECT_ID.TABLE_DATASET.TABLE_NAME`;
替换以下内容:
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
:STRING
值,指定要使用的模型的名称。MAX_ITERATIONS
:INT64
值,指定为进行监督式调优而运行的步数。MAX_ITERATIONS
值必须在1
到∞
之间。Gemini 模型使用周期而非步骤进行训练,因此 BigQuery ML 会将
MAX_ITERATIONS
值转换为周期。MAX_ITERATIONS
的默认值为输入数据的行数,相当于一个 epoch。如需使用多个 epoch,请指定训练数据中行数的倍数。例如,如果您有 100 行输入数据,并且您想使用两个 epoch,请为参数值指定200
。如果您提供的值不是输入数据行数的倍数,BigQuery ML 会向上舍入到最近的纪元。 例如,如果您有 100 行输入数据,并为MAX_ITERATIONS
值指定101
,则系统会进行两次迭代来执行训练。如需详细了解用于调优 Gemini 模型的参数,请参阅创建调优作业。
DATA_SPLIT_METHOD
:STRING
值,指定将输入数据拆分为训练集和评估集的方法。有效选项如下:AUTO_SPLIT
:BigQuery ML 会自动拆分数据。数据的拆分方式因输入表中的行数而异。此设置为默认值。RANDOM
:数据在拆分为各个集之前会随机化。如需自定义数据拆分,您可以将此选项与DATA_SPLIT_EVAL_FRACTION
选项结合使用。CUSTOM
:使用DATA_SPLIT_COL
选项中提供的列拆分数据。DATA_SPLIT_COL
值必须是BOOL
类型的列的名称。值为TRUE
或NULL
的行用作评估数据,值为FALSE
的行用作训练数据。SEQ
:使用DATA_SPLIT_COL
选项中提供的列拆分数据。DATA_SPLIT_COL
值必须是以下任一类型的列的名称:NUMERIC
BIGNUMERIC
STRING
TIMESTAMP
数据根据指定列从小到大排序。
前 n 行用作评估数据,其中 n 是为
DATA_SPLIT_EVAL_FRACTION
指定的值。其余行用作训练数据。NO_SPLIT
:不拆分数据;所有输入数据都用作训练数据。
如需详细了解这些数据拆分选项,请参阅
DATA_SPLIT_METHOD
。DATA_SPLIT_EVAL_FRACTION
:FLOAT64
值,指定在执行监督式调优时用作评估数据的数据比例。必须是[0, 1.0]
范围内的值。默认值为0.2
。当您指定
RANDOM
或SEQ
作为DATA_SPLIT_METHOD
选项的值时,请使用此选项。如需自定义数据拆分,您可以将DATA_SPLIT_METHOD
选项与DATA_SPLIT_EVAL_FRACTION
选项结合使用。DATA_SPLIT_COL
:STRING
值,指定用于将输入数据分类到训练集或评估集中的列的名称。在指定CUSTOM
或SEQ
作为DATA_SPLIT_METHOD
选项的值时使用。EVALUATION_TASK
:STRING
值,指定您要对模型进行调优以执行的任务类型。有效选项包括:TEXT_GENERATION
CLASSIFICATION
SUMMARIZATION
QUESTION_ANSWERING
UNSPECIFIED
默认值为
UNSPECIFIED
。INPUT_PROMPT_COL
:STRING
值,包含执行监督式调优时使用的训练数据表中提示列的名称。默认值为prompt
。INPUT_LABEL_COLS
:ARRAY<<STRING>
值,包含要在监督式调优中使用的训练数据表中标签列的名称。只能在数组中指定一个元素。默认值为空数组。这会使label
成为LABEL_COLUMN
参数的默认值。PROMPT_COLUMN
:训练数据表中包含用于评估LABEL_COLUMN
列中内容的提示的列。此列必须是STRING
类型或转换为STRING
。如果您为INPUT_PROMPT_COL
选项指定了值,则必须为PROMPT_COLUMN
指定相同的值。否则,此值必须为prompt
。如果您的表没有prompt
列,请使用别名指定现有表列。例如AS SELECT hint AS prompt, label FROM mydataset.mytable
。LABEL_COLUMN
:训练数据表中包含用于训练模型的样本的列。此列必须是STRING
类型或转换为STRING
。如果您为INPUT_LABEL_COLS
选项指定了值,则必须为LABEL_COLUMN
指定相同的值。否则,此值必须为label
。如果您的表没有label
列,请使用别名指定现有表列。例如AS SELECT prompt, feature AS label FROM mydataset.mytable
。TABLE_PROJECT_ID
:包含训练数据表的项目的项目 ID。TABLE_DATASET
:包含训练数据表的数据集的名称。TABLE_NAME
:包含用于训练模型的数据的表的名称。
评估调优后的模型
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下查询以评估调优后模型:
SELECT * FROM ML.EVALUATE( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, TABLE `TABLE_PROJECT_ID.TABLE_DATASET.TABLE_NAME`, STRUCT('TASK_TYPE' AS task_type, TOKENS AS max_output_tokens, TEMPERATURE AS temperature, TOP_K AS top_k, TOP_P AS top_p));
替换以下内容:
PROJECT_ID
:包含该模型的项目的 ID。DATASET_ID
:包含该模型的数据集的 ID。MODEL_NAME
:模型的名称。TABLE_PROJECT_ID
:包含评估数据表的项目的项目 ID。TABLE_DATASET
:包含训练数据表的数据集的名称。TABLE_NAME
:包含评估数据的表的名称。表中必须有一列的名称与模型训练期间提供的提示列名称匹配。您可以在模型训练期间使用
prompt_col
选项提供此值。如果未指定prompt_col
,系统会使用训练数据中名为prompt
的列。如果没有名为prompt
的列,则会返回错误。表中必须有一列的名称与模型训练期间提供的标签列名称匹配。您可以在模型训练期间使用
input_label_cols
选项提供此值。如果未指定input_label_cols
,系统会使用训练数据中名为label
的列。如果没有名为label
的列,则会返回错误。TASK_TYPE
:一个STRING
值,用于指定要为其评估模型的任务类型。有效选项包括:TEXT_GENERATION
CLASSIFICATION
SUMMARIZATION
QUESTION_ANSWERING
UNSPECIFIED
TOKENS
:一个INT64
值,用于设置回答中可生成的词元数上限。此值必须在范围[1,1024]
内。 指定较低的值可获得较短的回答,指定较高的值可获得较长的回答。默认值为128
。TEMPERATURE
:[0.0,1.0]
范围内的一个FLOAT64
值,用于控制词元选择中的随机程度。默认值为0
。较低的
temperature
值适合需要更具确定性和较少开放性或创造性响应的提示,而较高的temperature
值可以产生更具多样性或创造性的结果。temperature
的值为0
表示确定性,即始终选择概率最高的回答。TOP_K
:[1,40]
范围内的一个INT64
值,用于确定模型考虑选择的初始词元池。指定较低的值可获得随机程度较低的响应,指定较高的值可获得随机程度较高的响应。默认值为40
。TOP_P
:[0.0,1.0]
范围内的FLOAT64
值有助于确定选择了TOP_K
确定的池中的哪些词元。指定较低的值可获得随机程度较低的响应,指定较高的值可获得随机程度较高的响应。默认值为0.95
。
生成文本
使用 ML.GENERATE_TEXT
函数生成文本:
提示列
使用表列提供提示来生成文本。
SELECT * FROM ML.GENERATE_TEXT( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, TABLE PROJECT_ID.DATASET_ID.TABLE_NAME, STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature, TOP_P AS top_p, FLATTEN_JSON AS flatten_json_output, STOP_SEQUENCES AS stop_sequences) );
请替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET_ID
:包含该模型的数据集的 ID。MODEL_NAME
:模型的名称。TABLE_NAME
:包含提示的表的名称。此表必须有一列的名称与调优后的模型中的特征列的名称匹配。在创建模型时,可以使用PROMPT_COL
选项设置模型中的特征列名称。否则,模型中的特征列名称默认为prompt
,您也可以使用别名来使用其他名称的列。TOKENS
:一个INT64
值,用于设置回答中可生成的词元数上限。 此值必须在范围[1,8192]
内。 指定较低的值可获得较短的回答,指定较高的值可获得较长的回答。 默认值为128
。TEMPERATURE
:[0.0,1.0]
范围内的一个FLOAT64
值,用于控制词元选择的随机程度。默认值为1.0
。较低的
temperature
值适合需要更具确定性和较少开放性或创造性响应的提示,而较高的temperature
值可以产生更具多样性或创造性的结果。temperature
的值为0
表示确定性,即始终选择概率最高的回答。TOP_P
:范围[0.0,1.0]
内的一个FLOAT64
值,用于确定所选词元的概率。指定较低的值可获得随机程度较低的回答,指定较高的值可获得随机程度较高的回答。 默认值为0.95
。FLATTEN_JSON
:一个BOOL
值,用于确定是否在单独的列中返回生成的文本和安全属性。默认值为FALSE
。STOP_SEQUENCES
:一个ARRAY<STRING>
值,如果模型的回答中包含指定的字符串,则用于移除这些字符串。字符串需要完全匹配,包括大小写。默认值为空数组。GROUND_WITH_GOOGLE_SEARCH
:一个BOOL
值,用于确定 Vertex AI 模型在生成回答时是否使用通过 Google 搜索建立依据。通过建立依据,模型可以在生成回答时使用网络上的其他信息来生成更具体的真实模型回答。如果flatten_json_output
和此字段都设置为True
,结果中会包含一个额外的ml_generate_text_grounding_result
列,其中提供了模型用于收集更多信息的来源。默认值为FALSE
。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
以下示例显示了具有以下特征的请求:
- 将
prompts
表的prompt
列用于提示。 - 返回概率中等的简短回答。
- 分列返回生成的文本和安全属性。
SELECT * FROM ML.GENERATE_TEXT( MODEL `mydataset.mymodel`, TABLE mydataset.prompts, STRUCT( 0.4 AS temperature, 100 AS max_output_tokens, 0.5 AS top_p, TRUE AS flatten_json_output));
提示查询
使用查询提供提示来生成文本。
SELECT * FROM ML.GENERATE_TEXT( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, (PROMPT_QUERY), STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature, TOP_P AS top_p, FLATTEN_JSON AS flatten_json_output, STOP_SEQUENCES AS stop_sequences) );
请替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET_ID
:包含该模型的数据集的 ID。MODEL_NAME
:模型的名称。PROMPT_QUERY
:提供提示数据的查询。TOKENS
:一个INT64
值,用于设置回答中可生成的词元数上限。 此值必须在范围[1,8192]
内。 指定较低的值可获得较短的回答,指定较高的值可获得较长的回答。 默认值为128
。TEMPERATURE
:[0.0,1.0]
范围内的一个FLOAT64
值,用于控制词元选择的随机程度。默认值为1.0
。较低的
temperature
值适合需要更具确定性和较少开放性或创造性响应的提示,而较高的temperature
值可以产生更具多样性或创造性的结果。temperature
的值为0
表示确定性,即始终选择概率最高的回答。TOP_P
:范围[0.0,1.0]
内的一个FLOAT64
值,用于确定所选词元的概率。指定较低的值可获得随机程度较低的回答,指定较高的值可获得随机程度较高的回答。 默认值为0.95
。FLATTEN_JSON
:一个BOOL
值,用于确定是否在单独的列中返回生成的文本和安全属性。默认值为FALSE
。STOP_SEQUENCES
:一个ARRAY<STRING>
值,如果模型的回答中包含指定的字符串,则用于移除这些字符串。字符串需要完全匹配,包括大小写。默认值为空数组。GROUND_WITH_GOOGLE_SEARCH
:一个BOOL
值,用于确定 Vertex AI 模型在生成回答时是否使用通过 Google 搜索建立依据。通过建立依据,模型可以在生成回答时使用网络上的其他信息来生成更具体的真实模型回答。如果flatten_json_output
和此字段都设置为True
,结果中会包含一个额外的ml_generate_text_grounding_result
列,其中提供了模型用于收集更多信息的来源。默认值为FALSE
。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
示例 1
以下示例显示了具有以下特征的请求:
- 提示在
articles
表的body
列中输入文本摘要。 - 返回中等长度且概率较高的回答。
- 分列返回生成的文本和安全属性。
SELECT * FROM ML.GENERATE_TEXT( MODEL `mydataset.mymodel`, ( SELECT CONCAT('Summarize this text', body) AS prompt FROM mydataset.articles ), STRUCT( 0.2 AS temperature, 650 AS max_output_tokens, 0.2 AS top_p, TRUE AS flatten_json_output));
示例 2
以下示例显示了具有以下特征的请求:
- 通过将提供提示前缀的字符串与表列串联起来,使用查询创建提示数据。
- 返回概率中等的简短回答。
- 不在单独的列中返回生成的文本和安全属性。
SELECT * FROM ML.GENERATE_TEXT( MODEL `mydataset.mytuned_model`, ( SELECT CONCAT(question, 'Text:', description, 'Category') AS prompt FROM mydataset.input_table ), STRUCT( 0.4 AS temperature, 100 AS max_output_tokens, 0.5 AS top_p, FALSE AS flatten_json_output));