1. Przegląd
Czym jest zarządzanie danymi podstawowymi?
Zarządzanie danymi podstawowymi (MDM) polega na tworzeniu jednego, wiarygodnego źródła informacji o najważniejszych danych organizacji. Wyobraź sobie starannie uporządkowaną bibliotekę, w której każda książka (punkt danych) jest prawidłowo oznaczona, aktualna i łatwa do znalezienia.
Dane podstawowe to główne, podstawowe jednostki biznesowe, które są niezbędne do prowadzenia działalności firmy. Oto kluczowe elementy danych podstawowych:
- Podmioty biznesowe: podmioty takie jak klienci, produkty, dostawcy, lokalizacje i pracownicy, czyli rzeczowniki, wokół których obraca 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 każdą jednostkę, np. adres klienta, cena produktu itp.
Aby lepiej zrozumieć dane podstawowe, porównajmy je z danymi transakcyjnymi. Dane transakcyjne rejestrują poszczególne zdarzenia (zakup, wysyłkę itp.). Dane podstawowe zapewniają kontekst tych zdarzeń, definiując zaangażowane w nie podmioty. Na przykład transakcja sprzedaży jest połączona z danymi podstawowymi klienta, produktu i sprzedawcy.
Wdrożenie solidnego systemu MDM jest niezbędne do podejmowania strategicznych decyzji, ale może być złożone i wymagać dużych nakładów. W tym miejscu pojawia się transformacyjna moc generatywnej AI, zwłaszcza modeli takich jak Gemini 1.0 Pro, Gemini 1.0 Pro Vision i Gemini 1.5 Pro.
2. Cel
W tym ćwiczeniu pokażemy, jak Gemini 1.0 Pro upraszcza aplikacje do zarządzania danymi podstawowymi, takie jak wzbogacanie i deduplikacja, w przypadku danych citibike_stations dostępnych w publicznym zbiorze danych BigQuery.
Czego użyjesz
- publiczny zbiór danych BigQuery
bigquery-public-data.new_york_citibike, - Wywoływanie funkcji Gemini (funkcja Cloud Function w Javie, która pobiera informacje o adresie za pomocą interfejsu Reverse Geocoding API dla współrzędnych dostępnych w danych citibike_stations).
- Interfejs Vertex AI Embeddings API i wyszukiwanie wektorowe w BigQuery do identyfikowania duplikatów.
Co utworzysz
- Na potrzeby tego przypadku użycia utworzysz zbiór danych BigQuery. W tym zbiorze danych utworzysz tabelę docelową z danymi z tabeli publicznego zbioru danych
bigquery-public-data.new_york_citibike.citibike_stations. - Wdrożysz funkcję w Cloud Functions, która zawiera wywoływanie funkcji w Gemini do standaryzacji adresów.
- Wzbogacone dane adresowe będziesz przechowywać w tabelach docelowych (z 2 źródeł udostępnionych na potrzeby tej demonstracji).
- Wywołasz interfejs Vertex AI Embeddings API z BigQuery na danych adresowych.
- Do identyfikowania zduplikowanych rekordów użyjesz wyszukiwania wektorowego w BigQuery.
Poniższy diagram przedstawia przepływ danych i etapy wdrażania.

3. Wymagania
4. Zanim zaczniesz
- W konsoli Google Cloud na stronie selektora projektów wybierz lub utwórz projekt Google Cloud.
- Sprawdź, czy w projekcie Cloud włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności .
- Będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud, które jest wstępnie załadowane narzędziem bq. U góry konsoli Google Cloud kliknij Aktywuj Cloud Shell.

- Po połączeniu z Cloud Shell sprawdź, czy uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu, używając tego polecenia:
gcloud auth list
- Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
- Jeśli projekt nie jest ustawiony, użyj tego polecenia, aby go ustawić:
gcloud config set project <YOUR_PROJECT_ID>
- 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
- Sprawdź, czy interfejsy BigQuery API, BigQuery Connection API, Cloud Functions API, Cloud Run API, Vertex AI API i Cloud Build API są włączone. Alternatywą dla polecenia gcloud jest konsola, do której możesz przejść, klikając ten link.
Informacje o poleceniach gcloud i ich użyciu 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 wszystkich tabel i obiektów aplikacji.
Aby utworzyć zbiór danych, wykonaj te czynności:
- W konsoli Google Cloud otwórz stronę BigQuery.
- W panelu Eksplorator wybierz projekt, w którym chcesz utworzyć zbiór danych.
- Rozwiń opcję Działania (ikonę pionowego wielokropka) i kliknij Utwórz zbiór danych.

