在 BigQuery 中輕鬆準備資料:低程式碼開發人員指南

1. 簡介

資料分析師經常會遇到以半結構化格式 (例如 JSON 酬載) 鎖定的寶貴資料。以往要擷取及準備這類資料以供分析和機器學習,是相當大的技術障礙,通常需要複雜的 ETL 指令碼,並由資料工程團隊介入處理。

本程式碼研究室提供技術藍圖,協助資料分析師獨立克服這項挑戰。這項範例會以「低程式碼」方式,建構端對端 AI 管道。您將瞭解如何使用 BigQuery Studio 提供的工具,從 Google Cloud Storage 中的原始 CSV 檔案,到支援 AI 驅動的建議功能。

主要目標是展示強大、快速且適合分析師的工作流程,擺脫複雜且需要大量程式碼的程序,從資料中產生實際的業務價值。

必要條件

  • Google Cloud 控制台的基本知識
  • 指令列介面和 Google Cloud Shell 的基本技能

課程內容

  • 瞭解如何使用 BigQuery 資料準備功能,直接從 Google Cloud Storage 擷取及轉換 CSV 檔案。
  • 瞭解如何使用免程式碼轉換功能,剖析及扁平化資料中的巢狀 JSON 字串。
  • 如何建立 BigQuery ML 遠端模型,連線至 Vertex AI 基礎模型以進行文字嵌入。
  • 如何使用 ML.GENERATE_TEXT_EMBEDDING 函式將文字資料轉換為數值向量。
  • 如何使用 ML.DISTANCE 函式計算餘弦相似度,並在資料集中找出最相似的項目。

軟硬體需求

  • Google Cloud 帳戶和 Google Cloud 專案
  • 網路瀏覽器,例如 Chrome

重要概念

  • BigQuery 資料準備:BigQuery Studio 內建的工具,提供互動式視覺化介面,方便您清理及準備資料。並建議轉換方式,讓使用者以最少的程式碼建構資料管道。
  • BQML 遠端模型:BigQuery ML 物件,可做為 Vertex AI (例如 Gemini) 託管模型的 Proxy。您可以使用熟悉的 SQL 語法,叫用強大的預先訓練 AI 模型。
  • 向量嵌入:以數值表示資料,例如文字或圖片。在本程式碼研究室中,我們會將藝術作品的文字說明轉換為向量,類似的說明會產生在多維空間中「更接近」的向量。
  • 餘弦相似度:用來判斷兩個向量相似程度的數學測量值。這是建議引擎邏輯的核心,ML.DISTANCE 函式會使用這項功能找出「最接近」(最相似) 的作品。

2. 設定和需求條件

啟動 Cloud Shell

雖然您可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。

Google Cloud 控制台中,點選右上工具列的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業很快就能完成。完成後,您應該會看到如下的內容:

7ffe5cbb04455448.png

這部虛擬機器搭載各種您需要的開發工具,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,可大幅提升網路效能和驗證。您可以在瀏覽器中完成本程式碼研究室的所有作業。您不需要安裝任何軟體。

啟用必要的 API 並設定環境

在 Cloud Shell 中執行下列指令,設定專案 ID、定義環境變數,並啟用本程式碼研究室的所有必要 API。

export PROJECT_ID=$(gcloud config get-value project)
gcloud config set project $PROJECT_ID
export LOCATION="US"
export GCS_BUCKET_NAME="met-artworks-source-${PROJECT_ID}" # Must be a globally unique name

gcloud services enable bigquery.googleapis.com \
                       storage.googleapis.com \
                       aiplatform.googleapis.com \
                       bigqueryconnection.googleapis.com

建立 BigQuery 資料集和 GCS Bucket

建立新的 BigQuery 資料集來存放資料表,以及 Google Cloud Storage bucket 來儲存來源 CSV 檔案。

# Create the BigQuery Dataset in the US multi-region
bq --location=$LOCATION mk --dataset $PROJECT_ID:met_art_dataset

# Create the GCS Bucket
gcloud storage buckets create gs://$GCS_BUCKET_NAME --project=$PROJECT_ID --location=$LOCATION

準備並上傳範例資料

複製包含範例 CSV 檔案的 GitHub 存放區,然後上傳至您剛建立的 GCS bucket。

# Clone the repository
git clone https://github.com/GoogleCloudPlatform/devrel-demos.git

# Navigate to the correct directory
cd devrel-demos/data-analytics/dataprep

# Upload the CSV file to your GCS bucket
gsutil cp dataprep-met-bqml.csv gs://$GCS_BUCKET_NAME/

3. 使用資料準備功能將資料從 GCS 移至 BigQuery

在本節中,我們將使用無程式碼的視覺化介面,從 GCS 擷取 CSV 檔案、清除檔案,然後載入至新的 BigQuery 資料表。

