Uproszczone zarządzanie danymi głównymi: dopasowanie & Połącz się z generatywną AI

1. Omówienie

Czym jest zarządzanie danymi źródłowymi?

Zarządzanie danymi głównymi (MDM) polega na tworzeniu pojedynczego, wiarygodnego źródła danych dla najważniejszych danych organizacji. Wyobraź sobie starannie zorganizowaną bibliotekę, w której każda książka (punkt danych) jest prawidłowo opisana, aktualna i łatwa do znalezienia.

Dane główne to podstawowe elementy biznesowe, które są niezbędne do działania firmy. Oto najważniejsze elementy danych źródłowych:

  • Podmioty biznesowe: podmioty takie jak klienci, produkty, dostawcy, lokalizacje i pracownicy, czyli rzeczowniki, wokół których kręci się Twoja firma.
  • Identyfikatory: unikalne identyfikatory, które zapewniają, że każda jednostka jest odrębna i można ją śledzić w różnych systemach.
  • Atrybuty: cechy opisujące poszczególne jednostki, np. adres klienta, cena produktu itp.

Aby ułatwić Ci zrozumienie danych głównych, porównamy je z danymi transakcyjnymi. Dane transakcyjne rejestrują poszczególne zdarzenia (zakup, dostawę itp.). Dane główne natomiast dostarczają kontekstu tych zdarzeń, definiując powiązane z nimi podmioty. Na przykład transakcja sprzedaży łączy się z danymi głównymi klienta, produktu i sprzedawcy.

Wdrożenie solidnego systemu MDM jest niezbędne do podejmowania strategicznych decyzji, ale może być skomplikowane i wymagające wielu zasobów. Właśnie w tym miejscu do gry wkracza potęga generatywnej AI, zwłaszcza modele takie jak Gemini 1.0 Pro, Gemini 1.0 Pro Vision czy Gemini 1.5 Pro.

2. Cel

W tym laboratorium kodu zademonstrujesz, jak Gemini 1.0 Pro upraszcza aplikacje do zarządzania danymi głównymi, takie jak wzbogacanie i usuwanie duplikatów, w przypadku danych citibike_stations dostępnych w publicznym zbiorze danych BigQuery.

Co będziesz używać

  1. Publiczny zbiór danych BigQuery bigquery-public-data.new_york_citibike.
  2. wywołanie funkcji Gemini (funkcja w Javie w Cloud Functions, która pobiera informacje o adresie za pomocą odwrotnego interfejsu Geocoding API dla współrzędnych dostępnych w danych citibike_stations).
  3. interfejs Vertex AI Embeddings API i wyszukiwanie wektorowe w BigQuery do identyfikowania duplikatów;

Co utworzysz

  1. Utwórz zbiór danych BigQuery na potrzeby danego przypadku użycia. W tym zbiorze danych utworzysz tabelę docelową z danymi z tabeli publicznego zbioru danych bigquery-public-data.new_york_citibike.citibike_stations.
  2. Wdrożysz funkcję w Cloud Functions, która obejmuje wywoływanie funkcji Gemini do standaryzacji adresów.
  3. W tabelach docelowych (z 2 źródeł danych, które zostały udostępnione na potrzeby tej demonstracji) przechowujesz wzbogacone dane adresowe.
  4. W BigQuery wywołasz interfejs Vertex AI Embeddings API, aby uzyskać dane adresowe.
  5. Do identyfikowania duplikatów rekordów użyjesz wyszukiwania wektorowego w BigQuery.

Poniższy diagram przedstawia przepływ danych i etapów wdrażania.

Ogólny przepływ pracy w przypadku użycia

3. Wymagania

  • przeglądarka, np. Chrome lub Firefox;
  • projekt Google Cloud z włączonymi płatnościami;

