將暗資料轉化為結構化黃金

1. 總覽

我們都知道「暗資料」的痛苦。這些檔案是位於 Cloud Storage bucket 中的 PDF、圖片和文字檔,SQL 查詢和 BI 資訊主頁完全看不到這些檔案。傳統上,解鎖這類資料需要複雜的 OCR 管道、手動輸入資料或容易出錯的自訂指令碼。

現在您不必再為此煩惱。

在本實驗室中,我將示範如何將 400 個非結構化 PDF 檔案 (包含文字、表格和圖片) 轉換為結構清楚的 BigQuery 資料表,並自動推斷這些資料表之間的關係。我們將使用 BigQuery Knowledge Catalog 和 Dataplex,在幾分鐘內完成這項作業。

建構項目

為求實際,我們以一家虛構的企業為例:一家快速成長的優格霜淇淋連鎖店。

假設您管理這間 Froyo 企業的資料。您有數百份食譜和供應商規格表,全都儲存為 PDF 檔。企業領袖想推出 AI 代理,協助店長和顧客查詢產品詳細資料。

以下是夢魘情境:顧客詢問「我對你們的午夜漩渦優格很感興趣,裡面有任何過敏原嗎?」

如要回答這個問題,系統通常必須:

  1. 找出「午夜漩渦」食譜 PDF。
  2. 閱讀成分 (例如「可可粉」、「乳製品基底」、「乳化劑 X」)。
  3. 從數十份供應商 PDF 中搜尋,找出這些特定成分的規格表。
  4. 查看供應商資料表,找出與這些成分相關的隱藏過敏原。

如果想在執行階段讀取 400 個原始 PDF,並即時建構可執行這項作業的 AI 代理程式,不僅速度緩慢、成本高昂,還容易產生幻覺。我們將改用語意推論,先將所有內容擷取到關聯式資料庫中,讓未來的 AI 代理速度飛快,且 100% 以實際的 SQL 資料為依據。

讓我們開始建構吧!

2381f1453211387d.png

課程內容

  • 如何設定來源檔案 (PDF) 的 Cloud Storage bucket
  • 瞭解如何在 Knowledge Catalog 中設定及執行資料掃描工作和語意推論,從來源 PDF 檔案擷取資料,並以語意推論連結和內容,然後將資料儲存在 BigQuery 中
  • 如何使用 BigQuery 代理與新建立的資料集對話

需求條件

  • 瀏覽器,例如 ChromeFirefox
  • 已啟用計費功能的 Google Cloud 專案。
  • 對 SQL 和 Java 有基本瞭解。

2. 事前準備

建立專案

  1. Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案
  2. 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能
  1. 您將使用 Cloud Shell,這是 Google Cloud 中執行的指令列環境。按一下 Google Cloud 控制台頂端的「啟用 Cloud Shell」。

「啟用 Cloud Shell」按鈕圖片

  1. 連至 Cloud Shell 後,請使用下列指令確認驗證已完成,專案也已設為獲派的專案 ID:
gcloud auth list
  1. 在 Cloud Shell 中執行下列指令,確認 gcloud 指令已瞭解您的專案。
gcloud config list project
  1. 如要驗證
gcloud auth login
  1. 如果未設定專案,請使用下列指令來設定:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project <YOUR_PROJECT_ID>
  1. 啟用必要的 API:執行下列指令,啟用所有必要的 API:
gcloud services enable \
    dataplex.googleapis.com \
    datacatalog.googleapis.com \
    discoveryengine.googleapis.com \
    bigqueryconnection.googleapis.com \
    bigquery.googleapis.com \
    aiplatform.googleapis.com \
    cloudresourcemanager.googleapis.com \
    serviceusage.googleapis.com \
    storage.googleapis.com

常見錯誤與疑難排解

「幽靈專案」 症候群

您執行了 gcloud config set project,但實際上在控制台 UI 中查看的是其他專案。檢查左上方的下拉式選單中的專案 ID!

帳單 路障

您已啟用專案,但忘記帳單帳戶。AlloyDB 是高效能引擎,如果「油箱」(帳單) 空了,就無法啟動。

API 傳播 延遲

您點選了「啟用 API」,但指令列仍顯示 Service Not Enabled。等待 60 秒。雲端需要一點時間喚醒神經元。

配額 Quags

如果您使用全新的試用帳戶,可能會達到 AlloyDB 執行個體的區域配額。如果 us-central1 失敗,請嘗試 us-east1

