Wprowadzenie do osadzania wektorowego z AlloyDB AI

1. Wprowadzenie

Z tego ćwiczenia w Codelabs dowiesz się, jak korzystać z AlloyDB AI, łącząc wyszukiwanie wektorowe z wektorami dystrybucyjnymi Vertex AI.

17e86406ab251142.png

Wymagania wstępne

  • Podstawowa znajomość Google Cloud i konsoli
  • podstawowe umiejętności w zakresie interfejsu wiersza poleceń i Google Shell;

Czego się nauczysz

  • Jak wdrożyć klaster i instancję główną AlloyDB
  • Łączenie się z AlloyDB z maszyny wirtualnej Google Compute Engine
  • Jak utworzyć bazę danych i włączyć AlloyDB AI
  • Jak wczytywać dane do bazy danych
  • Jak używać modelu umieszczania Vertex AI w AlloyDB
  • Wzbogacanie wyników za pomocą modelu generatywnego Vertex AI

Czego potrzebujesz

  • konto Google Cloud i projekt Google Cloud;
  • przeglądarki, np. Chrome;

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz podać swój identyfikator projektu (zwykle identyfikowany jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu.
  • Jest jeszcze trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nic nie kosztuje. Aby wyłączyć zasoby w celu uniknięcia naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Uruchamianie Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w ramach tego ćwiczenia z programowania wykorzystasz Google Cloud Shell – środowisko wiersza poleceń działające w chmurze.

W konsoli Google Cloud kliknij ikonę Cloud Shell na górnym pasku narzędzi:

55efc1aaa7a4d3ad.png

Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po zakończeniu powinno pojawić się coś takiego:

7ffe5cbb04455448.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, znacząco zwiększając wydajność sieci i uwierzytelnianie. Wszystkie zadania w ramach tego ćwiczenia z programowania można wykonywać w przeglądarce. Nie musisz niczego instalować.

3. Zanim zaczniesz

Włącz API

Dane wyjściowe:

W Cloud Shell sprawdź, czy identyfikator projektu jest skonfigurowany:

gcloud config set project [YOUR-PROJECT-ID]

Ustaw zmienną środowiskową PROJECT_ID:

PROJECT_ID=$(gcloud config get-value project)

Włącz wszystkie niezbędne usługi:

gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com

Oczekiwane dane wyjściowe

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

Skonfiguruj region domyślny do użycia modeli wektorów dystrybucyjnych Vertex AI. Dowiedz się więcej o lokalizacjach dostępnych dla Vertex AI. W tym przykładzie używamy regionu us-central1.

gcloud config set compute/region us-central1

4. Wdrażanie AlloyDB

Zanim utworzysz klaster AlloyDB, potrzebujemy dostępnego prywatnego zakresu adresów IP w naszym środowisku VPC, który będzie używany przez przyszłą instancję AlloyDB. Jeśli go nie mamy, musimy go utworzyć, przypisać do użytku przez wewnętrzne usługi Google, a następnie utworzyć klaster i instancję.

Tworzenie zakresu prywatnych adresów IP

Musimy skonfigurować konfigurację prywatnego dostępu do usługi w naszej sieci VPC dla AlloyDB. W tym ujęciu zakładamy, że „domyślna” Sieć VPC w projekcie, która będzie używana do wszystkich działań.

Utwórz zakres prywatnych adresów IP:

gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default

Utwórz połączenie prywatne, używając przydzielonego zakresu adresów IP:

gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].

student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.

student@cloudshell:~ (test-project-402417)$

Tworzenie klastra AlloyDB

Utwórz klaster AlloyDB w regionie us-central1.

Określ hasło użytkownika postgres. Możesz zdefiniować własne hasło lub wygenerować je przy użyciu funkcji losowej.

export PGPASSWORD=`openssl rand -hex 12`

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

Zanotuj hasło do PostgreSQL – do wykorzystania w przyszłości:

echo $PGPASSWORD

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

