簡化主要資料管理:比對與與生成式 AI 合併!

1. 總覽

什麼是主資料管理?

主要資料管理 (MDM) 的目的,就是為貴機構最重要的資料建立單一可靠的資料來源。想像一下,如果圖書館經過精心整理,每本書籍 (資料點) 都正確標示、保持最新狀態,而且容易找到,那該有多好。

主資料代表對公司營運至關重要的核心基礎業務實體。以下是主資料的主要元素:

  • 商家實體:實體,例如客戶、產品、供應商、地點和員工,這些是商家圍繞的專有名詞
  • 識別碼:用於確保每個實體在各系統中皆可區分且可追蹤的專屬 ID
  • 屬性:描述每個實體的特徵,例如客戶的地址、產品價格等。

為了讓您更瞭解主資料,我們將主資料與交易資料進行比較。交易資料可擷取個別事件 (購買、出貨等)。主資料則會定義相關實體,為這些事件提供背景資訊。舉例來說,銷售交易會連結至客戶、產品和業務員的主要資料。

雖然導入完善的 MDM 對策略決策至關重要,但這項作業可能相當複雜,且需要大量資源。這就是生成式 AI 的轉型力量所在,尤其是 Gemini 1.0 Pro、Gemini 1.0 Pro Vision、Gemini 1.5 Pro 等模型。

2. 目標

在這個程式碼研究室中,您將示範 Gemini 1.0 Pro 如何簡化主資料管理應用程式,例如針對 BigQuery 公開資料集中的 citibike_stations 資料進行強化和去重。

您將使用的工具

  1. BigQuery 公開資料集 bigquery-public-data.new_york_citibike
  2. Gemini 函式呼叫 (Java Cloud Function,可使用 reverse Geocoding API 取得 citibike_stations 資料的座標,進而取得地址資訊)。
  3. 使用 Vertex AI Embeddings API 和 BigQuery 中的向量搜尋功能,找出重複項目。

建構項目

  1. 您將為此用途建立 BigQuery 資料集。在這個資料集中,您將使用公開資料集資料表 bigquery-public-data.new_york_citibike.citibike_stations 的資料建立到達表。
  2. 您將部署包含 Gemini 函式呼叫功能的 Cloud 函式,以便將地址標準化。
  3. 您會將經過強化的地址資料儲存在到達資料表中 (從這項示範提供的兩個來源)。
  4. 您將針對地址資料,從 BigQuery 叫用 Vertex AI Embeddings API。
  5. 您將使用 BigQuery 向量搜尋功能找出重複記錄。

下圖顯示實作過程中涉及的資料流程和步驟。

用途的概略流程

3. 需求條件

  • ChromeFirefox 等瀏覽器
  • 已啟用計費功能的 Google Cloud 專案。

4. 事前準備

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

「啟用 Cloud Shell」按鈕圖片

  1. 連線至 Cloud Shell 後,請使用下列指令確認您已通過驗證,且專案已設為您的專案 ID:
gcloud auth list
  1. 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案。
gcloud config list project
  1. 如果未設定專案,請使用下列指令進行設定:
gcloud config set project <YOUR_PROJECT_ID>
  1. 前往 Gemini for Google Cloud Marketplace 啟用 API。您也可以在 Cloud Shell 終端機中使用下列指令:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. 請確認已啟用 BigQuery、BigQuery Connection、Cloud Function、Cloud Run、Vertex AI 和 Cloud Build API。您也可以透過主控台使用 這個連結,執行 gcloud 指令的替代做法。

如要瞭解 gcloud 指令和用法,請參閱說明文件

5. 建立 BigQuery 資料集和外部連線

我們先建立資料集和 Cloud 資源連線。

BigQuery 中的資料集是應用程式所有資料表和物件的容器。

如要建立資料集,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。
  2. 在「Explorer」面板中,選取要建立資料集的專案。
  3. 展開「動作」選項 (垂直的刪節號圖示),然後按一下「建立資料集」

