簡素化されたマスターデータ管理: マッチングと生成 AI と統合する

1. 概要

マスターデータ管理とは

マスターデータ管理(MDM)とは、組織の最も重要なデータに対して、信頼できる唯一の情報源を作成することです。すべての書籍(データポイント)に正しいラベルが付けられ、最新の状態に保たれ、簡単に検索できる、きちんと整理された図書館を想像してみてください。

マスターデータは、企業の運営に不可欠なコアとなる基盤のビジネス エンティティを表します。マスターデータの主な要素は次のとおりです。

  • ビジネス エンティティ: 顧客、商品、サプライヤー、ロケーション、従業員など、ビジネスの中心となる名詞
  • 識別子: 各エンティティがシステム全体で一意かつ追跡可能であることを保証する一意の識別子
  • 属性: 各エンティティを説明する特性(顧客の住所、商品の価格など)

マスターデータをより深く理解するために、トランザクション データと比較してみましょう。トランザクション データは、個々のイベント(購入、出荷など)をキャプチャします。一方、マスターデータは、関連するエンティティを定義することで、これらのイベントのコンテキストを提供します。たとえば、販売トランザクションは、顧客、商品、営業担当者のマスターデータにリンクされます。

戦略的な意思決定を行うには、堅牢な MDM の実装が不可欠ですが、複雑でリソースを大量に消費する可能性があります。ここで、生成 AI、特に Gemini 1.0 Pro、Gemini 1.0 Pro Vision、Gemini 1.5 Pro などのモデルの変革力が発揮されます。

2. 目標

この Codelab では、Gemini 1.0 Pro が、BigQuery の一般公開データセットで利用可能な citibike_stations データに対して、エンリッチメントや重複排除などのマスターデータ マネジメント アプリケーションをどのように簡素化するかを示します。

必要なもの

  1. BigQuery の一般公開データセット bigquery-public-data.new_york_citibike
  2. Gemini 関数呼び出し(citibike_stations データで利用可能な座標の リバース Geocoding API を使用して住所情報を取得する Java Cloud Functions の関数)。
  3. 重複を特定するための Vertex AI Embeddings API と BigQuery のベクトル検索。

作成するアプリの概要

  1. ユースケース用の BigQuery データセットを作成します。このデータセットに、一般公開データセット テーブル bigquery-public-data.new_york_citibike.citibike_stations のデータを含むランディング テーブルを作成します。
  2. 住所の標準化に Gemini 関数呼び出しを含む Cloud Functions の関数をデプロイします。
  3. エンリッチされた住所データをランディング テーブルに保存します(このデモ用に提供されている 2 つのソースから)。
  4. BigQuery から住所データに対して Vertex AI Embeddings API を呼び出します。
  5. BigQuery ベクトル検索を使用して重複レコードを特定します。

次の図は、実装に関わるデータの流れと手順を示しています。

ユースケースのフローの概要

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. Gemini for Google Cloud Marketplace に移動して、API を有効にします。Cloud Shell ターミナルで次のコマンドを使用することもできます。
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. BigQuery、BigQuery Connection、Cloud Functions、Cloud Run、Vertex AI、Cloud Build の各 API が有効になっていることを確認します。gcloud コマンドの代替手段は、 このリンクを使用してコンソールから実行することです。

gcloud コマンドとその使用方法については、ドキュメントをご覧ください。

5. BigQuery データセットと外部接続を作成する

まず、データセットと Cloud リソース接続を作成します。

BigQuery の データセットは、アプリケーションのすべてのテーブルとオブジェクトのコンテナです。

データセットを作成する手順は次のとおりです。

  1. Google Cloud コンソールの [BigQuery ページ] に移動します。
  2. [エクスプローラ] パネルで、データセットを作成するプロジェクトを選択します。
  3. [アクション] オプション(縦の省略記号アイコン)を開き、[データセットを作成] をクリックします。

[アクション] メニューと [データセットを作成] オプションの画像

  1. [データセット ID] フィールドに「mdm_gemini」と入力します。
  2. ロケーション タイプを Multi-region に設定し、デフォルト値の US(multiple regions in United States. を受け入れます。
  3. [データセットを作成] をクリックします。
  4. データセットが作成され、[エクスプローラ] ペインのプロジェクト ID の下に表示されていることを確認します。

Cloud Functions の関数とやり取りするには、BigQuery 接続が必要です。リモート関数を作成するには、BigQuery 接続を作成する必要があります。この Codelab では、BigLake 接続を使用して、Cloud Functions の関数を介して BigQuery からモデルにアクセスします。BigLake 接続を使用すると、きめ細かい BigQuery アクセス制御とセキュリティを維持しながら、外部データソースに接続できます。この事例では、Vertex AI Gemini Pro API に接続します。

BigLake 接続を作成する手順は次のとおりです。

  1. BigQuery ページの [エクスプローラ] ペインで [追加] をクリックします。

BigQuery コンソールで、外部接続を追加するための [追加] ボタンがハイライト表示されている

  1. [外部データソースへの接続] をクリックします。
  2. [接続タイプ] リストで、[Vertex AI リモートモデル、リモート関数、BigLake(Cloud リソース)] を選択します。
  3. [接続 ID] フィールドに、接続名として「gemini-bq-conn」と入力します。
  4. ロケーション タイプを Multi-region に設定し、デフォルト値の US(multiple regions in United States. を受け入れます。
  5. [接続を作成] をクリックします。
  6. [接続に移動] をクリックし、[接続情報] ペインでサービス アカウント ID をコピーします。

接続情報のスクリーンショット

  1. [IAM と管理] ページに移動し、[アクセス権を付与] をクリックします。
  2. [新しいプリンシパル] フィールドにサービス アカウント ID を貼り付けます。
  3. ロールリストから Vertex AI user ロールを選択し、[保存] をクリックします。

サービス アカウントへのアクセス権の付与のスクリーンショット

これで、データセットと BigQuery 接続が正常に作成されました。

6. Gemini 関数呼び出し(Java Cloud Functions の関数)をデプロイする

Gemini 関数呼び出しを含む Java Cloud Functions の関数をデプロイする手順は次のとおりです。

  1. 次のコマンドを使用して、Cloud Shell ターミナルから github リポジトリのクローンを作成します。
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  1. プレースホルダ YOUR_API_KEYYOUR_PROJECT_ID を独自の値に置き換えます。

こちらのブログをこちらでお読みになると、関数呼び出しの実装でリバース Geocoding APIが使用されていることがわかります。API_KEY は、こちらの手順に沿って作成できます。

  1. 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

  1. ターミナルから次のコマンドを実行して、この 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 内で直接保存または処理できる関数レスポンスを取得できます。

  1. 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. 回避策を試す

リバース Geocoding 関数呼び出しアプローチに必要な API_KEY がない場合や、何らかの理由で Cloud Functions の関数がデプロイされていない場合は、次の方法を試してください。

  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: 自転車ステーションの位置情報の 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 の詳細については、こちらをご覧ください。

  1. 次の 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');
  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;

これにより、2 つ目のソースのエンベディングが作成されます。エンベディング フィールドは、同じテーブル 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 テーブルの 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;

クエリを実行するテーブル: mdm_gemini.CITIBIKE_STATIONS_SOURCE1(フィールド ml_generate_embedding_result

ベースとして使用するテーブル: mdm_gemini.CITIBIKE_STATIONS_SOURCE2(フィールド embeddings_src

top_k: 返される最近傍の数を指定します。デフォルトは 10 件です。負の値は無限として扱われます。つまり、すべての値が近傍としてカウントされ、返されます。

distance_type: 2 つのベクトルの距離の計算に使用する指標タイプを指定します。サポートされている距離タイプは、ユークリッドコサイン です。デフォルトはユークリッド です。

クエリの結果は次のとおりです。

結果セット

ご覧のとおり、CITIBIKE_STATIONS_SOURCE1CITIBIKE_STATIONS_SOURCE2 の 2 行の最近傍(つまり、最も近い重複)が一覧表示されています。distance_type が指定されていないため、ユークリッド であると想定され、距離は 2 つのソース間の住所 TEXT 値の距離として読み取られます。最も類似した住所テキストが最も小さくなります。

次のクエリを使用して、distance_typeコサイン に設定します。

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

どちらのクエリ(どちらの距離タイプ)も距離の降順で並べ替えられています。つまり、距離が短くなる順に結果を一覧表示します。ただし、2 つ目のクエリの距離の順序が逆になっています。理由を推測できますか?

はい。正解です。コサイン類似度では、数値が大きいほど類似性が高く、距離が短くなります。ユークリッド距離では、数値が大きいほど値間の距離が大きくなります。

MDM の理解と、ユークリッドとコサインの違いと用途を理解するためのヒントについては、ブログをご覧ください。

11. クリーンアップ

この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順に従います。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
  4. プロジェクトを保持する場合は、上記の手順をスキップし、Cloud Functions に移動して Cloud Functions の関数を削除します。関数のリストから、削除する関数を選択して [削除] をクリックします。

12. 完了

おめでとうございます。Gemini 1.0 Pro と関数呼び出しを使用して、いくつかの MDM アクティビティを簡素化された強力な決定論的で信頼性の高い生成 AI 機能に変換できることを示しました。これで、同じユースケースや他の MDM 機能を実装する他の方法を特定できます。生成 AI レスポンスに埋め込まれた構造化された呼び出しを使用して、検証できるデータセット、埋めることができる情報ギャップ、自動化できるタスクはありますか?詳細なガイダンスについては、 Vertex AIBigQuery リモート関数Cloud Functionsエンベディングベクトル検索のドキュメントをご覧ください。このプロジェクトの github リポジトリはこちらです。この学習で構築したものをぜひお知らせください。