Tworzenie aplikacji z rekomendacjami strojów opartej na AI za pomocą AlloyDB i środowisk bezserwerowych

1. Przegląd

Wyobraź sobie aplikację modową, która nie tylko pomaga znaleźć idealny strój, ale też zapewnia porady dotyczące stylizacji w czasie rzeczywistym – a wszystko to dzięki integracji z najnowocześniejszą generatywną AI. Podczas tego wystąpienia opowiemy, jak stworzyliśmy taką aplikację, korzystając z funkcji wyszukiwania wektorowego AlloyDB w połączeniu z indeksem ScaNN od Google. Umożliwia to błyskawiczne wyszukiwanie pasujących strojów i natychmiastowe rekomendacje modowe.

Omówimy też, jak indeks ScaNN w AlloyDB optymalizuje złożone zapytania, aby generować spersonalizowane sugestie dotyczące stylu. Będziemy też używać Gemini i Imagen, czyli zaawansowanych modeli generatywnej AI, aby dostarczać Ci inspiracji dotyczących stylizacji, a nawet wizualizować Twoje spersonalizowane stylizacje. Cała aplikacja jest oparta na architekturze bezserwerowej, co zapewnia użytkownikom płynne i skalowalne działanie.

Problem: aplikacja ma pomagać osobom, które mają problem z podjęciem decyzji dotyczącej ubioru, poprzez oferowanie spersonalizowanych sugestii dotyczących strojów. Pomaga to też uniknąć zmęczenia decyzyjnego związanego z planowaniem stroju.

Rozwiązanie: aplikacja z usługą polecającą stroje rozwiązuje problem z zapewnieniem użytkownikom inteligentnych, spersonalizowanych i angażujących wrażeń związanych z modą, a przy tym prezentuje możliwości AlloyDB, generatywnej AI i technologii bezserwerowych.

Co utworzysz

W ramach tego laboratorium:

  1. Tworzenie instancji AlloyDB i wczytywanie zbioru danych e-commerce
  2. Włączanie rozszerzeń pgvector i modelu generatywnej AI w AlloyDB
  3. Generowanie wektorów dystrybucyjnych na podstawie opisu produktu
  4. Wdrażanie rozwiązania w bezserwerowych funkcjach Cloud Run
  5. Prześlij obraz do Gemini i wygeneruj prompt z opisem obrazu.
  6. Generowanie wyników wyszukiwania na podstawie promptów w połączeniu z osadzaniem zbiorów danych e-commerce.
  7. Dodaj dodatkowe prompty, aby dostosować prompt i wygenerować rekomendacje dotyczące stylu.
  8. Wdrażanie rozwiązania w bezserwerowych funkcjach Cloud Run

Wymagania

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

2. Architektura

Ogólna architektura aplikacji jest następująca:

ce32f865dfe59142.png

Poniższe sekcje przedstawiają kontekst samouczka:

Przetwarzanie:

Pierwszym krokiem jest pozyskanie danych o handlu detalicznym (asortyment, opisy produktów, interakcje z klientami) do AlloyDB.

Silnik Analytics:

Będziemy używać AlloyDB jako silnika analitycznego do wykonywania tych czynności:

  1. Wyodrębnianie kontekstu: silnik analizuje dane przechowywane w AlloyDB, aby zrozumieć relacje między produktami, kategoriami, zachowaniami klientów itp.
  2. Tworzenie wektorów dystrybucyjnych: Wektory dystrybucyjne (matematyczne reprezentacje tekstu) są generowane zarówno dla zapytania użytkownika, jak i dla informacji przechowywanych w AlloyDB.
  3. Wyszukiwanie wektorowe: wyszukiwarka przeprowadza wyszukiwanie podobieństw, porównując wektor dystrybucyjny zapytania z wektorami dystrybucyjnymi opisów produktów, opinii i innych odpowiednich danych. Wskazuje to 25 najbardziej trafnych „najbliższych sąsiadów”.

Rekomendacja Gemini:

Tablica bajtów obrazu jest przekazywana do modelu Gemini za pomocą interfejsu Vertex AI API wraz z promptem z prośbą o opis tekstowy odzieży wierzchniej oraz sugestie dotyczące odzieży dolnej.

