1. 简介
在此 Codelab 中,我们将使用 BigQuery SQL 查询和 Vertex AI PaLM API 构建一个电影成功率预测和建议应用。用于执行文本生成的模型为 text-bison,并以远程函数的形式托管在 BigQuery 中。
使用的服务列表如下:
- BigQuery ML
- Vertex AI PaLM API
- Cloud Shell
构建内容
您将创建
- 包含模型的 BigQuery 数据集
- 一种 BigQuery ML 模型,可根据电影的 GENRE 和 RUNTIME 属性预测电影的成功得分
- 将 Vertex AI PaLM API 作为远程函数托管的 BigQuery 模型
- 用于在 BigQuery 和 Vertex AI 之间建立连接的外部连接
2. 要求
准备工作
- 在 Google Cloud 控制台的项目选择器页面上,选择或创建一个 Google Cloud 项目
- 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能
- 确保所有必需的 API(BigQuery API、Vertex AI API、BigQuery Connection API)均已启用
- 您将使用 Cloud Shell,这是一个在 Google Cloud 中运行的命令行环境,它预加载了 bq。如需了解 gcloud 命令和用法,请参阅文档
在 Cloud 控制台中,点击右上角的“激活 Cloud Shell”:

如果项目未设置,请使用以下命令进行设置:
gcloud config set project <YOUR_PROJECT_ID>
- 在浏览器中输入以下网址,直接前往 BigQuery 控制台:https://console.cloud.google.com/bigquery
3. 准备数据
在此使用情形中,我们将使用源自 movielens 源的 movies 数据集。
- 创建数据集:
BigQuery 数据集是表的集合。数据集中的所有表都存储在同一数据位置。您还可以附加自定义访问权限控制,以限制对数据集及其表的访问权限。
在 Cloud Shell 中,使用 bq mk 命令创建名为“movie_insights”的数据集
bq mk --location=us-central1 movie_insights
- 将源文件克隆到 Cloud Shell 机器:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
- 前往在 Cloud Shell 机器中创建的新项目目录:
cd movie_score_genai_insights
- 使用 bq load 命令将 CSV 文件加载到 BigQuery 表中(请注意,您也可以直接通过 BigQuery 界面上传):
bq load --source_format=CSV --skip_leading_rows=1 movie_insights.movie_score \
./movies_data.csv \ Id:numeric,name:string,rating:string,genre:string,year:numeric,released:string,score:string,director:string,writer:string,star:string,country:string,budget:numeric,company:string,runtime:numeric,data_cat:string
- 您可以查询一个示例,以检查数据集是否已创建表 movie_score 和数据:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;
4. 从数据到机器学习
我们来创建一个分类模型,根据 GENRE 和 RUNTIME 属性预测电影的成功得分。我们将使用 CREATE MODEL 语句和“LOGISTIC_REG”选项来创建和训练逻辑回归模型。
在 BigQuery 控制台的 SQL 工作区“查询编辑器”部分中运行以下查询:
CREATE OR REPLACE MODEL
`movie_insights.model_rating_by_runtime_genre`
OPTIONS
( model_type='LOGISTIC_REG',
auto_class_weights=TRUE,
data_split_method='NO_SPLIT',
model_registry='vertex_ai',
vertex_ai_model_version_aliases=['logistic_reg', 'experimental'],
input_label_cols=['score']
) AS
SELECT name, genre,runtime, score
FROM
movie_insights.movie_score
WHERE
data_cat = 'TRAIN';
查询详情:
- CREATE MODEL 语句使用 SELECT 语句中的训练数据来训练模型。
- OPTIONS 子句用于指定模型类型和训练选项。在这里,LOGISTIC_REG 选项指定逻辑回归模型类型。无需指定二元逻辑回归模型与多类别逻辑回归模型:BigQuery ML 可根据标签列中的唯一值数量来确定要训练的模型。
- data_split_method=‘NO_SPLIT' 会强制 BQML 根据查询条件 (data_cat = ‘TRAIN') 训练数据,另请注意,最好在此选项中使用“AUTO_SPLIT”,以允许框架(或本例中的服务)随机化训练/测试拆分的分区。
- input_label_cols 选项用于指定 SELECT 语句中的哪个列将用作标签列。在这里,标签列是“得分”,因此模型将根据每行中的其他值来学习得出“得分”的 10 个值中的哪一个值最有可能。
- ‘auto_class_weights=TRUE' 选项平衡训练数据中的类别标签。默认情况下,训练数据未加权。如果训练数据中的标签不平衡,则模型可能会更频繁地学习预测最热门的标签类别。
- SELECT 语句会查询我们使用 CSV 数据加载的表。WHERE 子句过滤输入表中的行,以便在此步骤中仅选择 TRAIN 数据集。
- 以下构造是可选的,因此 BigQuery ML 可以将其显式注册到 Vertex AI Model Registry。如需详细了解此功能,请参阅这篇博文
. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']
创建完成后,BigQuery SQL 工作区的“架构”部分会显示以下内容:

创建模型后,您可以使用 ML.EVALUATE 函数评估模型的性能。ML.EVALUATE 函数根据实际数据评估预测值。
您还可以通过“模型”页面查看模型的评估指标:

关键指标一览:
精确率 - 正确识别的正例占所有识别出的正例的比例是多少?精确率 = 真正例 /(真正例 + 假正例)召回率 - 正确识别出的实际正例所占的比例是多少?召回率 = 真正例 /(真正例 + 假负例)准确率 - 一种用于评估分类模型的指标,指模型实际做出的正确预测所占的比例。准确率 = 正确预测数 / 预测总数
5. 使用模型预测电影得分
预测时间到了!以下查询可预测数据集中归类为“测试”数据的每部电影的得分。
在 BigQuery 控制台的 SQL 工作区“查询编辑器”部分中运行以下查询:
SELECT
*
FROM
ML.PREDICT (MODEL movie_insights.model_rating_by_runtime_genre,
(
SELECT
*
FROM
movie_insights.movie_score
WHERE
data_cat= 'TEST'
)
);
结果如下所示:

