Administración de datos maestros simplificada: coincidencias & Combina con la IA generativa

1. Descripción general

¿Qué es la administración de datos maestros?

La administración de datos maestros (MDM) consiste en crear una única fuente confiable de información para los datos más importantes de tu organización. Imagina una biblioteca organizada meticulosamente en la que cada libro (dato) está bien etiquetado, actualizado y fácil de encontrar.

Los datos maestros representan las entidades comerciales fundamentales y básicas que son esenciales para las operaciones de una empresa. Estos son los elementos clave de los datos maestros:

  • Entidades comerciales: Entidades como clientes, productos, proveedores, ubicaciones y empleados que son los sustantivos con los que gira tu empresa
  • Identificadores: identificadores únicos que garantizan que cada entidad sea distinta y se pueda rastrear en distintos sistemas
  • Atributos: las características que describen cada entidad, por ejemplo, la dirección de un cliente, el precio de un producto, etcétera

Para comprender mejor los datos maestros, vamos a compararlos con los datos transaccionales. Los datos transaccionales capturan eventos individuales (una compra, un envío, etcétera). Por otro lado, los datos maestros proporcionan el contexto para esos eventos definiendo las entidades involucradas. Por ejemplo, una transacción de venta se vincula a datos maestros del cliente, el producto y el vendedor.

Si bien la implementación de una MDM sólida es esencial para la toma de decisiones estratégicas, puede ser compleja y requerir muchos recursos. Aquí es donde entra en juego el poder transformador de la IA generativa, en particular modelos como Gemini 1.0 Pro, Gemini 1.0 Pro Vision y Gemini 1.5 Pro.

2. Objetivo

En este codelab, demostrarás cómo Gemini 1.0 Pro simplifica las aplicaciones de administración de datos maestros, como el enriquecimiento y la anulación de duplicación, para los datos de citibike_stations disponibles en el conjunto de datos públicos de BigQuery.

Qué necesitarás

  1. Conjunto de datos públicos de BigQuery bigquery-public-data.new_york_citibike.
  2. Llamadas a funciones de Gemini (una Cloud Function de Java que obtiene la información de la dirección usando la API de Geocoding inversa para las coordenadas disponibles con los datos de citibike_stations)
  3. La API de Vertex AI Embeddings y la búsqueda de vectores en BigQuery para identificar duplicados.

Qué compilarás

  1. Crearás un conjunto de datos de BigQuery para el caso de uso. En este conjunto de datos, crearás una tabla de destino con datos de la tabla del conjunto de datos públicos bigquery-public-data.new_york_citibike.citibike_stations.
  2. Implementarás la Cloud Function, que incluye las llamadas a funciones de Gemini para estandarizar direcciones.
  3. Almacenarás los datos de direcciones enriquecidos en las tablas de destino (de las dos fuentes que se proporcionan para esta demostración).
  4. Invocarás la API de Vertex AI Embeddings desde BigQuery en los datos de dirección.
  5. Usarás la búsqueda de vectores de BigQuery para identificar los registros duplicados.

En el siguiente diagrama, se representa el flujo de datos y los pasos involucrados en la implementación.

Flujo de alto nivel del caso de uso

3. Requisitos

  • Un navegador, como Chrome o Firefox.
  • Un proyecto de Google Cloud con facturación habilitada.

4. Antes de comenzar

  1. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información para verificar si la facturación está habilitada en un proyecto .
  3. Usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud y que viene precargado en bq. Haz clic en Activar Cloud Shell en la parte superior de la consola de Google Cloud.

Imagen del botón Activa Cloud Shell

  1. Cuando te conectes a Cloud Shell, usa el siguiente comando para comprobar que ya estés autenticado y que el proyecto esté configurado con tu ID del proyecto:
gcloud auth list
  1. Ejecuta el siguiente comando en Cloud Shell para confirmar que el comando de gcloud conoce tu proyecto.
gcloud config list project
  1. Si tu proyecto no está configurado, usa el siguiente comando para hacerlo:
gcloud config set project <YOUR_PROJECT_ID>
  1. Para habilitar la API, ve a Gemini para Google Cloud Marketplace. También puedes usar el siguiente comando en la terminal de Cloud Shell:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. Asegúrate de que las APIs de BigQuery, conexión de BigQuery, Cloud Function, Cloud Run, Vertex AI y Cloud Build estén habilitadas. La alternativa al comando de gcloud es a través de la consola mediante este vínculo.