RAG i wyszukiwanie wektorowe w AlloyDB:

Opis odzieży wierzchniej jest używany do wysyłania zapytań do bazy danych. Zapytanie przekształca tekst wyszukiwania (rekomendację modelu Gemini dotyczącą pasujących spodni) w wektory dystrybucyjne i przeprowadza wyszukiwanie wektorowe w wektorach dystrybucyjnych przechowywanych w bazie danych, aby znaleźć najbliższych sąsiadów (pasujące wyniki). Wektory dystrybucyjne w bazie danych AlloyDB są indeksowane za pomocą indeksu ScaNN, co zapewnia lepsze przywoływanie.

Generowanie obrazów w odpowiedzi:

Zweryfikowane odpowiedzi są uporządkowane w tablicę JSON, a cały silnik jest spakowany w bezserwerową funkcję Cloud Run, która jest wywoływana z poziomu narzędzia do tworzenia agentów.

Generowanie obrazów w Imagen:

Prompt dotyczący stylu użytkownika, wybrana przez niego rekomendacja i wszelkie prośby o personalizację są łączone, aby wygenerować prompt dla Imagen 3 na podstawie istniejącego obrazu. Obraz stylizowany jest generowany na podstawie tego promptu przy użyciu interfejsu Vertex AI API.

3. Zanim zaczniesz

Utwórz projekt

  1. W konsoli Google Cloud na stronie selektora projektów 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. 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. Kliknij Aktywuj Cloud Shell ( f2ae85166a716c5c.png) u góry konsoli Google Cloud.
  4. 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
  1. Aby sprawdzić, czy przyszłe polecenia gcloud będą prawidłowo identyfikować Twój projekt, uruchom to polecenie:
gcloud config list project
  1. Jeśli projekt nie jest ustawiony, użyj tego polecenia, aby go ustawić:
gcloud config set project <YOUR_PROJECT_ID>
  1. Włącz wymagane interfejsy API.

Kliknij link, aby włączyć interfejsy API.

Jeśli zapomnisz włączyć któryś interfejs API, możesz to zrobić w trakcie wdrażania.

Więcej informacji o poleceniach gcloud i ich użyciu znajdziesz w dokumentacji.

4. Konfiguracja bazy danych

W tym laboratorium użyjemy AlloyDB jako bazy danych do przechowywania zbioru danych e-commerce dotyczących handlu detalicznego. Do przechowywania wszystkich zasobów, takich jak bazy danych i logi, używa klastrów. Każdy klaster ma instancję główną, która zapewnia punkt dostępu do danych. Tabele to rzeczywiste zasoby, w których są przechowywane dane.

Utwórzmy klaster, instancję i tabelę AlloyDB, do których zostanie wczytany zbiór danych e-commerce.

Tworzenie klastra i instancji

  1. W konsoli Google Cloud wyszukaj AlloyDB. Najprostszym sposobem na znalezienie większości stron w Cloud Console jest wyszukanie ich za pomocą paska wyszukiwania w konsoli.
  2. Kliknij UTWÓRZ KLASTER.

f76ff480c8c889aa.png

  1. Utwórz klaster i instancję o tych wartościach:
  • identyfikator klastra: „shopping-cluster
  • hasło: „alloydb
  • Zgodność z PostgreSQL 15
  • Region: „us-central1
  • Sieci: „default

538dba58908162fb.png

  1. Gdy w sekcji Sieć wybierzesz sieć domyślną, pojawi się ta opcja: Aby skonfigurować sieć domyślną, kliknij SKONFIGURUJ POŁĄCZENIE.
    7939bbb6802a91bf.png
  2. Wybierz Użyj automatycznie przydzielonego zakresu adresów IP i kliknij Dalej. Po sprawdzeniu informacji kliknij UTWÓRZ POŁĄCZENIE. 768ff5210e79676f.png

Poczekaj na zakończenie tworzenia sieci domyślnej.

  1. W sekcji Skonfiguruj instancję główną ustaw identyfikator instancji jako „shopping-instance".

2bddecf6b7c7407b.png

  1. Kliknij UTWÓRZ KLASTER, aby dokończyć konfigurowanie klastra w ten sposób:

