使用数据调优模型
本文档介绍如何创建引用 text-bison
Vertex AI 自然语言基础模型的任何版本并配置模型以执行监督式调优的 BigQuery ML 远程模型。创建远程模型后,您可以使用 ML.EVALUATE
函数来评估模型并确认模型的性能是否适合您的应用场景。然后,您可以将该模型与 ML.GENERATE_TEXT
函数结合使用来分析 BigQuery 表中的文本。
所需权限
如需创建连接,您需要拥有以下 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.
-
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
将以下部分附加到 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
:您的连接的 IDPROJECT_ID
:您的 Google Cloud 项目 IDREGION
:您的连接区域
向连接的服务账号授予访问权限
向您的服务账号授予访问 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 连接委托服务代理的实例,因此可以为其分配服务代理角色。
向 Compute Engine 默认服务账号授予访问权限
启用 Compute Engine API 后,Compute Engine 默认服务账号会自动被授予项目的 Editor 角色,除非您已对项目停用此行为。如果是这种情况,您必须重新向 Compute Engine 默认服务账号授予 Editor 角色,使其拥有足够权限来创建和调优远程模型。
控制台
前往 IAM 和管理页面。
点击
授予访问权限。在新的主账号中,输入服务账号 ID,即
PROJECT_NUMBER-compute@developer.gserviceaccount.com
。点击选择角色
在请选择一个角色中,选择基本,然后选择 Editor。
点击保存。
gcloud
使用 gcloud projects add-iam-policy-binding
命令:
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/editor' --condition=None
替换以下内容:
PROJECT_NUMBER
:您的项目编号。MEMBER
:服务账号 ID,即PROJECT_NUMBER-compute@developer.gserviceaccount.com
。
创建使用监督式调优的模型
在 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, EARLY_STOP = EARLY_STOP, LEARNING_RATE_MULTIPLIER = LEARNING_RATE_MULTIPLIER, ACCELERATOR_TYPE = 'ACCELERATOR_TYPE', 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
值,指定要使用的文本 LLM 的名称,在本例中必须是text-bison
模型的任何版本。MAX_ITERATIONS
:INT64
值,指定为进行监督式调优而运行的步数。MAX_ITERATIONS
值必须在1
到2400
之间。通常,100 步大约需要 1 小时才能完成。默认值为300
。MAX_ITERATIONS
值与ACCELERATOR_TYPE
值相结合会影响模型训练中使用的批次大小。如需详细了解如何选择训练步数,请参阅建议的配置。如需了解详情,请参阅
MAX_ITERATIONS
。EARLY_STOP
:BOOL
值,用于确定是否在完成所有调优步骤之前停止监督式调优。设置为TRUE
时,如果模型性能(通过预测词元的准确率来衡量)在两次评估运行之间没有得到足够的改进,则会停止监督式调优。设置为FALSE
时,监督式调优会继续,直到所有调优步骤完成。默认值为FALSE
。LEARNING_RATE_MULTIPLIER
:FLOAT64
,要应用于建议的学习速率的调节系数。默认值为1.0
。ACCELERATOR_TYPE
:STRING
值,指定要用于监督式调优的加速器类型。有效选项如下:GPU
:使用 A100 80 GB GPU 进行监督式调优。TPU
:使用 64 个 TPU v3 Pod 核心进行监督式调优。 如果您选择此选项,则存在以下情况:- 您必须在
europe-west4
区域中运行查询。如需了解如何更改查询选项(例如位置),请参阅运行交互式查询。 - 监督式调优计算在
europe-west4
区域中进行,因为这是 TPU 资源所在的位置。
- 您必须在
默认值为
GPU
。无论您使用哪个选项,都请确保您有足够的配额。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_K AS top_k, 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
:包含提示的表的名称。此表必须有一列的名称与调优后的 LLM 中的特征列的名称匹配。在创建模型时,可以使用PROMPT_COL
选项设置 LLM 中的特征列名称。否则,LLM 中的特征列名称默认为prompt
,您也可以使用别名来使用其他名称的列。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
值,用于确定所选词元的概率。指定较低的值可获得随机程度较低的回答,指定较高的值可获得随机程度较高的回答。默认值为0.95
。FLATTEN_JSON
:一个BOOL
值,用于确定是否在单独的列中返回生成的文本和安全属性。默认值为FALSE
。STOP_SEQUENCES
:一个ARRAY<STRING>
值,如果模型的回答中包含指定的字符串,则用于移除这些字符串。字符串需要完全匹配,包括大小写。默认值为空数组。
以下示例显示了具有以下特征的请求:
- 将
prompts
表的prompt
列用于提示。 - 返回概率中等的简短回答。
- 分列返回生成的文本和安全属性。
SELECT * FROM ML.GENERATE_TEXT( MODEL `mydataset.llm_model`, TABLE mydataset.prompts, STRUCT( 0.4 AS temperature, 100 AS max_output_tokens, 0.5 AS top_p, 40 AS top_k, 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_K AS top_k, 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,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
值,用于确定所选词元的概率。指定较低的值可获得随机程度较低的回答,指定较高的值可获得随机程度较高的回答。默认值为0.95
。FLATTEN_JSON
:一个BOOL
值,用于确定是否在单独的列中返回生成的文本和安全属性。默认值为FALSE
。STOP_SEQUENCES
:一个ARRAY<STRING>
值,如果模型的回答中包含指定的字符串,则用于移除这些字符串。字符串需要完全匹配,包括大小写。默认值为空数组。
示例 1
以下示例显示了具有以下特征的请求:
- 提示在
articles
表的body
列中输入文本摘要。 - 返回中等长度且概率较高的回答。
- 分列返回生成的文本和安全属性。
SELECT * FROM ML.GENERATE_TEXT( MODEL `mydataset.llm_model`, ( 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, 15 AS top_k, TRUE AS flatten_json_output));
示例 2
以下示例显示了具有以下特征的请求:
- 通过将提供提示前缀的字符串与表列串联起来,使用查询创建提示数据。
- 返回概率中等的简短回答。
- 不在单独的列中返回生成的文本和安全属性。
SELECT * FROM ML.GENERATE_TEXT( MODEL `mydataset.llm_tuned_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, 30 AS top_k, FALSE AS flatten_json_output));