1. Visão geral
O que é o gerenciamento de dados mestres?
O gerenciamento de dados mestres (MDM) é a criação de uma fonte de verdade única e confiável para os dados mais importantes da sua organização. Imagine uma biblioteca meticulosamente organizada em que cada livro (ponto de dados) está corretamente rotulado, atualizado e fácil de encontrar.
Os dados principais representam as entidades de negócios principais e fundamentais que são essenciais para as operações de uma empresa. Estes são os principais elementos dos dados mestres:
- Entidades empresariais:entidades como clientes, produtos, fornecedores, locais e funcionários, que são os substantivos em torno dos quais sua empresa gira
- 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 principais, vamos compará-los com os dados transacionais. Os dados transacionais capturam eventos individuais (uma compra, um envio etc.). Já os dados principais fornecem o contexto desses eventos definindo as entidades envolvidas. Por exemplo, uma transação de vendas é vinculada aos dados mestre do cliente, do produto e do vendedor.
Embora a implementação de um MDM robusto seja essencial para a tomada de decisões estratégicas, ela pode ser complexa e exigir muitos recursos. É aqui que entra em jogo o poder transformador da IA generativa, principalmente modelos como Gemini 1.0 Pro, Gemini 1.0 Pro Vision e Gemini 1.5 Pro.
2. Objetivo
Neste codelab, você vai demonstrar como o Gemini 1.0 Pro simplifica aplicativos de gerenciamento de dados mestre, como enriquecimento e eliminação de duplicação, para os dados citibike_stations disponíveis no conjunto de dados público do BigQuery.
Vamos usar
- Conjunto de dados público do BigQuery
bigquery-public-data.new_york_citibike
. - Chamada de função Gemini (uma função Java Cloud que recebe as informações do endereço usando a API de geocodificação reversa para as coordenadas disponíveis com os dados citibike_stations).
- API Vertex AI Embeddings e pesquisa vetorial no BigQuery para identificar duplicatas.
O que você vai criar
- 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
. - Você vai implantar a função do Cloud que inclui a chamada de função do Gemini para padronização de endereços.
- Você vai armazenar os dados de endereço enriquecidos nas tabelas de destino (das duas fontes fornecidas para esta demonstração).
- Você vai invocar a API Vertex AI Embeddings do BigQuery nos dados de endereço.
- Você vai usar o BigQuery Vector Search para identificar registros duplicados.
O diagrama a seguir representa o fluxo de dados e as etapas envolvidas na implementação.
3. Requisitos
4. Antes de começar
- No console do Google Cloud, na página de seletor de projetos, selecione ou crie um projeto do Google Cloud.
- Verifique se o faturamento está ativado para seu projeto do Cloud. Saiba como verificar se o faturamento está ativado em um projeto .
- Você vai usar o Cloud Shell, um ambiente de linha de comando executado no Google Cloud que vem pré-carregado com bq. Clique em "Ativar o Cloud Shell" na parte de cima do console do Google Cloud.
- Depois de se conectar ao Cloud Shell, verifique se você já está autenticado e se o projeto está definido como seu ID usando o seguinte comando:
gcloud auth list
- Execute o comando a seguir no Cloud Shell para confirmar se o comando gcloud sabe sobre seu projeto.
gcloud config list project
- Se o projeto não estiver definido, use este comando:
gcloud config set project <YOUR_PROJECT_ID>
- Acesse o Gemini para Google Cloud Marketplace para ativar a API. Também é possível usar o seguinte comando no terminal do Cloud Shell:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Verifique se as APIs BigQuery, BigQuery Connection, Cloud Function, 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 e uma conexão externa do BigQuery
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:
- Acesse a página do BigQuery no console do Google Cloud.
- No painel Explorador, selecione o projeto em que você quer criar o conjunto de dados.
- Expanda a opção Ações (o ícone de reticências verticais) e clique em Criar conjunto de dados.
- Insira
mdm_gemini
no campo ID do conjunto de dados. - Defina o tipo de local como
Multi-region
e aceite o valor padrão, que éUS(multiple regions in United States.
. - Clique em Criar conjunto de dados.
- Verifique se o conjunto de dados foi criado e listado no ID do projeto no painel Explorer.
Uma conexão do BigQuery é necessária para interagir com a função do Cloud. Para criar uma função remota, você precisa criar uma conexão do BigQuery. Neste codelab, vamos usar a conexão do BigLake para acessar o modelo do BigQuery pela 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, nesse caso, é a API Vertex AI Gemini Pro.
Para criar a conexão do BigLake, faça o seguinte:
- Clique em Adicionar no painel Explorer da página do BigQuery.
- Clique em Conexões com fontes de dados externas.
- Na lista "Tipo de conexão", selecione Modelos remotos, funções remotas e BigLake (recurso do Cloud) da Vertex AI.
- No campo ID da conexão, insira o nome da conexão como
gemini-bq-conn
. - Defina o tipo de local como
Multi-region
e aceite o valor padrão, que éUS(multiple regions in United States.
. - Clique em Criar conexão.
- Clique em Acessar conexão e copie o ID da conta de serviço no painel Informações da conexão.
- Acesse a página IAM e administrador e clique em Conceder acesso.
- Cole o ID da conta de serviço no campo Novos princípios.
- Selecione o papel
Vertex AI user
na lista de papéis e clique em Salvar.
Você criou o conjunto de dados e a conexão do BigQuery.
6. Implantar a chamada de função Gemini (função do Cloud em Java)
Siga estas etapas para implantar a função Java Cloud que inclui a chamada de função Gemini.
- Clone o repositório do GitHub no terminal do Cloud Shell usando o seguinte comando:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
- Substitua os marcadores de posição
YOUR_API_KEY
eYOUR_PROJECT_ID
pelos seus valores.
Se você leu o blog aqui, sabe que as implementações de chamada de função usam a API Reverse Geocoding. Você pode criar sua própria API_KEY seguindo estas instruções.
- No terminal do Cloud Shell, acesse o diretório de projeto 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 receber a solicitação de permissão para invocações não autenticadas. O ideal é configurar a autenticação para seus aplicativos corporativos, conforme recomendado. No entanto, como este é um app de demonstração, vamos prosseguir sem autenticação.
A saída é um URL REST no seguinte formato:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling
- Para testar essa Função do Cloud, execute o seguinte comando no terminal:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'
Resposta para uma instrução de amostra aleatória:
'{"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 dessa 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 do BigQuery no local. Isso significa que, se a 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.
- Execute o seguinte DDL no 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 chamada gemini-fn-calling. Acesse a guia "Permissões", adicione o participante como "allUsers" e conceda o papel "Invocador do Cloud Functions" para garantir que o Cloud Functions seja acessível a todos os usuários (somente porque este é um app de demonstração).
7. Tente uma solução alternativa
Se você não tiver a API_KEY necessária para a abordagem de chamada de função de geocodificação reversa ou não tiver o Cloud Function implantado, por algum motivo, faça o seguinte como alternativa:
- Faça o download do arquivo CITIBIKE_STATIONS.csv do repositório para a pasta do projeto do Cloud Shell e navegue até ela.
- Exporte os dados do CSV para o novo conjunto de dados
mdm_gemini
do BigQuery 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 uma tabela e enriquecer dados de endereços
Etapa 1: criar a tabela
Importante:pule esta etapa se você já tiver criado a tabela.
Se você não usou a solução alternativa, execute o 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 maior que 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 da estação de bicicletas
Não pule esta etapa, mesmo que você tenha usado a abordagem alternativa para criar a tabela.
Nesta etapa, você vai criar uma segunda fonte para os dados de local da estação de bicicletas para fins deste codelab. Isso demonstra que o MDM reúne dados de várias fontes e identifica a verdade.
Execute os seguintes DDLs no BigQuery SQL Editor 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
Os embeddings são vetores numéricos de alta dimensão que representam uma determinada entidade, como um texto ou um arquivo de áudio. Os modelos de machine learning (ML) usam embeddings para codificar semântica sobre essas entidades, facilitando o entendimento delas e sua comparação. 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 os itens semanticamente mais parecidos. A API Text-embeddings 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 as relações entre palavras e frases. Leia mais sobre as incorporações de texto da Vertex AI aqui.
- Execute o DDL abaixo para criar um modelo remoto para a API Text-embeddings 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');
- Agora que o modelo de embeddings remoto está pronto, vamos gerar embeddings para a primeira fonte 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, você também pode armazenar o campo de resultado de embeddings na mesma tabela mdm_gemini.CITIBIKE_STATIONS que você criou anteriormente.
- 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 vai criar embeddings para a segunda fonte. Criamos o campo de incorporação na mesma tabela CITIBIKE_STATIONS_SOURCE2.
- 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`;
Agora vamos realizar uma pesquisa vetorial para identificar duplicações.
10. Executar uma pesquisa vetorial para sinalizar endereços duplicados
Nesta etapa, você vai pesquisar as embeddings de endereço na coluna ml_generate_embedding_result da tabela mdm_gemini.CITIBIKE_STATIONS_SOURCE1 para encontrar as duas embeddings principais que correspondem a cada linha de dados na coluna embeddings_src da tabela mdm_gemini.CITIBIKE_STATIONS_SOURCE2.
Para fazer 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 usada como base: mdm_gemini.CITIBIKE_STATIONS_SOURCE2
no campo embeddings_src
top_k::especifica o número de vizinhos mais próximos que serão retornados. O padrão é 10. Um valor negativo é tratado como infinito, o que significa que todos os valores são contados como vizinhos e retornados.
distance_type::especifica o tipo de métrica a ser usada para calcular a distância entre dois vetores. Os tipos de distância aceitos são Euclidiana e Cosseno. O padrão é Euclidiana.
O resultado da consulta é o seguinte:
Como você pode ver, isso listou os dois vizinhos mais próximos (ou seja, as duplicatas mais próximas) para as duas linhas em CITIBIKE_STATIONS_SOURCE2
de CITIBIKE_STATIONS_SOURCE1
. Como o distance_type
não está especificado, presume-se que ele seja Euclidean, e a distância é lida como as distâncias nos valores de TEXTO de endereço entre as duas fontes, sendo o menor o texto de endereço mais semelhante.
Vamos definir distance_type
como Cosine 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:
As duas consultas (dos dois tipos de distância) são ordenadas por distância DESCENDENTE, o que significa que queremos listar os resultados na ordem de distância decrescente. No entanto, a ordem da distância da segunda consulta é invertida. Sabe por quê?
Ótimo! Mandou bem! Na similaridade de cosseno, um número maior significa maior semelhança e distância menor. Na distância euclidiana, um número maior significa uma distância maior entre os valores.
Para mais informações sobre o MDM e dicas para entender a diferença e as aplicações de Euclides e de cosseno, leia o blog.
11. Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados nesta postagem, siga estas etapas:
- No console do Google Cloud, acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir.
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
- Se você quiser manter seu 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 uso do Gemini 1.0 Pro e das chamadas de função para transformar algumas atividades de MDM em recursos simplificados, mas poderosos, determinísticos e confiáveis de IA generativa. Agora que você sabe, sinta-se à vontade para identificar outras maneiras de implementar o mesmo caso de uso ou outras funcionalidades de MDM. Há conjuntos de dados que você pode validar, lacunas de informações que podem ser preenchidas ou tarefas que podem ser automatizadas com chamadas estruturadas incorporadas às respostas de IA generativa? Consulte a documentação da Vertex AI, BigQuery Remote Functions, Cloud Functions, Embeddings e Pesquisa de vetor para receber orientações mais detalhadas. Confira o repositório do GitHub para este projeto. Conte para a gente o que você criou com esse aprendizado.