24eec29fa5cfdb3e.png

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 ustawionych podczas tworzenia klastra.

Uwierzytelnianie w bazie danych AlloyDB

  1. W konsoli Google Cloud otwórz AlloyDB. Wybierz klaster podstawowy, a następnie w menu nawigacyjnym po lewej stronie kliknij AlloyDB Studio:

847e35f1bf8a8bd8.png

  1. Aby uwierzytelnić się w bazie danych AlloyDB, podaj te informacje:
  • Nazwa użytkownika: „postgres
  • Baza danych: „postgres
  • Hasło: „alloydb

Po pomyślnym uwierzytelnieniu w AlloyDB Studio polecenia SQL są wprowadzane na kartach Edytor. Możesz dodać wiele okien Edytora, klikając znak plusa po prawej stronie pierwszej karty Edytora.

91a86d9469d499c4.png

Polecenia dla AlloyDB będziesz wpisywać w oknach Edytora, korzystając w razie potrzeby z opcji Uruchom, Formatuj i Wyczyść.

Włącz rozszerzenia

Do utworzenia 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 możesz używać do uzyskiwania dostępu do punktów końcowych prognozowania Vertex AI w celu uzyskiwania prognoz w SQL.
  1. Włącz te rozszerzenia, uruchamiając te DDL:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
  1. Sprawdź, czy rozszerzenia są zainstalowane, uruchamiając to polecenie SQL:
select extname, extversion from pg_extension;

Tworzenie tabeli

  1. 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 pomyślnym wykonaniu powyższego polecenia powinna być widoczna tabela w

w bazie danych. Przykład znajdziesz na ilustracji poniżej:

908e33bbff58a6d.png

Pozyskiwanie danych

W tym laboratorium użyjemy danych testowych zawierających około 200 rekordów w tym pliku SQL. Zawiera id, category, sub_category, uri, image i content. Pozostałe pola wypełnisz w dalszej części tego modułu.

  1. Skopiuj 20 wierszy/instrukcji wstawiania z pliku SQL do nowej karty edytora w AlloyDB Studio i kliknij RUN.
  1. Rozwiń sekcję Eksplorator, aż zobaczysz tabelę o nazwie apparels.
  2. Kliknij ikonę menu [], a potem Zapytanie. Instrukcja SELECT otworzy się w nowej karcie Edytora.

b31ece70e670ab89.png

  1. Aby sprawdzić, czy wiersze zostały wstawione, kliknij Uruchom.

Przyznawanie uprawnień użytkownikowi

Przyznamy użytkownikowi postgres uprawnienia do generowania wektorów dystrybucyjnych w AlloyDB.. W AlloyDB Studio uruchom to polecenie, aby przyznać użytkownikowi postgres uprawnienia do wykonywania funkcji embedding:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Przyznawanie roli Użytkownik Vertex AI kontu usługi AlloyDB

Do generowania wektorów dystrybucyjnych będziemy używać modeli wektorów dystrybucyjnych tekstu z Vertex AI, dlatego do konta usługi AlloyDB musisz przypisać rolę Użytkownik Vertex AI.

W konsoli Google Cloud kliknij ikonę terminala Cloud Shell [f2ae85166a716c5c.png] 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ć embedding, musimy mieć context, czyli wszystkie informacje, które chcemy umieścić w jednym polu. W tym celu utworzymy opis produktu, który zapiszemy w kolumnie pdt_desc w tabeli apparels.

W naszym przypadku użyjemy wszystkich informacji o każdym produkcie, ale gdy będziesz to robić z własnymi danymi, możesz je dowolnie przetwarzać w sposób, który uznasz za istotny dla swojej firmy.

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 język DML tworzy proste podsumowanie kontekstu na podstawie informacji ze wszystkich pól dostępnych w tabeli i innych zależności (jeśli w Twoim przypadku użycia występują jakieś zależności). Aby uzyskać bardziej precyzyjny wybór informacji i kontekst, możesz dowolnie przetwarzać dane w sposób, który uznasz za przydatny dla swojej firmy.

7. Tworzenie wektorów dystrybucyjnych dla kontekstu

