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 de información confiable para los datos más importantes de tu organización. Imagina una biblioteca organizada de forma meticulosa en la que cada libro (dato) esté etiquetado correctamente, esté actualizado y sea fácil de encontrar.

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

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

Para ayudarte a comprender mejor los datos maestros, comparémoslos con los datos transaccionales. Los datos transaccionales registran eventos individuales (una compra, un envío, etcétera). Mientras que los datos maestros proporcionan el contexto para esos eventos definiendo las entidades involucradas. Por ejemplo, una transacción de ventas se vincula a los datos maestros del cliente, el producto y el vendedor.

Si bien implementar un MDM sólido es esencial para la toma de decisiones estratégicas, puede ser complejo 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 con la API de Geocoding inversa para las coordenadas disponibles con los datos de citibike_stations)
  3. La API de incorporaciones de Vertex AI 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 función de Cloud Functions que incluye la función de llamada de Gemini para la estandarización de 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 la dirección.
  5. Usarás la Búsqueda vectorial de BigQuery para identificar registros duplicados.

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

Flujo general 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 con bq. Haz clic en Activar Cloud Shell en la parte superior de la consola de Google Cloud.

Imagen del botón Activar Cloud Shell

  1. Una vez que te conectes a Cloud Shell, verifica que ya te hayas autenticado y que el proyecto esté configurado con tu ID con el siguiente comando:
gcloud auth list
  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando 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. Navega al Mercado de Gemini para Google Cloud para habilitar la API. 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, BigQuery Connection, Cloud Functions, Cloud Run, Vertex AI y Cloud Build estén habilitadas. La alternativa al comando gcloud es a través de la consola con 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 por crear 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 los 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 de conjunto de datos.
  2. Establece el 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 haya creado y aparezca debajo del ID de tu proyecto en el panel Explorador.

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 función de Cloud. Las conexiones de BigLake ayudan a conectar la fuente de datos externa y mantener el control de acceso y la seguridad precisos de BigQuery, lo que en nuestro caso es la API de Vertex AI Gemini Pro.

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.

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 (Cloud Resource).
  3. En el campo ID de conexión, ingresa el nombre de tu conexión como gemini-bq-conn.
  4. Establece el 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 (Create connection).
  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 conexión.

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

  1. Ve a la página IAM y administración y haz clic en Otorgar acceso.
  2. Pega el ID de la cuenta de servicio en el campo Nuevos principios.
  3. Selecciona el rol Vertex AI user en la lista de roles y, luego, haz clic en Guardar.

Captura de pantalla de la cuenta de servicio con acceso otorgado

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

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

Sigue estos pasos para implementar la función de Cloud Functions de Java que incluye las llamadas a funciones de Gemini.

  1. Clona el repositorio de GitHub desde la 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 lees el blog aquí, sabrás que las implementaciones de llamadas a funciones usan la API de Geocoding inversa. Puedes crear tu propia API_KEY con las instrucciones que se indican aquí.

  1. En la terminal de Cloud Shell, ve al directorio del proyecto clonado recientemente GeminiFunctionCalling y ejecuta la siguiente sentencia para compilar e 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 se te solicite responder las preguntas "Permitir invocaciones no autenticadas". Lo ideal es que configures la autenticación para tus aplicaciones empresariales, según las recomendaciones. Sin embargo, como se trata de una app de demostración, no realizaremos la autenticación.

El resultado es una URL 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 a 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 funciones remotas de BigQuery. Se puede consumir directamente desde los datos de BigQuery sin necesidad de realizar cambios. Esto significa que, si tu entrada de datos (datos de latitud y longitud) se encuentra en BigQuery, puedes llamar a la función remota en los datos y obtener la respuesta de la función, que se puede almacenar o procesar 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) from mdm_gemini.CITIBIKE_STATIONS limit 1;

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, agrega el principal como “allUsers” y otorga el rol “Invocador de Cloud Functions” para asegurarte de 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 tienes la API_KEY necesaria para el enfoque de llamada a la función de geocodificación inversa o no implementaste la función de Cloud, por algún motivo, puedes hacer lo siguiente como alternativa:

  1. Descarga el archivo CITIBIKE_STATIONS.csv del repositorio en la carpeta del proyecto de Cloud Shell y navega a esa carpeta.
  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 una tabla y enriquece los datos de direcciones

Paso 1: Crea la tabla

Imp: Omite este paso si usaste la solución alternativa, ya que ya debes haber 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:

  • Se informó en el año 2024
  • Cantidad de bicicletas disponibles > 0
  • Capacidad superior a 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 de solución alternativa para crear la tabla.

En este paso, crearás una segunda fuente para los datos de ubicación de las estaciones de bicicletas para los fines de este codelab. Esto demuestra que el MDM une datos de varias fuentes y, además, identifica la verdad absoluta.

Ejecuta las siguientes DDL en BigQuery SQL Editor para crear la segunda fuente de datos de ubicación con dos registros. Asignemos el nombre mdm_gemini.CITIBIKE_STATIONS_SOURCE2 a esta tabla 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. Genera 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 a fin de facilitar el razonamiento y la 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 incorporaciones para encontrar elementos que sean más semánticamente similares. La API de incorporaciones de texto de Vertex AI te permite crear una incorporación de texto mediante la IA generativa en Vertex AI. Las incorporaciones de texto son representaciones numéricas del 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 siguiente DDL 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, generemos incorporaciones para la primera fuente y almacénalas 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 las incorporaciones en la misma tabla mdm_gemini.CITIBIKE_STATIONS que creaste antes.

  1. Para generar incorporaciones para los datos de direcciones 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. Ejecuta una búsqueda vectorial para marcar direcciones duplicadas

En este paso, buscarás las dos incorporaciones principales que coincidan con cada fila de datos en la columna embeddings_src de la tabla mdm_gemini.CITIBIKE_STATIONS_SOURCE2 en la columna ml_generate_embedding_result 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 a la que le hacemos la consulta: 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 mostrarán. El valor predeterminado es 10. Un valor negativo se considera infinito, lo que significa que todos los valores se cuentan como vecinos y se muestran.

distance_type: Especifica el tipo de métrica que se usará para calcular la distancia entre dos vectores. Los tipos de distancia admitidos son euclidiana y coseno. El valor predeterminado es Euclidean.

El resultado de la consulta es el siguiente:

Conjunto de resultados

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

Establece distance_type en Cosine con 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) se ordenan por distancia DESCENDENTE, lo que significa que queremos enumerar los resultados en orden de distancia decreciente. Sin embargo, notarás que el orden de distancia de la segunda consulta está invertido. ¿Puedes adivinar por qué?

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

Para obtener más información sobre el MDM y sugerencias para comprender la diferencia y las aplicaciones de la distancia euclidiana y el 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 función de Cloud Functions. 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 el poder de usar Gemini 1.0 Pro y las llamadas a función para transformar algunas actividades de MDM en capacidades de IA generativa simplificadas, pero potentes, deterministas y confiables. Ahora que lo sabes, no dudes en identificar otras formas de implementar el mismo caso de uso o otras funciones de MDM. ¿Hay conjuntos de datos que puedas validar, brechas de información que puedas llenar o tareas que se puedan automatizar con llamadas estructuradas incorporadas en tus respuestas de IA generativa? Consulta la documentación de Vertex AI, BigQuery Remote Functions, Cloud Functions, Incorporaciones y Vector Search para obtener una guía más detallada. Este es el repositorio de GitHub de este proyecto. Cuéntanos qué creaste con este aprendizaje.