Consulta la documentación para ver los comandos y el uso de gcloud.

5. Crea un conjunto de datos de BigQuery y una conexión externa

Comencemos creando un conjunto de datos y una conexión de recursos de Cloud.

Un conjunto de datos en BigQuery es un contenedor para todas las tablas y objetos de tu aplicación.

Para crear un conjunto de datos, haz lo siguiente:

  1. Ve a la página de BigQuery en la consola de Google Cloud.
  2. En el panel Explorador, selecciona el proyecto en el que deseas crear el conjunto de datos.
  3. Expande la opción Acciones (el ícono de puntos suspensivos verticales) y haz clic en Crear conjunto de datos.

Imagen del menú Acciones y la opción Crear conjunto de datos

  1. Ingresa mdm_gemini en el campo ID del conjunto de datos.
  2. Establece tu tipo de ubicación como Multi-region y acepta el valor predeterminado, que es US(multiple regions in United States..
  3. Haz clic en Crear conjunto de datos.
  4. Verifica que el conjunto de datos se cree y aparezca en el ID de tu proyecto en el panel Explorer.

Se requiere una conexión de BigQuery para interactuar con tu Cloud Function. Para crear una función remota, debes crear una conexión de BigQuery. En este codelab, usaremos la conexión de BigLake para acceder al modelo desde BigQuery a través de la Cloud Function. Las conexiones de BigLake ayudan a conectar la fuente de datos externa y, al mismo tiempo, conservan el control de acceso y la seguridad detallados de BigQuery, que en nuestro caso es la API de Gemini Pro de Vertex AI.

Para crear la conexión de BigLake, haz lo siguiente:

  1. Haz clic en Agregar en el panel Explorador de la página de BigQuery.

La consola de BigQuery con el botón AGREGAR destacado para agregar una conexión externa

  1. Haz clic en Conexiones a fuentes de datos externas.
  2. En la lista Tipo de conexión, selecciona Modelos remotos de Vertex AI, funciones remotas y BigLake (recurso de Cloud).
  3. En el campo ID de conexión, ingresa el nombre de tu conexión como gemini-bq-conn.
  4. Establece tu tipo de ubicación como Multi-region y acepta el valor predeterminado, que es US(multiple regions in United States..
  5. Haz clic en Crear conexión.
  6. Haz clic en Ir a la conexión y, luego, copia el ID de la cuenta de servicio en el panel Información de la conexión.

Captura de pantalla de la información de conexión

  1. Dirígete a la pestaña IAM y Administrador y haz clic en Otorgar acceso.
  2. Pega el ID de la cuenta de servicio en el campo Principios nuevos.
  3. Selecciona el rol Vertex AI user de la lista de roles y, luego, haz clic en Guardar.

Captura de pantalla de Otorga acceso a la cuenta de servicio

Creaste correctamente el conjunto de datos y la conexión con BigQuery.

6. Implementa llamadas a funciones de Gemini (Cloud Function de Java)

Sigue estos pasos para implementar la Cloud Function de Java que incluye las llamadas a funciones de Gemini.

  1. Clona el repositorio de GitHub desde tu terminal de Cloud Shell con el siguiente comando:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  1. Reemplaza los marcadores de posición YOUR_API_KEY y YOUR_PROJECT_ID por tus valores.

Si lee el blog aquí, sabrá que las implementaciones de llamada a función utilizan la API de geocodificación inversa. Puedes crear tu propia API_KEY según las instrucciones que se indican aquí.

  1. En la terminal de Cloud Shell, ve al directorio del proyecto recién clonado GeminiFunctionCalling y ejecuta la siguiente sentencia para compilar y, luego, implementar la Cloud Function:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

Di "y" cuando aparezca el mensaje "Permitir invocaciones no autenticadas" preguntas. Lo ideal es que configures la autenticación para tus aplicaciones empresariales, según la recomendación. Pero como se trata de una app de demostración, procederemos sin autenticar.

El resultado es una URL de REST en el siguiente formato:

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

  1. Ejecuta el siguiente comando desde la terminal para probar esta Cloud Function:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'

Respuesta para una instrucción de muestra aleatoria:

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

Los parámetros de solicitud y respuesta de esta Cloud Function se implementan de una manera compatible con la invocación de función remota de BigQuery. Se puede consumir directamente desde los datos locales de BigQuery. Significa que si tu entrada de datos (datos lat. y largo) se encuentra en BigQuery, entonces puedes llamar a la función remota en los datos y obtener la respuesta de la función que puede almacenarse o procesarse directamente en BigQuery.

  1. Ejecuta el siguiente DDL desde BigQuery para crear una función remota que invoque esta Cloud Function implementada:
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
 );

Consulta de prueba para usar la nueva función remota creada:

SELECT mdm_gemini.MDM_GEMINI(latlong) del límite 1 de mdm_gemini.CITIBIKE_STATIONS;

Si la consulta de prueba que usa la nueva función remota creada en BigQuery falla debido a un problema de permisos de Cloud Functions, ve a Cloud Functions desde la consola de Google Cloud y busca la Cloud Function implementada llamada “gemini-fn-calling”. Ve a la pestaña de permisos y agrega la principal como “allUsers” y otorga el rol “Invocador de Cloud Functions” para garantizar que todos los usuarios puedan acceder a Cloud Functions (solo porque esta es una app de demostración).

7. Prueba una solución alternativa

Si no cuentas con la API_KEY necesaria para el enfoque de llamada a la función de geocodificación inversa o no tienes implementada la Cloud Function, por algún motivo, puedes hacer lo siguiente como alternativa:

  1. Descarga el archivo CITIBIKE_STATIONS.csv del repositorio en la carpeta de tu proyecto de Cloud Shell y navega a ella.
  2. Exporta los datos del archivo CSV a tu nuevo conjunto de datos de BigQuery mdm_gemini con el siguiente comando en la terminal de 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. Crea tablas y enriquece los datos de direcciones

Paso 1: Crea la tabla

Impr.: Omite este paso si utilizaste la solución alternativa, dado que es probable que ya hayas creado la tabla.

Si no usaste la solución alternativa, ejecuta el siguiente DDL en el Editor de SQL de 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) ;