Komputery znacznie łatwiej przetwarzają liczby niż tekst. System osadzania przekształca tekst w ciąg liczb zmiennoprzecinkowych, które powinny reprezentować tekst niezależnie od tego, jak jest sformułowany, w jakim języku jest napisany itp.

Rozważ opisanie lokalizacji nadmorskiej. Może to być np. "on the water, beachfront, walk from your room to the ocean, sur la mer, на берегу океана itp. Te terminy wyglądają inaczej, ale ich znaczenie semantyczne, czyli w terminologii uczenia maszynowego ich osadzenia, powinno być bardzo zbliżone.

Gdy dane i kontekst będą gotowe, uruchomimy SQL, aby dodać do tabeli w polu embedding wektory osadzeń kolumny (pdt_desc) z opisem produktu. Możesz używać różnych modeli osadzania. Korzystamy z text-embedding-005 z Vertex AI.

  1. W AlloyDB Studio uruchom to polecenie, aby wygenerować wektory dystrybucyjne i zaktualizować kolumnę pdt_desc o wektory dystrybucyjne dla przechowywanych w niej danych:
UPDATE
 apparels
SET
 embedding = embedding( 'text-embedding-005',
   pdt_desc)
WHERE
 TRUE;
  1. Sprawdź, czy wygenerowano osadzanie, uruchamiając to polecenie:
SELECT
 id,
 category,
 sub_category,
 content,
 embedding
FROM
 Apparels
LIMIT 5;

Oto przykładowy wektor osadzania, który wygląda jak tablica liczb zmiennoprzecinkowych, dla przykładowego tekstu w zapytaniu:

c69c08d085389f74.png

8. Wykonywanie wyszukiwania wektorowego

Tabela, dane i wektory dystrybucyjne są już gotowe. Przeprowadźmy teraz wyszukiwanie wektorowe w czasie rzeczywistym dla tekstu wyszukiwanego przez użytkownika.

Załóżmy, że tekst wyszukiwania użytkownika to „pink color, casual, pure cotton tops for women”.

Aby znaleźć pasujące wyniki, 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 szczegółowo:

W tym zapytaniu

  1. Tekst wyszukiwania użytkownika to: „I want womens tops, pink casual only pure cotton.
  2. Konwertujemy ten tekst wyszukiwania na wektory dystrybucyjne za pomocą metody embedding() i modelu text-embedding-005. Ten krok powinien być Ci znany z poprzedniego etapu, na którym zastosowaliśmy funkcję osadzania do wszystkich elementów w tabeli.
  3. <=>” oznacza użycie metody odległości COSINE SIMILARITY. Wszystkie dostępne miary podobieństwa znajdziesz w dokumentacji pgvector.
  4. Wynik metody osadzania przekształcamy w typ danych wektorowych, aby był zgodny z wektorami przechowywanymi w bazie danych.
  5. LIMIT 5 oznacza, że chcemy wyodrębnić 5 najbliższych sąsiadów dla tekstu wyszukiwania.

Poniżej znajdziesz przykładową odpowiedź na to zapytanie SQL:

4193a68737400535.png

Jak widać w wynikach, dopasowania są dość zbliżone do tekstu wyszukiwania. Spróbuj zmienić kolor, aby zobaczyć, jak zmienią się wyniki.

Indeks ScaNN w AlloyDB zwiększający wydajność zapytań

Załóżmy, że chcemy zwiększyć wydajność (czas zapytania), skuteczność i precyzję tego wyniku wyszukiwania wektorowego za pomocą indeksu ScaNN.

Jeśli chcesz użyć indeksu ScaNN, wykonaj te czynności:

  1. Mamy już utworzone klaster, instancję, kontekst i osadzenia, więc wystarczy zainstalować rozszerzenie ScaNN za pomocą tego polecenia:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. 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 indeksowania.
  • embedding to kolumna w tabeli, którą chcesz indeksować.
  • cosine to metoda pomiaru odległości, której chcesz użyć w przypadku indeksu.
  • 54 to liczba partycji, które mają zostać zastosowane do tego indeksu. Ustaw dowolną wartość z zakresu od 1 do 1048576. Więcej informacji o tym, jak określić tę wartość, znajdziesz w artykule Dostrajanie indeksu ScaNN.

