Gerenciamento de dados mestre simplificado: correspondência e Use a IA generativa!

1. Visão geral

O que é gerenciamento de dados mestres?

O principal objetivo do gerenciamento de dados (MDM) é criar uma fonte de verdade única e confiável para os dados mais importantes da sua organização. Imagine uma biblioteca meticulosamente organizada em que todos os livros (pontos de dados) estão corretamente rotulados, atualizados e fáceis de encontrar.

Os dados mestres representam as principais entidades de negócios fundamentais e essenciais para as operações de uma empresa. Aqui estão os principais elementos dos dados mestres:

  • Entidades comerciais:entidades como clientes, produtos, fornecedores, locais e funcionários, que são os substantivos relacionados à sua empresa
  • Identificadores:identificadores exclusivos que garantem que cada entidade seja distinta e rastreável em todos os sistemas.
  • Atributos: as características que descrevem cada entidade, por exemplo, o endereço de um cliente, o preço de um produto etc.

Para ajudar você a entender melhor os dados mestres, vamos compará-los com os dados transacionais. Os dados transacionais capturam eventos individuais (uma compra, uma remessa etc.). Já os dados mestres oferecem o contexto desses eventos ao definir as entidades envolvidas. Por exemplo, uma transação de vendas é vinculada aos dados mestres de cliente, produto e vendedor.

Embora implementar um MDM robusto seja essencial para a tomada de decisões estratégicas, ele pode ser complexo e usar muitos recursos. É aí que entra o poder transformador da IA generativa, principalmente modelos como o Gemini 1.0 Pro, o Gemini 1.0 Pro Vision e o Gemini 1.5 Pro.

2. Objetivo

Neste codelab, você vai demonstrar como o Gemini 1.0 Pro simplifica os aplicativos de gerenciamento de dados mestres, como enriquecimento e eliminação de duplicação, para os dados de citibike_stations disponíveis no conjunto de dados público do BigQuery.

Vamos usar

  1. Conjunto de dados público bigquery-public-data.new_york_citibike do BigQuery.
  2. Chamada da função do Gemini (uma função do Cloud do Java que recebe as informações de endereço usando a API Geocoding inversa para as coordenadas disponíveis com os dados de citibike_stations).
  3. a API Vertex AI Embeddings e a pesquisa de vetores no BigQuery para identificar cópias.

O que você vai criar

  1. Você vai criar um conjunto de dados do BigQuery para o caso de uso. Neste conjunto de dados, você vai criar uma tabela de destino com dados da tabela de conjunto de dados público bigquery-public-data.new_york_citibike.citibike_stations.
  2. Você vai implantar uma função do Cloud que inclui a chamada de função do Gemini para padronizar o endereço.
  3. Você vai armazenar os dados de endereço aprimorados nas tabelas de destino (das duas fontes fornecidas para esta demonstração).
  4. Você vai invocar a API Vertex AI Embeddings do BigQuery nos dados de endereço.
  5. Você vai usar a pesquisa de vetores do BigQuery para identificar registros duplicados.

O diagrama a seguir representa o fluxo de dados e as etapas envolvidas na implementação.

Fluxo de alto nível do caso de uso

3. Requisitos

  • Use um navegador, como o Chrome ou o Firefox.
  • Ter um projeto do Google Cloud com o faturamento ativado.

4. Antes de começar

  1. No console do Google Cloud, na página de seletor de projetos, selecione ou crie um projeto do Google Cloud.
  2. Verifique se o faturamento está ativado para seu projeto do Cloud. Saiba como verificar se o faturamento está ativado em um projeto .
  3. Você usará o Cloud Shell, um ambiente de linha de comando em execução no Google Cloud que vem pré-carregado com o bq. Clique em "Ativar o Cloud Shell" na parte de cima do console do Google Cloud.

Imagem do botão "Ativar o Cloud Shell"

  1. Depois de se conectar ao Cloud Shell, verifique se você já está autenticado e se o projeto está configurado com o ID do seu projeto usando o seguinte comando:
gcloud auth list
  1. Execute o comando a seguir no Cloud Shell para confirmar que o comando gcloud conhece seu projeto.
