1. Wprowadzenie
W tym ćwiczeniu dowiesz się, jak korzystać z integracji AI w Cloud SQL for PostgreSQL, łącząc wyszukiwanie wektorowe z osadzaniem z Gemini Enterprise Agent Platform.

Wymagania wstępne
- Podstawowa znajomość Google Cloud i konsoli Google Cloud
- Podstawowa znajomość interfejsu wiersza poleceń i Cloud Shell
Jakie zadania wykonasz
- Wdrażanie instancji Cloud SQL for PostgreSQL
- Utwórz bazę danych i włącz integrację Cloud SQL AI.
- Wczytywanie danych do bazy danych
- Korzystanie z Cloud SQL Studio
- Generowanie wektorów dystrybucyjnych za pomocą Gemini Enterprise Agent Platform w Cloud SQL
- Korzystanie z Agent Platform Studio
- Wzbogacanie wyników zapytania za pomocą modelu generatywnego Gemini Enterprise Agent Platform
- Zwiększanie wydajności zapytań za pomocą indeksu wektorowego HNSW
Czego potrzebujesz
- konto Google Cloud i projekt w chmurze Google Cloud,
- przeglądarka, np. Chrome;
2. Konfiguracja i wymagania
Konfigurowanie projektu
- Zaloguj się w konsoli Google Cloud. Jeśli nie masz jeszcze konta Google (Gmail lub Google Workspace), musisz je utworzyć.
Użyj konta osobistego zamiast konta służbowego lub szkolnego.
- Utwórz nowy projekt lub użyj istniejącego. Aby utworzyć nowy projekt w konsoli Google Cloud, na pasku narzędzi kliknij Wybierz projekt.

W oknie Wybierz projekt kliknij Nowy projekt.

W oknie wpisz Nazwę projektu i wybierz Lokalizację.

- Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Nazwa projektu nie jest używana przez interfejsy API Google i można ją w każdej chwili zmienić.
- Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Google Cloud automatycznie generuje unikalny identyfikator, ale możesz go dostosować. Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować kolejny losowy identyfikator lub podać własny, aby sprawdzić jego dostępność. W większości ćwiczeń z programowania odwołujesz się do identyfikatora projektu, który jest zwykle oznaczony symbolem zastępczym
. - Trzecia wartość, numer projektu, jest używana przez niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji Tworzenie projektów i zarządzanie nimi.
Włącz płatności
Konfigurowanie osobistego konta rozliczeniowego
Jeśli skonfigurujesz płatności za pomocą środków w Google Cloud, możesz pominąć ten krok.
Aby skonfigurować osobiste konto rozliczeniowe, włącz rozliczenia w konsoli Rozliczeń usługi Google Cloud.
Uwagi:
- Ukończenie tego modułu kosztuje mniej niż 5 USD w zasobach Google Cloud.
- Jeśli chcesz uniknąć dalszych opłat, wykonaj czynności opisane na końcu tego modułu, aby usunąć zasoby.
- Nowi użytkownicy mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.
Uruchamianie Cloud Shell
Możesz zdalnie korzystać z Google Cloud na swoim komputerze, ale w tym ćwiczeniu użyjesz Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.
Na pasku narzędzi konsoli Google Cloud kliknij Aktywuj Cloud Shell:

Możesz też nacisnąć g, a potem s w konsoli Google Cloud lub otworzyć Cloud Shell.
Udostępnienie środowiska i połączenie się z nim zajmuje tylko kilka chwil. Po zakończeniu powinien pojawić się podłączony terminal:

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Wszystkie zadania w tym ćwiczeniu możesz wykonać w przeglądarce.
3. Włącz interfejsy API
Aby korzystać z Cloud SQL, Compute Engine, Service Networking i Gemini Enterprise Agent Platform, włącz odpowiednie interfejsy API w projekcie Google Cloud.
W terminalu Cloud Shell sprawdź, czy identyfikator projektu jest ustawiony:
gcloud config set project <PROJECT_ID>
Ustaw zmienną środowiskową PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
Włącz wszystkie wymagane usługi:
gcloud services enable sqladmin.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 sqladmin.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.
Informacje o każdym włączonym interfejsie API znajdziesz w dokumentacji.
4. Utworzenie instancji Cloud SQL
Utwórz instancję Cloud SQL z integracją bazy danych Gemini Enterprise Agent Platform.
Tworzenie hasła do bazy danych
Określ hasło domyślnego użytkownika bazy danych. Możesz zdefiniować własne hasło lub użyć funkcji losowej, aby je wygenerować:
export CLOUDSQL_PASSWORD=$(openssl rand -hex 16)
Wyświetl wygenerowane hasło:
echo $CLOUDSQL_PASSWORD
Zapisz wygenerowane hasło, aby użyć go później.
Utwórz instancję Cloud SQL for PostgreSQL
Instancje Cloud SQL można tworzyć na kilka sposobów, m.in. za pomocą konsoli Google Cloud, Terraform lub Google Cloud CLI (gcloud). W tym laboratorium użyjesz gcloud. Aby dowiedzieć się, jak utworzyć instancję za pomocą innych narzędzi, zapoznaj się z dokumentacją Tworzenie instancji.
Aby utworzyć instancję, w Cloud Shell uruchom to polecenie:
gcloud sql instances create my-cloudsql-instance \
--database-version=POSTGRES_18 \
--tier=db-custom-1-3840 \
--region=us-central1 \
--edition=ENTERPRISE \
--enable-google-ml-integration \
--database-flags cloudsql.enable_google_ml_integration=on
Po utworzeniu instancji ustaw hasło domyślnego użytkownika (postgres) i sprawdź, czy możesz się połączyć:
gcloud sql users set-password postgres \
--instance=my-cloudsql-instance \
--password=$CLOUDSQL_PASSWORD
Połącz się z instancją za pomocą gcloud sql connect. Gdy pojawi się prośba, wpisz hasło:
gcloud sql connect my-cloudsql-instance --user=postgres
Aby wyjść z sesji psql, naciśnij Ctrl+D lub wpisz exit:
exit
Włączanie integracji z Gemini Enterprise Agent Platform
Przypisz niezbędną rolę uprawnień do konta usługi Cloud SQL, aby włączyć integrację z platformą agentów Gemini Enterprise.
Pobierz adres e-mail konta usługi Cloud SQL i wyeksportuj go jako zmienną środowiskową:
SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL
Przypisz rolę roles/aiplatform.user do konta usługi Cloud SQL:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="roles/aiplatform.user"
Więcej informacji o tworzeniu i konfigurowaniu instancji znajdziesz w artykule Integrowanie Cloud SQL z Gemini Enterprise Agent Platform.
5. Przygotowywanie bazy danych
Utwórz bazę danych i włącz obsługę wektorów.
Utwórz bazę danych
Utwórz bazę danych o nazwie quickstart_db. Bazy danych możesz tworzyć za pomocą klientów baz danych (np. psql), Google Cloud CLI lub Cloud SQL Studio. W tym kroku użyj gcloud.
Aby utworzyć bazę danych, uruchom w Cloud Shell to polecenie:
gcloud sql databases create quickstart_db --instance=my-cloudsql-instance
Włączanie rozszerzeń
Aby pracować z Gemini Enterprise Agent Platform i wektorami, włącz w bazie danych quickstart_db 2 rozszerzenia: google_ml_integration i vector.
W Cloud Shell połącz się z bazą danych:
gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres
Gdy pojawi się prośba, wpisz hasło do bazy danych.
W sesji SQL uruchom te polecenia:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;
Zakończ sesję SQL:
exit;
6. Wczytaj dane
Utwórz tabele w bazie danych i załaduj dane za pomocą fikcyjnych plików zbioru danych Cymbal Store przechowywanych w publicznym zasobniku Cloud Storage w formacie CSV.
Najpierw utwórz wymagane obiekty schematu. Uruchom polecenia gcloud sql connect i gcloud storage, aby pobrać i zaimportować schemat:
W Cloud Shell uruchom to polecenie (gdy pojawi się prośba, wpisz hasło utworzone dla instancji):
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql | gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres
To polecenie łączy się z bazą danych i wykonuje pobrany kod SQL, aby utworzyć tabele, indeksy i sekwencje.
Następnie pobierz pliki danych CSV z Cloud Storage:
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv .
Połącz się z bazą danych:
gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres
Importowanie danych z plików CSV:
\copy cymbal_products from 'cymbal_products.csv' csv header
\copy cymbal_inventory from 'cymbal_inventory.csv' csv header
\copy cymbal_stores from 'cymbal_stores.csv' csv header
Jeśli używasz własnych danych, a pliki CSV są zgodne z narzędziem importowania Cloud SQL w konsoli Google Cloud, możesz użyć konsoli zamiast wiersza poleceń.
7. Tworzenie wektorów dystrybucyjnych
Utwórz wektory osadzeń dla opisów produktów za pomocą modelu text-embedding-005 z Gemini Enterprise Agent Platform i zapisz je jako dane wektorowe.
Jeśli sesja została przerwana, połącz się z bazą danych:
gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres
Utwórz wygenerowaną kolumnę o nazwie embedding w tabeli cymbal_products za pomocą funkcji embedding. To polecenie tworzy zapisaną kolumnę wygenerowaną, która zawiera wektory dystrybucyjne wygenerowane z kolumny product_description dla wszystkich wierszy w tabeli. Model jest określony jako pierwszy parametr, a kolumna tekstu źródłowego jako drugi parametr:
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (google_ml.embedding('text-embedding-005', product_description)) STORED;
W przypadku 900–1000 wierszy ten proces trwa zwykle od 1 do 5 minut.
Gdy wstawisz do tabeli nowy wiersz lub zaktualizujesz product_description w istniejącym wierszu, kolumna embedding zostanie automatycznie zaktualizowana.
8. Uruchamianie wyszukiwania podobieństw
Przeprowadź wyszukiwanie podobieństwa, porównując wektory dystrybucyjne obliczone na podstawie opisów produktów z wektorem dystrybucyjnym zapytania.
Zapytania SQL możesz uruchamiać z wiersza poleceń za pomocą polecenia gcloud sql connect lub w Cloud SQL Studio. Cloud SQL Studio zapewnia wygodniejszy sposób edytowania i wykonywania długich instrukcji SQL z wieloma wierszami w danych wyjściowych.
Uruchamianie Cloud SQL Studio
- W konsoli Google Cloud otwórz instancje Cloud SQL i kliknij
my-cloudsql-instance.