4. Zanim zaczniesz

  1. W konsoli Google Cloud na stronie selektora projektu wybierz lub utwórz projekt Google Cloud.
  2. Sprawdź, czy w projekcie Cloud włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności .
  3. Użyjesz Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud, które jest wstępnie załadowane w bq. Kliknij Aktywuj Cloud Shell u góry konsoli Google Cloud.

Obraz przycisku aktywowania Cloud Shell

  1. Po połączeniu z Cloud Shell sprawdź, czy jesteś już uwierzytelniony i czy projekt jest ustawiony na identyfikator Twojego projektu, używając tego polecenia:
gcloud auth list
  1. Aby sprawdzić, czy polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
  1. Jeśli projekt nie jest ustawiony, użyj tego polecenia:
gcloud config set project <YOUR_PROJECT_ID>
  1. Aby włączyć interfejs API, przejdź do Gemini for Google Cloud Marketplace. Możesz też użyć tego polecenia w terminalu Cloud Shell:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. Upewnij się, że interfejsy API BigQuery, BigQuery Connection, Cloud Function, Cloud Run, Vertex AI i Cloud Build są włączone. Alternatywą dla polecenia gcloud jest konsola, do której można dostać się za pomocą tego linku.

Informacje o poleceniach i użytkowaniu gcloud znajdziesz w dokumentacji.

5. Tworzenie zbioru danych BigQuery i połączenia zewnętrznego

Zacznijmy od utworzenia zbioru danych i połączenia z zasobem Cloud.

Zbiór danych w BigQuery to kontener na wszystkie tabele i obiekty w aplikacji.

Aby utworzyć zbiór danych, wykonaj te czynności:

  1. Otwórz stronę BigQuery w konsoli Google Cloud.
  2. W panelu Eksplorator wybierz projekt, w którym chcesz utworzyć zbiór danych.
  3. Rozwiń opcję Działania (ikona pionowych kropek) i kliknij Utwórz zbiór danych.

