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

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

程式碼研究室簡介

subject上次更新時間:4月 30, 2024
account_circle作者:Author: Abirami Sukumaran, Editor: Swati Mohanty

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 資料,簡化了擴充和簡化等主資料管理應用程式。

要使用的預估值

  1. BigQuery 公開資料集 bigquery-public-data.new_york_citibike
  2. Gemini 函式呼叫 (使用 reverse Geocoding API 取得地址資訊的 Java Cloud 函式,用於取得 citibike_stations 資料座標)。
  3. 在 BigQuery 中使用 Vertex AI Embeddings API 和 Vector Search 找出重複項目。

建構項目

  1. 您將針對用途建立 BigQuery 資料集。在這個資料集中,您將建立包含公開資料集資料表 bigquery-public-data.new_york_citibike.citibike_stations 資料的到達網頁。
  2. 您將部署包含 Gemini 函式呼叫的 Cloud 函式,以便將地址標準化。
  3. 您可以將充實過的地址資料儲存在到達網頁 (本示範提供的兩個來源中)。
  4. 您會透過 BigQuery 對地址資料叫用 Vertex AI Embeddings API。
  5. 您將使用 BigQuery Vector Search 找出重複的記錄。

下圖說明導入的資料流以及相關步驟。

應用實例的概略流程

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. 前往 Google Cloud Marketplace 專用 Gemini 啟用 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」Explorer面板中,選取要建立資料集的專案。
  3. 展開「動作」選項 (垂直的刪節號圖示),然後按一下「建立資料集」

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

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

需要 BigQuery 連線,才能與 Cloud 函式互動。如要建立遠端函式,您必須建立 BigQuery 連線。在本程式碼研究室中,我們會使用 BigLake 連線,透過 Cloud 函式從 BigQuery 存取模型。BigLake 連線有助於連結外部資料來源,同時保留精細的 BigQuery 存取權控管和安全防護機制,本例中為 Vertex AI Gemini Pro API。

如要建立 BigLake 連線,請執行下列步驟:

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

BigQuery 控制台,醒目顯示的項目是「ADD」按鈕以新增外部連線

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

連線資訊螢幕截圖

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

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

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

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

請按照下列步驟部署含有 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

說出「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 函式:
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) 與 mdm_gemini.CITIBIKE_STATIONS 限制的 1;

如果因為 Cloud Functions 權限問題而使用在 BigQuery 中建立的新遠端函式的測試查詢失敗,請透過 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 text-embeddings API,您就能在 Vertex AI 中使用生成式 AI 建立文字嵌入功能。文字嵌入是以數字呈現的文字,代表字詞和詞組之間的關係。如要進一步瞭解 Vertex AI 文字嵌入,請按這裡

  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 資料表中每列資料相符的前兩個嵌入。

如要這麼做,請執行下列查詢:

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

做為基礎的表格: embeddings_src 欄位中的 mdm_gemini.CITIBIKE_STATIONS_SOURCE2

top_k:指定要傳回的鄰點數量。預設值為 10。系統會將負值視為無限大,表示所有值都會計為相鄰值並傳回。

distance_type:指定用於計算兩個向量之間的距離的指標類型。支援的距離類型為 EuclideanCosine。預設值為「Euclidean」

查詢結果如下:

結果集

如您所見,這些項目已列出 CITIBIKE_STATIONS_SOURCE2CITIBIKE_STATIONS_SOURCE1 兩列最鄰近的兩個鄰 (也就是最接近的重複項目)。由於 distance_type 未指定,因此假設其為 Euclidean,且系統在讀取距離為兩個來源地址 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

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

當然可以!答對了!如果是餘弦相似度,數字越大表示相似度越高,距離則越小。在歐幾里德距離中,數字越大表示值之間的距離越大。

如要進一步瞭解行動裝置管理 (MDM) 和瞭解歐蘇利文和 Cosine 的差異和應用方式,請參閱這篇網誌

11. 清除所用資源

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

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

12. 恭喜

恭喜!您已展現運用 Gemini 1.0 Pro 和函式呼叫的強大功能,可將少數行動裝置管理 (MDM) 活動轉換成操作簡單又可靠的生成式 AI 功能。相信現在您依然可以考慮採用其他方式,實現相同的用途或其他行動裝置管理 (MDM) 功能。生成式 AI 回覆內嵌的結構化呼叫時,是否能驗證某些資料集、可以填補的資訊缺口,或是可以自動執行的工作?如需更詳盡的指引,請參閱 Vertex AIBigQuery 遠端函式Cloud Functions嵌入Vector Search 的說明文件。以下是這項專案的 GitHub 存放區。另外,也歡迎與我們分享您根據這些學習成果建構的內容!