「隱藏」服務專員

有時系統不會自動將 aiplatform.user 角色授予 AlloyDB 服務代理。如果 SQL 查詢稍後無法與 Gemini 對話,通常就是這個原因。

3. 設定 Google Cloud Storage Bucket

在本節中,您將在 BigQuery 中建立組織架構,專門用於儲存 Froyo 食譜和供應商資料,特別是 Froyo 產品詳細資料。此外,這項服務也會建立雲端資源連結,做為安全「橋樑」,讓 BigQuery 從 Cloud Storage 等外部來源讀取檔案。

事前準備:

這個存放區包含食譜和供應商 PDF 檔案,我們將在專案中使用這些檔案。請務必下載這些檔案。如要下載檔案,請按照下列步驟操作。

在 Cloud Shell 中執行下列指令:

git clone --depth 1 --filter=blob:none --sparse https://github.com/GoogleCloudPlatform/next-26-keynotes.git

前往新建立的資料夾:

cd next-26-keynotes

拉取 data-cloud-demo 資料夾

git sparse-checkout set genkey/data-cloud-demo

結帳完成後,請前往 data-cloud-demo 資料夾,並解壓縮 ZIP 檔案,存取程式碼研究室資產。

建立 bucket 並上傳 Froyo (食譜和供應商) PDF 檔案

  1. 前往 Google Cloud 控制台中的「Cloud Storage Buckets」(Cloud Storage 值區) 頁面。
  2. 按一下「建立」。
  3. 在「建立 bucket」頁面中,輸入 bucket 資訊。完成下列每個步驟後,請按一下「繼續」前往下一個步驟:
  4. 在「開始使用」部分,輸入 bucket 名稱。例如:froyo_data
  5. 在「選擇資料儲存的位置」專區中,選取「區域」,然後輸入您的區域。us-central1
  6. 在「選取如何控制物件的存取權」部分,取消勾選「強制禁止公開存取這個 bucket」核取方塊。
  7. 按一下「建立」。
  8. 在 bucket 清單中,按一下您建立的 bucket。
  9. 在 bucket 的「Objects」(物件) 分頁中,依序點選「Upload」(上傳) 和「Upload folders」(上傳資料夾)。
  10. 選取您在本程式碼研究室「事前準備」一節中解壓縮的 recipes 資料夾。
  11. 按一下 [上傳]。
  12. 針對「suppliers」資料夾重複上傳程序。

上傳後,值區結構應如下所示 (無論值區名稱為何):

596b8acb481016b7.png

4. 設定 BigQuery 連線

建立 Cloud 資源連結。這會產生專屬服務帳戶,做為 BigQuery 存取外部檔案的「身分證」。

  • 前往「BigQuery」BigQuery頁面。
  • 按一下左側窗格中的「Explorer」。如果沒有看到左側窗格,請按一下「Expand left pane」(展開左側窗格) 開啟窗格。
  • 在「Explorer」窗格中展開專案名稱,然後按一下「Connections」。
  • 在「連線」頁面中,按一下「建立連線」。
  • 在「連線類型」中,選擇「Vertex AI 遠端模型、遠端函式、BigLake 和 Spanner (Cloud 資源)」。
  • 在「連線 ID」欄位中,輸入連線 ID 名稱:
  • bq-connection。請務必記下這個 ID,因為稍後在本程式碼研究室中設定資料掃描時,您會需要用到這個 ID。
  • 將「位置類型」設為「區域」,然後選取區域。例如 us-central1。連線應與資料集等其他資源位於相同區域。
  • 按一下「建立連線」。
  • 按一下「前往連線」。
  • 在「連線資訊」窗格,複製服務帳戶 ID,以便在後續步驟中使用。服務帳戶類似於 bqcx-**********-qn3a@gcp-sa-bigquery-condel.iam.gserviceaccount.com。

5. 設定權限

  1. 授予 BigQuery 連線存取 Cloud Storage 物件和 Knowledge Catalog 的必要權限

前往「IAM 與管理」頁面,在「按照主體查看」部分中,按一下「授予存取權」按鈕,然後貼上您在上一個步驟中複製的服務帳戶,新增主體。在角色部分中,逐一新增下列角色名稱並儲存:

  • roles/storage.objectUser
  • roles/storage.objectViewer
  • roles/bigquery.user
  • roles/bigquery.dataEditor
  • roles/aiplatform.viewer
  • roles/agentplatform.user
  • roles/storage.admin
  • roles/dataproc.serviceAgent
  • roles/dataplex.discoveryPublishingServiceAgent
  • roles/dataplex.serviceAgent
  • roles/dataplex.securityAdmin
  1. 授予 Dataplex 服務帳戶存取 Cloud Storage Bucket 的權限