Zgodnie z zaleceniem w repozytorium ScaNN użyliśmy PIERWIASTKA KWADRATOWEGO z liczby punktów danych. Podczas dzielenia na partycje wartość num_leaves powinna być w przybliżeniu pierwiastkiem kwadratowym z liczby punktów danych.

  1. Sprawdź, czy indeks został utworzony, za pomocą tego zapytania:
SELECT * FROM pg_stat_ann_indexes;
  1. Przeprowadź wyszukiwanie wektorowe za pomocą tego samego zapytania, którego użyliśmy 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 to, którego użyliśmy w laboratorium w kroku 8. Teraz jednak pole jest indeksowane za pomocą indeksu ScaNN.

  1. Przeprowadź test za pomocą prostego zapytania wyszukiwania z indeksem i bez niego. Aby przeprowadzić test bez indeksu, musisz go usunąć:

white tops for girls without any print

Powyższy tekst wyszukiwania w zapytaniu wyszukiwania wektorowego dotyczącym danych WEKTORÓW DYSTRYBUCYJNYCH ZINDEKSOWANYCH daje wysokiej jakości wyniki wyszukiwania i wydajność. Dzięki indeksowi wydajność znacznie się poprawia (pod względem czasu wykonania: 10,37 ms bez ScaNN i 0,87 ms ze ScaNN). Więcej informacji na ten temat znajdziesz na tym blogu.

9. Weryfikacja dopasowania za pomocą LLM

Zanim przejdziemy dalej i utworzymy usługę zwracającą najlepsze dopasowania do aplikacji, użyjmy modelu generatywnej AI, aby sprawdzić, czy te potencjalne odpowiedzi są rzeczywiście trafne i bezpieczne dla użytkownika.

Sprawdzanie, czy instancja jest skonfigurowana pod kątem Gemini

  1. Sprawdź, czy google_ml_integration jest już włączona w przypadku klastra i instancji. W AlloyDB Studio uruchom to polecenie:
show google_ml_integration.enable_model_support;

Jeśli wartość jest wyświetlana jako „włączone”, możesz pominąć 2 kolejne kroki i przejść bezpośrednio do konfigurowania

integracja AlloyDB i modelu Vertex AI;

  1. Otwórz instancję główną klastra AlloyDB i kliknij EDYTUJ INSTANCJĘ GŁÓWNĄ.

456ffdf292d3c0e0.png

  1. W sekcji Opcje konfiguracji zaawansowanej rozwiń sekcję Nowa flaga bazy danych i upewnij się, że symbol google_ml_integration.enable_model_support flag ma wartość „on”:

6a59351fcd2a9d35.png 3. Jeśli nie jest ustawiona na „on”, ustaw ją na „on”, a następnie kliknij ZAKTUALIZUJ INSTANCJĘ.

Ten krok zajmie kilka minut.

Integracja AlloyDB i modelu Vertex AI

Teraz możesz połączyć się z AlloyDB Studio i uruchomić następującą instrukcję DML, aby skonfigurować dostęp do modelu Gemini z AlloyDB, używając w odpowiednim miejscu identyfikatora projektu. Przed uruchomieniem polecenia może pojawić się ostrzeżenie o błędzie składni, ale powinno ono działać prawidłowo.

  1. W konsoli Google Cloud otwórz AlloyDB. Wybierz klaster podstawowy, a następnie w menu nawigacyjnym po lewej stronie kliknij AlloyDB Studio.
  2. Użyjemy gemini-1.5-pro:generateContent, które jest domyślnie dostępne w rozszerzeniu google_ml_integration. cdb5af753a625777.png
  3. Modele skonfigurowane pod kątem dostępu możesz sprawdzić za pomocą tego polecenia w AlloyDB Studio:
select model_id,model_type from google_ml.model_info_view;        
  1. Przyznaj użytkownikom bazy danych uprawnienia do wykonywania funkcji ml_predict_row, aby uruchamiać prognozy przy użyciu modeli Google Vertex AI, wykonując to polecenie:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

Ocena odpowiedzi

W następnej sekcji użyjemy jednego dużego zapytania, aby przenieść aplikację do Cloud Run. Aby jednak mieć pewność, że odpowiedzi na zapytanie są rozsądne, zapytanie może być trudne do zrozumienia.

