生成和搜索多模态嵌入
本教程介绍了如何使用 BigQuery 和 Vertex AI 为图片和文本生成多模态嵌入,然后使用这些嵌入执行文生图语义搜索。
本教程介绍了以下任务:
- 基于 Cloud Storage 存储桶中的图片数据创建 BigQuery 对象表。
- 使用 BigQuery 中的 Colab Enterprise 笔记本探索图片数据。
- 创建一个针对 Vertex AI
multimodalembedding
基础模型的 BigQuery ML 远程模型。 - 将远程模型与
ML.GENERATE_EMBEDDING
函数搭配使用,以根据对象表中的图片生成嵌入。 - 更正所有嵌入生成错误。
- (可选)创建一个矢量索引以将图片嵌入编入索引。
- 为给定搜索字符串创建文本嵌入。
- 使用
VECTOR_SEARCH
函数对与文本嵌入类似的图片嵌入执行语义搜索。 - 使用笔记本直观呈现结果。
本教程使用大都会艺术博物馆中的公共领域艺术图片,您可以在公共 Cloud Storage gcs-public-data--met
存储桶中找到这些图片。
所需的角色
如需运行本教程,您需要拥有以下 Identity and Access Management (IAM) 角色:
- 创建和使用 BigQuery 数据集、连接、模型和笔记本:BigQuery Studio Admin (
roles/bigquery.studioAdmin
)。 - 向连接的服务账号授予权限:Project IAM Admin (
roles/resourcemanager.projectIamAdmin
)。
这些预定义角色包含执行本文档中的任务所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
- 创建数据集:
bigquery.datasets.create
- 创建、委托和使用连接:
bigquery.connections.*
- 设置默认连接:
bigquery.config.*
- 设置服务账号权限:
resourcemanager.projects.getIamPolicy
和resourcemanager.projects.setIamPolicy
- 创建对象表:
bigquery.tables.create
和bigquery.tables.update
- 创建模型并运行推断:
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.models.updateMetadata
- 创建和使用笔记本:
resourcemanager.projects.get
resourcemanager.projects.list
bigquery.config.get
bigquery.jobs.create
bigquery.readsessions.create
bigquery.readsessions.getData
bigquery.readsessions.update
dataform.locations.get
dataform.locations.list
dataform.repositories.create
dataform.repositories.list
dataform.collections.create
dataform.collections.list
aiplatform.notebookRuntimeTemplates.apply
aiplatform.notebookRuntimeTemplates.get
aiplatform.notebookRuntimeTemplates.list
aiplatform.notebookRuntimeTemplates.getIamPolicy
aiplatform.notebookRuntimes.assign
aiplatform.notebookRuntimes.get
aiplatform.notebookRuntimes.list
aiplatform.operations.list
aiplatform.notebookRuntimeTemplates.apply
费用
在本文档中,您将使用 Google Cloud的以下收费组件:
- BigQuery ML: You incur costs for the data that you process in BigQuery.
- Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.
如需根据您的预计使用量来估算费用,请使用价格计算器。
如需详细了解 BigQuery 价格,请参阅 BigQuery 文档中的 BigQuery 价格。
如需详细了解 Vertex AI 价格,请参阅 Vertex AI 价格页面。
准备工作
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.
创建数据集
创建 BigQuery 数据集以存储机器学习模型。
控制台
在 Google Cloud 控制台中,前往 BigQuery 页面。
在探索器窗格中,点击您的项目名称。
点击
查看操作 > 创建数据集在 创建数据集 页面上,执行以下操作:
在数据集 ID 部分,输入
bqml_tutorial
。在位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。
保持其余默认设置不变,然后点击创建数据集。
bq
如需创建新数据集,请使用带有 --location
标志的 bq mk
命令。 如需查看完整的潜在参数列表,请参阅 bq mk --dataset
命令参考文档。
创建一个名为
bqml_tutorial
的数据集,并将数据位置设置为US
,说明为BigQuery ML tutorial dataset
:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
该命令使用的不是
--dataset
标志,而是-d
快捷方式。如果省略-d
和--dataset
,该命令会默认创建一个数据集。确认已创建数据集:
bq ls
API
使用已定义的数据集资源调用 datasets.insert
方法。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrame
在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC。
创建对象表
基于公共 Cloud Storage gcs-public-data--met
存储桶中的艺术图片创建对象表。对象表让您无需从 Cloud Storage 中移动图片即可分析图片。
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,运行以下查询:
CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.met_images` WITH CONNECTION DEFAULT OPTIONS ( object_metadata = 'SIMPLE', uris = ['gs://gcs-public-data--met/*'] );
探索图片数据
在 BigQuery 中创建 Colab Enterprise 笔记本来探索图片数据。
在 Google Cloud 控制台中,前往 BigQuery 页面。
设置笔记本:
启用表显示:
- 在笔记本中添加代码单元。
将以下代码复制并粘贴到该代码单元中:
#@title Enable data table display %load_ext google.colab.data_table
运行该代码单元。
创建一个用于显示图片的函数:
- 在笔记本中添加代码单元。
将以下代码复制并粘贴到该代码单元中:
#@title Util function to display images import io from PIL import Image import matplotlib.pyplot as plt import tensorflow as tf def printImages(results): image_results_list = list(results) amt_of_images = len(image_results_list) fig, axes = plt.subplots(nrows=amt_of_images, ncols=2, figsize=(20, 20)) fig.tight_layout() fig.subplots_adjust(hspace=0.5) for i in range(amt_of_images): gcs_uri = image_results_list[i][0] text = image_results_list[i][1] f = tf.io.gfile.GFile(gcs_uri, 'rb') stream = io.BytesIO(f.read()) img = Image.open(stream) axes[i, 0].axis('off') axes[i, 0].imshow(img) axes[i, 1].axis('off') axes[i, 1].text(0, 0, text, fontsize=10) plt.show()
运行该代码单元。
显示图片:
- 在笔记本中添加代码单元。
将以下代码复制并粘贴到该代码单元中:
#@title Display Met images inspect_obj_table_query = """ SELECT uri, content_type FROM bqml_tutorial.met_images WHERE content_type = 'image/jpeg' Order by uri LIMIT 10; """ printImages(client.query(inspect_obj_table_query))
运行该代码单元。
结果应如下所示:
将笔记本保存为
met-image-analysis
。
创建远程模型
创建表示托管 Vertex AI 多模态嵌入模型的远程模型:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,运行以下查询:
CREATE OR REPLACE MODEL `bqml_tutorial.multimodal_embedding_model` REMOTE WITH CONNECTION DEFAULT OPTIONS (ENDPOINT = 'multimodalembedding@001');
查询需要几秒钟才能完成,之后
multimodal_embedding_model
模型会显示在探索器窗格的bqml_tutorial
数据集中。由于查询使用CREATE MODEL
语句来创建模型,因此没有查询结果。
生成嵌入图片
使用 ML.GENERATE_EMBEDDING
函数根据对象表中的图片生成嵌入,然后将其写入表中以供下一步使用。嵌入生成是一项费用高昂的操作,因此查询使用子查询(包括 LIMIT
子句)将嵌入生成限制为 10,000 张图片,而不是嵌入包含 601,294 张图片的完整数据集。这也有助于将 ML.GENERATE_EMBEDDING
函数的图片数量保持在 25,000 的限制以下。此查询大约需要 40 分钟才能完成运行。
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,运行以下查询:
CREATE OR REPLACE TABLE `bqml_tutorial.met_image_embeddings` AS SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.multimodal_embedding_model`, (SELECT * FROM `bqml_tutorial.met_images` WHERE content_type = 'image/jpeg' LIMIT 10000))
更正所有嵌入生成错误
检查并更正任何嵌入生成错误。由于 Vertex AI 上的生成式 AI 配额或服务不可用,嵌入生成可能会失败。
ML.GENERATE_EMBEDDING
函数在 ml_generate_embedding_status
列中返回错误详细信息。如果成功生成嵌入,此列为空;如果嵌入生成失败,此列会包含错误消息。
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,运行以下查询以查看是否存在任何嵌入生成失败:
SELECT DISTINCT(ml_generate_embedding_status), COUNT(uri) AS num_rows FROM bqml_tutorial.met_image_embeddings GROUP BY 1;
如果返回存在错误的行,请丢弃无法生成嵌入的行:
DELETE FROM `bqml_tutorial.met_image_embeddings` WHERE ml_generate_embedding_status = 'A retryable error occurred: RESOURCE_EXHAUSTED error from remote service/endpoint.';
创建矢量索引
您可以选择使用 CREATE VECTOR INDEX
语句在 met_images_embeddings
表的 ml_generate_embedding_result
列上创建 met_images_index
矢量索引。矢量索引可让您更快地执行矢量搜索,同时需要降低召回率并返回更多近似结果。
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,运行以下查询:
CREATE OR REPLACE VECTOR INDEX `met_images_index` ON bqml_tutorial.met_image_embeddings(ml_generate_embedding_result) OPTIONS ( index_type = 'IVF', distance_type = 'COSINE');
矢量索引是异步创建的。如需检查是否已创建矢量索引,请查询
INFORMATION_SCHEMA.VECTOR_INDEXES
视图并确认coverage_percentage
值大于0
,并且last_refresh_time
值不是NULL
:SELECT table_name, index_name, index_status, coverage_percentage, last_refresh_time, disable_reason FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES WHERE index_name = 'met_images_index';
为搜索文本生成嵌入
如需搜索与指定文本搜索字符串对应的图片,您必须先为该字符串创建文本嵌入。使用同一远程模型创建用于创建图片嵌入的文本嵌入,然后将文本嵌入写入表中以供下一步使用。搜索字符串为 pictures of white or cream colored dress from victorian era
。
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,运行以下查询:
CREATE OR REPLACE TABLE `bqml_tutorial.search_embedding` AS SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.multimodal_embedding_model`, ( SELECT 'pictures of white or cream colored dress from victorian era' AS content ) );
执行文本转图片语义搜索
使用 VECTOR_SEARCH
函数对与文本嵌入表示的搜索字符串最匹配的图片执行语义搜索。
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,运行以下查询以执行语义搜索并将结果写入表:
CREATE OR REPLACE TABLE `bqml_tutorial.vector_search_results` AS SELECT base.uri AS gcs_uri, distance FROM VECTOR_SEARCH( TABLE `bqml_tutorial.met_image_embeddings`, 'ml_generate_embedding_result', TABLE `bqml_tutorial.search_embedding`, 'ml_generate_embedding_result', top_k => 3);
直观呈现语义搜索结果
使用笔记本直观呈现语义搜索结果。
在 Google Cloud 控制台中,前往 BigQuery 页面。
打开您之前创建的
met-image-analysis
笔记本。直观呈现矢量搜索结果:
- 在笔记本中添加代码单元。
将以下代码复制并粘贴到该代码单元中:
query = """ SELECT * FROM `bqml_tutorial.vector_search_results` ORDER BY distance; """ printImages(client.query(query))
运行该代码单元。
结果应如下所示:
清理
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.