Zdefiniuj region i nazwę klastra AlloyDB. Wykorzystamy region us-central1 i Alloydb-aip-01 jako nazwę klastra:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Uruchom polecenie, aby utworzyć klaster:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION

Oczekiwane dane wyjściowe konsoli:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

Tworzenie instancji głównej AlloyDB

Utwórz instancję główną AlloyDB dla naszego klastra w tej samej sesji Cloud Shell. Jeśli rozłączysz konta, konieczne będzie ponowne zdefiniowanie zmiennych środowiskowych regionu i nazwy klastra.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

5. Połącz z AlloyDB

AlloyDB jest wdrażane z użyciem połączenia tylko prywatnego, dlatego do pracy z bazą danych potrzebuje maszyny wirtualnej z zainstalowanym klientem PostgreSQL.

Wdrażanie maszyny wirtualnej GCE

Utwórz maszynę wirtualną GCE w tym samym regionie i sieci VPC co klaster AlloyDB.

Wykonaj w Cloud Shell:

export ZONE=us-central1-a
gcloud compute instances create instance-1 \
    --zone=$ZONE \
    --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
gcloud compute instances create instance-1 \
    --zone=$ZONE \
    --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1].
NAME: instance-1
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE: 
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.71.192.233
STATUS: RUNNING

Zainstaluj klienta Postgres

Zainstaluj oprogramowanie klienckie PostgreSQL na wdrożonej maszynie wirtualnej

Połącz się z maszyną wirtualną:

gcloud compute ssh instance-1 --zone=us-central1-a

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a
Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417].                                                                                                                                                         
Updating project ssh metadata...done.                                                                                                                                                                                                                                              
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts.
Linux instance-1.us-central1-a.c.gleb-test-short-001-418811.internal 6.1.0-18-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
student@instance-1:~$ 

Zainstaluj oprogramowanie uruchamiające polecenie w maszynie wirtualnej:

sudo apt-get update
sudo apt-get install --yes postgresql-client

Oczekiwane dane wyjściowe konsoli:

student@instance-1:~$ sudo apt-get update
sudo apt-get install --yes postgresql-client
Get:1 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable InRelease [5146 B]
Get:2 https://packages.cloud.google.com/apt cloud-sdk-bullseye InRelease [6406 B]   
Hit:3 https://deb.debian.org/debian bullseye InRelease  
Get:4 https://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Get:5 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable/main amd64 Packages [1930 B]
Get:6 https://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:7 https://deb.debian.org/debian bullseye-backports InRelease [49.0 kB]
...redacted...
update-alternatives: using /usr/share/postgresql/13/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-client (13+225) ...
Processing triggers for man-db (2.9.4-2) ...
Processing triggers for libc-bin (2.31-13+deb11u7) ...

Łączenie z instancją

połączyć się z instancją główną z maszyny wirtualnej za pomocą psql;

Na tej samej karcie Cloud Shell z otwartą sesją SSH połączenia z maszyną wirtualną instancji 1.

Użyj podanej wartości hasła AlloyDB (PGPASSWORD) i identyfikatora klastra AlloyDB, aby połączyć się z AlloyDB z maszyny wirtualnej GCE:

export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"

Oczekiwane dane wyjściowe konsoli:

student@instance-1:~$ export PGPASSWORD=CQhOi5OygD4ps6ty
student@instance-1:~$ ADBCLUSTER=alloydb-aip-01
student@instance-1:~$ REGION=us-central1
student@instance-1:~$ INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
gleb@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require"
psql (15.6 (Debian 15.6-0+deb12u1), server 15.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>

Zamknij sesję psql:

exit

6. Przygotowanie bazy danych

Musimy utworzyć bazę danych, włączyć integrację z Vertex AI, utworzyć obiekty bazy danych i zaimportować dane.

Przyznaj niezbędne uprawnienia AlloyDB

Dodaj uprawnienia Vertex AI do agenta usługi AlloyDB.

Otwórz inną kartę Cloud Shell ze znakiem „+” na górze ekranu.

4ca978f5142bb6ce.png

Na nowej karcie Cloud Shell wykonaj te czynności:

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"

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-11039]
student@cloudshell:~ (test-project-001-402417)$ 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"
Updated IAM policy for project [test-project-001-402417].
bindings:
- members:
  - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com
  role: roles/aiplatform.user