Przyjrzymy się poszczególnym sekcjom, które składają się na większe zapytanie, którego ostatecznie używamy.

  1. Najpierw wyślemy do bazy danych żądanie pobrania 5 najbliższych wyników pasujących do zapytania użytkownika. Aby uprościć ten przykład, na stałe kodujemy zapytanie, ale nie martw się, później je interpolujemy.

Uwzględniamy opis produktu z tabeli apparels i dodajemy 2 nowe pola – jedno, które łączy opis z indeksem, i drugie z pierwotnym żądaniem. Dane te są zapisywane w tabeli o nazwie xyz, która jest nazwą tabeli tymczasowej.

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;

Wynikiem tego zapytania będzie 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 mieć te kolumny:

  • literature
  • content
  • user_text
  1. Aby określić, jak trafne są odpowiedzi, użyjemy złożonego zapytania, w którym wyjaśnimy, jak je oceniać. W zapytaniu używa kolumn user_textcontent w tabeli xyz.
"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."
  1. Na podstawie tego zapytania sprawdzimy następnie „jakość” odpowiedzi w tabeli xyz. Mówiąc o jakości, mamy na myśli, jak bardzo wygenerowane odpowiedzi są zgodne z oczekiwaniami.
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;
  1. 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ć rzeczywisty zwrócony kod JSON, możesz usunąć ten kod.
  2. Aby uzyskać pole LLM, wystarczy wyodrębnić je z tabeli x:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. Można to połączyć w jedno zapytanie w ten sposób:

Ostrzeżenie: jeśli powyższe zapytania zostały uruchomione w celu sprawdzenia wyników pośrednich,

przed uruchomieniem tego zapytania usuń tabele xyzx 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 jest połączeniem wszystkich zapytań, które uruchamiamy we wcześniejszych krokach. Wyniki wskazują, czy występuje dopasowanie, jaki jest jego odsetek i zawierają wyjaśnienie oceny.

Zwróć uwagę, że model Gemini ma domyślnie włączone przesyłanie strumieniowe on, więc rzeczywista odpowiedź jest rozłożona na kilka wierszy: 14e74d71293b7b9.png

10. Przenoszenie aplikacji do internetu

Teraz będziemy hostować tę aplikację, aby można było uzyskać do niej dostęp z internetu.

Tworzenie funkcji Cloud Run

  1. W konsoli Google Cloud otwórz funkcje Cloud Run, korzystając z tego linku:

https://console.cloud.google.com/run/create?deploymentType=function

  1. W sekcji Configure (Skonfiguruj) ustaw nazwę funkcji na „retail-engine” i wybierz region „us-central1”.
  2. W polu URL punktu końcowego wybierz środowisko wykonawcze Java 17.
  3. W sekcji Uwierzytelnianie wybierz Zezwalaj na nieuwierzytelnione wywołania.
  4. Rozwiń sekcję Kontenery, woluminy, sieć, zabezpieczenia i kliknij kartę Sieć.
  5. Wybierz Łącz się z siecią VPC w przypadku ruchu wychodzącego, a następnie kliknij Używaj oprogramowania sprzęgającego bezserwerowego dostępu do VPC.
  6. 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.
  7. W sekcji Utwórz łącznik ustaw nazwę na alloydb-test-conn.
  8. Ustaw region na us-central.
  9. Pozostaw wartość Sieć jako domyślna i ustaw Podsieć jako Niestandardowy zakres adresów IP z zakresem adresów IP 10.8.0.0 lub podobnym, który jest dostępny.
  10. Rozwiń ustawienia Pokaż skalowanie i ustaw Minimalna liczba instancji na 2, a Maksymalna liczba instancji na 3.
  11. Wybierz typ instancji f1-micro. Poniżej znajdziesz opcje tworzenia oprogramowania sprzęgającego:

bed4b2af6795a8ba.png

  1. Kliknij Utwórz, aby utworzyć łącznik.
  2. W sekcji Kierowanie ruchem wybierz Kieruj do VPC cały ruch.
  3. Kliknij Utwórz, aby utworzyć funkcję.

Wdrażanie aplikacji