啟動資料準備作業並連線至來源

  1. 在 Google Cloud 控制台中,前往 BigQuery Studio。

8825270159447e89.png

  1. 在歡迎頁面中,按一下「資料準備」資訊卡即可開始。

8b7b3ce147a55647.png

  1. 如果是第一次使用,可能需要啟用必要的 API。點選「Gemini for Google Cloud API」和「BigQuery Unified API」的「啟用」。啟用後,即可關閉這個面板。

e0a128b8b63137e6.png

1ab7db12bd624bff.png

  1. 在主要的「資料準備」視窗中,按一下「選擇其他資料來源」下方的「Google Cloud Storage」。右側會開啟「準備資料」面板。

5ef56d07d54abab4.png

  1. 按一下「瀏覽」按鈕,選取來源檔案。

95899fcbb7383967.png

  1. 前往先前建立的 GCS bucket (met-artworks-source-...),然後選取 dataprep-met-bqml.csv 檔案。按一下「選取」。

3590d0841677ad01.png

107797a8f134b248.png

  1. 接著,您需要設定暫存表。
  2. 在「資料集」部分,選取您建立的 met_art_dataset
  3. 在「Table name」(資料表名稱) 部分輸入名稱,例如 temp
  4. 按一下「建立」。

694a7064eb1f2109.png

轉換及清除資料

  1. BigQuery 的資料準備功能現在會載入 CSV 檔案的預覽畫面。找出 label_details_json 欄,其中包含長 JSON 字串。按一下欄標題即可選取。

345e09d8222ef0d6.png

  1. 在右側的「建議」面板中,Gemini in BigQuery 會自動建議相關轉換。按一下「扁平化資料欄 label_details_json」資訊卡上的「套用」按鈕。這會將巢狀欄位 (descriptionscore 等) 擷取至各自的頂層資料欄。

a432edf49f182ea3.png

  1. 按一下 object_id 欄,然後按一下「將欄 object_id 從類型 string 轉換為 int64」的套用按鈕。

46523a5dd6b7c495.png

a190553c0a153393.png

定義目的地並執行工作

  1. 在右側面板中,按一下「目的地」按鈕,設定轉換的輸出內容。

90b0d1e641d6ace9.png

  1. 設定目的地詳細資料:
  2. 資料集應預先填入 met_art_dataset
  3. 輸入輸出內容的新資料表名稱:met_art_flatten_table
  4. 按一下「儲存」。

cda9b07bfd5ff6a3.png

  1. 按一下「執行」按鈕,然後等待資料準備工作完成。

9be3f3baecc7ee93.png

  1. 您可以在頁面底部的「執行」分頁中監控工作進度。經過一段時間後,這項工作就會完成。

df820e4a5183e9b9.png

f9329c88a7fdb535.png

4. 使用 BQML 生成向量嵌入

現在資料已清理完畢並完成結構化,我們將使用 BigQuery ML 執行核心 AI 工作:將藝術品的文字說明轉換為數值向量嵌入。

建立 BigQuery 連線

如要允許 BigQuery 與 Vertex AI 服務通訊,請先建立 BigQuery 連線。

  1. 在 BigQuery Studio 的「Explorer」面板中,按一下「+ 新增資料」按鈕。

eef6c5c73cf8736.png

  1. 在右側面板中,使用搜尋列輸入 Vertex AI。選取該項目,然後從篩選後的清單中選取 BigQuery 聯盟。

32e9632e84dd1ae7.png

7feedffb98bb288a.png

  1. 系統隨即會開啟「外部資料來源」表單。填寫下列詳細資料:
  • 連線 ID:輸入連線 ID (例如 bqml-vertex-connection)
  • 位置類型:確認已選取「多區域」。
  • 位置:選取位置 (例如 US)。

c0681e76440a18cd.png

  1. 連線建立完成後,系統會顯示確認對話方塊。在「Explorer」分頁中,按一下「前往連線」或「外部連線」。在連線詳細資料頁面,將完整 ID 複製到剪貼簿。這是 BigQuery 用來呼叫 Vertex AI 的服務帳戶身分。

fd0d82f3265f1def.png

  1. 在 Google Cloud 控制台導覽選單中,依序前往「IAM 與管理」>「IAM」。

de8a0fe28f8dee8f.png

  1. 按一下「授予存取權」按鈕
  2. 將上一個步驟複製的服務帳戶貼到「新主體」欄位。
  3. 在「角色」下拉式選單中指派「Vertex AI 使用者」,然後按一下「儲存」。

8b2c89b8c97e37cc.png

這個重要步驟可確保 BigQuery 獲得適當授權,代表您使用 Vertex AI 模型。

建立遠端模型