- members:
...
etag: BwYIEbe_Z3U=
version: 1
 

Zamknij kartę przez wykonanie polecenia „exit” na karcie:

exit

Utwórz bazę danych

Tworzenie bazy danych – krótkie wprowadzenie.

W sesji maszyny wirtualnej GCE wykonaj:

Utwórz bazę danych:

psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"

Oczekiwane dane wyjściowe konsoli:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"
CREATE DATABASE
student@instance-1:~$  

Włączanie integracji Vertex AI

Włącz integrację Vertex AI i rozszerzenia pgvector w bazie danych.

Wykonaj w maszynie wirtualnej GCE:

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"

Oczekiwane dane wyjściowe konsoli:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"
CREATE EXTENSION
CREATE EXTENSION
student@instance-1:~$ 

Importowanie danych

Pobierz przygotowane dane i zaimportuj je do nowej bazy danych.

Wykonaj w maszynie wirtualnej GCE:

gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"

Oczekiwane dane wyjściowe konsoli:

student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
SET
SET
SET
SET
SET
 set_config 
------------
 
(1 row)
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
ALTER TABLE
ALTER TABLE
ALTER TABLE
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
COPY 941
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
COPY 263861
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"
COPY 4654
student@instance-1:~$

7. Oblicz wektory dystrybucyjne

Po zaimportowaniu danych otrzymaliśmy dane o produktach z tabeli cymbal_products, podając liczbę dostępnych produktów w każdym sklepie w tabeli cymbal_inventory oraz listę sklepów w tabeli cymbal_stores. Musimy obliczyć dane wektorowe na podstawie opisów naszych produktów i użyć do tego funkcji umieszczania. Za pomocą tej funkcji użyjemy integracji Vertex AI do obliczenia danych wektorowych na podstawie opisów naszych produktów i dodania ich do tabeli. Więcej informacji o zastosowanej technologii znajdziesz w dokumentacji.

Tworzenie kolumny wektora dystrybucyjnego

Połącz się z bazą danych za pomocą psql i utwórz kolumnę wirtualną z danymi wektorowymi, korzystając z funkcji osadzania w tabeli cymbal_products. Funkcja umieszczania zwraca dane wektorowe z Vertex AI na podstawie danych przesłanych z kolumny product_description.

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

W sesji psql po połączeniu się z bazą danych wykonaj:

ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;

Polecenie utworzy kolumnę wirtualną i zapełni ją danymi wektorowymi.

Oczekiwane dane wyjściowe konsoli:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
psql (13.11 (Debian 13.11-0+deb11u1), server 14.7)
WARNING: psql major version 13, server major version 14.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;
ALTER TABLE
quickstart_db=> 

8. Uruchom wyszukiwanie podobieństw

Możemy teraz przeprowadzać wyszukiwanie za pomocą wyszukiwania podobieństw na podstawie wartości wektorów obliczonych dla opisów i wartości wektora otrzymanego w żądaniu.

Zapytanie SQL można wykonać z tego samego interfejsu wiersza poleceń psql lub jako alternatywne w AlloyDB Studio. Wszystkie wielowierszowe i złożone dane wyjściowe mogą wyglądać lepiej w AlloyDB Studio.

Łączenie z AlloyDB Studio

W poniższych rozdziałach wszystkie polecenia SQL wymagające połączenia z bazą danych można także wykonać w AlloyDB Studio. Aby uruchomić polecenie, otwórz interfejs konsoli internetowej klastra AlloyDB przez kliknięcie instancji głównej.

ef4bfbcf0ed2ef3a.png

Następnie po lewej stronie kliknij AlloyDB Studio:

5c155cbcd7d43a1.png

