Wprowadzenie do wektorów dystrybucyjnych w Cloud SQL for PostgreSQL

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.

Schemat architektury pokazujący integrację Cloud SQL 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

  1. 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.

  1. Utwórz nowy projekt lub użyj istniejącego. Aby utworzyć nowy projekt w konsoli Google Cloud, na pasku narzędzi kliknij Wybierz projekt.

Okno wyboru projektu w konsoli Google Cloud

W oknie Wybierz projekt kliknij Nowy projekt.

37d264871000675d.png

W oknie wpisz Nazwę projektu i wybierz Lokalizację.

96d86d3d5655cdbe.png

  • 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:

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:

Aktywowanie 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:

Zrzut ekranu terminala Google Cloud Shell pokazujący, że środowisko zostało połączone

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

  1. W konsoli Google Cloud otwórz instancje Cloud SQL i kliknij my-cloudsql-instance.

Lista instancji Cloud SQL w konsoli Google Cloud

  1. W menu nawigacyjnym kliknij Cloud SQL Studio.

Element menu Cloud SQL Studio

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

Okno uwierzytelniania Cloud SQL Studio

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

Karta edytora SQL w Cloud SQL Studio

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):

Uruchamianie zapytania SQL w Cloud SQL Studio

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:

  1. Generowanie ładunku JSON na podstawie wyniku wyszukiwania wektorowego w Cloud SQL.
  2. Przetestuj prompt w Agent Platform Studio.
  3. 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.

  1. W konsoli Google Cloud otwórz Agent Platform Studio.

Nawigacja w Agent Platform Studio

  1. Wpisz w Agent Platform Studio ten prompt:

Wpisywanie prompta w Agent Platform Studio

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.

Prompt w Agent Platform Studio

  1. Uruchom prompta.

Wynik prompta w Agent Platform Studio

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.

  1. W razie potrzeby zaktualizuj rozszerzenie do wersji 1.4.3 lub nowszej. Połącz się z quickstart_db i 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';
  1. 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;
  1. Zarejestruj model gemini-3.5-flash do generowania odpowiedzi (zastąp identyfikatorem 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';
  1. 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.

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.