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

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

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

本教學課程使用大都會藝術博物館的公共領域藝術圖像,這些圖像位於公開的 Cloud 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.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

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

費用

在本文件中,您會使用下列 Cloud de Confiance by S3NS的計費元件:

  • 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.

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

如要進一步瞭解 Agent Platform 計價方式,請參閱這個頁面

事前準備

  1. 在 Cloud de Confiance 控制台的專案選擇器頁面中,選取或建立 Cloud de Confiance 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色

    前往專案選取器

  2. 確認專案已啟用計費功能 Cloud de Confiance

  3. 啟用 BigQuery、BigQuery Connection 和 Agent Platform API。

    啟用 API 時所需的角色

    如要啟用 API,您需要服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    啟用 API

建立資料集

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

控制台

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

    前往 BigQuery 頁面

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

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

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

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

    • 針對「Location type」(位置類型) 選取「Multi-region」(多區域),然後選取「US」(美國)

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

bq

如要建立新的資料集,請使用 bq mk --dataset 指令

  1. 建立名為 bqml_tutorial 的資料集,並將資料位置設為 US

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. 確認資料集已建立完成:

    bq ls

API

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

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

建立物件資料表

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

  1. 前往 Cloud de Confiance 控制台的「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. 前往 Cloud de Confiance 控制台的「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

建立遠端模型

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

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

    前往「BigQuery」

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

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

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

    前往「BigQuery」

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

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

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

    前往「BigQuery」

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

    SELECT DISTINCT(status),
      COUNT(uri) AS num_rows
    FROM bqml_tutorial.met_image_embeddings
    GROUP BY 1;
  3. 如果傳回含有錯誤的資料列,請捨棄任何無法產生嵌入內容的資料列:

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

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

    前往「BigQuery」

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

    CREATE OR REPLACE
      VECTOR INDEX `met_images_index`
    ON
      bqml_tutorial.met_image_embeddings(embedding)
      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. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

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

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

  1. 前往 Cloud de Confiance 控制台的「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`,
        'embedding',
        TABLE `bqml_tutorial.search_embedding`,
        'embedding',
        top_k => 3);

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

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

  1. 前往 Cloud de Confiance 控制台的「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. 前往 Cloud de Confiance 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。