生成及搜尋多模態嵌入
本教學課程說明如何使用 BigQuery 和 Gemini Enterprise Agent Platform,為圖片和文字生成多模態嵌入,然後使用這些嵌入執行文字轉圖像語意搜尋。
本教學課程涵蓋下列工作:
- 在 Cloud Storage bucket 中,為圖片資料建立 BigQuery 物件資料表。
- 在 BigQuery 使用 Colab Enterprise 筆記本探索圖片資料。
- 建立 BigQuery ML 遠端模型,指定 Gemini Enterprise Agent Platform
multimodalembedding基礎模型。 - 使用遠端模型搭配
AI.GENERATE_EMBEDDING函式,從物件資料表中的圖片生成嵌入。 - 修正所有嵌入生成錯誤。
- 視需要建立向量索引,為圖片嵌入建立索引。
- 為指定搜尋字串建立文字嵌入。
- 使用
VECTOR_SEARCH函式,對與文字嵌入相似的圖片嵌入執行語意搜尋。 - 使用筆記本將結果製成圖表。
本教學課程使用大都會藝術博物館的公有領域藝術圖片,這些圖片可在公有雲 Storage gcs-public-data--met bucket 中取得。
必要的角色
如要執行本教學課程,您必須具備下列 Identity and Access Management (IAM) 角色:
- 建立及使用 BigQuery 資料集、連線、模型和筆記本:BigQuery Studio 管理員 (
roles/bigquery.studioAdmin)。 - 將權限授予連線的服務帳戶:專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin)。
這些預先定義的角色具備執行本文件所述工作所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
- 建立資料集:
bigquery.datasets.create - 建立、委派及使用連線:
bigquery.connections.* - 設定預設連線:
bigquery.config.* - 設定服務帳戶權限:
resourcemanager.projects.getIamPolicy和resourcemanager.projects.setIamPolicy - 建立物件資料表:
bigquery.tables.create和bigquery.tables.update - 建立模型並執行推論:
bigquery.jobs.createbigquery.models.createbigquery.models.getDatabigquery.models.updateDatabigquery.models.updateMetadata
- 建立及使用筆記本:
resourcemanager.projects.getresourcemanager.projects.listbigquery.config.getbigquery.jobs.createbigquery.readsessions.createbigquery.readsessions.getDatabigquery.readsessions.updatedataform.locations.getdataform.locations.listdataform.repositories.create
。dataform.repositories.listdataform.collections.createdataform.collections.listaiplatform.notebookRuntimeTemplates.applyaiplatform.notebookRuntimeTemplates.getaiplatform.notebookRuntimeTemplates.listaiplatform.notebookRuntimeTemplates.getIamPolicyaiplatform.notebookRuntimes.assignaiplatform.notebookRuntimes.getaiplatform.notebookRuntimes.listaiplatform.operations.listaiplatform.notebookRuntimeTemplates.apply
費用
在本文件中,您將使用下列 Google Cloud計費元件:
- BigQuery ML: You incur costs for the data that you process in BigQuery.
- Gemini Enterprise Agent Platform: You incur costs for calls to the Agent Platform service that's represented by the remote model.
您可以使用 Pricing Calculator,根據預測用量估算費用。
如要進一步瞭解 BigQuery 定價,請參閱 BigQuery 說明文件中的「BigQuery 定價」。
如要進一步瞭解 Agent Platform 定價,請參閱 Agent Platform 定價頁面。
事前準備
-
在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。
選取或建立專案所需的角色
- 選取專案:選取專案時,不需具備特定 IAM 角色,只要您已獲派某個專案的角色,即可選取該專案。
-
建立專案:如要建立專案,您必須具備專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
啟用 BigQuery、BigQuery Connection 和 Agent Platform API (如有尚未啟用的 API)。
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過擁有者角色 (roles/owner) 取得這項權限。否則,您可以透過 Service Usage 管理員角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。
建立資料集
如要建立 BigQuery 資料集,請選取下列其中一個選項:
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。
在「Explorer」中展開專案,然後按一下「資料集」。
在「Datasets」(資料集) 頁面,按一下「Create dataset」(建立資料集)。
在「建立資料集」窗格中,執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial。在「資料位置」部分,選取「US」。
其餘預設設定則保持不變。
點選「建立資料集」。
bq
如要建立新的資料集,請使用 bq mk --dataset 指令。
建立名為
bqml_tutorial的資料集,並將資料位置設為US:bq mk --dataset \ --location=US \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
確認資料集已建立:
bq ls
API
使用定義的資料集資源呼叫 datasets.insert 方法:
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
建立物件資料表
在公開 Cloud Storage gcs-public-data--met bucket 中,建立藝術圖片的物件資料表。有了物件資料表,您不必將圖片從 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。
建立遠端模型
建立遠端模型,代表託管的 Agent Platform 多模態嵌入模型:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列查詢:
CREATE OR REPLACE MODEL `bqml_tutorial.multimodal_embedding_model` REMOTE WITH CONNECTION DEFAULT OPTIONS (ENDPOINT = 'gemini-embedding-2-preview');
查詢會在幾秒內完成,完成後,您就能存取
bqml_tutorial資料集中的multimodal_embedding_model模型。由於查詢使用CREATE MODEL陳述式建立模型,因此不會有查詢結果。
生成圖片嵌入
使用 AI.GENERATE_EMBEDDING 函式,從物件資料表中的圖片生成嵌入,然後將嵌入寫入資料表,以便在後續步驟中使用。生成嵌入項目是一項高成本作業,因此查詢會使用包含 LIMIT 子句的子查詢,將嵌入項目生成作業限制為 10,000 張圖片,而非嵌入 601,294 張圖片的完整資料集。這也有助於將圖片數量控制在 AI.GENERATE_EMBEDDING 函式的 25,000 張上限內。這項查詢大約需要 40 分鐘才能執行完畢。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列查詢:
CREATE OR REPLACE TABLE `bqml_tutorial.met_image_embeddings` AS SELECT * FROM AI.GENERATE_EMBEDDING( MODEL `bqml_tutorial.multimodal_embedding_model`, (SELECT * FROM `bqml_tutorial.met_images` WHERE content_type = 'image/jpeg' LIMIT 10000))
修正所有嵌入生成錯誤
檢查並修正所有嵌入生成錯誤。如果 Agent Platform 上的生成式 AI 配額不足或服務無法使用,嵌入生成作業可能會失敗。
AI.GENERATE_EMBEDDING 函式會在 status 欄中傳回錯誤詳細資料。如果成功生成嵌入,這個資料欄會留空;如果生成失敗,則會顯示錯誤訊息。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列查詢,查看是否有任何嵌入生成失敗:
SELECT DISTINCT(status), COUNT(uri) AS num_rows FROM bqml_tutorial.met_image_embeddings GROUP BY 1;
如果傳回含有錯誤的資料列,請捨棄任何嵌入生成失敗的資料列:
DELETE FROM `bqml_tutorial.met_image_embeddings` WHERE status = 'A retryable error occurred: RESOURCE_EXHAUSTED error from remote service/endpoint.';
建立向量索引
您可以視需要使用 CREATE VECTOR INDEX 陳述式,在 met_images_embeddings 資料表的 embedding 欄建立 met_images_index 向量索引。向量索引可讓您更快速地執行向量搜尋,但缺點是會降低檢索率,因此會傳回更多近似結果。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列查詢:
CREATE OR REPLACE VECTOR INDEX `met_images_index` ON bqml_tutorial.met_image_embeddings(embedding) 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 AI.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`, 'embedding', TABLE `bqml_tutorial.search_embedding`, 'embedding', top_k => 3);
以圖表呈現語意搜尋結果
使用筆記本,以視覺化方式呈現語意搜尋結果。
前往 Google Cloud 控制台的「BigQuery」頁面。
開啟先前建立的
met-image-analysis筆記本。以圖表呈現向量搜尋結果:
- 在筆記本中新增程式碼儲存格。
複製下列程式碼並貼到程式碼儲存格:
query = """ SELECT * FROM `bqml_tutorial.vector_search_results` ORDER BY distance; """ printImages(client.query(query))執行程式碼儲存格。
結果應大致如下:
清除所用資源
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。