前往「IAM 與管理」頁面,在「按照主體查看」部分中,按一下「授予存取權」按鈕,然後在「新主體」文字列中輸入 Dataplex,即可新增主體。從自動完成的清單中,選取與下列項目類似的 Dataplex 服務帳戶主體:

service-*********@ gcp-sa-dataplex.iam.gserviceaccount.com

將下列角色授予這個服務帳戶:

  • roles/storage.objectUser
  • roles/storage.objectViewer
  • roles/storage.viewer
  • roles/dataplex.discoveryBigLakePublishingServiceAgentroles/storage.objectUser
  • roles/storage.objectViewer
  • roles/storage.viewer
  • roles/dataplex.discoveryBigLakePublishingServiceAgentroles/storage.objectUser
  • roles/storage.objectViewer
  • roles/storage.viewer
  • roles/dataplex.discoveryBigLakePublishingServiceAgent

6. 設定 Knowledge Catalog

建立 Knowledge Catalog,統一管理非結構化資料,並自動探索非結構化檔案 (例如 PDF 食譜和 PDF 供應商)。

  1. 透過 curl 建立 DataScan

您也可以從控制台建立這項工作,但本節會新增 datascan_ID 並指向 BigQuery 資料集,為 Cloud Storage bucket 建立掃描作業。之後,Knowledge Catalog 就會自動在 BigQuery 中為 PDF 建立項目。

在目前感興趣的現行專案中,從 Cloud Shell 終端機執行下列指令集:

# 1. Set your variables
PROJECT_ID="<PROJECT_ID>"
REGION="<REGION>"
ENV_SUFFIX="stg1"
DATASCAN_ID="froyo-data-${ENV_SUFFIX}"
BUCKET_NAME="<BUCKET_NAME>"

# 2. Set this to the Name of the connection you created in Step 7
CONNECTION_ID="<CONNECTION_ID_NAME>"

# 3. Define the API Endpoint
DATAPLEX_API="dataplex.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}"

# 4. Create the DataScan via CURL
echo "Creating Dataplex DataScan: ${DATASCAN_ID}..."

curl -X POST "https://$DATAPLEX_API/dataScans?dataScanId=${DATASCAN_ID}" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"data": {
   "resource": "//storage.googleapis.com/projects/'"${PROJECT_ID}"'/buckets/'"${BUCKET_NAME}"'"
   },
"executionSpec": {
   "trigger": {
      "on_demand": {}
   }
},
"dataDiscoverySpec": {
   "bigqueryPublishingConfig": {
      "tableType": "BIGLAKE",
      "connection": "projects/'"${PROJECT_ID}"'/locations/'"${REGION}"'/connections/'"${CONNECTION_ID}"'"
   },
   "storageConfig": {
      "unstructuredDataOptions": {
      "entity_inference_enabled": true
      }
   }
   }
}'

請替換上述預留位置變數的值,確保指令順利執行。請注意,這項操作只會建立作業,不會執行作業。

  1. 過一兩分鐘後,前往 Google Cloud 控制台的「Metadata curation」(中繼資料管理) 頁面。
  2. 在 Cloud Storage 探索分頁中,按一下探索掃描項目的名稱 (請勿點選來源連結,這可能會很吸引人,但會開啟儲存空間)。

31afb1dc3caba5f6.png

  1. 重要步驟:

編輯工作,並確認已勾選「啟用語意推論」核取方塊。如果未勾選的話,請勾選方塊,然後輸入專案 ID 和區域,並點選「儲存」。

c021927bf80fe204.png

完成後,您可以從 Cloud Shell 終端機執行下列指令,或點選 Cloud Storage 探索頁面中的「立即執行」按鈕:

gcloud dataplex datascans run $DATASCAN_ID --location=$REGION
  1. 掃描作業需要一段時間才能完成。工作完成後,請檢查是否顯示「已發布的資料集」。如要檢查工作狀態,請前往「Metadata curation」(中繼資料管理) 頁面,在 Cloud Storage 探索分頁中,按一下最近一次執行的探索掃描名稱。您應該會看到已發布的資料集,如下所示:

d0cd6ae1edb81ce9.png

附註:如果在掃描步驟中發生錯誤,請稍候片刻再重試 (建立工作並完成執行作業需要幾分鐘)。

如要在 BigQuery 中查看資料表,請按一下並前往 froyo_data 資料集。在 BigQuery 中按一下資料表 ID,然後在「查詢編輯器」分頁中執行下列查詢:

SELECT count(*) FROM `agent-data-cloud.froyo_data.froyo_data` LIMIT 1000;

這會產生 400 (如果沒有,您可以返回並再次執行 Datascan 工作)。

7. 語意資料擷取

太棒了!現在,我們來使用 Knowledge Catalog 擷取這些非結構化物件的推論。

我們將使用「洞察」功能生成 SQL 陳述式,從非結構化資料表擷取結構化資料

  1. 在 Google Cloud 控制台中,前往「Knowledge Catalog Search」頁面。
  2. 搜尋要查看洞察資料的資料集資料表。在搜尋列中輸入上一步的資料集 / 資料表名稱:「froyo_data」,然後按下 Enter 鍵
  3. 在結果清單中,按一下「TABLE」項目 (不是資料集項目)
  4. 畫面上應該會顯示「洞察」分頁標籤。按一下該按鈕 (如果系統要求您啟用任何 API,請按照指示啟用 API)。

如果您在這個步驟啟用 API,請重新執行掃描作業。

  1. 在「洞察」分頁中,您會看到「擷取」按鈕下拉式選單。按一下該選項,然後選取「使用 SQL 擷取」選項。

89809b34c610569d.png

在「Extract with SQL」(使用 SQL 擷取) 對話方塊中,將「DESTINATION dataset」(目的地資料集) 設為您在資料掃描工作結果中看到的資料集。開始輸入名稱,系統就會自動完成。按一下「擷取」按鈕。或者,您也可以在這個時間點建立新的資料集並擷取資料。

這時應該會開啟 BigQuery 查詢編輯器,並在分頁中填入從資料掃描推論擷取的 SQL。

8. SQL 驗證和結構定義建立

如果生成的查詢看起來沒問題,且與非結構化資料在語意上相關,請按一下查詢編輯器中的「執行」按鈕運作執行查詢。建立非結構化媒體結構化儲存空間所需的結構定義,需要幾分鐘的時間。

完成後,您應該就能在 BigQuery Studio 的 Explorer 窗格中展開資料集,驗證結構定義,如下所示:

6e65906240a9a8be.png

好的!我們很快就完成了所有資料庫相關作業,真是太棒了。現在可以進行最終測試了!

9. 終極測試!

假設我希望代理程式根據事實,以真實、完整且精心編排的資訊回覆使用者的問題。我將提出一個問題,代理只能參考來源中的多個媒體檔案和參考資料來回答。

我的使用者問題如下:

I'm really interested in your Midnight Swirl froyo. Are there any allergens in it?

現在,一般搜尋或 LLM 搜尋會顯示「零種食材」。但我們建構了完整的語意推論,將所有非結構化媒體轉換為結構化資料。以下是擷取這項資訊的簡單 SQL:

SELECT p.product_name, i.ingredient_name, a.allergen_name, category, stability
FROM froyo_data.consistsof c
INNER JOIN froyo_data.product p
  ON c.product_id = p.product_id
INNER JOIN froyo_data.ingredient i
  ON c.ingredient_id = i.ingredient_name
LEFT OUTER JOIN froyo_data.containsallergen a
  ON i.ingredient_id = a.ingredient_id
WHERE
  UPPER(p.product_name) LIKE '%MIDNIGHT%SWIRL%'
  AND allergen_name IS NOT NULL;

太厲害了!查看結果:

f582d55814a23e8.png

10. 清理

完成本實驗室後,請務必刪除掃描工作,以及工作建立的 BigQuery 資料表。

前往 https://console.cloud.google.com/bigquery/governance/metadata-curation/cloud-storage-discovery。找出要刪除的工作,然後按一下旁邊的垂直省略號,並點選「刪除」。

9fcbbfa1a9ccba6d.png

這樣應該就能清理工作。

11. 恭喜

我們成功透過實作方式找出隱藏的過敏原。各位,我們再也不需要暗資料了!在第 2 部分中,我們會將 AlloyDB 中的交易系統與 BigQuery 資料聯合,以滿足代理程式應用程式的資料需求。