Po utworzeniu funkcji zaktualizuj źródło i wdroż aplikację ponownie.

  1. W Cloud Run kliknij kartę Usługi, a następnie kliknij funkcję retail-engine.
  2. Kliknij kartę Źródło. Pozostaw domyślny Punkt wejścia funkcji ustawiony na „gcfv2.HelloHttpFunction”.
  3. Zastąp zawartość pliku HelloHttpFunction.java zawartością tego pliku Java.
  4. Zaktualizuj szczegóły AlloyDbJdbcConnector w pliku zgodnie ze szczegółami instancji i klastra AlloyDB. Zastąp $PROJECT_ID identyfikatorem projektu klastra i instancji AlloyDB.

a89dc5af3580fbcf.png

  1. Zastąp zawartość pliku pom.xml zawartością tego pliku XML.
  2. Aby wdrożyć funkcję, kliknij Zapisz i wdrażaj ponownie.

11. Testowanie aplikacji silnika handlowego

Po wdrożeniu zaktualizowanej funkcji w Cloud Functions powinien pojawić się punkt końcowy w tym formacie:

https://retail-engine-PROJECT_NUMBER.us-central1.run.app

Możesz to sprawdzić 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"}'

Możesz też przetestować funkcję Cloud Run 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 .

Wynik:

88bc1ddfb5644a28.png

Po przeprowadzeniu wyszukiwania wektorów podobieństwa za pomocą modelu wektorów dystrybucyjnych na danych AlloyDB możemy przejść do tworzenia aplikacji, która używa tych wektorów dystrybucyjnych wraz z obrazem i promptami do generowania sugestii dotyczących stylu.

12. Omówienie przepływu rekomendacji dotyczących stroju

Aplikacja z rekomendacjami strojów to aplikacja typu sprint boot skonfigurowana do współpracy z wektorami, które utworzyliśmy w aplikacji AlloyDB retail-engine, a także z Gemini i Imagen, aby generować wizualne opcje stylizacji strojów. Umożliwia też dodawanie niestandardowych promptów i improwizowanie rekomendacji.

Wyobraź sobie, że przesyłasz do tej aplikacji zdjęcie różowego topu z Twojej garderoby. Gdy klikniesz „Pokaż”, aplikacja na podstawie prompta ustawionego w kodzie aplikacji i osadzeń w bazie danych AlloyDB wygeneruje kilka opcji pasujących do oryginalnego obrazu. Zastanawiasz się, jak wyglądałyby sugerowane opcje z niebieskim naszyjnikiem, więc dodajesz prompta w tym stylu i klikasz „Styl”. Wygenerowany obraz końcowy łączy oryginalne zdjęcie i rekomendacje, aby stworzyć pasujący strój.

Aby rozpocząć tworzenie aplikacji do rekomendowania strojów, wykonaj te czynności:

  1. W Cloud Run otwórz aplikację retail-engine i zanotuj adres URL aplikacji. Jest to repozytorium wektorów, którego będziemy używać do generowania podobnych sugestii.
  2. W 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 z ważnych plików 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 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, wchodzi w interakcje z wektorami dystrybucyjnymi AlloyDB i zwraca ostateczną odpowiedź do interfejsu. Ten kontroler wywołuje klasę GenerateImageSample.
  • GenerateImageSample.java: zawiera klasę generowania obrazów, która łączy się z Vertex AI, formatuje prompt użytkownika, wykonuje wywołania interfejsu API do modelu Imagen i zwraca przewidywany obraz do klasy kontrolera.
  • Resources: ten katalog zawiera obrazy i pliki HTML wymagane do wygenerowania interfejsu aplikacji.
  • Pom.xml: określa zależności i konfiguracje projektu.
  1. W Visual Studio Code otwórz plik HelloWorldController.java i zaktualizuj instancje identyfikatora projektu i lokalizacji zgodnie z miejscem utworzenia instancji AlloyDB.

9fff8f5cbb62567.png

  1. Zaktualizuj endpoint, aby wskazywał adres URL aplikacji retail-engine, którą wcześniej hostowano.

ae6227e88eec5485.png

  1. Otwórz plik GenerateImageSample.java i zaktualizuj identyfikator projektu oraz lokalizację zgodnie z miejscem utworzenia instancji AlloyDB.

