生成及搜尋多模態嵌入項目

本教學課程說明如何使用 BigQuery 和 Vertex AI,為圖片和文字生成多模態嵌入項目,然後使用這些嵌入項目執行文字轉圖像語意搜尋。

本教學課程涵蓋下列工作:

本教學課程使用大都會藝術博物館的公共領域藝術圖片,這些圖片位於公開的 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.getIamPolicyresourcemanager.projects.setIamPolicy
  • 建立物件資料表: bigquery.tables.createbigquery.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.

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

如要進一步瞭解 BigQuery 定價,請參閱 BigQuery 說明文件中的「BigQuery 定價」一文。

如要進一步瞭解 Vertex AI 定價,請參閱 Vertex AI 定價頁面。

事前準備

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

建立資料集

建立 BigQuery 資料集來儲存機器學習模型。

控制台

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery 頁面

  2. 在「Explorer」窗格中,按一下專案名稱。

  3. 依序點按 「View actions」(查看動作) >「Create dataset」(建立資料集)

    「建立資料集」選單選項。

  4. 在「建立資料集」頁面中,執行下列操作:

    • 在「Dataset ID」(資料集 ID) 中輸入 bqml_tutorial

    • 針對「Location type」(位置類型) 選取「Multi-region」(多區域),然後選取「US (multiple regions in United States)」(us (多個美國區域))

    • 其餘設定請保留預設狀態,然後按一下「Create dataset」(建立資料集)

bq

如要建立新的資料集,請使用 bq mk 指令搭配 --location 旗標。如需可能的完整參數清單,請參閱 bq mk --dataset 指令參考資料。

  1. 建立名為「bqml_tutorial」的資料集,並將資料位置設為「US」,以及說明設為「BigQuery ML tutorial dataset」:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    這個指令採用 -d 捷徑,而不是使用 --dataset 旗標。如果您省略 -d--dataset,該指令預設會建立資料集。

  2. 確認資料集已建立完成:

    bq ls

API

請呼叫 datasets.insert 方法,搭配已定義的資料集資源

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件

如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

建立物件資料表

在公開的 Cloud Storage gcs-public-data--met bucket 中,針對藝術圖片建立物件資料表。有了物件資料表,您就能分析圖片,不必將圖片從 Cloud Storage 移出。

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在查詢編輯器中執行下列查詢:

    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 筆記本,探索圖片資料。

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 使用 BigQuery 編輯器建立筆記本

  3. 將筆記本連線至預設執行階段

  4. 設定筆記本:

    1. 在筆記本中新增程式碼儲存格。
    2. 複製下列程式碼,並貼到程式碼儲存格中:

      #@title Set up credentials
      
      from google.colab import auth
      auth.authenticate_user()
      print('Authenticated')
      
      PROJECT_ID='PROJECT_ID'
      from google.cloud import bigquery
      client = bigquery.Client(PROJECT_ID)
      

      PROJECT_ID 替換為您在本教學課程中使用的專案名稱。

    3. 執行程式碼儲存格。

  5. 啟用表格顯示功能:

    1. 在筆記本中新增程式碼儲存格。
    2. 複製下列程式碼,並貼到程式碼儲存格中:

      #@title Enable data table display
      %load_ext google.colab.data_table
      
    3. 執行程式碼儲存格。

  6. 建立函式來顯示圖片:

    1. 在筆記本中新增程式碼儲存格。
    2. 複製下列程式碼,並貼到程式碼儲存格中:

      #@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()
      
    3. 執行程式碼儲存格。

  7. 顯示圖片:

    1. 在筆記本中新增程式碼儲存格。
    2. 複製下列程式碼,並貼到程式碼儲存格中:

      #@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))
      
    3. 執行程式碼儲存格。

      結果應如下所示:

      大都會藝術博物館的文物圖片。

  8. 將筆記本儲存為 met-image-analysis

建立遠端模型

建立遠端模型,代表託管的 Vertex AI 多模態嵌入模型:

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在查詢編輯器中執行下列查詢:

    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 分鐘才能完成執行。

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在查詢編輯器中執行下列查詢:

    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 欄中傳回錯誤詳細資料。如果成功產生嵌入內容,這個資料欄會是空白;如果產生失敗,則會顯示錯誤訊息。

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在查詢編輯器中執行下列查詢,查看是否有任何嵌入生成失敗:

    SELECT DISTINCT(ml_generate_embedding_status),
      COUNT(uri) AS num_rows
    FROM bqml_tutorial.met_image_embeddings
    GROUP BY 1;
  3. 如果傳回含有錯誤的資料列,請捨棄任何嵌入生成失敗的資料列:

    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 向量索引。向量索引可讓您更快執行向量搜尋,但會降低召回率,因此傳回的結果會更近似。

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在查詢編輯器中執行下列查詢:

    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');
  3. 系統會以非同步方式建立向量索引。如要檢查向量索引是否已建立,請查詢 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

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在查詢編輯器中執行下列查詢:

    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 函式執行語意搜尋,找出最符合文字嵌入所代表搜尋字串的圖片。

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在查詢編輯器中執行下列查詢,進行語意搜尋並將結果寫入資料表:

    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);

以視覺化方式呈現語意搜尋結果

使用筆記本以視覺化的方式呈現語意搜尋結果。

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 開啟先前建立的 met-image-analysis 筆記本。

  3. 以視覺化方式呈現向量搜尋結果:

    1. 在筆記本中新增程式碼儲存格。
    2. 複製下列程式碼,並貼到程式碼儲存格中:

      query = """
        SELECT * FROM `bqml_tutorial.vector_search_results`
        ORDER BY distance;
      """
      
      printImages(client.query(query))
      
    3. 執行程式碼儲存格。

      結果應如下所示:

      多模態向量搜尋查詢傳回的圖片。

清除所用資源

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.