生成及搜尋多模態嵌入項目
本教學課程說明如何使用 BigQuery 和 Vertex AI,為圖片和文字生成多模態嵌入項目,然後使用這些嵌入項目執行文字轉圖像語意搜尋。
本教學課程涵蓋下列工作:
- 在 Cloud Storage bucket 中,針對圖片資料建立 BigQuery 物件資料表。
- 使用 BigQuery 中的 Colab Enterprise 筆記本探索圖片資料。
- 建立以 Vertex AI
multimodalembedding
基礎模型為目標的 BigQuery ML 遠端模型。 - 使用
ML.GENERATE_EMBEDDING
函式搭配遠端模型,從物件資料表中的圖片生成嵌入。 - 修正任何嵌入生成錯誤。
- 選擇建立向量索引,為圖片嵌入項目建立索引。
- 為指定搜尋字串建立文字嵌入。
- 使用
VECTOR_SEARCH
函式,對與文字嵌入類似的圖片嵌入執行語意搜尋。 - 使用筆記本將結果製成圖表。
本教學課程使用大都會藝術博物館的公共領域藝術圖片,這些圖片位於公開的 Cloud Storage gcs-public-data--met
bucket。
必要的角色
如要執行本教學課程,您需要下列 Identity and Access Management (IAM) 角色:
- 建立及使用 BigQuery 資料集、連線、模型和筆記本:
BigQuery Studio 管理員 (
roles/bigquery.studioAdmin
)。 - 將權限授予連線的服務帳戶:專案 IAM 管理員 (
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
費用
在本文件中,您會使用 Trusted Cloud by S3NS的下列計費元件:
- 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 Trusted Cloud console, on the project selector page, select or create a Trusted 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 Trusted 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 資料集來儲存機器學習模型。
控制台
前往 Trusted Cloud 控制台的「BigQuery」頁面。
在「Explorer」窗格中,按一下專案名稱。
依序點按
「View actions」(查看動作) >「Create dataset」(建立資料集)。在「建立資料集」頁面中,執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial
。針對「Location type」(位置類型) 選取「Multi-region」(多區域),然後選取「US (multiple regions in United States)」(us (多個美國區域))。
其餘設定保留預設值,然後點選「建立資料集」。
bq
如要建立新的資料集,請使用 bq mk
指令搭配 --location
旗標。如需可能的完整參數清單,請參閱 bq mk --dataset
指令參考資料。
建立名為「
bqml_tutorial
」的資料集,並將資料位置設為「US
」,說明則設為「BigQuery ML tutorial dataset
」:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
這個指令採用
-d
捷徑,而不是使用--dataset
旗標。如果您省略-d
和--dataset
,該指令預設會建立資料集。確認資料集已建立完成:
bq ls
API
請呼叫 datasets.insert
方法,搭配已定義的資料集資源。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件。
如要驗證 BigQuery,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。
建立物件資料表
在公開的 Cloud Storage gcs-public-data--met
bucket 中,針對藝術圖片建立物件資料表。有了物件資料表,您就能分析圖片,不必將圖片從 Cloud Storage 移出。
前往 Trusted 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 筆記本,探索圖片資料。
前往 Trusted 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 多模態嵌入模型:
前往 Trusted Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列查詢:
CREATE OR REPLACE MODEL `bqml_tutorial.multimodal_embedding_model` REMOTE WITH CONNECTION DEFAULT OPTIONS (ENDPOINT = 'multimodalembedding@001');
查詢作業會在幾秒內完成,完成後,
multimodal_embedding_model
模型會顯示在「Explorer」(探索工具) 窗格的bqml_tutorial
資料集中。由於查詢使用CREATE MODEL
陳述式建立模型,因此不會有查詢結果。
生成圖片嵌入
使用 ML.GENERATE_EMBEDDING
函式,從物件資料表中的圖片生成嵌入內容,然後將這些內容寫入資料表,以供後續步驟使用。產生嵌入內容的作業成本高昂,因此查詢會使用包含 LIMIT
子句的子查詢,將嵌入內容的產生作業限制為 10,000 張圖片,而不是嵌入 601,294 張圖片的完整資料集。這也有助於將圖片數量控制在 ML.GENERATE_EMBEDDING
函式的 25,000 張上限內。這項查詢大約需要 40 分鐘才能完成執行。
前往 Trusted 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
欄中傳回錯誤詳細資料。如果成功產生嵌入內容,這個資料欄會是空白;如果產生失敗,則會顯示錯誤訊息。
前往 Trusted 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
向量索引。向量索引可讓您更快執行向量搜尋,但會降低召回率,因此傳回的結果會更近似。
前往 Trusted 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
。
前往 Trusted 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
函式,根據文字嵌入所代表的搜尋字串,執行語意搜尋,找出最相符的圖片。
前往 Trusted 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);
以視覺化方式呈現語意搜尋結果
使用筆記本以視覺化的方式呈現語意搜尋結果。
前往 Trusted Cloud 控制台的「BigQuery」頁面。
開啟先前建立的
met-image-analysis
筆記本。以視覺化方式呈現向量搜尋結果:
- 在筆記本中新增程式碼儲存格。
複製下列程式碼,並貼到程式碼儲存格中:
query = """ SELECT * FROM `bqml_tutorial.vector_search_results` ORDER BY distance; """ printImages(client.query(query))
執行程式碼儲存格。
結果應如下所示:
清除所用資源
- In the Trusted 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.