gcloud config list project
  1. Se o projeto não estiver definido, use este comando:
gcloud config set project <YOUR_PROJECT_ID>
  1. Acesse o Gemini para Google Cloud Marketplace e ative a API. Também é possível usar o seguinte comando no terminal do Cloud Shell:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. Verifique se as APIs BigQuery, conexão do BigQuery, Cloud Functions, Cloud Run, Vertex AI e Cloud Build estão ativadas. A alternativa ao comando gcloud é pelo console, usando este link.

Consulte a documentação para ver o uso e os comandos gcloud.

5. Criar um conjunto de dados do BigQuery e uma conexão externa

Vamos começar criando um conjunto de dados e uma conexão de recursos do Cloud.

Um conjunto de dados no BigQuery é um contêiner para todas as tabelas e objetos do seu aplicativo.

Para criar um conjunto de dados, faça o seguinte:

  1. Acesse a página do BigQuery no console do Google Cloud.
  2. No painel Explorador, selecione o projeto em que você quer criar o conjunto de dados.
  3. Expanda a opção Ações (o ícone de reticências verticais) e clique em Criar conjunto de dados.

Imagem do menu de ações e da opção &quot;Criar conjunto de dados&quot;

  1. Insira mdm_gemini no campo ID do conjunto de dados.
  2. Defina seu tipo de local como Multi-region e aceite o valor padrão, que é US(multiple regions in United States.
  3. Clique em Criar conjunto de dados.
  4. Verifique se o conjunto de dados foi criado e listado no ID do projeto no painel Explorer.

É necessária uma conexão com o BigQuery para interagir com a função do Cloud. Para criar uma função remota, crie uma conexão com o BigQuery. Neste codelab, usaremos a conexão do BigLake para acessar o modelo do BigQuery usando a função do Cloud. As conexões do BigLake ajudam a conectar a fonte de dados externa, mantendo o controle de acesso e a segurança refinados do BigQuery, que, neste caso, é a API Gemini Pro da Vertex AI.

Para criar a conexão do BigLake, faça o seguinte:

  1. Clique em Adicionar no painel Explorer da página do BigQuery.

Console do BigQuery com o botão &quot;ADICIONAR&quot; destacado para adicionar conexão externa

  1. Clique em Conexões com fontes de dados externas.
  2. Na lista "Tipo de conexão", selecione Modelos remotos da Vertex AI, funções remotas e BigLake (recurso do Cloud).
  3. No campo ID da conexão, digite o nome da conexão como gemini-bq-conn.
  4. Defina seu tipo de local como Multi-region e aceite o valor padrão, que é US(multiple regions in United States.
  5. Clique em Criar conexão.
  6. Clique em Acessar conexão e copie o ID da conta de serviço no painel Informações de conexão.

Captura de tela com informações da conexão

  1. Acesse a página IAM e Administrador e clique em Conceder acesso.
  2. Cole o ID da conta de serviço no campo Novos princípios.
  3. Selecione o papel Vertex AI user na lista de papéis e clique em Salvar.

Captura de tela: conceder acesso à conta de serviço

Você criou o conjunto de dados e a conexão do BigQuery.

6. Implantar a chamada de função do Gemini (função do Cloud em Java)

Siga estas etapas para implantar a função do Cloud em Java que inclui a chamada de função do Gemini.

  1. Clone o repositório do GitHub no terminal do Cloud Shell usando o seguinte comando:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  1. Substitua os marcadores de posição YOUR_API_KEY e YOUR_PROJECT_ID pelos valores.

Se você ler o blog aqui, vai saber que as implementações de chamada de função usam a API Reverse Geocoding. Siga estas instruções para criar sua própria API_KEY.

  1. No terminal do Cloud Shell, acesse o diretório do projeto recém-clonado GeminiFunctionCalling e execute a seguinte instrução para criar e implantar a função do Cloud:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

Diga "y" quando a mensagem "Permitir invocações não autenticadas" aparecer perguntas. O ideal é que você configure a autenticação dos aplicativos empresariais, conforme a recomendação. Mas, como este é um app de demonstração, vamos continuar sem autenticação.

A saída é um URL REST no seguinte formato:

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

  1. Execute o seguinte comando no terminal para testar a Função do Cloud:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'

Resposta a um comando de amostra aleatório:

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

Os parâmetros de solicitação e resposta desta função do Cloud são implementados de maneira compatível com a invocação de função remota do BigQuery. Ele pode ser consumido diretamente dos dados no local do BigQuery. Isso significa que, se sua entrada de dados (dados de latitude e longitude) estiver no BigQuery, você poderá chamar a função remota nos dados e receber a resposta da função, que pode ser armazenada ou processada diretamente no BigQuery.

  1. Execute o DDL a seguir pelo BigQuery para criar uma função remota que invoca essa função do Cloud implantada:
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
 );

Teste a consulta para usar a nova função remota criada:

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

Se a consulta de teste que usa a nova função remota criada no BigQuery falhar devido a um problema de permissões do Cloud Functions, acesse o Cloud Functions no console do Google Cloud e localize a função implantada do Cloud chamada "gemini-fn-calling". Acesse a guia "Permissões" e adicione o principal como "allUsers" e conceder o papel "Invocador do Cloud Functions" para garantir que o Cloud Functions possa ser acessado por todos os usuários (porque este é um app de demonstração).

7. Tentar uma solução alternativa

Se você não tiver a API_KEY necessária para a abordagem de chamada da função de geocodificação inversa ou não tiver a função do Cloud implantada, por algum motivo, faça o seguinte:

  1. Faça o download do arquivo CITIBIKE_STATIONS.csv do repositório para a pasta do projeto do Cloud Shell e navegue até ela.
  2. Exporte os dados do CSV para o novo conjunto de dados do BigQuery mdm_gemini usando o seguinte comando no terminal do 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. Criar tabela e aprimorar dados de endereço

Etapa 1: criar a tabela

Imp: pule esta etapa se você usou a solução alternativa, porque já deve ter criado a tabela.

Se você não usou a solução alternativa, execute a seguinte DDL no BigQuery SQL Editor:

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

Agora, vamos enriquecer os dados de endereço invocando a função remota nas coordenadas de latitude e longitude disponíveis na tabela. Defina as seguintes condições para os dados:

  • Informado no ano de 2024
  • Número de bicicletas disponíveis > 0
  • Capacidade > 100

Execute a seguinte 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;

Etapa 2: criar uma segunda fonte para os dados de local das estações de bicicletas

Não pule esta etapa mesmo que você tenha usado uma abordagem alternativa para criar a tabela.

Nesta etapa, você vai criar uma segunda fonte para os dados de localização de estações de bicicleta para os fins deste codelab. Isso demonstra que o MDM está reunindo dados de várias fontes e identificando a verdade.

Execute os DDLs a seguir no Editor SQL do BigQuery para criar a segunda fonte de dados de local com dois registros. Vamos nomear essa tabela como mdm_gemini.CITIBIKE_STATIONS_SOURCE2 e inserir dois registros nela.

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. Gerar embeddings para dados de endereço

Embeddings são vetores numéricos de alta dimensão que representam uma determinada entidade, como um texto ou arquivo de áudio. Os modelos de machine learning (ML) usam embeddings para codificar a semântica sobre essas entidades, facilitando o raciocínio e a comparação delas. Por exemplo, uma operação comum em modelos de clustering, classificação e recomendação é medir a distância entre vetores em um espaço de embedding para encontrar itens semanticamente parecidos. A API de embeddings de texto da Vertex AI permite criar um embedding de texto usando a IA generativa na Vertex AI. Os embeddings de texto são representações numéricas de texto que capturam relações entre palavras e frases. Saiba mais sobre os embeddings de texto da Vertex AI neste link.

  1. Execute o DDL abaixo para criar um modelo remoto para a API de embeddings de texto da 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. Agora que o modelo de embeddings remoto está pronto, vamos gerar embeddings para a primeira origem e armazená-los em uma tabela usando a seguinte 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 )
  )
);

