1. Przegląd
W dzisiejszym dynamicznym świecie handlu detalicznego najważniejsze jest zapewnienie wyjątkowej obsługi klienta przy jednoczesnym umożliwieniu spersonalizowanych zakupów. Zabierzemy Cię w techniczną podróż po procesie tworzenia aplikacji do czatowania opartej na wiedzy, która ma odpowiadać na pytania klientów, ułatwiać odkrywanie produktów i dostosowywać wyniki wyszukiwania. To innowacyjne rozwiązanie łączy moc AlloyDB do przechowywania danych, wewnętrzny silnik analityczny do zrozumienia kontekstowego, Gemini (duży model językowy) do weryfikacji trafności oraz narzędzie Google Agent Builder do szybkiego tworzenia inteligentnego asystenta konwersacyjnego.
Wyzwanie: współcześni klienci detaliczni oczekują natychmiastowych odpowiedzi i rekomendacji produktów, które są zgodne z ich indywidualnymi preferencjami. Tradycyjne metody wyszukiwania często nie zapewniają takiego poziomu personalizacji.
Rozwiązanie: nasza aplikacja do obsługi czatu oparta na wiedzy bezpośrednio rozwiązuje ten problem. Wykorzystuje ona bogatą bazę wiedzy pochodzącą z Twoich danych o sprzedaży detalicznej, aby rozpoznawać intencje klientów, inteligentnie odpowiadać na ich pytania i dostarczać bardzo trafne wyniki.
Co utworzysz
W ramach tego modułu (część 1) wykonasz te zadania:
- Tworzenie instancji AlloyDB i wczytywanie zbioru danych e-commerce
- Włączanie rozszerzeń pgvector i modelu generatywnej AI w AlloyDB
- Generowanie wektorów dystrybucyjnych na podstawie opisu produktu
- Przeprowadzanie w czasie rzeczywistym wyszukiwania podobieństwa kosinusowego dla tekstu wyszukiwanego przez użytkownika
- Wdrażanie rozwiązania w bezserwerowych funkcjach Cloud Run
Druga część laboratorium obejmuje czynności związane z Kreatorem agentów.
Wymagania
2. Architektura
Przepływ danych: przyjrzyjmy się bliżej temu, jak dane przepływają przez nasz system:
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:
- Wyodrębnianie kontekstu: silnik analizuje dane przechowywane w AlloyDB, aby zrozumieć relacje między produktami, kategoriami, zachowaniami klientów itp.
- Tworzenie wektorów dystrybucyjnych: Wektory dystrybucyjne (matematyczne reprezentacje tekstu) są generowane zarówno dla zapytania użytkownika, jak i dla informacji przechowywanych w AlloyDB.
- Wyszukiwanie wektorowe: silnik przeprowadza wyszukiwanie podobieństw, porównując wektor zapytania z wektorami dystrybucyjnymi opisów produktów, opinii i innych odpowiednich danych. Wskazuje to 25 najbardziej trafnych „najbliższych sąsiadów”.
Weryfikacja Gemini:
Te potencjalne odpowiedzi są wysyłane do Gemini w celu oceny. Gemini sprawdza, czy są one rzeczywiście trafne i bezpieczne dla użytkownika.
Generowanie 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.
Interakcja konwersacyjna:
Kreator agentów przedstawia odpowiedzi użytkownikowi w formacie języka naturalnego, co ułatwia prowadzenie dialogu. Ta część zostanie omówiona w kolejnym module.
3. Zanim zaczniesz
Utwórz projekt
- 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>
- Włącz wymagane interfejsy API.
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
Alternatywą dla polecenia gcloud jest wyszukanie poszczególnych usług w konsoli lub skorzystanie z tego linku.
Jeśli pominiesz jakiś interfejs API, możesz go włączyć w trakcie wdrażania.
Informacje o poleceniach gcloud i ich użyciu znajdziesz w dokumentacji.
4. Konfiguracja bazy danych
W tym module użyjemy AlloyDB jako bazy danych do przechowywania danych o sprzedaży detalicznej. Używa klastrów do przechowywania wszystkich zasobów, takich jak bazy danych i logi. Każdy klaster ma instancję główną, która zapewnia punkt dostępu do danych. Tabele będą zawierać rzeczywiste dane.
Utwórzmy klaster, instancję i tabelę AlloyDB, do których zostanie wczytany zbiór danych e-commerce.
Tworzenie klastra i instancji
- Otwórz stronę AlloyDB w konsoli Cloud. Najprostszym sposobem na znalezienie większości stron w Cloud Console jest wyszukanie ich za pomocą paska wyszukiwania w konsoli.
- Na tej stronie kliknij UTWÓRZ KLASTER:

- Wyświetli się ekran podobny do tego poniżej. 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”

- Po wybraniu sieci domyślnej zobaczysz ekran podobny do tego poniżej. Wybierz SKONFIGURUJ POŁĄCZENIE.

- Następnie wybierz „Użyj automatycznie przydzielonego zakresu adresów IP” i kliknij Dalej. Po sprawdzeniu informacji kliknij UTWÓRZ POŁĄCZENIE.

- Po skonfigurowaniu sieci możesz kontynuować tworzenie klastra. Aby dokończyć konfigurowanie klastra, kliknij UTWÓRZ KLASTER, jak pokazano poniżej:

Pamiętaj, aby zmienić identyfikator instancji na „shopping-instance"”.
Pamiętaj, że utworzenie klastra zajmie około 10 minut. Po zakończeniu procesu powinien wyświetlić się ekran podobny do tego:

5. Pozyskiwanie danych
Teraz dodaj tabelę z danymi o sklepie. Otwórz AlloyDB, wybierz klaster główny, a następnie AlloyDB Studio:

Może być konieczne poczekanie na zakończenie tworzenia instancji. Gdy to zrobisz, zaloguj się w AlloyDB przy użyciu danych logowania utworzonych podczas tworzenia klastra. Do uwierzytelniania w PostgreSQL użyj tych danych:
- Nazwa użytkownika: „
postgres” - Baza danych: „
postgres” - Hasło: „
alloydb”
Po pomyślnym uwierzytelnieniu w AlloyDB Studio polecenia SQL są wpisywane w Edytorze. Możesz dodać wiele okien Edytora, klikając znak plusa po prawej stronie ostatniego okna.

Polecenia dla AlloyDB będziesz wpisywać w oknach edytora, w razie potrzeby korzystając 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 i wyszukiwanie wektorów dystrybucyjnych. 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. Włącz te rozszerzenia, uruchamiając te DDL:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
Jeśli chcesz sprawdzić, które rozszerzenia są włączone w bazie danych, uruchom to polecenie SQL:
select extname, extversion from pg_extension;
Tworzenie tabeli
Utwórz tabelę za pomocą poniższej 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 bazie danych. Przykładowy zrzut ekranu znajdziesz poniżej:

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.
Skopiuj z niej 20 wierszy lub instrukcji wstawiania, a następnie wklej je na pustej karcie edytora i kliknij URUCHOM.
Aby wyświetlić zawartość tabeli, rozwiń sekcję Eksplorator, aż zobaczysz tabelę o nazwie apparels. Kliknij ikonę trzech kropek (⋮), aby wyświetlić opcję Zapytanie do tabeli. Instrukcja SELECT otworzy się w nowej karcie Edytora.