在 BigQuery Studio 中開啟新的 SQL 編輯器分頁。您將在此定義連結至 Gemini 的 BQML 模型。

這個陳述式不會訓練新模型,這項作業只會在 BigQuery 中建立參照,並使用您剛授權的連線,指向功能強大的預先訓練 gemini-embedding-001 模型。

複製下列整個 SQL 指令碼,並貼到 BigQuery 編輯器。

ba0a9c9d951c0f71.png

CREATE OR REPLACE MODEL `met_art_dataset.embedding_model`
REMOTE WITH CONNECTION `US.bqml-vertex-connection`
OPTIONS (endpoint = 'gemini-embedding-001');

生成嵌入

現在,我們將使用 BQML 模型生成向量嵌入。我們不會只是轉換每列的單一文字標籤,而是會採用更精細的方法,為每件作品建立更豐富、更有意義的「語意摘要」。這有助於產生更高品質的嵌入內容,並提供更準確的建議。

這項查詢會執行重要的預先處理步驟:

  • 這項查詢會先使用 WITH 子句建立暫存資料表。
  • 在其中,我們會使用 GROUP BY object_id,將單一藝術作品的所有資訊合併為一列。
  • 我們使用 STRING_AGG 函式,將所有個別文字說明 (例如「肖像」、「女性」、「布面油畫」) 合併為單一綜合文字字串,並依據相關分數排序。

這段合併文字可為 AI 提供更豐富的脈絡資訊,進而產生更細緻且強大的向量嵌入。

在新 SQL 編輯器分頁中,貼上並執行下列查詢:

CREATE OR REPLACE TABLE `met_art_dataset.artwork_embeddings` AS
WITH artwork_semantic_text AS (
  -- First, we group all text labels for each artwork into a single row.
  SELECT
    object_id,
    ANY_VALUE(title) AS title,
    ANY_VALUE(artist_display_name) AS artist_display_name,
    -- STRING_AGG combines all descriptions into one comma-separated string,
    -- ordering them by score to put the most relevant labels first.
    STRING_AGG(description, ', ' ORDER BY score DESC) AS aggregated_labels
  FROM
    `met_art_dataset.met_art_flatten_table`
  GROUP BY
    object_id
)
SELECT
  *
FROM ML.GENERATE_TEXT_EMBEDDING(
  MODEL `met_art_dataset.embedding_model`,
  (
    -- We pass the new, combined string as the content to be embedded.
    SELECT
      object_id,
      title,
      artist_display_name,
      aggregated_labels AS content
    FROM
      artwork_semantic_text
  )
);

這項查詢大約需要 10 分鐘。查詢完成後,請確認結果。在「Explorer」面板中找到新的 artwork_embeddings 資料表,然後點選該資料表。在資料表結構定義檢視器中,您會看到 object_id、包含向量的新 ml_generate_text_embedding_result 資料欄,以及做為來源文字的 aggregated_labels 資料欄。

c894ad3624d710e7.png

5. 使用 SQL 尋找類似的藝術品

建立高品質且內容豐富的向量嵌入後,只要執行 SQL 查詢,就能輕鬆找出主題相似的藝術作品。我們使用 ML.DISTANCE 函式計算向量之間的餘弦相似度。由於我們的嵌入內容是從匯總文字產生,相似度結果會更準確且相關。

  1. 在新 SQL 編輯器分頁中,貼上下列查詢。這項查詢會模擬推薦應用程式的核心邏輯:
  • 首先,系統會選取單一特定藝術作品的向量 (在本例中為梵谷的「絲柏樹」,其 object_id 為 436535)。
  • 然後計算該單一向量與表格中所有其他向量之間的距離。
  • 最後,系統會依距離排序結果 (距離越小表示越相似),找出最接近的前 10 個相符項目。
WITH selected_artwork AS (
  SELECT text_embedding
  FROM `met_art_dataset.artwork_embeddings`
  WHERE object_id = 436535
)
SELECT
  base.object_id,
  base.title,
  base.artist_display_name,
  -- ML.DISTANCE calculates the cosine distance between the two vectors.
  -- A smaller distance means the items are more similar.
  ML.DISTANCE(base.text_embedding, (SELECT text_embedding FROM selected_artwork), 'COSINE') AS similarity_distance
FROM
  `met_art_dataset.artwork_embeddings` AS base, selected_artwork
ORDER BY
  similarity_distance
LIMIT 10;
  1. 執行查詢。結果會列出 object_id,最相符的結果會顯示在頂端。來源圖片會先顯示,距離為 0。這是 AI 推薦引擎的核心邏輯,您完全是在 BigQuery 中使用 SQL 建立這項邏輯。

6. (選用) 在 Cloud Shell 中執行範例