Wybierz bazę danych Quickstart_db, postgres użytkownika i hasło zapisane podczas tworzenia klastra. Potem kliknij „Uwierzytelnij”. Przycisk

432613065cac864f.png

Otworzy się interfejs AlloyDB Studio. Aby uruchomić polecenia w bazie danych, kliknij „Edytor 1”. po prawej stronie.

b36c28f8165119ca.png

Otwiera interfejs, w którym można uruchamiać polecenia SQL

cf43aa20f292797e.png

Jeśli wolisz użyć wiersza poleceń psql, skorzystaj z alternatywnej trasy i połącz się z bazą danych przez sesję SSH maszyny wirtualnej w sposób opisany w poprzednich rozdziałach.

Uruchamianie wyszukiwania podobieństw z psql

Jeśli sesja bazy danych została odłączona, ponownie połącz się z bazą danych za pomocą psql lub AlloyDB Studio.

Połącz się z bazą danych:

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

Uruchom zapytanie, aby uzyskać listę dostępnych produktów, które są najbardziej związane z żądaniem klienta. Żądanie, które będziemy przekazywać do Vertex AI, aby uzyskać wartość wektora, brzmi na przykład „Jakiego rodzaju drzewa owocowe dobrze tu radzą?”.

Oto zapytanie, które możesz uruchomić, aby wybrać pierwsze 10 elementów, które najlepiej pasują do Twojego zapytania:

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;

Oto oczekiwane dane wyjściowe:

quickstart_db=> SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;
    product_name     |                                   description                                    | sale_price | zip_code |      distance       
---------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 Cherry Tree         | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 |   0.287184013172779
 Toyon               | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.30574073611569963
 Secateurs           | These secateurs are perfect for pruning small branches and vines.                |      15.00 |    93230 |  0.3264385326189635
 Trimming Shears     | These trimming shears are perfect for trimming hedges and bushes.                |      20.00 |    93230 | 0.33293036535756393
 Cypress Tree        | This is a beautiful cypress tree that will provide shade and privacy. It is an e |      75.00 |    93230 | 0.33485770716129326
 Madrone             | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.3354408801293012
 California Redwood  | This is a beautiful redwood tree that can grow to be over 300 feet tall. It is a |    1000.00 |    93230 |  0.3427243109636263
 California Lilac    | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 |  0.3427628377929176
 California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.3430208475356905
 Maple Tree          | This is a beautiful maple tree that will produce colorful leaves in the fall. It |     100.00 |    93230 |  0.3432609589330091
(10 rows)

quickstart_db=> 

9. Popraw odpowiedź

Korzystając z wyniku zapytania, możesz poprawić odpowiedź do aplikacji klienckiej i przygotować sensowne dane wyjściowe, używając podanych wyników zapytania w ramach promptu wysyłanego do generatywnego modelu językowego generatywnej AI.

Aby to osiągnąć, planujemy wygenerować plik JSON na podstawie naszych wyników wyszukiwania wektorowego, a następnie użyć wygenerowanego pliku JSON jako dodatku do promptu tekstowego modelu LLM w Vertex AI w celu utworzenia sensownych danych wyjściowych. W pierwszym kroku generujemy plik JSON, następnie testujemy go w Vertex AI Studio, a w ostatnim kroku dodajemy go do instrukcji SQL, której można użyć w aplikacji.

Generowanie danych wyjściowych w formacie JSON

Zmodyfikuj zapytanie, aby wygenerować dane wyjściowe w formacie JSON i zwrócić tylko 1 wiersz, który zostanie przekazany do Vertex AI

Oto przykład zapytania:

WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Oto oczekiwany plik JSON w danych wyjściowych:

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

Uruchamianie promptu w Vertex AI Studio

Możemy użyć wygenerowanego pliku JSON, aby dostarczyć go jako część promptu do modelu tekstowego generatywnej AI w Vertex AI Studio

Otwórz Vertex AI Studio w konsoli Cloud.

e514b176aef7945e.png

54712e5ade7121f.png