Obraz menu Działania i opcji Utwórz zbiór danych

  1. W polu Identyfikator zbioru danych wpisz mdm_gemini.
  2. Ustaw typ lokalizacji na Multi-region i zaakceptuj wartość domyślną, czyli US(multiple regions in United States..
  3. Kliknij Utwórz zbiór danych.
  4. Sprawdź, czy zbiór danych został utworzony i wyświetlany pod identyfikatorem projektu w panelu Eksplorator.

Aby korzystać z Cloud Functions, musisz mieć połączenie z BigQuery. Aby utworzyć funkcję zdalną, musisz utworzyć połączenie z BigQuery. W tym laboratorium kodu użyjemy połączenia BigLake, aby uzyskać dostęp do modelu z BigQuery za pomocą funkcji Cloud Functions. Połączenia BigLake pomagają połączyć zewnętrzne źródło danych, zachowując przy tym szczegółową kontrolę dostępu i zabezpieczenia BigQuery, w naszym przypadku interfejs API Vertex AI Gemini Pro.

Aby utworzyć połączenie z BigLake, wykonaj te czynności:

  1. W panelu Eksplorator na stronie BigQuery kliknij Dodaj.

Konsole BigQuery z wyróżnionym przyciskiem DODAJ, aby dodać połączenie zewnętrzne

  1. Kliknij Połączenia z zewnętrznymi źródłami danych.
  2. Na liście Typ połączenia wybierz Modele zdalne Vertex AI, funkcje zdalne i BigLake (zasób Cloud).
  3. W polu Connection ID (Identyfikator połączenia) wpisz nazwę połączenia jako gemini-bq-conn.
  4. Ustaw typ lokalizacji na Multi-region i zaakceptuj wartość domyślną, czyli US(multiple regions in United States..
  5. Kliknij Utwórz połączenie.
  6. Kliknij Przejdź do połączenia,a następnie skopiuj identyfikator konta usługi w panelu Informacje o połączeniu.

Zrzut ekranu z informacjami o połączeniu

  1. Otwórz stronę Administracja i kliknij Przyznaj dostęp.
  2. Wklej identyfikator konta usługi w polu Nowe podmioty zabezpieczeń.
  3. Wybierz z listy rolę Vertex AI user, a następnie kliknij Zapisz.

Zrzut ekranu z przyznawaniem dostępu do konta usługi

Zbiór danych i połączenie z BigQuery zostały utworzone.

6. Wdrażanie wywołania funkcji Gemini (funkcja Java Cloud)

Aby wdrożyć funkcję Java Cloud Functions, która obejmuje wywoływanie funkcji Gemini, wykonaj te czynności:

  1. Sklonuj repozytorium GitHuba z terminala Cloud Shell za pomocą tego polecenia:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  1. Zastąp obiekty zastępcze YOUR_API_KEYYOUR_PROJECT_ID swoimi wartościami.

Jeśli przeczytasz tutaj wpis na blogu, dowiesz się, że implementacje wywoływania funkcji korzystają z interfejsu Reverse Geocoding API. Aby utworzyć własny klucz API_KEY, wykonaj instrukcje podane tutaj.

  1. W terminalu Cloud Shell przejdź do katalogu nowo skopiowanego projektu GeminiFunctionCalling i uruchom to polecenie, aby skompilować i wdrożyć funkcję Cloud Functions:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

Gdy pojawi się pytanie „Zezwalaj na nieuwierzytelnione wywołania”, odpowiedz „y”. Zgodnie z zaleceniem najlepiej skonfigurować uwierzytelnianie w przypadku aplikacji korporacyjnych. Ponieważ jest to aplikacja demonstracyjna, nie będziemy wymagać uwierzytelniania.

Dane wyjściowe to adres URL REST o tym formacie:

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

  1. Aby przetestować tę funkcję Cloud Functions, uruchom w terminalu to polecenie:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'

Odpowiedź na prompt dotyczący losowej próbki:

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

Parametry żądania i odpowiedzi tej funkcji Cloud Functions są implementowane w sposób zgodny z wywoływaniem funkcji zdalnej w BigQuery. Można go używać bezpośrednio w BigQuery. Oznacza to, że jeśli dane wejściowe (dane szerokości i długości geograficznej) znajdują się w BigQuery, możesz wywołać funkcję zdalną na tych danych i otrzymać odpowiedź funkcji, którą można przechowywać lub przetwarzać bezpośrednio w BigQuery.

  1. Aby utworzyć funkcję zdalną, która wywołuje tę wdrożony funkcję Cloud Functions, uruchom w BigQuery ten kod DDL:
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
 );

Testowe zapytanie, aby użyć utworzonej nowej funkcji zdalnej:

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

Jeśli testowe zapytanie korzystające z nowej funkcji zdalnej utworzonej w BigQuery kończy się niepowodzeniem z powodu problemu z uprawnieniami Cloud Functions, otwórz Cloud Functions w konsoli Google Cloud i znajdź wdrożoną funkcję Cloud Functions o nazwie „gemini-fn-calling". Otwórz kartę uprawnień, dodaj podmiot zabezpieczeń jako „allUsers” i przypisz rolę „Wywołujący funkcje Cloud Functions”, aby zapewnić dostęp do Cloud Functions wszystkim użytkownikom (tylko dlatego, że jest to aplikacja demonstracyjna).

7. Wypróbuj obejście problemu

Jeśli nie masz klucza API_KEY do wywołania funkcji odwrotnego geokodowania lub z jakiegoś powodu nie masz wdrożonej funkcji Cloud Functions, możesz wykonać te czynności:

  1. Pobierz plik CITIBIKE_STATIONS.csvrepozytorium do folderu projektu Cloud Shell i otwórz ten folder.
  2. Wyeksportuj dane z pliku CSV do nowego zbioru danych BigQuery mdm_gemini, używając tego polecenia w terminalu 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. Tworzenie tabeli i wzbogacanie danych adresowych

Krok 1. Utwórz tabelę

Ważne: jeśli zastosowałeś/aś obejście, pomiń ten krok, ponieważ musisz już mieć utworzoną tabelę.

Jeśli nie zastosowałeś obejścia, wykonaj w Edytorze SQL w BigQuery to zapytanie DDL:

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

Teraz wzbogaćmy dane adresu, wywołując funkcję zdalną na podstawie współrzędnych szerokości i długości geograficznej dostępnych w tabeli. Ustaw te warunki danych:

  • Zgłoszone w 2024 r.
  • Liczba dostępnych rowerów > 0
  • Pojemność > 100

Uruchom poniższe zapytanie:

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;

Krok 2. Utwórz drugie źródło danych o lokalizacji stacji rowerowej

Nie pomijaj tego kroku, nawet jeśli do utworzenia tabeli zastosowałeś/aś obejście.

W tym kroku utworzysz drugi, dodatkowy do tego ćwiczenia, sposób pozyskiwania danych o lokalizacji stacji rowerowej. Ma to pokazać, że MDM łączy dane z wielu źródeł i identyfikuje złotą prawdę.

Aby utworzyć drugi źródło danych o lokalizacji z 2 rekordami, uruchom w Edytorze SQL BigQuery podane niżej zapytania DDL. Nazwijmy tę tabelę mdm_gemini.CITIBIKE_STATIONS_SOURCE2 i wstawmy do niej 2 rekordy.

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. Generowanie wektorów danych adresowych

Reprezentacje właściwościowe to wielowymiarowe wektory liczbowe, które reprezentują dany element, np. fragment tekstu lub plik audio. Modele systemów uczących się (ML) używają wektorów zastępczych do kodowania semantyki takich jednostek, aby ułatwić ich analizowanie i porównywanie. Na przykład częstą operacją w modelach klasyfikacji, grupowania i rekomendacji jest pomiar odległości między wektorami w przestrzeni wektorów dystrybucyjnych w celu znalezienia elementów, które są najbardziej podobne pod względem semantycznym. Interfejs Vertex AI Text-Embedding API umożliwia tworzenie wektorów dystrybucyjnych tekstu za pomocą generatywnej AI w Vertex AI. Reprezentacje właściwościowe tekstu to liczbowe reprezentacje tekstu, które odzwierciedlają relacje między słowami i wyrażeniami. Więcej informacji o wektorach tekstowych Vertex AI znajdziesz tutaj.

  1. Aby utworzyć model zdalny dla interfejsu Vertex AI Embeddings API, uruchom poniższy DDL:
CREATE OR REPLACE MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (ENDPOINT = 'textembedding-gecko@latest');
  1. Teraz, gdy model encji zdalnych jest gotowy, wygeneruj enze dla pierwszego źródła i przechowuj je w tabeli za pomocą tego zapytania:
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 )
  )
);

