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 czatu 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 czynności:
- Tworzenie instancji AlloyDB i wczytywanie zbioru danych e-commerce
- Włączanie rozszerzeń pgvector i modelu generatywnej AI w AlloyDB
- Generowanie wektorów z 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ęść modułu 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 wprowadzenie danych o sprzedaży detalicznej (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 reprezentacji właściwościowych: reprezentacje właściwościowe (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 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 kreatora 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 wyboru 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 .
- 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ę podstawową, 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, używając 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łączanie rozszerzeń
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. 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 module 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 niego 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 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
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 można dojść do oceanu”, „sur la mer”, „на берегу океана” itp. Te terminy wyglądają inaczej, ale ich znaczenie semantyczne lub, w terminologii uczenia maszynowego, ich osadzenia powinny 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.
Uwaga: jeśli używasz istniejącego projektu Google Cloud utworzonego jakiś czas temu, być może musisz nadal korzystać ze starszych wersji modelu osadzania tekstu, takich jak 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 osadzania, 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 bezpłatnego poziomu mogą mieć problemy z limitami liczby żądań osadzania na sekundę do modeli osadzania. 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 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, różowe, sportowe, tylko 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 PODOBIEŃSTWA COSINUSOWEGO. 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ę zindeksować.
„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 partycjonowania 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 indeksowane.
- 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ąć 2 kolejne 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 działają razem.
- 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
xyztabeli.
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ż może to nadal 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ć zmienną $PROJECT_ID i dane logowania do połączenia z AlloyDB odpowiednimi wartościami. Dane logowania do AlloyDB to te, których użyliśmy na początku tego samouczka. 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 funkcji Cloud Run 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”. Następnie 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. Wykonywanie wyszukiwania wektorowego podobieństwa za pomocą modelu wektorów dystrybucyjnych na danych AlloyDB jest bardzo 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. Łącząc 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.