Przyznaj uprawnienia
Uruchom poniższą instrukcję, 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
Otwórz terminal Cloud Shell i wpisz 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
Wróć na stronę instancji AlloyDB.
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 nazwiemy pdt_desc). 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.
Uruchom to polecenie w AlloyDB Studio nowo utworzonej instancji. Spowoduje to zaktualizowanie pola pdt_desc o dane kontekstowe:
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. „nad wodą”, „przy plaży”, „z pokoju na plażę”, „sur la mer”, „на берегу океана” itp. Te określenia 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ń opisu produktu. Możesz używać różnych modeli osadzania. Korzystamy z text-embedding-004 z Vertex AI. Pamiętaj, aby w całym projekcie używać tego samego modelu wektorów dystrybucyjnych.
Uwaga: jeśli używasz istniejącego projektu Google Cloud utworzonego jakiś czas temu, być może musisz nadal używać starszych wersji modelu do wektoryzacji tekstu, np. textembedding-gecko.
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-004',
pdt_desc)
WHERE
TRUE;
Jeszcze raz spójrz na apparels tabelę, aby zobaczyć niektóre osadzenia. Aby zobaczyć zmiany, ponownie uruchom instrukcję SELECT.
SELECT
id,
category,
sub_category,
content,
embedding
FROM
apparels;
Powinien on zwrócić wektor dystrybucyjny, który wygląda jak tablica liczb zmiennoprzecinkowych dla przykładowego tekstu w zapytaniu, jak pokazano poniżej:

Uwaga: nowo utworzone projekty Google Cloud w ramach poziomu bezpłatnego mogą mieć problemy z limitami liczby żądań wektorów dystrybucyjnych na sekundę do modeli wektorów dystrybucyjnych. Podczas generowania osadzania zalecamy użycie zapytania filtra dla identyfikatora, a następnie selektywne wybieranie 1–5 rekordów itd.
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 użytkownik zada pytanie:
Chcę damskie bluzki, tylko różowe, sportowe, z czystej bawełny.
Aby znaleźć pasujące elementy, uruchom to zapytanie:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
Przyjrzyjmy się temu zapytaniu szczegółowo:
W tym zapytaniu
- Tekst wyszukiwania użytkownika to: „Chcę damskie topy, różowe, na co dzień, tylko z czystej bawełny”.
- Przekształcamy go w wektory za pomocą metody
embedding()i modelutext-embedding-004. Ten krok powinien być Ci znany z poprzedniego etapu, na którym zastosowaliśmy funkcję osadzania do wszystkich elementów w tabeli. - „
<=>” oznacza użycie metody odległości COSINE SIMILARITY. Wszystkie dostępne miary podobieństwa znajdziesz w dokumentacji pgvector. - Wynik metody wektorów dystrybucyjnych przekształcamy w typ wektorowy, aby był zgodny z wektorami przechowywanymi w bazie danych.
- LIMIT 5 oznacza, że chcemy wyodrębnić 5 najbliższych sąsiadów dla tekstu wyszukiwania.
Wynik wygląda tak:

Jak widać w wynikach, dopasowania są dość zbliżone do tekstu wyszukiwania. Spróbuj zmienić kolor, aby zobaczyć, jak zmienią się wyniki.
Ważna uwaga:
Załóżmy, że chcemy zwiększyć wydajność (czas zapytania), skuteczność i przypominanie tego wyniku wyszukiwania wektorowego za pomocą indeksu ScaNN. Aby porównać różnicę w wynikach z indeksem i bez niego, przeczytaj instrukcje w tym artykule na blogu. Dla wygody podajemy tutaj tylko kroki tworzenia indeksu:
- 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;
- Następnie utworzymy 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 moja tabela
„scann” to metoda indeksowania
„embedding” to kolumna w tabeli, którą chcę indeksować.
„cosine” to metoda pomiaru odległości, której chcę używać 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.
Użyłem PIERWIASTKA KWADRATOWEGO z liczby punktów danych zgodnie z zaleceniami w repozytorium ScaNN (podczas dzielenia na partycje liczba węzłów powinna być w przybliżeniu pierwiastkiem kwadratowym z liczby punktów danych).
- Sprawdź, czy indeks został utworzony, za pomocą tego zapytania:
SELECT * FROM pg_stat_ann_indexes;
- 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 już zaindeksowane.
- Przeprowadź test za pomocą prostego zapytania wyszukiwania z indeksem i bez niego (usuwając indeks):
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
Najpierw sprawdź, czy integracja Google ML jest już włączona w przypadku Twojego klastra i instancji. W AlloyDB Studio wpisz to polecenie:
show google_ml_integration.enable_model_support;
Jeśli wartość to „włączone”, możesz pominąć kolejne 2 kroki i przejść bezpośrednio do konfigurowania integracji AlloyDB i modelu Vertex AI.
- Otwórz instancję główną klastra AlloyDB i kliknij EDYTUJ INSTANCJĘ GŁÓWNĄ.