為了讓您實際運用本程式碼研究室的概念,您複製的存放區包含簡單的網頁應用程式。這項選用示範會使用您建立的 artwork_embeddings 表格,為圖像搜尋引擎提供資料,讓您瞭解 AI 輔助建議的實際運作方式。

如要在 Cloud Shell 中執行試用版,請按照下列步驟操作:

  1. 設定環境變數:執行應用程式前,請先設定 PROJECT_ID 和 BIGQUERY_DATASET 環境變數。
export PROJECT_ID=$(gcloud config get-value project)
export BIGQUERY_DATASET=met_art_dataset
export REGION='us-central1'
bq cp bigquery-public-data:the_met.images $PROJECT_ID:met_art_dataset.images
  1. 安裝依附元件並啟動後端伺服器。
cd ~/devrel-demos/data-analytics/dataprep/backend/ && npm install
node server.js
  1. 您需要第二個終端機分頁,才能執行前端應用程式。按一下「+」圖示,開啟新的 Cloud Shell 分頁。

bbc9ecde0ff417f4.png

  1. 現在,請在新分頁中執行下列指令,安裝依附元件並執行前端伺服器
cd ~/devrel-demos/data-analytics/dataprep/frontend/ && npm install
npm run dev
  1. 預覽應用程式:在 Cloud Shell 工具列中,按一下「網頁預覽」圖示,然後選取「透過以下通訊埠預覽:5173」。瀏覽器會開啟新分頁並執行應用程式。您現在可以使用應用程式搜尋藝術作品,並查看相似度搜尋的實際運作情形。

d4dc326a225354c9.png

b9956f2c29af2864.png

  1. 如要將這個視覺化示範連結回您在 BigQuery SQL 編輯器中執行的工作,請在搜尋列中輸入「Cypresses」。這與您在 ML.DISTANCE 查詢中使用的藝術品(object_id=436535) 相同。接著,在左側面板中點選「Cypresses」圖片,右側就會顯示結果。應用程式會顯示最相似的藝術作品,以視覺化方式呈現您建構的向量相似度搜尋功能。

a030b3ee20c8703d.png

7. 清除環境

如要避免系統日後向您的 Google Cloud 帳戶收取本程式碼研究室所用資源的費用,請刪除您建立的資源。

在 Cloud Shell 終端機中執行下列指令,移除服務帳戶、BigQuery 連線、GCS Bucket 和 BigQuery 資料集。

# Re-run these exports if your Cloud Shell session timed out
export PROJECT_ID=$(gcloud config get-value project)
export LOCATION="US"
export GCS_BUCKET_NAME="met-artworks-source-${PROJECT_ID}"
export BQ_CONNECTION_ID="bqml-vertex-connection"

移除 BigQuery 連線和 GCS Bucket

# Delete the BigQuery connection
bq rm --connection $LOCATION.$BQ_CONNECTION_ID

# Delete the GCS bucket and its contents
gcloud storage rm --recursive gs://$GCS_BUCKET_NAME

刪除 BigQuery 資料集

最後,刪除 BigQuery 資料集。這項指令無法復原。-f (強制) 旗標會移除資料集和所有資料表,且不會提示確認。

# Manually type this command to confirm you are deleting the correct dataset
bq rm -r -f --dataset $PROJECT_ID:met_art_dataset

8. 恭喜!

您已成功建構端對端 AI 輔助資料管道。

您從 GCS 儲存空間中的原始 CSV 檔案開始,使用 BigQuery Data Prep 的低程式碼介面擷取並扁平化複雜的 JSON 資料,建立強大的 BQML 遠端模型,透過 Gemini 模型生成高品質的向量嵌入,並執行相似度搜尋查詢來尋找相關項目。

您現在已掌握在 Google Cloud 上建構 AI 輔助工作流程的基本模式,可快速輕鬆地將原始資料轉換為智慧型應用程式。

後續步驟

  • 在 Looker Studio 中將結果視覺化:直接將 artwork_embeddings BigQuery 資料表連結至 Looker Studio (免費!)。您可以建構互動式資訊主頁,讓使用者選取藝術品,並查看最相似作品的視覺藝廊,完全不必編寫任何前端程式碼。
  • 使用排定時間的查詢自動執行作業:您不需要複雜的自動化調度管理工具,就能讓嵌入內容保持在最新狀態。使用 BigQuery 內建的「已排定的查詢」功能,每天或每週自動重新執行 ML.GENERATE_TEXT_EMBEDDING 查詢。
  • 使用 Gemini CLI 生成應用程式:只要用純文字描述需求,Gemini CLI 就會生成完整的應用程式。這樣一來,您就能快速建構相似性搜尋的工作原型,不必手動撰寫 Python 程式碼。
  • 閱讀說明文件: