Gestion simplifiée des données de référence: mise en correspondance et Fusionner avec l'IA générative !

1. Présentation

Qu'est-ce que la gestion des données de référence ?

La gestion des données de référence (MDM, Master Data Management) consiste à créer une source unique et fiable pour les données les plus critiques de votre organisation. Imaginez une bibliothèque méticuleusement organisée, où chaque livre (point de données) est correctement étiqueté, à jour et facile à trouver.

Les données de référence représentent les entités commerciales de base qui sont essentielles au fonctionnement d'une entreprise. Voici les principaux éléments des données de référence:

  • Entités commerciales:entités telles que les clients, les produits, les fournisseurs, les établissements et les employés, qui sont les noms autour desquels votre entreprise tourne
  • Identifiants:identifiants uniques qui garantissent que chaque entité est distincte et traçable dans tous les systèmes
  • Attributs: caractéristiques qui décrivent chaque entité, par exemple l'adresse d'un client, le prix d'un produit, etc.

Pour vous aider à mieux comprendre les données de référence, comparons-les aux données transactionnelles. Les données transactionnelles enregistrent des événements individuels (un achat, une expédition, etc.). Les données de référence fournissent le contexte de ces événements en définissant les entités impliquées. Par exemple, une transaction de vente est associée aux données de référence du client, du produit et du vendeur.

Bien que l'implémentation d'une solution MDM robuste soit essentielle pour la prise de décisions stratégiques, elle peut être complexe et nécessiter beaucoup de ressources. C'est là que le pouvoir transformateur de l'IA générative, en particulier des modèles tels que Gemini 1.0 Pro, Gemini 1.0 Pro Vision et Gemini 1.5 Pro, entre en jeu.

2. Objectif

Dans cet atelier de programmation, vous allez montrer comment Gemini 1.0 Pro simplifie les applications de gestion des données principales, comme l'enrichissement et la déduplication, pour les données citibike_stations disponibles dans l'ensemble de données public BigQuery.

Outils utilisés

  1. Ensemble de données public BigQuery bigquery-public-data.new_york_citibike.
  2. Appel de fonction Gemini (fonction Cloud Java qui obtient les informations d'adresse à l'aide de l'API de géocodage inverse pour les coordonnées disponibles avec les données citibike_stations).
  3. L'API Vertex AI Embeddings et la recherche vectorielle dans BigQuery pour identifier les doublons.

Ce que vous allez faire

  1. Vous allez créer un ensemble de données BigQuery pour le cas d'utilisation. Dans cet ensemble de données, vous allez créer une table de destination avec les données de la table de l'ensemble de données public bigquery-public-data.new_york_citibike.citibike_stations.
  2. Vous allez déployer la fonction Cloud qui inclut l'appel de fonction Gemini pour la standardisation des adresses.
  3. Vous allez stocker les données d'adresse enrichies dans les tables de destination (à partir des deux sources fournies pour cette démonstration).
  4. Vous allez appeler l'API Vertex AI Embeddings à partir de BigQuery sur les données d'adresse.
  5. Vous allez utiliser la recherche vectorielle BigQuery pour identifier les enregistrements en double.

Le diagramme suivant représente le flux de données et les étapes impliquées dans l'implémentation.

Flux général du cas d'utilisation

3. Conditions requises

  • Un navigateur tel que Chrome ou Firefox
  • Un projet Google Cloud avec facturation activée.

4. Avant de commencer

  1. Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud.
  2. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet .
  3. Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud et fourni avec bq. Cliquez sur "Activer Cloud Shell" en haut de la console Google Cloud.

Image du bouton Activer Cloud Shell

  1. Une fois connecté à Cloud Shell, vérifiez que vous êtes déjà authentifié et que le projet est défini avec votre ID de projet à l'aide de la commande suivante:
gcloud auth list
  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud connaît votre projet.
gcloud config list project
  1. Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
gcloud config set project <YOUR_PROJECT_ID>
  1. Accédez à la Marketplace Gemini pour Google Cloud pour activer l'API. Vous pouvez également utiliser la commande suivante dans le terminal Cloud Shell:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. Assurez-vous que les API BigQuery, BigQuery Connection, Cloud Functions, Cloud Run, Vertex AI et Cloud Build sont activées. Vous pouvez également utiliser la console via ce lien au lieu de la commande gcloud.

Consultez la documentation pour connaître les commandes gcloud ainsi que leur utilisation.

5. Créer un ensemble de données BigQuery et une connexion externe

Commençons par créer un ensemble de données et une connexion à une ressource Cloud.

Un ensemble de données dans BigQuery est un conteneur pour toutes les tables et tous les objets de votre application.

Pour créer un ensemble de données, procédez comme suit:

  1. Accédez à la page BigQuery de la console Google Cloud.
  2. Sur le panneau Explorateur, sélectionnez le projet pour lequel vous souhaitez créer l'ensemble de données.
  3. Développez l'option Actions (icône représentant des points de suspension verticaux), puis cliquez sur Créer un ensemble de données.

Image du menu &quot;Actions&quot; et de l&#39;option &quot;Créer un ensemble de données&quot;

  1. Saisissez mdm_gemini dans le champ ID de l'ensemble de données.
  2. Définissez le type d'emplacement sur Multi-region et acceptez la valeur par défaut, qui est US(multiple regions in United States..
  3. Cliquez sur Créer un ensemble de données.
  4. Vérifiez que l'ensemble de données est créé et listé sous l'ID de votre projet dans le volet Explorer.

Une connexion BigQuery est requise pour interagir avec votre fonction Cloud. Pour créer une fonction distante, vous devez créer une connexion BigQuery. Dans cet atelier de programmation, nous allons utiliser la connexion BigLake pour accéder au modèle depuis BigQuery via la fonction Cloud. Les connexions BigLake permettent de connecter la source de données externe tout en conservant une sécurité et un contrôle des accès ultraprécis dans BigQuery, qui dans notre cas est l'API Vertex AI Gemini Pro.

Pour créer la connexion BigLake, procédez comme suit:

  1. Cliquez sur Ajouter dans le volet Explorateur de la page BigQuery.

Console BigQuery avec le bouton AJOUTER mis en surbrillance pour ajouter une connexion externe

  1. Cliquez sur Connexions à des sources de données externes.
  2. Dans la liste "Type de connexion", sélectionnez Modèles distants Vertex AI, fonctions à distance et BigLake (ressource Cloud).
  3. Dans le champ ID de connexion, saisissez gemini-bq-conn comme nom de connexion.
  4. Définissez le type d'emplacement sur Multi-region et acceptez la valeur par défaut, qui est US(multiple regions in United States..
  5. Cliquez sur Créer une connexion.
  6. Cliquez sur Accéder à la connexion,puis copiez l'ID du compte de service dans le volet Informations de connexion.

Capture d&#39;écran des informations de connexion

  1. Accédez à la page IAM et administration, puis cliquez sur Accorder l'accès.
  2. Collez l'ID du compte de service dans le champ Nouveaux principes.
  3. Sélectionnez le rôle Vertex AI user dans la liste des rôles, puis cliquez sur Enregistrer.

Capture d&#39;écran de l&#39;attribution de l&#39;accès au compte de service

Vous avez maintenant créé l'ensemble de données et la connexion BigQuery.

6. Déployer l'appel de fonction Gemini (fonction Cloud Java)

Pour déployer la fonction Cloud Java qui inclut l'appel de fonction Gemini, procédez comme suit :

  1. Clonez le dépôt GitHub à partir de votre terminal Cloud Shell à l'aide de la commande suivante:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  1. Remplacez les espaces réservés YOUR_API_KEY et YOUR_PROJECT_ID par vos valeurs.

Si vous lisez cet article de blog, vous saurez que les implémentations d'appel de fonction utilisent l'API de géocodage inversé. Vous pouvez créer votre propre clé API en suivant ces instructions.

  1. Dans le terminal Cloud Shell, accédez au répertoire de projet nouvellement cloné GeminiFunctionCalling et exécutez l'instruction suivante pour créer et déployer la fonction Cloud:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

Répondez "y" lorsque vous êtes invité à répondre à la question "Autoriser les appels non authentifiés". Idéalement, vous devez configurer l'authentification pour vos applications d'entreprise, conformément aux recommandations. Toutefois, comme il s'agit d'une application de démonstration, nous allons procéder sans authentification.

Le résultat est une URL REST au format suivant:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling

  1. Testez cette fonction Cloud en exécutant la commande suivante dans le terminal:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'

Réponse pour un exemple d'invite aléatoire:

 '{"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}}```"]}'

Les paramètres de requête et de réponse de cette fonction Cloud sont implémentés de manière compatible avec l'appel de fonction distante de BigQuery. Il peut être utilisé directement à partir des données BigQuery en place. Cela signifie que si votre entrée de données (données de latitude et de longitude) se trouve dans BigQuery, vous pouvez appeler la fonction distante sur les données et obtenir la réponse de la fonction, qui peut être stockée ou traitée directement dans BigQuery.

  1. Exécutez le script DDL suivant à partir de BigQuery pour créer une fonction distante qui appelle cette fonction Cloud déployée:
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
 );

Requête de test pour utiliser la nouvelle fonction distante créée:

SELECT mdm_gemini.MDM_GEMINI(latlong) from mdm_gemini.CITIBIKE_STATIONS limit 1;

Si la requête de test qui utilise la nouvelle fonction distante créée dans BigQuery échoue en raison d'un problème d'autorisations Cloud Functions, accédez à Cloud Functions depuis la console Google Cloud et recherchez la fonction Cloud déployée appelée gemini-fn-calling. Accédez à l'onglet "Autorisations", ajoutez le compte principal "allUsers" et accordez le rôle "Demandeur Cloud Functions" pour vous assurer que les fonctions Cloud sont accessibles à tous les utilisateurs (uniquement parce qu'il s'agit d'une application de démonstration).

7. Essayer une solution de contournement

Si vous ne disposez pas de la clé API nécessaire pour l'approche d'appel de la fonction de géocodage inverse ou si la fonction Cloud n'est pas déployée, vous pouvez procéder comme suit:

  1. Téléchargez le fichier CITIBIKE_STATIONS.csv à partir du dépôt dans le dossier de votre projet Cloud Shell, puis accédez à ce dossier.
  2. Exportez les données du fichier CSV vers votre nouvel ensemble de données BigQuery mdm_gemini à l'aide de la commande suivante dans le terminal Cloud Shell:
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. Créer une table et enrichir les données d'adresse

Étape 1: Créez le tableau

Important:Si vous avez utilisé la solution de contournement, ignorez cette étape, car vous devez déjà avoir créé le tableau.

Si vous n'avez pas utilisé la solution de contournement, exécutez le LDD suivant dans l'éditeur SQL BigQuery:

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) ;

Enrichissons maintenant les données d'adresse en appelant la fonction distante sur les coordonnées de latitude et de longitude disponibles dans le tableau. Définissez les conditions suivantes pour les données:

  • Signalé en 2024
  • Nombre de vélos disponibles > 0
  • Capacité > 100

Exécutez la requête suivante :

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;

Étape 2: Créer une deuxième source pour les données de localisation des bornes à vélo

Ne sautez pas cette étape, même si vous avez utilisé la solution de contournement pour créer la table.

Dans cette étape, vous allez créer une deuxième source pour les données de localisation des bornes à vélo à des fins d'atelier de programmation. Cela permet de démontrer que la gestion des données de référence rassemble les données de plusieurs sources et identifie la vérité d'or.

Exécutez les instructions DDL suivantes dans l'éditeur SQL BigQuery pour créer la deuxième source de données de localisation contenant deux enregistrements. Nommons cette table mdm_gemini.CITIBIKE_STATIONS_SOURCE2 et y insérons deux enregistrements.

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. Générer des embeddings pour les données d'adresse

Les représentations vectorielles continues sont des vecteurs numériques de grande dimension qui représentent une entité donnée, comme un exemple de texte ou un fichier audio. Les modèles de machine learning (ML) utilisent des représentations vectorielles continues pour encoder la sémantique concernant ces entités afin de faciliter leur raisonnement et leur comparaison. Par exemple, une opération courante dans les modèles de clustering, de classification et de recommandation consiste à mesurer la distance entre les vecteurs dans un espace de représentation vectorielle afin de trouver les éléments les plus sémantiquement similaires. L'API d'embeddings de texte Vertex AI vous permet de créer un embedding de texte à l'aide de l'IA générative sur Vertex AI. Les embeddings de texte sont des représentations numériques de texte qui capturent les relations entre les mots et les expressions. Pour en savoir plus sur les représentations vectorielles continues Vertex AI pour le texte, cliquez ici.

  1. Exécutez le script DDL ci-dessous pour créer un modèle distant pour l'API d'embeddings de texte Vertex AI:
CREATE OR REPLACE MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (ENDPOINT = 'textembedding-gecko@latest');
  1. Maintenant que le modèle d'embeddings distant est prêt, générons des embeddings pour la première source et stockons-les dans une table à l'aide de la requête suivante:
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 )
  )
);

Au lieu de créer une table, vous pouvez également stocker le champ de résultat des embeddings dans la même table mdm_gemini.CITIBIKE_STATIONS que vous avez créée précédemment.

  1. Pour générer des représentations vectorielles continues pour les données d'adresse de la table CITIBIKE_STATIONS_SOURCE2,exécutez la requête suivante:
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;

Des embeddings devraient être créés pour la deuxième source. Notez que nous avons créé le champ d'embeddings dans la même table CITIBIKE_STATIONS_SOURCE2.

  1. Pour visualiser les représentations vectorielles continues générées pour les tables de données sources 1 et 2, exécutez la requête suivante:
select name,address,embeddings_src from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2`;
select name,content,ml_generate_embedding_result from `mdm_gemini.CITIBIKE_STATIONS_SOURCE1`;

Nous allons maintenant effectuer une recherche vectorielle pour identifier les doublons.

10. Exécuter une recherche vectorielle pour signaler les adresses en double

À cette étape, vous allez rechercher dans la colonne ml_generate_embedding_result de la table mdm_gemini.CITIBIKE_STATIONS_SOURCE1 les deux principaux vecteurs d'encapsulation correspondant à chaque ligne de données de la colonne embeddings_src de la table mdm_gemini.CITIBIKE_STATIONS_SOURCE2.

Pour ce faire, exécutez la requête suivante:

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;

Table que nous interrogeons: mdm_gemini.CITIBIKE_STATIONS_SOURCE1 sur le champ ml_generate_embedding_result

Table de référence: mdm_gemini.CITIBIKE_STATIONS_SOURCE2 sur le champ embeddings_src

top_k::spécifie le nombre de voisins les plus proches à renvoyer. La valeur par défaut est 10. Une valeur négative est considérée comme infinie, ce qui signifie que toutes les valeurs sont comptées comme des voisins et renvoyées.

distance_type::spécifie le type de métrique à utiliser pour calculer la distance entre deux vecteurs. Les types de distance compatibles sont euclidien et cosinus. La valeur par défaut est Euclidien.

Le résultat de la requête se présente comme suit:

Ensemble de résultats

Comme vous pouvez le constater, les deux voisins les plus proches (en d'autres termes, les doublons les plus proches) des deux lignes de CITIBIKE_STATIONS_SOURCE2 à partir de CITIBIKE_STATIONS_SOURCE1 sont listés. Étant donné que distance_type n'est pas spécifié, il est supposé qu'il s'agit de la distance euclidienne, et la distance est lue comme les distances dans les valeurs de TEXTE d'adresse entre les deux sources, la plus faible étant les textes d'adresse les plus similaires.

Définissons distance_type sur Cosine à l'aide de la requête suivante:

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;

Le résultat de la requête se présente comme suit:

Ensemble de résultats 2

Les deux requêtes (des deux types de distance) sont triées par distance DESCENDANTE, ce qui signifie que nous souhaitons lister les résultats par ordre de distance décroissante. Vous remarquerez toutefois que l'ordre des distances de la deuxième requête est inversé. Pouvez-vous deviner pourquoi ?

Parfait ! C'est tout à fait ça ! Dans la similarité cosinus, un nombre plus élevé correspond à une plus grande similarité et à une distance plus faible. Dans la distance euclidienne, un nombre plus élevé correspond à une distance plus grande entre les valeurs.

Pour en savoir plus sur la compréhension de la MDM et obtenir des conseils pour comprendre la différence et les applications de l'Euclidienne et du cosinus, consultez cet article de blog.

11. Effectuer un nettoyage

Pour éviter que les ressources utilisées dans cet article soient facturées sur votre compte Google Cloud, procédez comme suit:

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.
  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.
  4. Si vous souhaitez conserver votre projet, ignorez les étapes ci-dessus et supprimez la fonction Cloud en accédant à Cloud Functions. Dans la liste des fonctions, cochez celle que vous souhaitez supprimer, puis cliquez sur Supprimer.

12. Félicitations

Félicitations ! Vous avez vu à quel point Gemini 1.0 Pro et l'appel de fonction peuvent transformer quelques activités de gestion des appareils mobiles en fonctionnalités d'IA générative simplifiées, mais puissantes, déterministes et fiables. Maintenant que vous savez, n'hésitez pas à identifier d'autres façons d'implémenter le même cas d'utilisation ou d'autres fonctionnalités de MDM. Existe-t-il des ensembles de données que vous pourriez valider, des lacunes d'informations que vous pourriez combler ou des tâches que vous pourriez automatiser à l'aide d'appels structurés intégrés à vos réponses d'IA générative ? Pour en savoir plus, consultez la documentation sur Vertex AI, les fonctions distantes BigQuery, Cloud Functions, les embeddings et Vector Search. Voici le dépôt GitHub de ce projet. N'hésitez pas à nous faire part de ce que vous avez créé grâce à ces connaissances.