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 の関数)。
- BigQuery の Vertex AI Embeddings API とベクトル検索を使用して重複を特定。
作成するアプリの概要
- このユースケースでは 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 を使用します。Cloud Shell は Google Cloud で動作するコマンドライン環境で、bq がプリロードされています。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] をクリックします。
![[Cloud Shell をアクティブにする] ボタンの画像](https://codelabs.developers.google.com/static/mdm-with-gemini/img/7875ca05ca6f7cab.png?hl=ja)
- 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 ページに移動します。
- [Explorer] パネルで、データセットを作成するプロジェクトを選択します。
- [アクション] オプション(その他アイコン)を開き、[データセットを作成] をクリックします。
![[操作] メニューと [データセットを作成] オプションの画像](https://codelabs.developers.google.com/static/mdm-with-gemini/img/ab1765bc923ff4fc.png?hl=ja)
- [データセット ID] フィールドに「
mdm_gemini」と入力します。 - ロケーション タイプを
Multi-regionに設定し、デフォルト値(US(multiple regions in United States.)を受け入れます。 - [データセットを作成] をクリックします。
- データセットが作成され、[Explorer] ペインのプロジェクト ID の下に表示されていることを確認します。
Cloud Functions の関数とやり取りするには、BigQuery の接続が必要です。リモート関数を作成するには、BigQuery 接続を作成する必要があります。この Codelab では、BigLake 接続を使用して、Cloud Functions の関数を介して BigQuery からモデルにアクセスします。BigLake 接続は、きめ細かい BigQuery アクセス制御とセキュリティを維持しながら、外部データソース(この場合は Vertex AI Gemini Pro API)に接続するのに役立ちます。
BigLake 接続を作成する手順は次のとおりです。
- BigQuery ページの [エクスプローラ] ペインで [追加] をクリックします。
![外部接続を追加するために [追加] ボタンがハイライト表示されている BigQuery コンソール](https://codelabs.developers.google.com/static/mdm-with-gemini/img/b9c6baedc98ecb37.png?hl=ja)
- [外部データソースへの接続] をクリックします。
- [接続タイプ] リストで、[Vertex AI リモートモデル、リモート関数、BigLake(クラウド リソース)] を選択します。
- [接続 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」と言ってください[Allow unauthenticated invocations] というメッセージが質問にお答えします。推奨に従ってエンタープライズ アプリケーションの認証を設定するのが理想的です。ただし、これはデモアプリのため、認証せずに進めます。
出力は、次の形式の 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;
Cloud Functions の権限の問題が原因で BigQuery で作成された新しいリモート関数を使用するテストクエリが失敗した場合は、Google Cloud コンソールから Cloud Functions に移動し、「gemini-fn-calling」という名前でデプロイされた Cloud Functions の関数を見つけます。[権限] タブに移動し、プリンシパルを「allUsers」として追加します。「Cloud Functions 起動元」ロールを(これはデモアプリであるために限って)すべてのユーザーが Cloud Functions にアクセスできるようにします。
7. 回避策を試す
リバース ジオコーディングの関数の呼び出しに必要な API_KEY がない場合や、なんらかの理由で Cloud Functions の関数がデプロイされていない場合は、代わりに次の方法を使用できます。
- リポジトリから Cloud Shell プロジェクト フォルダにファイル CITIBIKE_STATIONS.csv をダウンロードし、そのフォルダに移動します。
- 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 に embeddings フィールドを作成したことに注意してください。
- ソースデータ テーブル 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 は指定されていないので、ユークリッドであると想定し、距離は住所の TEXT 値で 2 つのソース間の距離として読み取られます。最も低いものは最も類似した住所テキストです。
次のクエリを使用して、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;
クエリの結果は次のとおりです。

どちらのクエリも(両方の距離タイプの)Distance DESCENDING 順に並んでいます。つまり、距離の小さい順に結果をリストします。しかし、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 リポジトリを示します。この学習内容を活かして、あなたが開発した機能をお聞かせください。