模型结果显示了电影的预测得分(分类),范围为 1 到 10。您可能想知道,为什么每部电影都有多个预测行。这是因为模型已按降序返回可能的预测标签以及每个标签的出现概率。
分析预测结果和模型:
您可以利用预测结果执行两项出色的分析步骤,以了解结果:
- 如需了解模型为何生成这些预测结果,您可以使用 ML.EXPLAIN_PREDICT 函数。
- 如需了解哪些特征在整体上对确定收入等级最为重要,您可以使用 ML.GLOBAL_EXPLAIN 函数。
您可以在文档中详细了解这些步骤。
6. 数据到生成式 AI
我们来分析电影数据集,方法是向 LLM(大语言模型)询问影响电影得分超过 5 分的因素的摘要,并使用 Vertex AI 的 text-bison(最新)模型通过生成式 AI 仅使用 SQL 查询
- 我们创建的 movie_score 表也将作为此步骤的输入。
- 系统将创建外部连接,以在 BigQuery ML 和 Vertex 服务之间建立访问权限。
- BigQuery GENERATE_TEXT 结构将用于从 Vertex AI 远程调用 PaLM API。
7. 创建外部连接
启用 BQ Connection API(如果尚未启用),并记下连接配置详细信息中的服务账号 ID:
- 点击 BigQuery 探索器窗格(位于 BigQuery 控制台左侧)中的“+ 添加”按钮,然后点击列出的热门来源中的“与外部数据源的连接”
- 选择“BigLake 和远程函数”作为连接类型,提供“区域”作为位置类型,提供“us-central1 (Iowa)”作为值,并提供“bq_llm_connection”作为连接 ID

- 连接创建完毕后,请记下从连接配置详细信息中生成的服务账号
授予权限
在此步骤中,我们将向服务账号授予访问 Vertex AI 服务的权限:
打开 IAM,将您在创建外部连接后复制的服务账号添加为主账号,然后选择“Vertex AI User”角色

8. 创建远程机器学习模型
创建表示托管式 Vertex AI 大语言模型的远程模型:
CREATE OR REPLACE MODEL
movie_insights.llm_model REMOTE
WITH CONNECTION `us-central1.bq_llm_connection` OPTIONS (remote_service_type = 'CLOUD_AI_LARGE_LANGUAGE_MODEL_V1');
它会在数据集 movie_insights 中创建一个名为 llm_model 的模型,该模型利用 Vertex AI 的 CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 API 作为远程函数。完成此操作需要几秒钟时间。
9. 使用机器学习模型生成文本
模型创建完毕后,您可以使用该模型生成、总结或分类文本。
SELECT
ml_generate_text_result['predictions'][0]['content'] AS generated_text,
ml_generate_text_result['predictions'][0]['safetyAttributes']
AS safety_attributes,
* EXCEPT (ml_generate_text_result)
FROM
ML.GENERATE_TEXT(
MODEL `movie_insights.llm_model`,
(
SELECT
CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
FROM (
SELECT
REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
FROM (
SELECT
*
FROM
`movie_insights.movie_score`
WHERE
CAST(SCORE AS INT64) > 5
LIMIT
50) ) AS MOVIES
),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens));
**说明:
ml_generate_text_result** 是文本生成模型以 JSON 格式返回的响应,其中包含内容和安全属性:a. Content 表示生成的文本结果 b。安全属性表示 Vertex AI PaLM API 中启用的内置内容过滤器,该过滤器具有可调节的阈值,可避免大语言模型生成任何意外或不可预见的回答 - 如果回答违反安全阈值,则会被屏蔽
ML.GENERATE_TEXT 是您在 BigQuery 中使用的结构,用于访问 Vertex AI LLM 以执行文本生成任务
CONCAT 会附加您的 PROMPT 语句和数据库记录
movie_insights 是数据集名称,movie_score 是包含我们将在提示设计中使用的数据的表的名称
温度是用于控制回答随机性的提示参数 - 就相关性而言,温度越低越好
Max_output_tokens 是您希望回答中包含的字数
查询响应如下所示:

如您所见,响应是嵌套的,且未经过格式化。
10. 展平查询结果
我们来展平结果,这样就不必在查询中明确解码 JSON:
SELECT
*
FROM
ML.GENERATE_TEXT( MODEL movie_insights.llm_model,
(
SELECT
CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
FROM (
SELECT
REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
FROM (
SELECT
*
FROM
`movie_insights.movie_score`
WHERE
CAST(SCORE AS INT64) > 5
LIMIT
50) ) AS MOVIES),
STRUCT( 0.2 AS temperature,
100 AS max_output_tokens,
TRUE AS flatten_json_output));
**说明:
Flatten_json_output** 表示布尔值,如果设置为 true,则返回从 JSON 响应中提取的易于理解的展平文本。
查询响应如下所示:

11. 清理
为避免本博文中使用的资源导致您的 Google Cloud 账号产生额外费用,您可以前往 Vertex AI 端点页面,删除您在机器学习步骤中创建的 Vertex AI 端点。
12. 恭喜
恭喜!您已成功创建 BQML 模型,并仅使用 SQL 查询对电影数据集执行了基于 Vertex AI API 的 LLM 分析。如需详细了解可用模型,请参阅 Vertex AI LLM 产品文档。