產生及搜尋多模態嵌入

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

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

本教學課程使用 大都會藝術博物館的公共領域藝術圖片,這些圖片可在公開的 Cloud Storage gcs-public-data--met 值區中取得。

所需權限

如要執行本教學課程,您必須具備下列身分和存取管理 (IAM) 權限:

  • 如要建立連線,您必須具備 BigQuery 連線管理員 (roles/bigquery.connectionAdmin) 角色。

  • 如要將權限授予連線的服務帳戶,您必須具備 resourcemanager.projects.setIamPolicy 權限。

  • 如要建立及執行筆記本,您必須具備下列 IAM 權限:

    • resourcemanager.projects.get
    • resourcemanager.projects.list
    • bigquery.config.get
    • bigquery.jobs.create
    • bigquery.readsessions.create
    • bigquery.readsessions.getData
    • bigquery.readsessions.update
    • resourcemanager.projects.get
    • resourcemanager.projects.list
    • 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

    您可以透過下列 IAM 角色取得這些權限:

    • BigQuery 讀取工作階段使用者 (roles/bigquery.readSessionUser)
    • BigQuery Studio 使用者 (roles/bigquery.studioUser)
  • 本教學課程中,針對其他 BigQuery 作業所需的 IAM 權限,已納入下列兩個角色:

    • BigQuery 資料編輯器 (roles/bigquery.dataEditor),用於建立模型、資料表和索引。
    • BigQuery 使用者 (roles/bigquery.user),用於執行 BigQuery 工作。

費用

在本文件中,您會使用 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. 在「Create dataset」頁面上執行下列操作:

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

    • 在「位置類型」中選取「多區域」,然後選取「美國 (多個美國區域)」

    • 保留其餘預設設定,然後點選「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 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件

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

import google.cloud.bigquery

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

建立連線

建立 Cloud 資源連線,並取得連線的服務帳戶 ID。請在先前步驟中建立的資料集位置中建立連線。

如果您已設定具備適當權限的預設連線,可以略過這個步驟。

為遠端模型建立Cloud 資源連線,並取得連線的服務帳戶。請在與您在上一個步驟中建立的資料集相同的位置建立連線。

選取下列選項之一:

主控台

  1. 前往「BigQuery」頁面

    前往 BigQuery

  2. 在「Explorer」窗格中,按一下 「新增資料」

    「新增資料」UI 元素。

    「Add data」對話方塊隨即開啟。

  3. 在「Filter By」窗格中的「Data Source Type」部分,選取「Business Applications」

    或者,您也可以在「Search for data sources」欄位中輸入 Vertex AI

  4. 在「精選資料來源」部分,按一下「Vertex AI」

  5. 按一下「Vertex AI 模型:BigQuery 聯盟」解決方案資訊卡。

  6. 在「連線類型」清單中,選取「Vertex AI 遠端模型、遠端函式和 BigLake (Cloud 資源)」

  7. 在「連線 ID」欄位中,輸入連線的名稱。

  8. 點選「建立連線」

  9. 按一下「前往連線」

  10. 在「連線資訊」窗格中,複製服務帳戶 ID,以便在後續步驟中使用。

bq

  1. 在指令列環境中建立連線:

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID

    --project_id 參數會覆寫預設專案。

    更改下列內容:

    • REGION:您的連線區域
    • PROJECT_ID:您的 Google Cloud 專案 ID
    • CONNECTION_ID:連線 ID

    建立連線資源時,BigQuery 會建立專屬的系統服務帳戶,並將該帳戶與連線建立關聯。

    疑難排解:如果您收到下列連線錯誤,請更新 Google Cloud SDK

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. 擷取並複製服務帳戶 ID,以便在後續步驟中使用:

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    輸出結果會與下列內容相似:

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

使用 google_bigquery_connection 資源。

如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。

以下範例會在 US 地區中建立名為 my_cloud_resource_connection 的 Cloud 資源連線:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節中的步驟。

準備 Cloud Shell

  1. 啟動 Cloud Shell
  2. 設定要套用 Terraform 設定的預設 Google Cloud 專案。

    您只需為每個專案執行這個指令一次,而且可以在任何目錄中執行。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 設定檔中設定明確的值,系統就會覆寫環境變數。

準備目錄

每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。

  1. Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱必須包含 .tf 副檔名,例如 main.tf。在本教學課程中,檔案稱為 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您正在參考教學課程,可以複製各個章節或步驟中的程式碼範例。

    將範例程式碼複製到新建立的 main.tf 中。

    您可以視需要從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您採用這種做法。

  3. 查看並修改要套用至環境的範例參數。
  4. 儲存變更。
  5. 初始化 Terraform。這項操作只需對每個目錄執行一次。
    terraform init

    如要使用最新版的 Google 供應器,您可以選擇加入 -upgrade 選項:

    terraform init -upgrade

套用變更

  1. 檢查設定,確認 Terraform 要建立或更新的資源符合您的預期:
    terraform plan

    視需要修正設定。

  2. 執行下列指令,並在提示中輸入 yes,即可套用 Terraform 設定:
    terraform apply

    等待 Terraform 顯示「Apply complete!」(套用完成) 訊息。

  3. 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。

將權限授予連線的服務帳戶

授予連線服務帳戶適當的角色,以便存取 Cloud Storage 和 Vertex AI 服務。您必須在開始前一節中建立或選取的專案中授予這些角色。在其他專案中授予角色會導致 bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource 錯誤。

如要授予適當的角色,請按照下列步驟操作:

  1. 前往「IAM & Admin」(IAM 與管理) 頁面。

    前往「IAM & Admin」(IAM 與管理)

  2. 按一下 「授予存取權」

  3. 在「新增主體」欄位,輸入先前複製的服務帳戶 ID。

  4. 在「請選擇角色」欄位中,依序選擇「Vertex AI」和「Vertex AI 使用者」

  5. 按一下 [Add another role] (新增其他角色)

  6. 在「請選擇角色」欄位中,依序選取「Cloud Storage」和「Storage 物件檢視者」

  7. 按一下 [儲存]

建立物件資料表

在公開 Cloud Storage gcs-public-data--met 值區中,針對藝術圖片建立物件資料表。物件表可讓您分析圖片,而無須將圖片從 Cloud Storage 移出。

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

    前往 BigQuery

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

    CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.met_images`
    WITH CONNECTION `LOCATION.CONNECTION_ID`
    OPTIONS
      ( object_metadata = 'SIMPLE',
        uris = ['gs://gcs-public-data--met/*']
      );

    更改下列內容:

    • LOCATION:連線位置。
    • CONNECTION_ID:BigQuery 連線的 ID。

      在 Google Cloud 控制台查看連線詳細資料時,這是連線 ID 中顯示的完整限定連線 ID 最後一節的值,例如 projects/myproject/locations/connection_location/connections/myconnection

探索圖片資料

在 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 `LOCATION.CONNECTION_ID`
      OPTIONS (ENDPOINT = 'multimodalembedding@001');

    更改下列內容:

    • LOCATION:連線位置。
    • CONNECTION_ID:BigQuery 連線的 ID。

      在 Google Cloud 控制台查看連線詳細資料時,這是連線 ID 中顯示的完整限定連線 ID 最後一節的值,例如 projects/myproject/locations/connection_location/connections/myconnection

    查詢需要幾秒鐘的時間才能完成,完成後,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);

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

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

  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.