db1f81a6f51d80de.png

  1. Zapisz wszystkie pliki.

Teraz wdrożymy tę aplikację w środowisku wykonawczym bezserwerowym Cloud Run.

13. Przenoszenie aplikacji do internetu

Po dodaniu do aplikacji Spring Boot rekomendującej stroje odpowiednich informacji o projekcie, lokalizacji i szczegółów aplikacji retail-engine możemy wdrożyć ją w Cloud Run.

Do wdrożenia aplikacji użyjemy polecenia gcloud run deploy w terminalu Visual Studio Code. W przypadku Visual Studio Code możesz zainstalować rozszerzenie Google Cloud Code, aby zacząć korzystać z gcloud CLI.

Aby wdrożyć aplikację, wykonaj te czynności:

  1. W środowisku IDE otwórz sklonowany katalog i uruchom terminal. W Visual Studio Code kliknij Terminal > New Terminal (Nowy terminal).
  2. Aby zainstalować gcloud CLI, postępuj zgodnie z instrukcjami w tym dokumencie.
  3. Jeśli używasz Visual Studio Code, kliknij Extensions (Rozszerzenia), wyszukaj Google Cloud Code i zainstaluj rozszerzenie.
  4. W terminalu IDE uwierzytelnij konto Google, uruchamiając to polecenie:
gcloud auth application-default login
  1. Ustaw identyfikator projektu na ten sam projekt, w którym znajduje się instancja AlloyDB.
gcloud config set project PROJECT_ID
  1. Rozpocznij proces wdrażania.
gcloud run deploy
  1. Source code location naciśnij Enter, aby wybrać sklonowany katalog GitHub.
  2. W polu Service name wpisz nazwę usługi, np. outfit-recommender, i naciśnij Enter.
  3. Please specify a region wpisz lokalizację, w której hostowana jest instancja AlloyDB i aplikacja retail-engine, np. 32 w przypadku regionu us-central1, i naciśnij Enter.

12c0de4248660d4d.png

  1. W polu Allow unauthenticated invocations to [..] wpisz Y i naciśnij Enter.

Na tym obrazie widać postęp wdrażania aplikacji:

1babbb82faa31fce.png

14. Testowanie aplikacji do rekomendowania strojów

Po pomyślnym wdrożeniu aplikacji w Cloud Run możesz wyświetlić usługę w konsoli Google Cloud w ten sposób:

  1. W konsoli Google Cloud otwórz Cloud Run.
  2. W sekcji Usługi kliknij wdrożoną usługę rekomendującą stroje. Powinny pojawić się usługi retail-engineoutfit-recommender:

24dd0aebe224059e.png

  1. Kliknij adres URL aplikacji, aby otworzyć interfejs aplikacji z rekomendacjami.

cdc9c1625b1648d2.png

    The following is a sample URL that you will use:

https://outfit-recommender-22905290964.us-central1.run.app/style

Wdrożoną aplikację można zobaczyć w ten sposób:

76245d1a6152d313.png

Korzystanie z aplikacji

Aby zacząć korzystać z aplikacji, wykonaj te czynności:

  1. Kliknij Prześlij i prześlij zdjęcie elementu garderoby.
  2. Po przesłaniu obrazu kliknij Styl. Aplikacja używa obrazu jako prompta i generuje opcje na podstawie prompta z aplikacji silnika handlowego, która zawiera osadzanie danych zbioru danych dotyczących handlu detalicznego.

Aplikacja generuje sugestie obrazów wraz z promptem na podstawie obrazu z rekomendacjami dotyczącymi stylu. Na przykład: A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.

  1. Do tej automatycznie wygenerowanej rekomendacji stylu możesz przekazać 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.
  2. Kliknij Pokaż, aby zobaczyć ostateczny styl.

38d6d08e9a0a44c0.png

15. Czyszczenie danych

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

  1. W konsoli Google Cloud otwórz stronę Zarządzanie zasobami.
  2. Z listy projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
  3. 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 wyszukiwarki wektorowej w połączeniu z wykorzystaniem wyniku wyszukiwania z zaawansowanym modelem Imagen do generowania rekomendacji dotyczących stylizacji.