Ahora, enriquezcamos los datos de la dirección invocando la función remota en las coordenadas de latitud y longitud disponibles en la tabla. Establece las siguientes condiciones para los datos:

  • Informado en el año 2024
  • Cantidad de bicicletas disponibles > (0)
  • Capacidad > 100

Ejecute la siguiente consulta:

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;

Paso 2: Crea una segunda fuente para los datos de ubicación de las estaciones de bicicletas

No omitas este paso, incluso si usaste el enfoque alternativo para crear la tabla.

En este paso, crearás una segunda fuente para los datos de ubicación de las estaciones de bicicletas a los fines de este codelab. Esto es para demostrar que la MDM reúne datos de múltiples fuentes e identifica la verdad fundamental.

Ejecuta los siguientes DDL en el Editor de SQL de BigQuery para crear la segunda fuente de datos de ubicación que contenga dos registros. Asígnale el nombre mdm_gemini.CITIBIKE_STATIONS_SOURCE2 y, luego, insertemos dos registros en ella.

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. Generar incorporaciones para datos de direcciones

Las incorporaciones son vectores numéricos de alta dimensión que representan una entidad determinada, como un fragmento de texto o un archivo de audio. Los modelos de aprendizaje automático (AA) usan incorporaciones para codificar la semántica de esas entidades y facilitar su razonamiento y comparación. Por ejemplo, una operación común en los modelos de agrupamiento en clústeres, clasificación y recomendación es medir la distancia entre vectores en un espacio de incorporación para encontrar elementos que sean más similares semánticamente. La API de incorporaciones de texto de Vertex AI te permite crear una incorporación de texto con IA generativa en Vertex AI. Las incorporaciones de texto son representaciones numéricas de texto que capturan las relaciones entre palabras y frases. Obtén más información sobre las incorporaciones de texto de Vertex AI aquí.

  1. Ejecuta el DDL que se muestra a continuación para crear un modelo remoto para la API de incorporaciones de texto de 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. Ahora que el modelo de incorporaciones remotas está listo, vamos a generar incorporaciones para la primera fuente y almacenarla en una tabla con la siguiente consulta:
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 )
  )
);

En lugar de crear una tabla nueva, también puedes almacenar el campo de resultados de incorporaciones en la misma tabla mdm_gemini.CITIBIKE_STATIONS que creaste anteriormente.

  1. Para generar incorporaciones para datos de dirección en la tabla CITIBIKE_STATIONS_SOURCE2,ejecuta la siguiente consulta:
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;

