1. 概要
マスターデータ管理とは
マスターデータ管理(MDM)は、組織の最も重要なデータの信頼できる単一の情報源を作成することを目的としています。すべての書籍(データポイント)に正しいラベルが付けられ、最新の状態に保たれ、簡単に見つけられるように、細かく整理された図書館を想像してみてください。
マスターデータは、企業の運営に不可欠なコアとなる基盤となるビジネス エンティティを表します。マスターデータの主な要素は次のとおりです。
- ビジネス エンティティ: 顧客、商品、サプライヤー、場所、従業員など、ビジネスの中心となる名詞
- 識別子: 各エンティティが一意であり、システム間で追跡可能であることを保証する一意の識別子
- 属性: 各エンティティを記述する特性(顧客の住所、商品の価格など)。
マスターデータをより深く理解するために、トランザクション データと比較してみましょう。トランザクション データは、個々のイベント(購入、配送など)をキャプチャします。一方、マスターデータは、関連するエンティティを定義することで、それらのイベントのコンテキストを提供します。たとえば、販売トランザクションは、顧客、商品、営業担当者のマスターデータにリンクされます。
堅牢な MDM の実装は戦略的な意思決定に不可欠ですが、複雑でリソースを大量に消費する可能性があります。ここで、生成 AI の革新的な力、特に Gemini 1.0 Pro、Gemini 1.0 Pro Vision、Gemini 1.5 Pro などのモデルが役立ちます。
2. 目標
この Codelab では、BigQuery 一般公開データセットで利用可能な citibike_stations データについて、Gemini 1.0 Pro がマスターデータ管理アプリケーション(拡充や重複除去など)を簡素化する方法を説明します。
必要なもの
- BigQuery 一般公開データセット
bigquery-public-data.new_york_citibike
。 - Gemini 関数呼び出し(citibike_stations データで利用可能な座標に対して Reverse Geocoding API を使用して住所情報を取得する Java Cloud Functions)。
- Vertex AI Embeddings API と BigQuery のベクトル検索を使用して重複を特定します。
作成するアプリの概要
- このユースケース用に BigQuery データセットを作成します。このデータセットでは、一般公開データセットのテーブル
bigquery-public-data.new_york_citibike.citibike_stations
のデータを使用してランディング テーブルを作成します。 - 住所の標準化に Gemini 関数呼び出しを含む Cloud Functions 関数をデプロイします。
- 拡充された住所データをランディング テーブルに保存します(このデモ用に提供されている 2 つのソースから)。
- 住所データに対して 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 Functions、Cloud Run、Vertex AI、Cloud Build の各 API が有効になっていることを確認します。gcloud コマンドの代わりに、こちらのリンクを使用してコンソールから操作することもできます。
gcloud コマンドとその使用方法については、ドキュメントをご覧ください。
5. BigQuery データセットと外部接続を作成する
まず、データセットと Cloud リソース接続を作成します。
BigQuery のデータセットは、アプリケーションのすべてのテーブルとオブジェクトのコンテナです。
データセットを作成するには、次の操作を行います。
- Google Cloud コンソールの [BigQuery] ページに移動します。
- [エクスプローラ] パネルで、データセットを作成するプロジェクトを選択します。
- [アクション] オプション(その他アイコン)を開き、[データセットを作成] をクリックします。
- [データセット ID] フィールドに「
mdm_gemini
」と入力します。 - ロケーション タイプを
Multi-region
に設定し、デフォルト値(US(multiple regions in United States.
)を受け入れます。 - [データセットを作成] をクリックします。
- データセットが作成され、[エクスプローラ] ペインのプロジェクト ID の下に表示されていることを確認します。
Cloud Functions の関数を操作するには、BigQuery の接続が必要です。リモート関数を作成するには、BigQuery 接続を作成する必要があります。この Codelab では、BigLake 接続を使用して、Cloud Functions を介して BigQuery からモデルにアクセスします。BigLake 接続を使用すると、きめ細かな BigQuery アクセス制御とセキュリティを維持しながら、外部データソースに接続できます。この事例では、Vertex AI Gemini Pro API に接続します。
BigLake 接続を作成するには、次の操作を行います。
- BigQuery ページの [エクスプローラ] ペインで [追加] をクリックします。
- [外部データソースへの接続] をクリックします。
- [接続タイプ] リストで、[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 Functions)
Gemini 関数呼び出しを含む Java Cloud Functions の関数をデプロイする手順は次のとおりです。
- 次のコマンドを使用して、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 Functions の関数をビルドしてデプロイします。
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http
「未認証の呼び出しを許可しますか?」というメッセージが表示されたら、「y」と答えます。推奨に沿って、エンタープライズ アプリケーションの認証を設定することをおすすめします。ただし、これはデモアプリであるため、認証なしで続行します。
出力は、次の形式の REST URL です。
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling
- ターミナルから次のコマンドを実行して、この Cloud Functions の関数をテストします。
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 Functions の関数のリクエスト パラメータとレスポンス パラメータは、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 Functions 関数を見つけます。[権限] タブに移動し、プリンシパルを「allUsers」として追加し、ロール「Cloud Functions 起動元」を付与して、すべてのユーザーが Cloud Functions にアクセスできるようにします(これはデモアプリであるためです)。
7. 回避策を試す
なんらかの理由で、リバース ジオコーディング関数呼び出しアプローチに必要な API_KEY がない場合や、Cloud Functions がデプロイされていない場合は、代わりに次の操作を行います。
- リポジトリから 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: 自転車スタンドの位置情報の 2 つ目のソースを作成する
回避策を使用してテーブルを作成した場合でも、この手順をスキップしないでください。
このステップでは、この Codelab の目的のために、自転車スタンドの位置情報の 2 つ目のソースを作成します。これは、MDM が複数のソースからデータを統合し、ゴールド トゥルースを特定していることを示しています。
BigQuery SQL エディタで次の DDL を実行して、2 つのレコードを含む 2 番目の位置情報ソースを作成します。このテーブルの名前を mdm_gemini.CITIBIKE_STATIONS_SOURCE2
にして、2 つのレコードを挿入します。
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 Text Embeddings の詳細については、こちらをご覧ください。
- 次の DDL を実行して、Vertex AI Text Embeddings 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;
これにより、2 番目のソースのエンベディングが作成されます。エンベディング フィールドは、同じテーブル 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 列の各データ行に一致する上位 2 つのエンベディングを検索します。
これを行うには、次のクエリを実行します。
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;
クエリ対象のテーブル: フィールド ml_generate_embedding_result
の mdm_gemini.CITIBIKE_STATIONS_SOURCE1
ベースとして使用するテーブル: フィールド embeddings_src
の mdm_gemini.CITIBIKE_STATIONS_SOURCE2
top_k: 返される最近傍の数を指定します。デフォルトは 10 です。負の値は無限大として扱われます。つまり、すべての値が近傍としてカウントされ、返されます。
distance_type: 2 つのベクトル間の距離の計算に使用する指標のタイプを指定します。サポートされている距離タイプは、ユークリッドとコサインです。デフォルトは ユークリッドです。
クエリの結果は次のようになります。
ご覧のとおり、CITIBIKE_STATIONS_SOURCE1
の CITIBIKE_STATIONS_SOURCE2
の 2 つの行の最近傍(最も近い重複)が 2 つ表示されています。distance_type
が指定されていないため、ユークリッド距離と見なされ、距離は 2 つのソース間の住所の 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 アカウントに課金されないようにするには、次の操作を行います。
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
- プロジェクトを保持する場合は、上記の手順をスキップして Cloud Functions に移動し、関数のリストから削除する関数をオンにして [削除] をクリックして、Cloud Functions の関数を削除します。
12. 完了
これで、Gemini 1.0 Pro と関数呼び出しを使用して、いくつかの MDM アクティビティを、シンプルでありながら強力で、確定的かつ信頼性の高い生成 AI 機能に変換する方法について説明しました。これで、同じユースケースや他の MDM 機能を実装する他の方法を自由に見つけることができます。検証できるデータセット、埋めることができる情報ギャップ、生成 AI レスポンスに埋め込まれた構造化呼び出しで自動化できるタスクはありますか?詳細なガイダンスについては、Vertex AI、BigQuery リモート関数、Cloud Functions、エンベディング、ベクトル検索のドキュメントをご覧ください。このプロジェクトの GitHub リポジトリは次のとおりです。学習した内容で作成した作品をお知らせください。