顯示「動作」選單和「建立資料集」選項的圖片

  1. 在「Dataset ID」欄位中輸入 mdm_gemini
  2. 將位置類型設為 Multi-region,並接受預設值 US(multiple regions in United States.
  3. 點選「建立資料集」
  4. 確認資料集已建立,並列在「Explorer」窗格中的專案 ID 下方。

您必須建立 BigQuery 連線,才能與 Cloud 函式互動。如要建立遠端函式,您必須建立 BigQuery 連線。在本程式碼研究室中,我們將使用 BigLake 連線,透過 Cloud Function 存取 BigQuery 中的模型。BigLake 連線可協助連結外部資料來源,同時保留精細的 BigQuery 存取控制和安全性,在本例中就是 Vertex AI Gemini Pro API。

如要建立 BigLake 連線,請按照下列步驟操作:

  1. 在 BigQuery 頁面的「Explorer」窗格中,按一下「Add」

BigQuery 主控台,其中「新增」按鈕已醒目顯示,可用於新增外部連結

  1. 按一下「連線至外部資料來源」
  2. 在「連線類型」清單中,選取「Vertex AI 遠端模型、遠端函式和 BigLake (Cloud 資源)」
  3. 在「連線 ID」欄位中,輸入連線名稱 gemini-bq-conn
  4. 將位置類型設為 Multi-region,並接受預設值 US(multiple regions in United States.
  5. 點選「建立連線」
  6. 按一下「前往連線」,然後複製「連線資訊」窗格中的服務帳戶 ID。

連線資訊螢幕截圖

  1. 前往「IAM 與管理」頁面,然後按一下「授予存取權」
  2. 將服務帳戶 ID 貼到「新主體」欄位中。
  3. 從角色清單中選取 Vertex AI user 角色,然後按一下「儲存」

授予服務帳戶存取權的螢幕截圖

您已成功建立資料集和 BigQuery 連線。

6. 部署 Gemini 函式呼叫 (Java Cloud Function)

請按照下列步驟部署包含 Gemini 函式呼叫功能的 Java Cloud 函式。

  1. 使用下列指令,從 Cloud Shell 終端機複製 GitHub 存放區
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  1. 將預留位置 YOUR_API_KEYYOUR_PROJECT_ID 替換為您的值。

如果您閱讀這篇文章,就會知道函式呼叫實作項目會使用 Reverse Geocoding API。您可以按照這裡的操作說明,自行建立 API_KEY。

  1. 在 Cloud Shell 終端機中,前往新複製的專案目錄 GeminiFunctionCalling,然後執行下列陳述式,以建構及部署 Cloud 函式:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

當系統提示「Allow unauthenticated invocations」(允許未經驗證的叫用) 時,請回覆「y」。建議您為企業應用程式設定驗證機制。不過,由於這是示範應用程式,我們會繼續進行未經驗證的程序。

輸出內容為以下格式的 REST 網址:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling

  1. 請在終端機中執行下列指令,測試這個 Cloud 函式:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'

隨機範例提示的回應:

 '{"replies":["{ \"DOOR_NUMBER\": \"277\", \"STREET_ADDRESS\": \"Bedford Ave\", \"AREA\":
 null, \"CITY\": \"Brooklyn\", \"TOWN\": null, \"COUNTY\": \"Kings County\", \"STATE\":
 \"NY\", \"COUNTRY\": \"USA\", \"ZIPCODE\": \"11211\", \"LANDMARK\": null}}```"]}'

這個 Cloud 函式的要求和回應參數,是以與 BigQuery 遠端函式叫用相容的方式實作。您可以直接從 BigQuery 資料中使用這項功能。也就是說,如果資料輸入內容 (緯度和經度資料) 位於 BigQuery 中,您就可以對資料呼叫遠端函式,並取得可直接在 BigQuery 中儲存或處理的函式回應。

  1. 請在 BigQuery 中執行下列 DDL,建立可叫用此已部署 Cloud Function 的遠端函式:
CREATE OR REPLACE FUNCTION
 `mdm_gemini.MDM_GEMINI` (latlng STRING) RETURNS STRING
 REMOTE WITH CONNECTION `us.gemini-bq-conn`
 OPTIONS (
   endpoint = 'https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling', max_batching_rows = 1
 );

使用新建立的遠端函式進行測試查詢:

SELECT mdm_gemini.MDM_GEMINI(latlong) from mdm_gemini.CITIBIKE_STATIONS limit 1;

如果使用 BigQuery 中建立的新遠端函式進行的測試查詢因 Cloud Functions 權限問題而失敗,請前往 Google Cloud 控制台的 Cloud Functions,找出已部署的 Cloud 函式,名稱為「gemini-fn-calling」。前往「權限」分頁,將主體新增為「allUsers」,並授予「Cloud Functions 叫用者」角色,確保所有使用者都能存取 Cloud Functions (僅限於這項應用程式為示範用途)。

7. 嘗試解決方法

如果您沒有反向地理編碼函式呼叫方法所需的 API_KEY,或是基於某些原因未部署 Cloud 函式,可以改用以下方法:

  1. 存放區下載 CITIBIKE_STATIONS.csv 檔案至 Cloud Shell 專案資料夾,然後前往該資料夾。
  2. 在 Cloud Shell 終端機中使用下列指令,將 CSV 中的資料匯出至新的 BigQuery 資料集 mdm_gemini