Może pojawić się prośba o włączenie dodatkowych interfejsów API, ale możesz to zignorować. Aby ukończyć moduł, nie potrzebujesz żadnych dodatkowych interfejsów API.

Użyjemy takiego promptu:

Jesteś przyjaznym doradcą i pomagasz znaleźć produkt dostosowany do potrzeb klienta.

Na prośbę klienta załadowaliśmy listę produktów ściśle związanych z wyszukiwaniem.

lista w formacie JSON z listą wartości takich jak {"product_name":"name","description":"opis","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}

Oto lista produktów:

[miejsce na nasz plik JSON]

Klient pyta: „Które drzewo tutaj rosną najlepiej?”.

Należy podać informacje o produkcie i cenie oraz kilka informacji dodatkowych” jako prompt

Po uruchomieniu prompta z wartościami JSON i użyciem modelu gemini-1.5-flash wynik będzie taki:

30e5072cd2975685.png

Odpowiedź uzyskana na podstawie modelu w tym przykładzie jest: Pamiętaj, że odpowiedź może być inna ze względu na zmiany modelu i parametrów z biegiem czasu:

„Widzę, że szukasz drzewa, które kwitnie w Twojej okolicy. Na podstawie Twojego kodu pocztowego 93230 uważamy, że drzewo wiśniowe to świetna opcja.

To piękne drzewo, które pozwala produkować przepyszne wiśnie. Obecnie jest w promocji za 75 złotych.

Chociaż nie znam tempa wzrostu w Twoim regionie, mogę powiedzieć, że wiśnie na ogół preferują dobrze nawodnioną glebę i pełne nasłonecznienie.

Aby uzyskać najlepsze efekty, skonsultuj się z lokalnym ogrodnikiem lub ogrodnikiem, który udzieli Ci bardziej spersonalizowanych porad dostosowanych do Twojej lokalizacji i stanu gleby. Mogą oni również pomóc w wyborze odmian, które najlepiej odpowiadają Twoim potrzebom, i udzielić wskazówek dotyczących sadzenia i pielęgnacji”.

Uruchamianie promptu w PSQL

Możemy użyć integracji AlloyDB AI z Vertex AI, aby uzyskać tę samą odpowiedź z modelu generatywnego korzystającego z SQL bezpośrednio w bazie danych. Ale aby korzystać z modelu gemini-1.5-flash, musimy go najpierw zarejestrować.

Uaktualnij rozszerzenie do wersji 1.3. Połącz się z bazą danych Quickstart_db z bazy danych pSQL w sposób, jaki pokazano wcześniej (lub użyj AlloyDB Studio) i wykonaj te czynności:

ALTER EXTENSION google_ml_integration UPDATE TO '1.3'

Następnie musimy ustawić flagę bazy danych google_ml_integration.enable_model_support na „on”. Możesz to zrobić za pomocą interfejsu konsoli internetowej AlloyDB lub uruchomić poniższe polecenie gcloud.

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
  --database-flags google_ml_integration.enable_model_support=on \
  --region=$REGION \
  --cluster=$ADBCLUSTER \
  --project=$PROJECT_ID \
  --update-mode=FORCE_APPLY

Polecenie zostanie wykonane w tle po około 3–5 minutach. Następnie możesz sprawdzić nową flagę w sesji psql lub przy użyciu AlloyDB Studio łączącego się z bazą danych Quickstart_db.

show google_ml_integration.enable_model_support;

Oczekiwane dane wyjściowe sesji psql to „wł.”:

postgres=> show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

Następnie musimy zarejestrować 2 modele. Pierwsza to już używany model text-embedding-004. Wymagana jest rejestracja, ponieważ włączyliśmy funkcje rejestracji modeli.

Aby zarejestrować model, uruchom w psql lub AlloyDB Studio ten kod:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-004',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-004',
    model_type => 'text_embedding',
    model_auth_type => 'alloydb_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

Kolejnym modelem, który musimy zarejestrować, jest gemini-1.5-flash-001. Zostanie on użyty do wygenerowania przyjaznych dla użytkownika danych wyjściowych.

CALL
  google_ml.create_model(
    model_id => 'gemini-1.5-flash-001',
    model_request_url => 'https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/publishers/google/models/gemini-1.5-flash-001:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'alloydb_service_agent_iam');

Zawsze możesz zweryfikować listę zarejestrowanych modeli, wybierając informacje z pliku google_ml.model_info_view.

select model_id,model_type from google_ml.model_info_view;

Oto przykładowe dane wyjściowe

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
        model_id         |   model_type   
-------------------------+----------------
 textembedding-gecko     | text_embedding
 textembedding-gecko@001 | text_embedding
 text-embedding-004      | text_embedding
 gemini-1.5-flash-001    | generic
(4 rows)

Teraz możemy użyć wygenerowanego w podzapytaniu pliku JSON, aby dostarczyć je jako część promptu do modelu tekstowego generatywnej AI za pomocą SQL.

Uruchom zapytanie w sesji psql lub AlloyDB Studio w bazie danych

WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci ON
        ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
        cs.store_id = ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:' || json_agg(trees) || 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information' AS prompt_text
FROM
        trees),
response AS (
SELECT
        json_array_elements(google_ml.predict_row( model_id =>'gemini-1.5-flash-001',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text)))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
        string_agg(resp::text,
        ' ')
FROM
        response;

Oto oczekiwane dane wyjściowe. Dane wyjściowe mogą się różnić w zależności od wersji modelu i parametrów:

--------------------------------------------------------------------------------------------------------
 "I" " see you're interested in fruit trees! Based on your location, I found" " one great option:\n\n**Cherry Tree:** \n\nThis beautiful cherry tree will" " produce delicious cherries. It's a deciduous tree, meaning it loses its leaves in the fall, and can grow up to 15 feet tall. The" " leaves are a vibrant dark green in the summer, turning a beautiful red in the fall. \n\nCherry trees are known for their beauty and ability to provide shade" " and privacy. They prefer a cool, moist climate and sandy soil, making them a good fit for your area. \n\nThe Cherry Tree is currently on sale for $75.00.\n\nWould you like to know more about" " the Cherry Tree, or are you interested in exploring other fruit tree options? \n" ""
(1 row)

10. Wyczyść środowisko

Po zakończeniu modułu zniszcz instancje i klaster AlloyDB

Usuwanie klastra AlloyDB i wszystkich instancji

Klaster zostanie zniszczony za pomocą wymuszania opcji, co spowoduje również usunięcie wszystkich należących do niego instancji.

W Cloud Shell zdefiniuj zmienne projektu i środowiskowego, jeśli konto jest odłączone i stracone są wszystkie poprzednie ustawienia:

gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

Usuń klaster:

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
All of the cluster data will be lost when the cluster is deleted.

Do you want to continue (Y/n)?  Y

Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f
Deleting cluster...done.   

Usuwanie kopii zapasowych AlloyDB

Usuń wszystkie kopie zapasowe AlloyDB z klastra:

for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f
Deleting backup...done.                                                                                                                                                                                                                                                            

Teraz możemy zniszczyć naszą maszynę wirtualną

Usuwanie maszyny wirtualnej GCE

Wykonaj w Cloud Shell:

export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet

Oczekiwane dane wyjściowe konsoli:

student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet
Deleted 

11. Gratulacje

Gratulujemy ukończenia ćwiczeń z programowania.

Omówione zagadnienia

  • Jak wdrożyć klaster i instancję główną AlloyDB
  • Łączenie się z AlloyDB z maszyny wirtualnej Google Compute Engine
  • Jak utworzyć bazę danych i włączyć AlloyDB AI
  • Jak wczytywać dane do bazy danych
  • Jak używać modelu umieszczania Vertex AI w AlloyDB
  • Wzbogacanie wyników za pomocą modelu generatywnego Vertex AI

12. Ankieta

Dane wyjściowe:

Jak wykorzystasz ten samouczek?

tylko do przeczytania. Przeczytaj go i wykonaj ćwiczenia