- W sekcji Opcje konfiguracji zaawansowanej otwórz sekcję Flagi. i upewnij się, że
google_ml_integration.enable_model_support flagjest ustawiony na „on”, jak pokazano poniżej:

Jeśli nie jest ustawiona na „włączone”, ustaw ją na „włączone”, a potem kliknij przycisk 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.
Najpierw utworzymy połączenie z modelem Gemini 1.5, jak pokazano poniżej. Pamiętaj, aby w poniższym poleceniu zastąpić $PROJECT_ID identyfikatorem projektu Google Cloud.
CALL
google_ml.create_model( model_id => 'gemini-1.5',
model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
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;
Na koniec musimy przyznać użytkownikom bazy danych uprawnienia do wykonywania funkcji ml_predict_row, aby mogli uruchamiać prognozy za pomocą modeli Google Vertex AI. Uruchom to polecenie:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
Uwaga: jeśli używasz istniejącego projektu Google Cloud i istniejącego klastra lub instancji AlloyDB utworzonych jakiś czas temu, może być konieczne usunięcie starych odwołań do modelu gemini-1.5 i ponowne utworzenie ich za pomocą powyższego polecenia CALL oraz ponowne uruchomienie polecenia grant execute on function ml_predict_row w przypadku wystąpienia problemów z przyszłymi wywołaniami modelu gemini-1.5.
Ocena odpowiedzi
W następnej sekcji użyjemy jednego dużego zapytania, aby upewnić się, że odpowiedzi są rozsądne, ale samo zapytanie może być trudne do zrozumienia. Za chwilę przyjrzymy się poszczególnym elementom i sprawdzimy, jak się ze sobą łączą.
- Najpierw wyślemy do bazy danych żądanie pobrania 5 najbardziej pasujących wyników 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
apparelsi dodajemy 2 nowe pola – jedno, które łączy opis z indeksem, i drugie z pierwotnym żądaniem. Wszystkie te dane są zapisywane w tabeli o nazwiexyz(jest to tylko tymczasowa nazwa 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-004',
'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. Nowa tabela xyz będzie zawierać 5 wierszy, a każdy z nich będzie mieć te kolumny:
literaturecontentuser_text
- 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_texticontentw 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."
- Na podstawie tego zapytania sprawdzimy następnie „jakość” odpowiedzi w tabeli
xyz.
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_rowzwraca 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. - Aby uzyskać pole LLM, wystarczy wyodrębnić je z tabeli x:
SELECT
LLM_RESPONSE
FROM
x;
- Można je połączyć w jedno kolejne zapytanie w ten sposób:
Jeśli po wykonaniu powyższych zapytań sprawdzisz wyniki pośrednie, przed uruchomieniem tego zapytania musisz usunąć 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-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
Chociaż nadal może to wyglądać zniechęcająco, mamy nadzieję, że teraz jest to dla Ciebie bardziej zrozumiałe. 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, więc rzeczywista odpowiedź jest rozłożona na kilka wierszy: 
10. Przenoszenie aplikacji do internetu
Chcesz udostępnić tę aplikację w internecie? Aby przekształcić ten silnik wiedzy w bezserwerowy za pomocą funkcji Cloud Run, wykonaj te czynności:
- Otwórz Cloud Run Functions w konsoli Google Cloud, aby UTWORZYĆ nową funkcję Cloud Run. Możesz też użyć tego linku: https://console.cloud.google.com/functions/add.
- Wybierz środowisko „Funkcja Cloud Run”. Podaj nazwę funkcji „retail-engine” i wybierz region „us-central1”. Ustaw uwierzytelnianie na „Zezwalaj na nieuwierzytelnione wywołania” i kliknij DALEJ. Wybierz Java 17 jako środowisko wykonawcze i Edytor wbudowany jako kod źródłowy.
- Domyślnie punkt wejścia zostanie ustawiony na „
gcfv2.HelloHttpFunction”. Zastąp kod zastępczy wHelloHttpFunction.javaipom.xmlfunkcji Cloud Run kodem z pliku Java i XML. - Pamiętaj, aby w pliku Java zastąpić symbol zastępczy $PROJECT_ID i dane logowania do połączenia z AlloyDB swoimi wartościami. Dane logowania do AlloyDB to te, których użyliśmy na początku tego ćwiczenia. Jeśli używasz innych wartości, zmień je w pliku Java.
- Kliknij Wdróż.
Po wdrożeniu, aby umożliwić funkcji w Cloud Functions dostęp do instancji bazy danych AlloyDB, utworzymy oprogramowanie sprzęgające VPC.
WAŻNY KROK:
Po rozpoczęciu wdrażania funkcje powinny być widoczne w konsoli Cloud Run Functions w Google. Wyszukaj nowo utworzoną funkcję (retail-engine), kliknij ją, a potem kliknij EDYTUJ i zmień te ustawienia:
- Otwórz Ustawienia środowiska wykonawczego, kompilacji, połączeń i zabezpieczeń
- Zwiększ czas oczekiwania do 180 sekund
- Otwórz kartę POŁĄCZENIA:

- W ustawieniach ruchu przychodzącego upewnij się, że wybrana jest opcja „Zezwalaj na cały ruch”.
- W sekcji Ustawienia ruchu wychodzącego kliknij menu Sieć i wybierz opcję „Dodaj nowy łącznik VPC”. Postępuj zgodnie z instrukcjami w wyświetlonym oknie:

- Podaj nazwę oprogramowania sprzęgającego VPC i upewnij się, że region jest taki sam jak w przypadku instancji. Pozostaw domyślną wartość Sieć 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.
- Rozwiń POKAŻ USTAWIENIA SKALOWANIA i upewnij się, że konfiguracja jest dokładnie taka:

- Kliknij UTWÓRZ. Ten łącznik powinien być teraz widoczny w ustawieniach ruchu wychodzącego.
- Wybierz nowo utworzony łącznik.
- Wybierz opcję kierowania całego ruchu przez to oprogramowanie sprzęgające VPC.
- Kliknij DALEJ, a potem WDRAŻAJ.
11. Testowanie aplikacji
Po wdrożeniu zaktualizowanej funkcji w Cloud Functions powinien pojawić się punkt końcowy w tym formacie:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine
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://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
Wynik:

To wszystko. Wyszukiwanie wektorowe podobieństwa za pomocą modelu wektorów dystrybucyjnych na danych AlloyDB jest tak proste.
Tworzenie agenta konwersacyjnego
Agent jest tworzony w części 2 tego modułu.
12. Czyszczenie danych
Jeśli planujesz ukończyć część 2 tego laboratorium, pomiń ten krok, ponieważ spowoduje on usunięcie bieżącego projektu.
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.
13. Gratulacje
Gratulacje! Udało Ci się przeprowadzić wyszukiwanie podobieństwa za pomocą AlloyDB, pgvector i wyszukiwarki wektorowej. Dzięki połączeniu możliwości AlloyDB, Vertex AI i wyszukiwania wektorowego zrobiliśmy ogromny krok naprzód w udostępnianiu wyszukiwania kontekstowego i wektorowego, które jest wydajne i naprawdę oparte na znaczeniu. W następnej części tego modułu omówimy kroki tworzenia agenta.