bq load --source_format=CSV --skip_leading_rows=1 mdm_gemini.CITIBIKE_STATIONS ./CITIBIKE_STATIONS.csv \ name:string,latlng:string,capacity:numeric,num_bikes_available:numeric,num_docks_available:numeric,last_reported:timestamp,full_address_string:string

8. 建立資料表並強化地址資料

步驟 1:建立資料表

重要事項:如果您已使用解決方法,請略過這個步驟,因為您必須已建立資料表。

如果您尚未使用因應措施,請在 BigQuery SQL 編輯器中執行下列 DDL:

CREATE TABLE mdm_gemini.CITIBIKE_STATIONS as (
select  name, latitude || ',' || longitude as latlong, capacity, num_bikes_available, num_docks_available,last_reported,
'' as full_address_string
from bigquery-public-data.new_york_citibike.citibike_stations) ;

接下來,我們將針對表格中提供的經緯度座標,叫用遠端函式,以便強化地址資料。為資料設定下列條件:

  • 2024 年回報
  • 可供租借的自行車數量 > 0
  • 容量 > 100

執行以下查詢:

update `mdm_gemini.CITIBIKE_STATIONS`
set full_address_string = `mdm_gemini.MDM_GEMINI`(latlong)
where EXTRACT(YEAR FROM last_reported) = 2024 and num_bikes_available > 0 and capacity > 100;

步驟 2:建立第二個資料來源,用於取得自行車站位置資料

即使您使用了因應措施建立資料表,也請勿略過這個步驟。

在這個步驟中,您將為本程式碼研究室的目的,為自行車站位置資料建立第二個來源。這項實驗旨在說明 MDM 會將來自多個來源的資料匯集在一起,並找出黃金真相。

在 BigQuery SQL 編輯器中執行下列 DDL,建立第二個位置資料來源,其中包含兩筆記錄。我們將這個資料表命名為 mdm_gemini.CITIBIKE_STATIONS_SOURCE2,並插入兩筆記錄。

CREATE TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE2 (name STRING(55), address STRING(1000), embeddings_src ARRAY<FLOAT64>);

insert into mdm_gemini.CITIBIKE_STATIONS_SOURCE2 VALUES ('Location broadway and 29','{ "DOOR_NUMBER": "1593", "STREET_ADDRESS": "Broadway", "AREA": null, "CITY": "New York", "TOWN": null, "COUNTY": "New York County", "STATE": "NY", "COUNTRY": "USA", "ZIPCODE": "10019", "LANDMARK": null}', null);

insert into mdm_gemini.CITIBIKE_STATIONS_SOURCE2 VALUES ('Allen St & Hester','{ "DOOR_NUMBER": "36", "STREET_ADDRESS": "Allen St", "AREA": null, "CITY": "New York", "TOWN": null, "COUNTY": "New York County", "STATE": "NY", "COUNTRY": "USA", "ZIPCODE": "10002", "LANDMARK": null}', null);

9. 為地址資料產生嵌入

嵌入是高維度數值向量,用來表示特定實體,例如文字或音訊檔案。機器學習 (ML) 模型會使用嵌入值編碼這類實體的語意,方便推理及比較。舉例來說,在聚合、分類和推薦模型中,常見的操作是測量嵌入空間中向量之間的距離,找出語意最相似的項目。Vertex AI 文字嵌入 API 可讓您使用 Vertex AI 上的生成式 AI 建立文字嵌入。文字嵌入是文字的數值表示法,可擷取字詞和詞組之間的關係。如要進一步瞭解 Vertex AI Text Embeddings,請參閱本文

  1. 執行下列 DDL,為 Vertex AI 文字嵌入 API 建立遠端模型:
CREATE OR REPLACE MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (ENDPOINT = 'textembedding-gecko@latest');
  1. 遠端嵌入模型已準備就緒,現在我們要為第一個來源產生嵌入資料,並使用下列查詢將其儲存在資料表中:
CREATE TABLE `mdm_gemini.CITIBIKE_STATIONS_SOURCE1` AS (
SELECT *
FROM ML.GENERATE_EMBEDDING(
 MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`,
 ( select name, full_address_string as content from `mdm_gemini.CITIBIKE_STATIONS`
 where full_address_string is not null )
  )
);

您也可以選擇不建立新資料表,而是將嵌入結果欄位儲存在先前建立的 mdm_gemini.CITIBIKE_STATIONS 資料表中。

  1. 如要為 CITIBIKE_STATIONS_SOURCE2 資料表中的地址資料產生嵌入資料,請執行下列查詢:
update `mdm_gemini.CITIBIKE_STATIONS_SOURCE2` a set embeddings_src =
(
SELECT  ml_generate_embedding_result
FROM ML.GENERATE_EMBEDDING(
 MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`,
 ( select name, address as content from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2` ))
where name = a.name) where name is not null;

這應該會為第二個來源建立嵌入資料。請注意,我們已在相同的 CITIBIKE_STATIONS_SOURCE2 資料表中建立嵌入欄位。

  1. 如要將為來源資料表 1 和 2 產生的嵌入資料可視化,請執行下列查詢:
select name,address,embeddings_src from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2`;
select name,content,ml_generate_embedding_result from `mdm_gemini.CITIBIKE_STATIONS_SOURCE1`;

接下來,我們要執行向量搜尋,找出重複的資料。

10. 執行向量搜尋,標示重複的地址

在這個步驟中,您會搜尋 mdm_gemini.CITIBIKE_STATIONS_SOURCE1 資料表的地址嵌入資料 ml_generate_embedding_result 欄,找出與 mdm_gemini.CITIBIKE_STATIONS_SOURCE2 資料表的 embeddings_src 欄中每列資料相符的前兩個嵌入資料。

如要執行這項操作,請執行下列查詢:

select query.name name1,base.name name2,
/* (select address from mdm_gemini.CITIBIKE_STATIONS_SOURCE2 where name = query.name) content1, base.content content2, */
distance
from VECTOR_SEARCH(
 TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE1,
 'ml_generate_embedding_result',
 (SELECT * FROM mdm_gemini.CITIBIKE_STATIONS_SOURCE2),
 'embeddings_src',
 top_k => 2
) where query.name <> base.name
order by distance desc;

要查詢的資料表: mdm_gemini.CITIBIKE_STATIONS_SOURCE1 在欄位 ml_generate_embedding_result

我們用來做為基礎的表格: mdm_gemini.CITIBIKE_STATIONS_SOURCE2 在欄位 embeddings_src

top_k:指定要傳回的最近鄰點數量。預設值為 10。負值會視為無限,也就是說所有值都會視為相鄰值並傳回。

distance_type:指定用於計算兩個向量之間距離的度量類型。系統支援的距離類型包括歐氏距離餘弦。預設為 Euclidean

查詢結果如下:

結果集

如您所見,這會列出 CITIBIKE_STATIONS_SOURCE1CITIBIKE_STATIONS_SOURCE2 兩列的兩個最近鄰 (也就是最接近的複本)。由於 distance_type 未指定,系統會假設為 歐氏距離,並將距離解讀為兩個來源地址 TEXT 值之間的距離,其中最小值為最相似的地址文字。

我們將使用以下查詢,將 distance_type 設為「Cosine」

select query.name name1,base.name name2,
/* (select address from mdm_gemini.CITIBIKE_STATIONS_SOURCE2 where name = query.name) content1, base.content content2, */
distance
from VECTOR_SEARCH(
 TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE1,
 'ml_generate_embedding_result',
 (SELECT * FROM mdm_gemini.CITIBIKE_STATIONS_SOURCE2),
 'embeddings_src',
 top_k => 2,distance_type => 'COSINE'
) where query.name <> base.name
order by distance desc;

查詢結果如下:

結果集 2

兩個查詢 (兩種距離類型) 都以距離遞減排序,也就是說,我們希望以距離遞減的順序列出結果。但您會發現,第二個查詢的距離順序是相反的。你能猜到原因嗎?

是的!答對了!在餘弦相似度中,數字越大,相似度越高,距離越短。在歐氏距離中,數字越大,表示值之間的距離越遠。

如要進一步瞭解 MDM 以及如何瞭解歐氏和餘弦的差異與應用方式,請參閱這篇網誌文章

11. 清理

如要避免系統向您的 Google Cloud 帳戶收取這篇文章所用資源的費用,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中前往「管理資源」頁面。
  2. 在專案清單中選取要刪除的專案,然後點按「刪除」。
  3. 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 即可刪除專案。
  4. 如果您想保留專案,請略過上述步驟,前往 Cloud Functions 並從函式清單中勾選要刪除的函式,然後按一下「刪除」

12. 恭喜

恭喜!您已瞭解 Gemini 1.0 Pro 和函式呼叫的強大功能,可將幾項 MDM 活動轉換為簡單且強大、可預測且可靠的生成式 AI 功能。瞭解這些概念後,您可以自由運用其他方式實作相同用途或其他 MDM 功能。您是否有可驗證的資料集、可填補的資訊缺口,或是可透過在生成式 AI 回覆中嵌入結構化呼叫來自動執行的工作?如需更深入的指引,請參閱 Vertex AIBigQuery 遠端函式Cloud Functions嵌入向量搜尋 的說明文件。以下是這個專案的 GitHub 存放區。歡迎與我們分享您運用這門課程所建構的內容!