1. 總覽
什麼是主要資料管理?
主要資料管理 (MDM) 的目標是為貴機構最重要資料建立單一可靠的資料來源。想像一下,在精心整理的圖書館中,每本書 (資料點) 都正確標示、內容最新,而且容易找到。
主資料代表對公司營運至關重要的核心基礎業務實體。主資料的主要元素如下:
- 業務實體:例如顧客、產品、供應商、地點和員工等實體,這些都是貴商家業務的核心名詞
- ID:確保每個實體在系統中都是獨一無二且可追蹤的專屬 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 函式,可使用反向 Geocoding API 取得 citibike_stations 資料提供的座標地址資訊)。
- 使用 Vertex AI Embeddings API 和 BigQuery 中的向量搜尋功能找出重複內容。
建構項目
- 您將為這個用途建立 BigQuery 資料集。您將在這個資料集中,使用公開資料集資料表
bigquery-public-data.new_york_citibike.citibike_stations中的資料建立登陸資料表。 - 您將部署 Cloud Functions,其中包含用於地址標準化的 Gemini 函式呼叫功能。
- 您會將經過擴充的地址資料儲存在登陸資料表中 (來自這項示範提供的兩個來源)。
- 您將從 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 中的資料集是應用程式所有資料表和物件的容器。
如要建立資料集,請按照下列步驟操作:
- 前往 Google Cloud 控制台的「BigQuery」頁面。
- 在「Explorer」面板中,選取要建立資料集的專案。
- 展開「動作」選項 (垂直刪節號圖示),然後點選「建立資料集」。

- 在「Dataset ID」欄位中輸入
mdm_gemini。 - 將位置類型設為
Multi-region,並接受預設值US(multiple regions in United States. - 點選「建立資料集」。
- 確認資料集已建立,並列在「Explorer」窗格的專案 ID 下方。
您必須建立 BigQuery 連線,才能與 Cloud Function 互動。如要建立遠端函式,必須先建立 BigQuery 連線。在本程式碼研究室中,我們將使用 BigLake 連線,透過 Cloud 函式從 BigQuery 存取模型。BigLake 連線有助於連結外部資料來源,同時保留精細的 BigQuery 存取控管和安全性,在本例中為 Vertex AI Gemini Pro API。
如要建立 BigLake 連線,請按照下列步驟操作:
- 在 BigQuery 頁面的「Explorer」窗格中,按一下「新增」。

- 按一下「連線至外部資料來源」。
- 在「連線類型」清單中,選取「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 Function。
- 使用下列指令,從 Cloud Shell 終端機複製 github 存放區:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
- 將預留位置
YOUR_API_KEY和YOUR_PROJECT_ID替換為您的值。
如果您已閱讀這篇網誌,就會知道函式呼叫實作項目使用反向地理編碼 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 Functions 的遠端函式:
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,找出名為「gemini-fn-calling」的已部署 Cloud 函式。前往「權限」分頁,將主體新增為「allUsers」,並授予「Cloud Functions 叫用者」角色,確保所有使用者都能存取 Cloud Functions (僅限這個試用版應用程式)。
7. 嘗試解決方法
如果您沒有反向地理編碼函式呼叫方法所需的 API_KEY,或因故未部署 Cloud Function,可以採取下列替代做法:
- 從存放區下載 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:指定用於計算兩個向量之間距離的指標類型。支援的距離類型包括歐幾里得和餘弦。預設值為「歐幾里得」。
查詢結果如下:

如您所見,這會列出 CITIBIKE_STATIONS_SOURCE2 中兩列的兩個最鄰近鄰點 (也就是最接近的重複項目)。CITIBIKE_STATIONS_SOURCE1由於 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;
查詢結果如下:

這兩項查詢 (兩種距離類型) 都會依距離遞減排序,也就是說,我們要依距離遞減順序列出結果。但你會發現第二個查詢的距離順序已反轉。你能猜到原因嗎?
Yes!! 你答對了!在餘弦相似度中,數字越大表示相似度越高,距離越小。在歐氏距離中,數字越大表示值之間的距離越遠。
如要進一步瞭解 MDM,以及歐幾里得和餘弦距離的差異與應用,請參閱這篇網誌。
11. 清理
如要避免系統向您的 Google Cloud 帳戶收取本文章所用資源的費用,請按照下列步驟操作:
12. 恭喜
恭喜!您已展現使用 Gemini 1.0 Pro 和函式呼叫的強大功能,將幾項 MDM 活動轉換為簡化但功能強大、具決定性且可靠的生成式 AI 功能。現在您已瞭解這項功能,歡迎找出其他實作相同用途或 MDM 功能的方式。您是否可以驗證資料集、填補資訊缺口,或透過內嵌在生成式 AI 回覆中的結構化呼叫,自動執行工作?如需更深入的指引,請參閱 Vertex AI、BigQuery 遠端函式、Cloud Functions、Embeddings 和 Vector Search 的說明文件。這是本專案的 GitHub 存放區。歡迎與我們分享您運用所學知識打造的內容!