Zamiast tworzyć nową tabelę, możesz też przechowywać pole wyników wbudowania w tej samej tabeli mdm_gemini.CITIBIKE_STATIONS, którą utworzyłeś/utworzyłaś wcześniej.

  1. Aby wygenerować zagęszczenia dla danych adresu w tabeli CITIBIKE_STATIONS_SOURCE2,wykonaj to zapytanie:
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;

Powinny zostać utworzone wektory dla drugiego źródła. Pamiętaj, że utworzyliśmy pole embeddings w tej samej tabeli CITIBIKE_STATIONS_SOURCE2.

  1. Aby zwizualizować wstępnie wygenerowane dla tabel danych źródłowych 1 i 2, uruchom to zapytanie:
select name,address,embeddings_src from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2`;
select name,content,ml_generate_embedding_result from `mdm_gemini.CITIBIKE_STATIONS_SOURCE1`;

Teraz wykonaj wyszukiwanie wektorowe, aby znaleźć duplikaty.

10. Przeprowadzanie wyszukiwania wektorowego w celu oznaczenia zduplikowanych adresów

W tym kroku wyszukasz w kolumnie ml_generate_embedding_result tabeli mdm_gemini.CITIBIKE_STATIONS_SOURCE1 2 najlepsze wskaźniki, które pasują do każdego wiersza danych w kolumnie embeddings_src tabeli mdm_gemini.CITIBIKE_STATIONS_SOURCE2.

Aby to zrobić, uruchom to zapytanie:

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, do której wysyłamy zapytanie: mdm_gemini.CITIBIKE_STATIONS_SOURCE1, pole ml_generate_embedding_result

Tabela, której używamy jako podstawy: mdm_gemini.CITIBIKE_STATIONS_SOURCE2 w polu embeddings_src

top_k: określa liczbę najbliższych sąsiadów do zwrócenia. Wartość domyślna to 10. Wartość ujemna jest traktowana jako nieskończoność, co oznacza, że wszystkie wartości są zliczane jako sąsiedzi i zwracane.

distance_type: określa typ danych, których należy użyć do obliczenia odległości między 2 wektorami. Obsługiwane typy odległości to Euklidesacosinus. Wartość domyślna to Euclidean.

Wynik zapytania:

Zestaw wyników

Jak widać, w przypadku 2 wierszy w tabeli CITIBIKE_STATIONS_SOURCE2 z tabeli CITIBIKE_STATIONS_SOURCE1 podano 2 najbliższe sąsiedzi (czyli najbliższe duplikaty). Ponieważ distance_type nie jest określony, przyjmuje się, że jest to odległość euklidesowa, a odległość jest odczytywana jako odległość w wartościach tekstowych adresu między 2 źródłami, przy czym najniższa wartość oznacza najbardziej podobne teksty adresów.

Ustaw wartość distance_type na Cosine, używając tego zapytania:

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;

Wynik zapytania:

Zestaw wyników 2

Oba zapytania (o obu typach odległości) są posortowane wg odległości malejąco, co oznacza, że chcemy wyświetlić wyniki w kolejności malejącej odległości. Zauważ, że kolejność odległości w drugim zapytaniu jest odwrotna. Czy wiesz, dlaczego?

Tak! Masz rację! W przypadku podobieństwa cosinusa większa liczba oznacza większe podobieństwo i mniejszy dystans. W przypadku odległości euklidesowej większa liczba oznacza większą odległość między wartościami.

Więcej informacji o MDM oraz porady na temat różnic i zastosowania metody euklidyjskiej i kosinusowej znajdziesz w poście na blogu.

11. Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby wykorzystane w tym poście, wykonaj te czynności:

  1. W konsoli Google Cloud otwórz stronę Zarządzanie zasobami.
  2. Na liście projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
  3. W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.
  4. Jeśli chcesz zachować projekt, pomiń powyższe czynności i usuń funkcję w usłudze Cloud Functions. Aby to zrobić, otwórz Cloud Functions, na liście funkcji zaznacz funkcję, którą chcesz usunąć, i kliknij Usuń.

12. Gratulacje

Gratulacje! Pokazałeś/pokazałaś, jak za pomocą Gemini 1.0 Pro i funkcji wywoływania można przekształcić kilka działań MDM w uproszczone, a jednak potężne, deterministyczne i niezawodne funkcje generatywnej AI. Teraz, gdy już to wiesz, możesz znaleźć inne sposoby implementacji tego samego przypadku użycia lub innych funkcji MDM. Czy istnieją zbiory danych, które można zweryfikować, luki informacyjne, które można wypełnić, czy zadania, które można zautomatyzować za pomocą wywołań strukturalnych wbudowanych w odpowiedzi generatywnej AI? Aby uzyskać bardziej szczegółowe wskazówki, zapoznaj się z dokumentacją Vertex AI, BigQuery Remote Functions, Cloud Functions, Embeddings i wyszukiwania wektorowego. Oto repozytorium tego projektu na GitHubie. Daj nam znać, co udało Ci się zbudować dzięki tym informacjom.