- W menu nawigacyjnym kliknij Cloud SQL Studio.

- W oknie uwierzytelniania wpisz nazwę bazy danych i dane logowania:
- Baza danych:
quickstart_db - Użytkownik:
postgres - Hasło:
- Baza danych:
- Kliknij Uwierzytelnij.

- Kliknij kartę Edytor, aby otworzyć edytor SQL.

Uruchom zapytanie
Uruchom zapytanie, aby pobrać 10 najbardziej trafnych produktów w odpowiedzi na zapytanie klienta: „Jakie drzewa owocowe dobrze rosną w tym miejscu?”
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
(cp.embedding <=> embedding('text-embedding-005','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;
W Cloud SQL Studio wpisz zapytanie i kliknij Uruchom (lub uruchom zapytanie w sesji psql):

Zapytanie zwraca pasujące produkty uporządkowane według odległości cosinusowej:
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.43922018972266397 Meyer Lemon Tree | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by | 34 | 93230 | 0.4685112926118228 Toyon | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e | 10.00 | 93230 | 0.4835677149651668 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.4947204525907498 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e | 25.00 | 93230 | 0.5054166905547247 California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d | 100.00 | 93230 | 0.5084219510932597 California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is | 300.00 | 93230 | 0.5140519790508755 Coast Live Oak | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev | 500.00 | 93230 | 0.5143126438081371 Fremont Cottonwood | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i | 200.00 | 93230 | 0.5174774727252058 Madrone | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an | 50.00 | 93230 | 0.5227400803389093 (10 rows)
9. Ulepszanie odpowiedzi LLM za pomocą pobranych danych
Ulepsz odpowiedź generatywnej AI w aplikacji klienta, przekazując wyniki zapytania jako kontekst w prompcie do podstawowego modelu językowego Gemini Enterprise Agent Platform.
W tym celu:
- Generowanie ładunku JSON na podstawie wyniku wyszukiwania wektorowego w Cloud SQL.
- Przetestuj prompt w Agent Platform Studio.
- Wykonaj kompleksową prośbę bezpośrednio z SQL za pomocą integracji
google_ml.
Generowanie danych wyjściowych w formacie JSON
Zmodyfikuj zapytanie, aby sformatować wynik jako JSON i zwrócić 1 wiersz:
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-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
Oczekiwane dane wyjściowe JSON:
[{"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"}]
Uruchom prompt w Agent Platform Studio
Wygenerowany plik JSON podaj jako kontekst w prompcie do modelu generatywnego w Agent Platform Studio.
- W konsoli Google Cloud otwórz Agent Platform Studio.

- Wpisz w Agent Platform Studio ten prompt:

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","description":"some description","sale_price":10,"zip_code": 10234, "product_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
<JSON_OUTPUT>
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.
Zastąp odpowiedzią JSON z zapytania:
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","description":"some description","sale_price":10,"zip_code": 10234, "product_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[{"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"}]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

- Uruchom prompta.

Odpowiedź zawiera cenę, opis i dodatkowe informacje, które model uzyskuje ze źródeł zewnętrznych na podstawie informacji o drzewie i lokalizacji.
Uruchom prompta w psql
Możesz też użyć integracji Cloud SQL AI z platformą Gemini Enterprise Agent Platform, aby otrzymywać odpowiedzi z modelu generatywnego bezpośrednio w SQL. Najpierw zarejestruj model.
- W razie potrzeby zaktualizuj rozszerzenie do wersji 1.4.3 lub nowszej. Połącz się z
quickstart_dbi uruchom:
SELECT extversion from pg_extension where extname='google_ml_integration';
Jeśli zwrócona wersja jest starsza niż 1.4.3, uruchom:
ALTER EXTENSION google_ml_integration UPDATE TO '1.4.3';
- Sprawdź flagę bazy danych
google_ml_integration.enable_model_support:
SHOW google_ml_integration.enable_model_support;
Jeśli flaga ma wartość off, zaktualizuj flagę bazy danych w Cloud Shell:
gcloud sql instances patch my-cloudsql-instance \
--database-flags google_ml_integration.enable_model_support=on,cloudsql.enable_google_ml_integration=on
Ta operacja trwa od 1 do 3 minut. Ponownie sprawdź ustawienie:
SHOW google_ml_integration.enable_model_support;
- Zarejestruj model
gemini-3.5-flashdo generowania odpowiedzi (zastąpidentyfikatorem projektu):
CALL
google_ml.create_model(
model_id => 'gemini-3.5-flash',
model_request_url => 'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.5-flash:generateContent',
model_provider => 'google',
model_auth_type => 'cloudsql_service_agent_iam');
Sprawdź zarejestrowane modele:
SELECT model_id, model_type FROM google_ml.model_info_view WHERE model_id='gemini-3.5-flash';
- Uruchom pełne zapytanie SQL, aby pobrać wyniki wyszukiwania wektorowego i przekazać je bezpośrednio do
gemini-3.5-flash:
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-005',
'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
google_ml.predict_row( model_id =>'gemini-3.5-flash',
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
REPLACE(resp::text, '\n', CHR(10))
FROM
response;
Oczekiwane dane wyjściowe:
"Hello there! If you're looking for a wonderful fruit tree to plant, I have a fantastic option for you: ### **Cherry Tree** * **Price:** $75.00 * **Product ID:** `d536e9e823296a2eba198e52dd23e712` --- ### **Why it's a great choice:** * **Fruit & Shade:** Not only will it produce delicious, sweet cherries, but it also grows into a beautiful 15-foot deciduous tree that provides excellent shade and privacy for your yard. * **Seasonal Beauty:** Its leaves are a lovely dark green throughout the summer and transition into a striking red during the fall. * **Ideal Growing Conditions:** Cherry trees thrive best in cool, moist climates with sandy soil and are suitable for **USDA hardiness zones 4–9**. If your local climate matches these conditions, this Cherry Tree would make a beautiful and tasty addition to your garden! Let me know if you'd like more details or help placing an order."
10. Tworzenie indeksu najbliższych sąsiadów
W przypadku dużych zbiorów danych zawierających miliony wektorów wyszukiwanie wektorowe może wymagać znacznych zasobów obliczeniowych. Aby zwiększyć wydajność zapytań, utwórz indeks na wektorowych osadzeniach.
Tworzenie indeksu HNSW
Hierarchical Navigable Small World (HNSW) to indeks wektorowy oparty na grafie.
Aby utworzyć indeks HNSW w kolumnie embedding, określ funkcję odległości (vector_cosine_ops) i opcjonalne parametry, takie jak m i ef_construction. Więcej informacji znajdziesz w artykule Praca z wektorami dystrybucyjnymi.
CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
Oczekiwane dane wyjściowe:
quickstart_db=> CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64); CREATE INDEX quickstart_db=>
Porównywanie skuteczności zapytań
Uruchom zapytanie w ramach wyszukiwania wektorowego za pomocą znaku EXPLAIN (ANALYZE), aby sprawdzić, czy planer zapytań używa indeksu:
EXPLAIN (ANALYZE)
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-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
Oczekiwane dane wyjściowe:
Aggregate (cost=779.12..779.13 rows=1 width=32) (actual time=1.066..1.069 rows=1 loops=1)
-> Subquery Scan on trees (cost=769.05..779.12 rows=1 width=142) (actual time=1.038..1.041 rows=1 loops=1)
-> Limit (cost=769.05..779.11 rows=1 width=158) (actual time=1.022..1.024 rows=1 loops=1)
-> Nested Loop (cost=769.05..9339.69 rows=852 width=158) (actual time=1.020..1.021 rows=1 loops=1)
-> Nested Loop (cost=768.77..9316.48 rows=852 width=945) (actual time=0.858..0.859 rows=1 loops=1)
-> Index Scan using cymbal_products_embeddings_hnsw on cymbal_products cp (cost=768.34..2572.47 rows=941 width=941) (actual time=0.532..0.539 rows=3 loops=1)
...
Planning Time: 112.398 ms
Execution Time: 1.221 ms
W planie wykonania pojawi się symbol Index Scan using cymbal_products_embeddings_hnsw.
Uruchom zapytanie bez narzędzia EXPLAIN:
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-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
Oczekiwane dane wyjściowe:
[{"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"}]
Więcej informacji i przykłady dotyczące LangChain i indeksów wektorowych znajdziesz w dokumentacji Cloud SQL AI – omówienie.
11. Zwalnianie miejsca
Po zakończeniu ćwiczeń usuń instancję Cloud SQL.
W Cloud Shell ustaw projekt i zmienne środowiskowe, jeśli sesja została odłączona:
export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)
Usuń instancję:
gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
Oczekiwane dane wyjściowe:
student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID All of the instance data will be lost when the instance is deleted. Do you want to continue (Y/n)? y Deleting Cloud SQL instance...done. Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].
12. Gratulacje
Gratulacje! To już koniec tego laboratorium.
Ten moduł jest częścią ścieżki szkoleniowej Wdrażanie AI w Google Cloud.
- Poznaj pełny program nauczania, aby przejść od prototypu do produkcji.
- Udostępniaj swoje postępy z hasztagiem
#ProductionReadyAI.
Podsumowanie
Dowiedziałeś(-aś) się, jak:
- Wdrażanie instancji Cloud SQL for PostgreSQL
- Utwórz bazę danych i włącz integrację Cloud SQL AI.
- Wczytywanie danych do bazy danych
- Korzystanie z Cloud SQL Studio
- Używanie modelu wektorów dystrybucyjnych z Gemini Enterprise Agent Platform w Cloud SQL
- Korzystanie z Agent Platform Studio
- Wzbogacanie wyników zapytania za pomocą modelu generatywnego Gemini Enterprise Agent Platform
- Zwiększanie wydajności zapytań za pomocą indeksu wektorowego
Wypróbuj ćwiczenie w Codelabs dotyczące wektorów dystrybucyjnych AI w AlloyDB z indeksem ScaNN zamiast HNSW.