程式碼研究室簡介
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 函式呼叫 (使用 reverse Geocoding API 取得地址資訊的 Java Cloud 函式,用於取得 citibike_stations 資料座標)。
- 在 BigQuery 中使用 Vertex AI Embeddings API 和 Vector Search 找出重複項目。
建構項目
- 您將針對用途建立 BigQuery 資料集。在這個資料集中,您將建立包含公開資料集資料表
bigquery-public-data.new_york_citibike.citibike_stations
資料的到達網頁。 - 您將部署包含 Gemini 函式呼叫的 Cloud 函式,以便將地址標準化。
- 您可以將充實過的地址資料儲存在到達網頁 (本示範提供的兩個來源中)。
- 您會透過 BigQuery 對地址資料叫用 Vertex AI Embeddings API。
- 您將使用 BigQuery Vector Search 找出重複的記錄。
下圖說明導入的資料流以及相關步驟。
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>
- 前往 Google Cloud Marketplace 專用 Gemini 啟用 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」Explorer面板中,選取要建立資料集的專案。
- 展開「動作」選項 (垂直的刪節號圖示),然後按一下「建立資料集」。
- 在「Dataset ID」(資料集 ID) 欄位中輸入
mdm_gemini
。 - 將地點類型設為
Multi-region
,並接受預設值,也就是US(multiple regions in United States.
- 點選「建立資料集」。
- 檢查是否已建立資料集,並列在「Explorer」Explorer窗格中的專案 ID 下方。
需要 BigQuery 連線,才能與 Cloud 函式互動。如要建立遠端函式,您必須建立 BigQuery 連線。在本程式碼研究室中,我們會使用 BigLake 連線,透過 Cloud 函式從 BigQuery 存取模型。BigLake 連線有助於連結外部資料來源,同時保留精細的 BigQuery 存取權控管和安全防護機制,本例中為 Vertex AI Gemini Pro API。
如要建立 BigLake 連線,請執行下列步驟:
- 在 BigQuery 頁面的「Explorer」窗格中,按一下「Add」。
- 按一下「與外部資料來源的連線」。
- 在「連線類型」清單中,選取「Vertex AI 遠端模型、遠端函式和 BigLake (Cloud 資源)」。
- 在「Connection ID」(連線 ID) 欄位中,輸入連線名稱做為
gemini-bq-conn
。 - 將地點類型設為
Multi-region
,並接受預設值,也就是US(multiple regions in United States.
- 點選「建立連線」。
- 按一下「Go to connection」,然後複製「Connection info」窗格中的服務帳戶 ID。
- 前往 IAM 與「管理」頁面,然後按一下「授予存取權」。
- 將服務帳戶 ID 貼到「Newprincipal」(新增原則) 欄位中。
- 從角色清單中選取
Vertex AI user
角色,然後按一下「Save」(儲存)。
現在,您已成功建立資料集和 BigQuery 連線。
6. 部署 Gemini 函式呼叫 (Java Cloud 函式)
請按照下列步驟部署含有 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
說出「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 函式:
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 函式,您可以採取下列任一做法:
- 將 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 text-embeddings API,您就能在 Vertex AI 中使用生成式 AI 建立文字嵌入功能。文字嵌入是以數字呈現的文字,代表字詞和詞組之間的關係。如要進一步瞭解 Vertex AI 文字嵌入,請按這裡。
- 執行下列 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 資料表中每列資料相符的前兩個嵌入。
如要這麼做,請執行下列查詢:
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:指定用於計算兩個向量之間的距離的指標類型。支援的距離類型為 Euclidean 和 Cosine。預設值為「Euclidean」。
查詢結果如下:
如您所見,這些項目已列出 CITIBIKE_STATIONS_SOURCE2
中 CITIBIKE_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;
查詢結果如下:
兩種查詢 (兩種距離類型) 都按距離 DESCENDING 排序,也就是說,我們希望按照遞減距離的順序列出結果。但您會注意到,第二項查詢的距離順序相反。你能猜出原因嗎?
當然可以!答對了!如果是餘弦相似度,數字越大表示相似度越高,距離則越小。在歐幾里德距離中,數字越大表示值之間的距離越大。
如要進一步瞭解行動裝置管理 (MDM) 和瞭解歐蘇利文和 Cosine 的差異和應用方式,請參閱這篇網誌。
11. 清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本文中所用資源的費用,請按照下列步驟操作:
12. 恭喜
恭喜!您已展現運用 Gemini 1.0 Pro 和函式呼叫的強大功能,可將少數行動裝置管理 (MDM) 活動轉換成操作簡單又可靠的生成式 AI 功能。相信現在您依然可以考慮採用其他方式,實現相同的用途或其他行動裝置管理 (MDM) 功能。生成式 AI 回覆內嵌的結構化呼叫時,是否能驗證某些資料集、可以填補的資訊缺口,或是可以自動執行的工作?如需更詳盡的指引,請參閱 Vertex AI、BigQuery 遠端函式、Cloud Functions、嵌入和 Vector Search 的說明文件。以下是這項專案的 GitHub 存放區。另外,也歡迎與我們分享您根據這些學習成果建構的內容!