Informacje o tym ćwiczeniu (w Codelabs)
1. Omówienie
Wyobraź sobie aplikację modową, która nie tylko pomaga znaleźć idealny strój, ale też udziela porad dotyczących stylizacji w czasie rzeczywistym. Wszystko dzięki potężnej integracji z generatywną AI. W tej prezentacji omówimy, jak zbudowaliśmy taką aplikację, korzystając z funkcji wyszukiwania wektorów w AlloyDB w połączeniu z indeksem ScaNN Google, co umożliwia błyskawiczne wyszukiwanie pasujących strojów i podawanie natychmiastowych rekomendacji dotyczących mody.
Opiszemy też, jak indeks ScaNN firmy AlloyDB optymalizuje złożone zapytania, aby generować spersonalizowane sugestie dotyczące stylu. Korzystamy też z modeli generatywnej AI Gemini i Imagen, aby dostarczać Ci inspiracji do kreatywnego stylizowania, a nawet wizualizować spersonalizowane stylizacje. Cała aplikacja została zbudowana na podstawie architektury bezserwerowej, co zapewnia użytkownikom płynne i skalowalne działanie.
Wyzwanie: aplikacja ma pomóc osobom, które mają problem z podejmowaniem decyzji dotyczących mody, oferując spersonalizowane propozycje stylizacji. Pomaga też uniknąć zmęczenia decyzjami związanymi z planowaniem stroju.
Rozwiązanie: aplikacja z rekomendacjami dotyczącymi strojów rozwiązuje problem zapewnienia użytkownikom inteligentnych, spersonalizowanych i zaangażowanych treści związanych z modą, a zarazem demonstruje możliwości AlloyDB, generatywnej AI i technologii bezserwerowych.
Co utworzysz
W ramach tego laboratorium wykonasz te czynności:
- Tworzenie instancji AlloyDB i wczytywanie zbioru danych E-commerce
- Włączanie w AlloyDB rozszerzeń pgvector i modeli generatywnej AI
- Generowanie wektorów na podstawie opisu produktu
- Wdrażanie rozwiązania w bezserwerowych funkcjach Cloud Run
- Prześlij obraz do Gemini i wygeneruj prompt opisu obrazu.
- generować wyniki wyszukiwania na podstawie promptów połączonych z wektorami w zbiorze danych e-commerce;
- Dodaj dodatkowe prompty, aby dostosować prompt i utworzyć rekomendacje dotyczące stylu.
- Wdrażanie rozwiązania w bezserwerowych funkcjach Cloud Run
Wymagania
2. Architektura
Ogólna architektura aplikacji:
W poniższych sekcjach omówiono kontekstowy przepływ samouczka:
Przetwarzanie:
Pierwszym krokiem jest przetworzenie danych o handlu detalicznym (asortyment, opisy produktów, interakcje z klientem) na potrzeby AlloyDB.
Silnik Analytics:
Jako mechanizm analityczny użyjemy usługi AlloyDB, aby wykonać te czynności:
- Wyodrębnianie kontekstu: mechanizm analizuje dane przechowywane w AlloyDB, aby zrozumieć relacje między produktami, kategoriami, zachowaniami klientów itp.
- Tworzenie zasobów: zasoby (matematyczne reprezentacje tekstu) są generowane zarówno dla zapytania użytkownika, jak i informacji przechowywanych w AlloyDB.
- Wyszukiwanie wektorowe: wyszukiwarka przeprowadza wyszukiwanie podobne, porównując wektor zapytania z wektorami opisów produktów, opinii i innych odpowiednich danych. W ten sposób zidentyfikujesz 25 najbardziej odpowiednich „najbliższych sąsiadów”.
Rekomendacja Gemini:
Tablica bajtów obrazu jest przekazywana do modelu Gemini za pomocą interfejsu Vertex AI API wraz z prośbą o tekstowy opis górnej części garderoby oraz sugestiami dotyczącymi dolnej części garderoby.
AlloyDB RAG i wyszukiwanie wektorowe:
Opis odzieży wierzchniej jest używany do wysyłania zapytań do bazy danych. Zapytanie konwertuje tekst wyszukiwania (rekomendacja z modelu Gemini dotycząca pasujących spodni) na wektory dystrybucyjne i wykonuje wyszukiwanie wektorowe na wektorach dystrybucyjnych przechowywanych w bazie danych, aby znaleźć najbliższych sąsiadów (pasujące wyniki). Aby zwiększyć odzyskiwanie, wektory dystrybucyjne w bazie danych AlloyDB są indeksowane za pomocą indeksu ScaNN.
Generowanie obrazu odpowiedzi:
Walidowane odpowiedzi są strukturyzowane w tablicę JSON, a cały mechanizm jest pakowany w bezserwerową funkcję Cloud Run, która jest wywoływana z narzędzia Agent Builder.
Generowanie obrazów w Imagen:
Prośba użytkownika o stylizację, wybrana przez niego rekomendacja i wszystkie prośby o personalizację są łączone, aby przekazać Imagenowi 3 istniejący obraz. Obraz stylizowany jest generowany na podstawie tego promptu za pomocą interfejsu Vertex AI API.
3. Zanim zaczniesz
Utwórz projekt
- W konsoli Google Cloud na stronie selektora projektu 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 .
- Użyjesz Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud, które jest wstępnie załadowane w bq. U góry konsoli Google Cloud kliknij Aktywuj Cloud Shell (
).
- Po połączeniu z Cloud Shell sprawdź, czy jesteś już uwierzytelniony i czy projekt ma ustawiony identyfikator Twojego projektu, używając tego polecenia:
gcloud auth list
- Uruchom to polecenie, aby sprawdzić, czy przyszłe polecenia gcloud będą prawidłowo identyfikować Twój projekt.
gcloud config list project
- Jeśli projekt nie jest ustawiony, użyj tego polecenia, aby ustawić go wyraźnie:
gcloud config set project <YOUR_PROJECT_ID>
- Włącz wymagane interfejsy API.
Aby włączyć interfejsy API, kliknij ten link.
Jeśli zapomnisz włączyć jakiś interfejs API, możesz to zrobić w trakcie implementacji.
Więcej informacji o poleceniach i sposobie korzystania z gcloud znajdziesz w dokumentacji.
4. Konfiguracja bazy danych
W tym module użyjemy bazy danych AlloyDB do przechowywania zbioru danych o e-commerce. Do przechowywania wszystkich zasobów, takich jak bazy danych i logi, używa klastrów. Każdy klaster ma instancję główną, która stanowi punkt dostępu do danych. Tabele to rzeczywiste zasoby, które przechowują dane.
Utwórz klaster, instancję i tabelę AlloyDB, do której zostanie załadowany zbiór danych e-commerce.
Tworzenie klastra i instancji
- W konsoli Google Cloud wyszukaj AlloyDB. Najłatwiej znaleźć większość stron w Cloud Console jest za pomocą paska wyszukiwania w konsoli.
- Kliknij UTWÓRZ KLASTER.
- Utwórz klaster i instancję z tymi wartościami:
- identyfikator klastra: „
shopping-cluster
”; - hasło: „
alloydb
” - Zgodność z PostgreSQL 15
- Region: „
us-central1
” - Networking: „
default
”
- Po wybraniu sieci domyślnej w sekcji Sieć pojawi się ta opcja. Aby skonfigurować sieć domyślną, kliknij SKONFIGUJ POŁĄCZENIE.
- Wybierz Użyj automatycznie przydzielonego zakresu adresów IP i kliknij Dalej. Po sprawdzeniu informacji kliknij UTWÓRZ POŁĄCZENIE.
Poczekaj na zakończenie tworzenia domyślnej sieci.
- W sekcji Konfigurowanie instancji głównej ustaw identyfikator instancji jako „
shopping-instance"
”.
- Kliknij UTWÓRZ KLASTER, aby dokończyć konfigurowanie klastra:
5. Pozyskiwanie danych
Teraz dodaj tabelę z danymi o sklepie. Poczekaj, aż instancja zostanie utworzona. Po utworzeniu klastra możesz zalogować się w AlloyDB, używając danych logowania skonfigurowanych podczas tworzenia klastra.
Uwierzytelnianie w bazie danych AlloyDB
- W konsoli Google Cloud otwórz AlloyDB. Wybierz klaster główny, a następnie w menu nawigacyjnym po lewej stronie kliknij AlloyDB Studio:
- Aby uwierzytelnić się w bazie danych AlloyDB, podaj te dane:
- Nazwa użytkownika: „
postgres
” - Baza danych: „
postgres
” - Hasło: „
alloydb
”
Po uwierzytelnieniu się w AlloyDB Studio możesz wpisywać polecenia SQL na kartach Edytor. Możesz dodać większą liczbę okien Edytora, klikając plusa po prawej stronie pierwszej karty Edytora.
Polecenia AlloyDB wpisujesz w oknach edytora, korzystając w razie potrzeby z opcji Uruchom, Formatuj i Wyczyść.
Włączanie rozszerzeń
Do tworzenia tej aplikacji użyjemy rozszerzeń „pgvector"
” i „google_ml_integration"
”.
- Rozszerzenie pgvector umożliwia przechowywanie wektorów dystrybucyjnych i wyszukiwanie ich.
- Rozszerzenie google_ml_integration udostępnia funkcje, których używasz do uzyskiwania dostępu do punktów końcowych prognozowania Vertex AI w celu uzyskiwania prognoz w SQL.
- Włącz te rozszerzenia, uruchamiając te DDL:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
- Aby sprawdzić, czy rozszerzenia są zainstalowane, uruchom to polecenie SQL:
select extname, extversion from pg_extension;
Tworzenie tabeli
- Utwórz tabelę za pomocą tej instrukcji DDL:
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
Po wykonaniu tego polecenia powinna się wyświetlić tabela
w bazie danych. Przykład na obrazku:
Pozyskiwanie danych
W tym module mamy dane testowe w postaci około 200 rekordów w pliku SQL. Zawiera id, category, sub_category, uri, image
i content
. Pozostałe pola zostaną wypełnione później w ramach tego modułu.
- Skopiuj 20 wierszy lub instrukcji insert z pliku SQL na nowej karcie Edytor w AlloyDB Studio i kliknij URUCHAMI.
- Rozwiń sekcję Eksplorator, aż zobaczysz tabelę o nazwie
apparels
. - Kliknij ikonę menu [⋮] i wybierz Zapytanie. W nowej karcie Edytor otworzy się instrukcja SELECT.
- Kliknij Uruchom, aby sprawdzić, czy wiersze zostały wstawione.
Przyznawanie uprawnień użytkownikowi
Użytkownikowi postgres
przyznamy uprawnienia do generowania wbudowanych obiektów w AlloyDB..
W AlloyDB Studio wykonaj to polecenie, aby przyznać użytkownikowi postgres
uprawnienia do wykonywania funkcji embedding
:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
Przypisz rolę Vertex AI USER do konta usługi AlloyDB
Do generowania wektorów dystrybucyjnych użyjemy modeli tekstowych Vertex AI, których rola użytkownika Vertex AI zostanie przypisana do konta usługi AlloyDB.
W konsoli Google Cloud kliknij ikonę terminala Cloud Shell [] i uruchom to polecenie:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
6. Kontekst kompilacji
Aby utworzyć kod embed, potrzebujemy context
, czyli wszystkich informacji, które chcemy uwzględnić w jednym polu. Aby to zrobić, utworzymy opis produktu, który zapiszemy w kolumnie pdt_desc
tabeli apparels
.
W naszym przypadku użyjemy wszystkich informacji o każdym produkcie, ale gdy będziesz wykorzystywać własne dane, możesz je przekształcić w dowolny sposób, który będzie dla Ciebie odpowiedni.
Na karcie Edytor w AlloyDB Studio uruchom to polecenie, które aktualizuje pole pdt_desc
danymi kontekstowymi:
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
Ten DML tworzy proste podsumowanie kontekstu, korzystając z informacji ze wszystkich pól dostępnych w tabeli i z innych zależności (jeśli występują w Twoim przypadku użycia). Aby uzyskać bardziej precyzyjny wybór informacji i tworzenie kontekstu, możesz dowolnie przekształcać dane w sposób, który uznasz za odpowiedni dla swojej firmy.
7. Tworzenie wektorów kontekstu
Komputery znacznie łatwiej przetwarzają liczby niż tekst. System umieszczania konwertuje tekst w serię liczb zmiennoprzecinkowych, które powinny reprezentować tekst, niezależnie od tego, jak jest sformułowany, w jakim języku jest itd.
Możesz opisać miejsce nad morzem. Może ona nosić nazwę „"on the water
”, „beachfront
”, „walk from your room to the ocean
”, „sur la mer
”, „на берегу океана
” itp. Wszystkie te terminy wyglądają inaczej, ale ich znaczenie semantyczne lub, mówiąc językiem uczenia maszynowego, ich wektory powinny być bardzo podobne.
Gdy dane i kontekst będą gotowe, uruchomimy zapytanie SQL, aby dodać do tabeli w polu embedding
zaszyfrowane informacje z kolumny (pdt_desc
opisu produktu. Możesz używać różnych modeli wstawiania. Używamy usługi text-embedding-005
z Vertex AI.
- W AlloyDB Studio uruchom podane niżej polecenie, aby wygenerować wektory dystrybucyjne, i zaktualizuj kolumnę
pdt_desc
, zastępując wektorami dane, które ona przechowuje:
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-005',
pdt_desc)
WHERE
TRUE;
- Aby sprawdzić, czy osadzone elementy zostały wygenerowane, uruchom to polecenie:
SELECT
id,
category,
sub_category,
content,
embedding
FROM
Apparels
LIMIT 5;
Oto przykład wektora zanurzonego, który wygląda jak tablica liczb zmiennoprzecinkowych, dla przykładowego tekstu w zapytaniu:
8. Wykonywanie wyszukiwania wektorowego
Teraz, gdy tabela, dane i wektory są gotowe, przeprowadźmy wyszukiwanie wektorów w czasie rzeczywistym dla tekstu wyszukiwanego przez użytkownika.
Załóżmy, że użytkownik wpisze w polu wyszukiwania tekst „pink color, casual, pure cotton tops for women
”.
Aby znaleźć dopasowania dla tego zapytania, uruchom to zapytanie SQL:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;
Przyjrzyjmy się temu zapytaniu bliżej:
W tym zapytaniu
- Tekst wyszukiwania użytkownika: „
I want womens tops, pink casual only pure cotton.
”. - Konwertujemy ten tekst wyszukiwania na wektory za pomocą metody
embedding()
i modelutext-embedding-005
. Ten krok powinien być Ci już znany z ostatniego kroku, w którym zastosowaliśmy funkcję umieszczania we wszystkich elementach w tabeli. - „
<=>
” oznacza użycie metody odległości COSINY SIMILARNOŚCI. Wszystkie dostępne miary podobieństwa znajdziesz w dokumentacji pgvector. - Przekształcamy wynik metody dystrybucji w typ danych wektora, aby zapewnić zgodność z wektorami zapisanymi w bazie danych.
- LIMIT 5 oznacza, że chcemy wyodrębnić 5 najbliższych sąsiadów dla tekstu wyszukiwania.
Poniżej przedstawiamy przykładową odpowiedź na to zapytanie SQL:
Jak widać w wynikach, dopasowania są bardzo zbliżone do tekstu wyszukiwania. Spróbuj zmienić kolor, aby zobaczyć, jak zmieniają się wyniki.
Indeks AlloyDB ScaNN dla wydajności zapytań
Załóżmy, że chcemy zwiększyć wydajność (czas zapytania), wydajność i wspomnienie tego wyniku wyszukiwania wektorów za pomocą indeksu ScaNN.
Jeśli chcesz użyć indeksu ScaNN, wykonaj te czynności:
- Ponieważ mamy już utworzone klastry, instancje, konteksty i wkłady, wystarczy zainstalować rozszerzenie ScaNN za pomocą tego polecenia:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- Utwórz indeks ScaNN:
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
W powyższym DDL:
apparel_index
to nazwa indeksu.apparels
to nazwa tabeli.scann
to metoda indeksu.embedding
to kolumna w tabeli, którą chcesz zindeksować.cosine
to metoda odległości, której chcesz użyć w indeksie.54
to liczba partycji, które mają być stosowane do tego indeksu. Ustaw dowolną wartość od 1 do 1048576. Więcej informacji o tym, jak określić tę wartość, znajdziesz w artykule Dostosowanie indeksu ScaNN.
Zgodnie z zaleceniem w repozytorium ScaNN użyliśmy kwadratowego pierwiastka z liczby punktów danych. Podczas partycjonowania wartość num_leaves
powinna być zbliżona do pierwiastka kwadratowego z liczby punktów danych.
- Sprawdź, czy indeks został utworzony, używając zapytania:
SELECT * FROM pg_stat_ann_indexes;
- Wykonaj wyszukiwanie wektorowe, używając tego samego zapytania, które zostało użyte bez indeksu:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
Powyższe zapytanie jest takie samo jak zapytanie użyte w laboratorium w kroku 8. Teraz jednak mamy pole zindeksowane za pomocą indeksu ScaNN.
- Przetestuj proste zapytanie z wykorzystaniem indeksu i bez niego. Aby przetestować indeksowanie bez indeksu, musisz usunąć indeks:
white tops for girls without any print
Powyższy tekst wyszukiwania w zapytaniu wyszukiwania wektorowego na danych wektorów dystrybucyjnych skutkuje jakościowymi wynikami wyszukiwania i wydajnością. Wydajność jest znacznie wyższa (w ujęciu czasu wykonania: 10,37 ms bez ScaNN i 0,87 ms z ScaNN) dzięki indeksowi. Więcej informacji na ten temat znajdziesz w tym poście na blogu.
9. Weryfikacja dopasowania za pomocą LLM
Zanim przejdziemy do tworzenia usługi, która zwraca najlepsze dopasowania do aplikacji, użyjemy generatywnego modelu AI, aby sprawdzić, czy te potencjalne odpowiedzi są naprawdę trafne i czy można je udostępnić użytkownikowi.
Sprawdzanie, czy instancja jest skonfigurowana pod kątem Gemini
- Sprawdź, czy
google_ml_integration
jest już włączone w przypadku Twojego klastra i instancji. W AlloyDB Studio uruchom to polecenie:
show google_ml_integration.enable_model_support;
Jeśli wartość jest wyświetlana jako „włączona”, możesz pominąć 2 kolejne kroki i przejść bezpośrednio do konfiguracji.
integrację AlloyDB z modelem Vertex AI;
- Otwórz instancję główną klastra AlloyDB i kliknij EDYTUJ INSTANCJĘ GŁÓWNĄ.
- W sekcji Zaawansowane opcje konfiguracji rozwiń sekcję Nowa flaga bazy danych i upewnij się, że wartość
google_ml_integration.enable_model_support flag
to „on
”:
3. Jeśli nie jest ustawiona wartość „
on
”, ustaw ją na „on
”, a potem kliknij ZAKTUALNIJ PRZYKŁAD.
Ten krok zajmie kilka minut.
Integracja AlloyDB z modelem Vertex AI
Teraz możesz połączyć się z AlloyDB Studio i uruchomić to polecenie DML, aby skonfigurować dostęp do modelu Gemini z AlloyDB. W odpowiednim miejscu użyj identyfikatora projektu. Zanim uruchomisz polecenie, możesz zobaczyć ostrzeżenie o błędzie składni, ale powinno ono działać prawidłowo.
- W konsoli Google Cloud otwórz AlloyDB. Wybierz klaster główny, a następnie w menu nawigacyjnym po lewej stronie kliknij AlloyDB Studio.
- Użyjemy
gemini-1.5-pro:generateContent
domyślnie dostępnego w rozszerzeniugoogle_ml_integration
. - Aby sprawdzić modele skonfigurowane pod kątem dostępu, uruchom w AlloyDB Studio to polecenie:
select model_id,model_type from google_ml.model_info_view;
- Aby przyznać użytkownikom bazy danych uprawnienia do wykonywania funkcji ml_predict_row, która służy do wykonywania prognoz za pomocą modeli Google Vertex AI, uruchom to polecenie:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
Ocenianie odpowiedzi
W następnej sekcji, w której przeniesiemy aplikację do Cloud Run, użyjemy jednego dużego zapytania, które może być trudne do zrozumienia. Aby zapewnić odpowiednie odpowiedzi na to zapytanie, użyjemy w nim dużej ilości danych.
Przyjrzymy się poszczególnym sekcją, które składają się na większe zapytanie, którego ostatecznie użyjemy.
- Najpierw wysyłamy do bazy danych żądanie z prośbą o uzyskanie 5 najbardziej pasujących wyników do zapytania użytkownika. Aby uprościć ten przykład, zapytanie jest zakodowane na stałe, ale nie martw się, później je interpolujemy.
Dodajemy opis produktu z tabeli apparels
i 2 nowe pola: jedno, które łączy opis z indeksem, i drugie, które łączy opis z pierwotnym żądaniem. Te dane są zapisywane w tabelce o nazwie xyz
, która jest nazwą tymczasowej tabeli.
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
Dane wyjściowe tego zapytania to 5 najbardziej podobnych wierszy dotyczących zapytania użytkownika. Jej
nowa tabela xyz
będzie zawierać 5 wierszy, z których każdy będzie miał te kolumny:
literature
content
user_text
- Aby określić, na ile odpowiedzi są prawidłowe, użyjemy złożonego zapytania, w którym wyjaśnimy, jak je oceniać. W zapytaniu są używane kolumny
user_text
icontent
z tabelixyz
.
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- Następnie na podstawie tego zapytania sprawdzimy „przydatność” odpowiedzi w tabeli
xyz
. Pod pojęciem „dobrego dopasowania” rozumiemy, na ile odpowiedzi są zgodne z naszym oczekiwaniem.
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
- Funkcja
predict_row
zwraca wynik w formacie JSON. Kod „-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"
” służy do wyodrębniania rzeczywistego tekstu z tego pliku JSON. Aby zobaczyć zwrócony kod JSON, możesz usunąć ten kod. - Aby uzyskać pole LLM, wystarczy je wyodrębnić z tabeli x:
SELECT
LLM_RESPONSE
FROM
x;
- Możesz je połączyć w jedno zapytanie w ten sposób:
Ostrzeżenie: jeśli wykonasz powyższe zapytania, aby sprawdzić wyniki pośrednie,
przed uruchomieniem tego zapytania usuń tabele xyz
i x
z bazy danych AlloyDB.
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
Większe zapytanie to kombinacja wszystkich zapytań wykonanych na wcześniejszych etapach. Wyniki pokazują, czy istnieje dopasowanie, jaki jest jego odsetek i jaki jest to rodzaj oceny.
Zwróć uwagę, że model Gemini ma domyślnie włączone strumieniowanie, więc rzeczywista odpowiedź jest rozłożona na kilka wierszy:
10. Przeniesienie aplikacji do sieci
Teraz umieścimy tę aplikację na serwerze, aby można było z niej korzystać w internecie.
Tworzenie funkcji Cloud Run
- W konsoli Google Cloud otwórz Cloud Run Functions, korzystając z tego linku:
https://console.cloud.google.com/run/create?deploymentType=function
- W sekcji Konfiguruj ustaw nazwę funkcji na „retail-engine”, a region na „us-central1”.
- W polu Endpoint URL (Adres URL punktu końcowego) wybierz środowisko uruchomieniowe Java 17.
- W sekcji Uwierzytelnianie wybierz Zezwalaj na nieuwierzytelnione wywołania.
- Rozwiń sekcję Kontenery, woluminy, sieć, zabezpieczenia i kliknij kartę Sieć.
- Kliknij Łącz się z siecią VPC w przypadku ruchu wychodzącego, a następnie Używaj oprogramowania sprzęgającego bezserwerowego dostępu do VPC.
- W sekcji Sieć kliknij Dodaj nowe oprogramowanie sprzęgające VPC. Włącz interfejs API bezserwerowego dostępu do VPC, jeśli nie jest jeszcze włączony.
- W polu „Create connector” (Utwórz łącznik) wpisz
alloydb-test-conn
. - Ustaw region na
us-central
. - Pozostaw wartość sieci jako domyślna, a podsieć ustaw jako Niestandardowy zakres adresów IP z zakresem adresów 10.8.0.0 lub podobnym, który jest dostępny.
- Rozwiń ustawienia Pokaż skalowanie i ustaw Minimalna liczba instancji na 2, a Maksymalna liczba instancji na 3.
- Jako typ instancji wybierz f1-micro. Poniżej znajdziesz opcje tworzenia połączeń:
- Kliknij Utwórz, aby utworzyć łącznik.
- W sekcji Kierowanie ruchu wybierz Kieruj do VPC cały ruch.
- Kliknij Utwórz, aby utworzyć funkcję.
Wdrażanie aplikacji
Po utworzeniu funkcji zaktualizuj źródło i ponownie wdrocz aplikację.
- W Cloud Run kliknij kolejno karty Usługi i retail-engine.
- Kliknij kartę Źródło. Pozostaw domyślne ustawienie Punkt wejścia funkcji jako „
gcfv2.HelloHttpFunction
”. - Zamień zawartość pliku HelloHttpFunction.java na zawartość tego pliku Java.
- Zaktualizuj w pliku szczegóły AlloyDbJdbcConnector zgodnie ze szczegółami instancji i klastra AlloyDB. Zastąp
$PROJECT_ID
identyfikatorem projektu klastra i instancji AlloyDB.
- Zamień zawartość pliku pom.xml na zawartość tego pliku XML.
- Aby wdrożyć funkcję, kliknij Zapisz i ponownie wdrożyć.
11. Testowanie aplikacji silnika handlu detalicznego
Po wdrożeniu zaktualizowanej funkcji w Cloud Functions punkt końcowy powinien mieć następujący format:
https://retail-engine-PROJECT_NUMBER.us-central1.run.app
Możesz go przetestować w terminalu Cloud Shell, uruchamiając to polecenie:
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
Funkcję Cloud Run możesz też przetestować w ten sposób:
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
A oto wynik:
Teraz, gdy wykonaliśmy wyszukiwanie wektorów podobieństwa za pomocą modelu wektorów w przypadku danych z AlloyDB, możemy przejść do tworzenia aplikacji, która używa tych wektorów wraz z Twoim obrazem, oraz promptów do generowania sugestii stylizacji.
12. Omówienie procesu rekomendacji strojów
Aplikacja do rekomendowania strojów to aplikacja startowa sprintu skonfigurowana do współpracy z wbudowanymi modelami z aplikacji AlloyDB Retail-Engine oraz z Gemini i Imagen, aby generować wizualne opcje stylizacji. Pozwala też dodawać niestandardowe prompty i improwizować rekomendacje.
Wyobraź sobie, że przesyłasz do tej aplikacji zdjęcie różowej bluzki z swojej szafy. Gdy klikniesz Pokaż, aplikacja na podstawie prompta ustawionego w jej kodzie i wbudowanych danych w bazie danych AlloyDB wygeneruje kilka opcji pasujących do oryginalnego obrazu. Chcesz teraz sprawdzić, jak sugerowane opcje wyglądają z niebieskim naszyjnikiem, więc dodajesz prompt na tych liniach i klikasz Styl. Na koniec generowany jest obraz, który łączy oryginalne zdjęcie z rekomendacjami, aby utworzyć pasujący strój.
Aby rozpocząć tworzenie aplikacji z zaleceniami dotyczącymi strojów:
- W Cloud Run otwórz aplikację retail-engine i zanotuj adres URL aplikacji. To repozytorium zasobów danych, które wykorzystamy do generowania podobnych sugestii.
- W swoim IDE sklonuj repozytorium https://github.com/AbiramiSukumaran/outfit-recommender/. W tym ćwiczeniu czynności są wykonywane w środowisku IDE Visual Studio Code.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/
Oto niektóre ważne pliki w katalogu aplikacji:
src/main
: katalog źródłowy, w którym znajdują się pliki aplikacji i HTML:HelloWorldApplication.java
: główny punkt wejścia do aplikacji Spring Boot.HelloWorldController.java
: kontroler REST Spring Boot, który obsługuje żądania HTTP związane z aplikacją do rekomendowania strojów. Ten plik obsługuje żądania GET i POST, przetwarza prompty użytkownika, analizuje obrazy, współpracuje z embeddingami AlloyDB i zwraca ostateczną odpowiedź do interfejsu użytkownika. Ten kontroler wywołuje klasę GenerateImageSample.GenerateImageSample.java
: zawiera klasę generowania obrazu, która łączy się z Vertex AI, formatuje prompt użytkownika, wykonuje wywołania interfejsu API do modelu Imagen, zwraca przewidywany obraz do klasy kontrolera.Resources
: ten katalog zawiera obrazy i pliki HTML wymagane do wygenerowania interfejsu aplikacji.Pom.xml
: definiuje zależności i konfiguracje projektu.
- W kodzie Visual Studio otwórz
HelloWorldController.java
i zaktualizuj instancje identyfikatora projektu i lokalizacji zgodnie z miejscem utworzenia instancji AlloyDB.
- Zmień
endpoint
na adres URL aplikacji retail-engine, który został wcześniej hostowany.
- Otwórz
GenerateImageSample.java
i zaktualizuj identyfikator projektu oraz lokalizację zgodnie z miejscem utworzenia instancji AlloyDB.
- Zapisz wszystkie pliki.
Teraz wdrożymy tę aplikację w środowisku bezserwerowym Cloud Run.
13. Przeniesienie aplikacji do sieci
Po dodaniu do aplikacji Spring Boot doradcy dotyczącej strojów odpowiednich informacji o projekcie, lokalizacji i aplikacji retail-engine możemy ją wdrożyć w Cloud Run.
Aby wdrożyć aplikację, użyjemy polecenia gcloud run deploy
w terminalu Visual Code Studio. Aby zacząć korzystać z interfejsu wiersza poleceń gcloud, w Visual Studio Code możesz zainstalować rozszerzenie Google Cloud Code.
Aby wdrożyć aplikację:
- W swojej IDE otwórz skopiowany katalog i uruchom terminal. W Visual Code Studio kliknij Terminal > Nowy terminal.
- Aby zainstalować interfejs wiersza poleceń gcloud, wykonaj instrukcje podane w tym dokumencie.
- Jeśli używasz Visual Code Studio, kliknij Rozszerzenia, wyszukaj Google Cloud Code i zainstaluj rozszerzenie.
- W terminalu IDE uwierzytelnij swoje konto Google, uruchamiając to polecenie:
gcloud auth application-default login
- Ustaw identyfikator projektu na ten sam, w którym znajduje się instancja AlloyDB.
gcloud config set project PROJECT_ID
- Rozpocznij proces wdrażania.
gcloud run deploy
- W
Source code location
naciśnij klawisz Enter, aby wybrać skopiowany katalog GitHub. - W polu
Service name
wpisz nazwę usługi, np. outfit-recommender, i naciśnij klawisz Enter. - W polu
Please specify a region
wpisz lokalizację, w której hostowana jest instancja AlloyDB i aplikacja retail-engine, np. 32 dla us-central1, i naciśnij klawisz Enter.
- W
Allow unauthenticated invocations to [..]
wpisz Y i naciśnij Enter.
Na poniższym obrazie widać postęp wdrażania aplikacji:
14. Testowanie aplikacji do rekomendowania strojów
Po wdrożeniu aplikacji w Cloud Run możesz zobaczyć usługę w konsoli Google Cloud w ten sposób:
- W konsoli Google Cloud otwórz Cloud Run.
- W sekcji Usługi kliknij wdrożoną usługę rekomendacji strojów. Powinny pojawić się usługi retail-engine i outfit-recommender:
- Kliknij adres URL aplikacji, aby otworzyć interfejs aplikacji rekomendującej.
The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
Wdrożona aplikacja wygląda tak:
Korzystanie z aplikacji
Aby zacząć korzystać z aplikacji, wykonaj te czynności:
- Kliknij Prześlij i prześlij zdjęcie elementu odzieży.
- Po przesłaniu obrazu kliknij Styl. Aplikacja używa obrazu jako promptu i generuje opcje na dole na podstawie promptu z aplikacji retail-engine, który zawiera uczenie maszynowe dla zbioru danych o handlu detalicznym.
Aplikacja generuje propozycje obrazów wraz z promptem na podstawie obrazu z rekomendacjami stylizacji. Na przykład: A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
- Możesz przekazać tej automatycznie wygenerowanej rekomendacji dotyczącej stylu dodatkowe prompty. Na przykład:
STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
- Aby zobaczyć ostateczny styl, kliknij Pokaż.
15. Czyszczenie danych
Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby wykorzystane w tym poście, wykonaj te czynności:
- W konsoli Google Cloud otwórz stronę Zarządzanie zasobami.
- Na liście projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
- W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.
16. Gratulacje
Gratulacje! Udało Ci się przeprowadzić wyszukiwanie podobieństw za pomocą AlloyDB, pgvector i Vector Search w połączeniu z wynikiem wyszukiwania z użyciem potężnego modelu Imagen w celu wygenerowania rekomendacji stylizacji.