Em vez de criar uma nova tabela, também é possível armazenar o campo de resultados dos embeddings na mesma tabela mdm_gemini.CITIBIKE_STATIONS criada anteriormente.

  1. Para gerar embeddings para dados de endereço na tabela CITIBIKE_STATIONS_SOURCE2,execute a seguinte 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;

Isso criará embeddings para a segunda origem. Observe que criamos o campo de embeddings na mesma tabela CITIBIKE_STATIONS_SOURCE2.

  1. Para visualizar os embeddings gerados para as tabelas de dados de origem 1 e 2, execute a seguinte 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`;

Vamos agora realizar uma pesquisa de vetor para identificar duplicatas.

10. Faça uma pesquisa de vetor para sinalizar endereços duplicados

Nesta etapa, você vai pesquisar na coluna de embeddings ml_generate_embedding_result da tabela mdm_gemini.CITIBIKE_STATIONS_SOURCE1 para encontrar os dois embeddings principais que correspondem a cada linha de dados na coluna embeddings_src da tabela mdm_gemini.CITIBIKE_STATIONS_SOURCE2.

Para isso, execute a seguinte 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;

Tabela que estamos consultando: mdm_gemini.CITIBIKE_STATIONS_SOURCE1 no campo ml_generate_embedding_result

Tabela que usamos como base : mdm_gemini.CITIBIKE_STATIONS_SOURCE2 no campo embeddings_src

top_k::especifica o número de vizinhos mais próximos a serem retornados. O padrão é 10. Um valor negativo é tratado como infinito. Isso significa que todos os valores são contados como vizinhos e retornados.

distance_type: especifica o tipo de métrica a ser usado para calcular a distância entre dois vetores. Os tipos de distância compatíveis são Euclidiano e Cosseno. O padrão é Euclidiano.

O resultado da consulta é o seguinte:

Conjunto de resultados

Como você pode ver, isso listou os dois vizinhos mais próximos (em outras palavras, cópias mais próximas) das duas linhas em CITIBIKE_STATIONS_SOURCE2 de CITIBIKE_STATIONS_SOURCE1. Como o distance_type não está especificado, ele presume que ele é euclidiano e a distância é lida como as distâncias nos valores de TEXTO do endereço entre as duas fontes, sendo que o menor é os textos de endereço mais semelhantes.

Vamos definir distance_type como Cosseno usando a seguinte 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;

O resultado da consulta é o seguinte:

Conjunto de resultados 2

As duas consultas (dos dois tipos de distância) são ordenadas pela distância DESCENDING, o que significa que queremos listar os resultados em ordem decrescente de distância. No entanto, a ordem de distância da segunda consulta será invertida. Sabe por quê?

Ótimo! Mandou bem! Na similaridade de cossenos, um número maior significa maior semelhança e menor distância. Na distância euclidiana, um número maior significa uma distância maior entre os valores.

Para mais informações sobre a compreensão do MDM e dicas para entender as diferenças e as aplicações de Euclidiano e Coseno, leia o blog.

11. Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados nesta postagem, siga estas etapas:

  1. No console do Google Cloud, acesse a página Gerenciar recursos.
  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir.
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
  4. Se quiser manter o projeto, pule as etapas acima e exclua a função do Cloud. Para isso, acesse o Cloud Functions e, na lista de funções, marque a que você quer excluir e clique em Excluir.

12. Parabéns

Parabéns! Você demonstrou o poder do Gemini 1.0 Pro e da chamada de função para transformar algumas atividades de MDM em recursos de IA generativa simplificados, determinísticos e confiáveis. Agora que você sabe, fique à vontade para identificar outras formas de implementar o mesmo caso de uso ou outras funcionalidades de MDM. Existem conjuntos de dados que você poderia validar, lacunas de informações que poderia preencher ou tarefas que poderiam ser automatizadas com chamadas estruturadas incorporadas às suas respostas de IA generativa? Consulte a documentação da Vertex AI, Funções remotas do BigQuery, Cloud Functions, Embeddings e Pesquisa de vetores para orientações mais detalhadas. Este é o repositório do GitHub para este projeto. Conte o que você criou com esse aprendizado.