1. 简介
在此 Codelab 中,我们将使用 BigQuery SQL 查询和 Vertex AI PaLM API 构建一个电影成功评分预测和处方应用。用于执行文本生成的模型是 text-bison,作为远程函数托管在 BigQuery 中。
使用的服务如下:
- BigQuery ML
- Vertex AI PaLM API
- Cloud Shell
构建内容
您将创建
- 包含模型的 BigQuery 数据集
- 一个根据电影的 GENRE 和 RUNTIME 属性预测电影成功分数的 BigQuery ML 模型
- 将 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 属性预测电影的成功分数。我们将使用带有“LOGISTIC_REG”选项的 CREATE MODEL 语句以创建和训练逻辑回归模型。
在 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 工作区的 SCHEMA 部分中:
创建模型后,请使用 ML.EVALUATE 函数评估模型的性能。ML.EVALUATE 函数根据实际数据评估预测值。
您还可以在“MODEL”页面中查看模型的评估指标:
关键指标一览表:
精确率 - 正例识别项中实际正确的比例占多大比例?精确率 = 真正例 /(真正例 + 假正例)召回率 - 正确识别的实际正例的比例是多少?召回率 = 真正例 /(真正例 + 假负例)准确率 - 用于评估分类模型的指标,是我们模型实际做出正确预测的比例。准确率 = 正确预测的数量 / 预测总数
5. 使用模型预测电影配乐
预测时间!!!!以下查询会预测数据集中归类为“TEST”的每部影片的得分数据。
在 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 的评分范围(分类)显示电影的 predict_score。您肯定想知道,为什么每部电影都有多个预测行。这是因为模型返回了可能的预测标签,以及每个标签的出现概率(以降序排列)。
分析预测结果和模型:
您可以针对预测结果执行两个很棒的分析步骤,以了解结果:
- 如需了解模型生成这些预测结果的原因,您可以使用 ML.EXPLAIN_PREDICT 函数。
- 要知道哪些特征对于确定一般收入等级来说最为重要,可以使用 ML.GLOBAL_EXPLAIN 函数。
如需详细了解这些步骤,请参阅文档。
6. 从数据到生成式 AI
我们使用 Vertex AI 的 text-bison(最新)模型的生成式 AI,仅使用 SQL 查询,通过 LLM(大语言模型)总结影响电影得分高于 5 的因素,提供关于电影数据集的分析洞见
- 我们创建的 movie_score 表也将作为此步骤的输入。
- 系统将创建外部连接,以便在 BigQuery ML 和 Vertex 服务之间建立访问。
- BigQuery GENERATE_TEXT 构造将用于从 Vertex AI 远程调用 PaLM API。
7. 创建外部连接
启用 BQ Connection API(如果尚未启用),并记下连接配置详细信息中的服务账号 ID:
- 点击 BigQuery Explorer 窗格(位于 BigQuery 控制台左侧)上的“+ 添加”按钮,然后点击“与外部数据源的连接”在列出的热门来源中
- 选择“BigLake 和远程函数”作为连接类型,选择“区域”作为位置类型并将值设为“us-central1(爱荷华)”和“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 模型,并使用 Vertex AI API 仅通过 SQL 查询对电影数据集执行了基于 LLM 的分析。如需详细了解可用的模型,请参阅 Vertex AI LLM 产品文档。