- W polu Identyfikator zbioru danych wpisz
mdm_gemini. - Ustaw typ lokalizacji jako
Multi-regioni zaakceptuj wartość domyślną, czyliUS(multiple regions in United States.. - Kliknij Utwórz zbiór danych.
- Sprawdź, czy zbiór danych został utworzony i jest widoczny pod identyfikatorem Twojego projektu w panelu Eksplorator.
Do interakcji z funkcją w Cloud Functions wymagane jest połączenie z BigQuery. Aby utworzyć funkcję zdalną, musisz utworzyć połączenie z BigQuery. W tym ćwiczeniu w Codelabs użyjemy połączenia BigLake, aby uzyskać dostęp do modelu z BigQuery za pomocą funkcji w Cloud Functions. Połączenia BigLake pomagają łączyć zewnętrzne źródło danych przy zachowaniu szczegółowej kontroli dostępu i bezpieczeństwa BigQuery, co w naszym przypadku oznacza interfejs Vertex AI Gemini Pro API.
Aby utworzyć połączenie BigLake, wykonaj te czynności:
- W panelu Eksplorator na stronie BigQuery kliknij Dodaj.

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

- Otwórz stronę IAM i Administracja i kliknij Przyznaj dostęp.
- Wklej identyfikator konta usługi w polu Nowe podmioty zabezpieczeń.
- Wybierz rolę
Vertex AI userz listy ról, a następnie kliknij Zapisz.

Zbiór danych i połączenie z BigQuery zostały utworzone.
6. Wdrażanie wywoływania funkcji w Gemini (funkcja w Cloud Functions w języku Java)
Aby wdrożyć funkcję Cloud Functions w Javie, która obejmuje wywoływanie funkcji w Gemini, wykonaj te czynności.
- Sklonuj repozytorium GitHub z terminala Cloud Shell za pomocą tego polecenia:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
- Zastąp symbole zastępcze
YOUR_API_KEYiYOUR_PROJECT_IDswoimi wartościami.
Jeśli przeczytasz tego bloga, dowiesz się, że implementacje wywoływania funkcji korzystają z interfejsu Reverse Geocoding API. Własny klucz API możesz utworzyć, postępując zgodnie z instrukcjami tutaj.
- W terminalu Cloud Shell przejdź do nowo sklonowanego katalogu projektu GeminiFunctionCalling i uruchom to polecenie, aby utworzyć i wdrożyć funkcję w 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”, powiedz „tak”. Zgodnie z zaleceniami najlepiej skonfigurować uwierzytelnianie w aplikacjach firmowych. Jest to jednak aplikacja w wersji demonstracyjnej, więc będziemy kontynuować bez uwierzytelniania.
Dane wyjściowe to adres URL REST w tym formacie:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling
- Przetestuj tę funkcję w Cloud Functions, uruchamiając w terminalu to polecenie:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'
Odpowiedź na prompt z losową próbką:
'{"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 Function są zaimplementowane w sposób zgodny z wywoływaniem funkcji zdalnych BigQuery. Można go używać bezpośrednio w danych BigQuery. Oznacza to, że jeśli dane wejściowe (dane o szerokości i długości geograficznej) znajdują się w BigQuery, możesz wywołać na nich funkcję zdalną i uzyskać odpowiedź, którą można bezpośrednio przechowywać lub przetwarzać w BigQuery.
- Aby utworzyć zdalną funkcję, która wywołuje wdrożoną funkcję w 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
);
Przetestuj zapytanie, aby użyć nowo utworzonej 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 nie powiedzie się z powodu problemu z uprawnieniami Cloud Functions, otwórz Cloud Functions w konsoli Google Cloud i znajdź wdrożoną funkcję Cloud Function o nazwie „gemini-fn-calling”. Otwórz kartę uprawnień, dodaj podmiot zabezpieczeń „allUsers” i przyznaj mu rolę „Wywołujący funkcje Cloud Functions”, aby mieć pewność, że funkcja w Cloud Functions jest dostępna dla wszystkich użytkowników (tylko dlatego, że jest to aplikacja w wersji demonstracyjnej).
7. Wypróbuj obejście
Jeśli nie masz niezbędnego klucza API_KEY do wywoływania funkcji odwrotnego geokodowania lub z jakiegoś powodu nie masz wdrożonej funkcji w Cloud Functions, możesz wykonać te czynności:
- Pobierz plik CITIBIKE_STATIONS.csv z repozytorium do folderu projektu Cloud Shell i przejdź do tego folderu.
- Wyeksportuj dane z pliku CSV do nowego zbioru danych BigQuery
mdm_gemini, używając w terminalu Cloud Shell tego polecenia:
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 zastosowano obejście, pomiń ten krok, ponieważ tabela została już utworzona.
Jeśli nie używasz obejścia, uruchom w edytorze SQL BigQuery ten kod 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 rowerowych
Nie pomijaj tego kroku, nawet jeśli do utworzenia tabeli używasz obejścia.
W tym kroku utworzysz drugie źródło danych o lokalizacji stacji rowerowych na potrzeby tego ćwiczenia. Ma to pokazać, że MDM łączy dane z wielu źródeł i określa „złotą prawdę”.
Uruchom w edytorze SQL BigQuery te instrukcje DDL, aby utworzyć drugie źródło danych o lokalizacji z 2 rekordami. 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 dystrybucyjnych dla danych adresowych
Wektory dystrybucyjne to wielowymiarowe wektory liczbowe, które reprezentują daną encję, np. fragment tekstu lub plik audio. Modele uczenia maszynowego wykorzystują osadzanie do kodowania semantyki takich elementów, aby ułatwić wnioskowanie na ich temat i porównywanie ich. Na przykład w modelach klastrowania, klasyfikacji i rekomendacji często mierzy się odległość między wektorami w przestrzeni wektorów dystrybucyjnych, aby znaleźć elementy, 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. Wektory dystrybucyjne tekstu to numeryczne reprezentacje tekstu, które odzwierciedlają relacje między słowami i wyrażeniami. Więcej informacji o wektorach dystrybucyjnych tekstu w Vertex AI znajdziesz tutaj.
- Uruchom poniższy kod DDL, aby utworzyć model zdalny dla interfejsu Vertex AI text embeddings API:
CREATE OR REPLACE MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (ENDPOINT = 'textembedding-gecko@latest');
- Model wektorów dystrybucyjnych zdalnie jest już gotowy. Wygenerujmy teraz wektory dystrybucyjne dla pierwszego źródła i zapiszmy 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ż zapisać pole z wynikami osadzania w tej samej tabeli mdm_gemini.CITIBIKE_STATIONS, którą utworzyliśmy wcześniej.
- Aby wygenerować embeddingi dla danych adresowych w tabeli CITIBIKE_STATIONS_SOURCE2,uruchom 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;
Spowoduje to utworzenie wektorów dystrybucyjnych dla drugiego źródła. Pole wektorów zostało utworzone w tej samej tabeli CITIBIKE_STATIONS_SOURCE2.
- Aby wizualizować wektory dystrybucyjne 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 wykonajmy wyszukiwanie wektorowe, aby zidentyfikować duplikaty.
10. Wykonywanie wyszukiwania wektorowego w celu oznaczania zduplikowanych adresów
W tym kroku wyszukasz w kolumnie ml_generate_embedding_result tabeli mdm_gemini.CITIBIKE_STATIONS_SOURCE1 2 najbardziej podobne wektory osadzenia adresów, 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 w polu 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ą traktowane jako sąsiednie i zwracane.
distance_type::określa typ wskaźnika, który ma być używany do obliczania odległości między 2 wektorami. Obsługiwane typy odległości to euklidesowa i kosinusowa. Wartość domyślna to Euclidean.
Wynik zapytania wygląda tak:

Jak widać, w przypadku 2 wierszy w kolumnie CITIBIKE_STATIONS_SOURCE2 z tabeli CITIBIKE_STATIONS_SOURCE1 wyświetlono 2 najbliższe sąsiednie wiersze (czyli najbliższe duplikaty). Ponieważ distance_type nie jest określony, zakłada się, że jest to przestrzeń euklidesowa, a odległość jest odczytywana jako odległość między wartościami tekstowymi w adresach z 2 źródeł. Najniższa wartość oznacza najbardziej podobne teksty adresów.
Ustawmy distance_type na Cosine za pomocą 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 wygląda tak:

Oba zapytania (dotyczące obu typów odległości) są uporządkowane według odległości w kolejności malejącej, co oznacza, że chcemy wyświetlać wyniki w kolejności malejącej odległości. Zauważysz jednak, że kolejność odległości w przypadku drugiego zapytania jest odwrotna. Zgadniesz dlaczego?
Tak!! Masz rację! W przypadku podobieństwa kosinusowego większa liczba oznacza większe podobieństwo i mniejszą odległość. W przypadku odległości euklidesowej większa liczba oznacza większą odległość między wartościami.
Więcej informacji o MDM oraz wskazówki, które pomogą Ci zrozumieć różnice między odległością euklidesową a odległością kosinusową i ich zastosowania, znajdziesz na blogu.
11. Czyszczenie danych
Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby użyte w tym poście, wykonaj te czynności:
- W konsoli Google Cloud otwórz stronę Zarządzanie zasobami.
- Z listy projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
- W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.
- Jeśli chcesz zachować projekt, pomiń powyższe kroki i usuń funkcję Cloud Function. W tym celu otwórz Cloud Functions, na liście funkcji zaznacz tę, którą chcesz usunąć, i kliknij Usuń.
12. Gratulacje
Gratulacje! Pokazujesz, jak wykorzystanie Gemini 1.0 Pro i wywoływania funkcji może przekształcić kilka działań MDM w uproszczone, ale zaawansowane, deterministyczne i niezawodne funkcje generatywnej AI. Teraz, gdy już to wiesz, możesz znaleźć inne sposoby wdrożenia tego samego przypadku użycia lub innych funkcji MDM. Are there datasets you could validate, information gaps you could fill, or tasks that could be automated with structured calls embedded within your generative AI responses? Więcej szczegółowych wskazówek znajdziesz w dokumentacji Vertex AI, funkcji zdalnych BigQuery, Cloud Functions, wektorów i wyszukiwania wektorowego. Oto repozytorium GitHub dla tego projektu. Daj nam znać, co udało Ci się stworzyć dzięki tej wiedzy.