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 資料進行強化和去重。
您將使用的工具
- BigQuery 公開資料集
bigquery-public-data.new_york_citibike
。 - Gemini 函式呼叫 (Java Cloud Function,可使用 reverse Geocoding API 取得 citibike_stations 資料的座標,進而取得地址資訊)。
- 使用 Vertex AI Embeddings API 和 BigQuery 中的向量搜尋功能,找出重複項目。
建構項目
- 您將為此用途建立 BigQuery 資料集。在這個資料集中,您將使用公開資料集資料表
bigquery-public-data.new_york_citibike.citibike_stations
的資料建立到達表。 - 您將部署包含 Gemini 函式呼叫功能的 Cloud 函式,以便將地址標準化。
- 您會將經過強化的地址資料儲存在到達資料表中 (從這項示範提供的兩個來源)。
- 您將針對地址資料,從 BigQuery 叫用 Vertex AI Embeddings API。
- 您將使用 BigQuery 向量搜尋功能找出重複記錄。
下圖顯示實作過程中涉及的資料流程和步驟。
3. 需求條件
4. 事前準備
- 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。
- 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。
- 您將使用 Cloud Shell,這是在 Google Cloud 中執行的指令列環境,並預先載入 bq。按一下 Google Cloud 主控台頂端的「啟用 Cloud Shell」。
- 連線至 Cloud Shell 後,請使用下列指令確認您已通過驗證,且專案已設為您的專案 ID:
gcloud auth list
- 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案。
gcloud config list project
- 如果未設定專案,請使用下列指令進行設定:
gcloud config set project <YOUR_PROJECT_ID>
- 前往 Gemini for Google Cloud Marketplace 啟用 API。您也可以在 Cloud Shell 終端機中使用下列指令:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- 請確認已啟用 BigQuery、BigQuery Connection、Cloud Function、Cloud Run、Vertex AI 和 Cloud Build API。您也可以透過主控台使用 這個連結,執行 gcloud 指令的替代做法。
如要瞭解 gcloud 指令和用法,請參閱說明文件。
5. 建立 BigQuery 資料集和外部連線
我們先建立資料集和 Cloud 資源連線。
BigQuery 中的資料集是應用程式所有資料表和物件的容器。
如要建立資料集,請按照下列步驟操作:
- 在「Dataset ID」欄位中輸入
mdm_gemini
。 - 將位置類型設為
Multi-region
,並接受預設值US(multiple regions in United States.
- 點選「建立資料集」。
- 確認資料集已建立,並列在「Explorer」窗格中的專案 ID 下方。
您必須建立 BigQuery 連線,才能與 Cloud 函式互動。如要建立遠端函式,您必須建立 BigQuery 連線。在本程式碼研究室中,我們將使用 BigLake 連線,透過 Cloud Function 存取 BigQuery 中的模型。BigLake 連線可協助連結外部資料來源,同時保留精細的 BigQuery 存取控制和安全性,在本例中就是 Vertex AI Gemini Pro API。
如要建立 BigLake 連線,請按照下列步驟操作:
- 在 BigQuery 頁面的「Explorer」窗格中,按一下「Add」。
- 按一下「連線至外部資料來源」。
- 在「連線類型」清單中,選取「Vertex AI 遠端模型、遠端函式和 BigLake (Cloud 資源)」。
- 在「連線 ID」欄位中,輸入連線名稱
gemini-bq-conn
。 - 將位置類型設為
Multi-region
,並接受預設值US(multiple regions in United States.
- 點選「建立連線」。
- 按一下「前往連線」,然後複製「連線資訊」窗格中的服務帳戶 ID。
- 前往「IAM 與管理」頁面,然後按一下「授予存取權」。
- 將服務帳戶 ID 貼到「新主體」欄位中。
- 從角色清單中選取
Vertex AI user
角色,然後按一下「儲存」。
您已成功建立資料集和 BigQuery 連線。
6. 部署 Gemini 函式呼叫 (Java Cloud Function)
請按照下列步驟部署包含 Gemini 函式呼叫功能的 Java Cloud 函式。
- 使用下列指令,從 Cloud Shell 終端機複製 GitHub 存放區:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
- 將預留位置
YOUR_API_KEY
和YOUR_PROJECT_ID
替換為您的值。
如果您閱讀這篇文章,就會知道函式呼叫實作項目會使用 Reverse Geocoding API。您可以按照這裡的操作說明,自行建立 API_KEY。
- 在 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
- 請在終端機中執行下列指令,測試這個 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 中儲存或處理的函式回應。
- 請在 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 函式,可以改用以下方法:
- 從存放區下載 CITIBIKE_STATIONS.csv 檔案至 Cloud Shell 專案資料夾,然後前往該資料夾。
- 在 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,請參閱本文。
- 執行下列 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');
- 遠端嵌入模型已準備就緒,現在我們要為第一個來源產生嵌入資料,並使用下列查詢將其儲存在資料表中:
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 資料表中。
- 如要為 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 和 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_SOURCE1
中 CITIBIKE_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;
查詢結果如下:
兩個查詢 (兩種距離類型) 都以距離遞減排序,也就是說,我們希望以距離遞減的順序列出結果。但您會發現,第二個查詢的距離順序是相反的。你能猜到原因嗎?
是的!答對了!在餘弦相似度中,數字越大,相似度越高,距離越短。在歐氏距離中,數字越大,表示值之間的距離越遠。
如要進一步瞭解 MDM 以及如何瞭解歐氏和餘弦的差異與應用方式,請參閱這篇網誌文章。
11. 清理
如要避免系統向您的 Google Cloud 帳戶收取這篇文章所用資源的費用,請按照下列步驟操作:
12. 恭喜
恭喜!您已瞭解 Gemini 1.0 Pro 和函式呼叫的強大功能,可將幾項 MDM 活動轉換為簡單且強大、可預測且可靠的生成式 AI 功能。瞭解這些概念後,您可以自由運用其他方式實作相同用途或其他 MDM 功能。您是否有可驗證的資料集、可填補的資訊缺口,或是可透過在生成式 AI 回覆中嵌入結構化呼叫來自動執行的工作?如需更深入的指引,請參閱 Vertex AI、BigQuery 遠端函式、Cloud Functions、嵌入和 向量搜尋 的說明文件。以下是這個專案的 GitHub 存放區。歡迎與我們分享您運用這門課程所建構的內容!