Esto debería crear incorporaciones para la segunda fuente. Ten en cuenta que creamos el campo de incorporaciones en la misma tabla CITIBIKE_STATIONS_SOURCE2.

  1. Para visualizar las incorporaciones generadas para las tablas de datos de origen 1 y 2, ejecuta la siguiente consulta:
select name,address,embeddings_src from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2`;
select name,content,ml_generate_embedding_result from `mdm_gemini.CITIBIKE_STATIONS_SOURCE1`;

Ahora realicemos una búsqueda vectorial para identificar duplicados.

10. Realizar una búsqueda de vectores para marcar las direcciones duplicadas

En este paso, buscarás en la columna de incorporaciones de dirección ml_generate_embedding_result de la tabla mdm_gemini.CITIBIKE_STATIONS_SOURCE1 las dos incorporaciones principales que coincidan con cada fila de datos en la columna embeddings_src de la tabla mdm_gemini.CITIBIKE_STATIONS_SOURCE1.

Para ello, ejecuta la siguiente consulta:

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;

Tabla que consultamos: mdm_gemini.CITIBIKE_STATIONS_SOURCE1 en el campo ml_generate_embedding_result

Tabla que usamos como base: mdm_gemini.CITIBIKE_STATIONS_SOURCE2 en el campo embeddings_src

top_k: Especifica la cantidad de vecinos más cercanos que se deben mostrar. El valor predeterminado es 10. Un valor negativo se trata como infinito, lo que significa que todos los valores se cuentan como vecinos y se devuelven.

distance_type: especifica el tipo de métrica que se usará para calcular la distancia entre dos vectores. Los tipos de distancia admitidos son Euclidean y Coseno. La configuración predeterminada es Euclidiana.

El resultado de la consulta es el siguiente:

Conjunto de resultados

Como puedes ver, se enumeran los dos vecinos más cercanos (en otras palabras, duplicados más cercanos) para las dos filas en CITIBIKE_STATIONS_SOURCE2 de CITIBIKE_STATIONS_SOURCE1. Dado que la distance_type no se especifica, se supone que es euclidiana y que la distancia se lee como las distancias en los valores TEXT de la dirección entre las dos fuentes, el más bajo corresponde a los textos de dirección más similares.

Establezcamos distance_type en Coseno mediante la siguiente consulta:

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;

El resultado de la consulta es el siguiente:

Conjunto de resultados 2

Ambas consultas (de ambos tipos de distancia) están ordenadas por distancia DESCENDING. Esto significa que queremos enumerar los resultados en orden de distancia decreciente. Pero notarás que el orden de distancia de la segunda consulta está invertido. ¿Puedes adivinar por qué?

¡Eso es! ¡Acertaste! En la similitud coseno, un número mayor significa mayor similitud y menor distancia. En la distancia euclidiana, un número mayor significa una mayor distancia entre los valores.

Si deseas obtener más información sobre la comprensión de la MDM y sugerencias para comprender la diferencia y los usos de Euclidean y Coseno, lee el blog.

11. Limpia

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en esta publicación:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.
  2. En la lista de proyectos, elige el proyecto que deseas borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.
  4. Si quieres conservar tu proyecto, omite los pasos anteriores y borra la Cloud Function. Para ello, navega a Cloud Functions y, en la lista de funciones, marca la que quieres borrar y haz clic en Borrar.

12. ¡Felicitaciones!

¡Felicitaciones! Demostraste la potencia de usar Gemini 1.0 Pro y las llamadas a función para transformar algunas actividades de MDM en capacidades de IA generativa simplificadas, potentes, deterministas y confiables. Ahora que lo sabes, no dudes en identificar otras formas de implementar el mismo caso de uso u otras funcionalidades de la MDM. ¿Hay conjuntos de datos que podrías validar, brechas de información que podrías llenar o tareas que podrían automatizarse con llamadas estructuradas incorporadas en tus respuestas de la IA generativa? Consulta la documentación de Vertex AI, funciones remotas de BigQuery, Cloud Functions, incorporaciones y búsqueda de vectores para obtener una orientación más detallada. Este es el repositorio de GitHub para este proyecto. Cuéntanos qué crearás con este aprendizaje.