Wprowadzenie do wektorów dystrybucyjnych w Cloud SQL dla MySQL

1. Wprowadzenie

Z tego ćwiczenia dowiesz się, jak używać integracji AI w Cloud SQL for MySQL do wyszukiwania semantycznego z użyciem wektorów dystrybucyjnych oraz jak zwiększyć wydajność za pomocą indeksu danych wektorowych.

8aa6ba3bc12a1593.png

Wymagania wstępne

  • Podstawowa znajomość Google Cloud i konsoli Google Cloud
  • Podstawowa znajomość interfejsu wiersza poleceń i Cloud Shell

Czego się nauczysz

  • Jak wdrożyć instancję Cloud SQL dla MySQL
  • Jak utworzyć bazę danych i włączyć integrację Cloud SQL z AI
  • Wczytywanie danych do bazy danych
  • Jak korzystać z Cloud SQL Studio
  • Jak używać modelu wektorów dystrybucyjnych Vertex AI w Cloud SQL
  • Jak korzystać z Agent Platform Studio
  • Jak wzbogacić wynik za pomocą modelu Gemini Enterprise Agent Platform
  • Jak zwiększyć wydajność za pomocą indeksu wektorów

Czego potrzebujesz

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

2. Konfiguracja i wymagania

Konfiguracja projektu

  1. Zaloguj się w konsoli Google Cloud. Jeśli nie masz jeszcze konta Gmail lub Google Workspace, musisz utworzyć konto Google.

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.

295004821bab6a87.png

W oknie Wybierz projekt kliknij przycisk Nowy projekt, który otworzy okno nowego projektu.

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 .
  • Warto wiedzieć, że istnieje też trzecia wartość, czyli numer projektu, której używają 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

Płatności możesz włączyć na 2 sposoby. Możesz użyć osobistego konta rozliczeniowego lub wykorzystać środki, wykonując te czynności.

Wykorzystaj środki w Google Cloud (opcjonalnie)

Aby przeprowadzić te warsztaty, musisz mieć konto rozliczeniowe z kredytem. Aby rozpocząć, użyj środków udostępnionych przez organizatorów warsztatów lub podanych na banerze u góry tego laboratorium. Jeśli masz już połączenie z kontem rozliczeniowym, możesz pominąć ten krok.

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:

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

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

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. Zanim zaczniesz

Włącz 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 get project

Jeśli zwraca pusty ciąg znaków, ustaw go za pomocą tego kodu:

gcloud config set project [YOUR-PROJECT-ID]

Ustaw zmienną środowiskową PROJECT_ID:

PROJECT_ID=$(gcloud config get-value project)

Włącz wszystkie niezbędne interfejsy API:

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.

Utwórz hasło 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.

Tworzenie instancji Cloud SQL for MySQL

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.

Flagę cloudsql_vector można włączyć podczas tworzenia instancji. Obsługa wektorów jest dostępna w MySQL w wersji 8.0 R20241208.01_00 lub nowszej.

W sesji Cloud Shell wykonaj to polecenie:

gcloud sql instances create my-cloudsql-instance \
--database-version=MYSQL_8_4 \
--tier=db-custom-2-8192 \
--region=us-central1 \
--enable-google-ml-integration \
--edition=ENTERPRISE \
--root-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=root

Oczekiwane dane wyjściowe:

$gcloud sql connect my-cloudsql-instance --user=root
Allowlisting your IP for incoming connection for 5 minutes...done.                                                                                                                           
Connecting to database with SQL user [root].Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 8.4.4-google (Google)

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Aby wyjść z sesji mysql, 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:

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 dokumentacji Cloud SQL tutaj.

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. mysql), 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

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.

Cloud Shell będzie Twoim głównym środowiskiem do łączenia się z bazą danych, tworzenia wszystkich obiektów i wczytywania danych.

Dodaj publiczny adres IP Cloud Shell do listy autoryzowanych sieci instancji Cloud SQL.

W Cloud Shell wykonaj to polecenie:

gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)

Jeśli sesja zostanie utracona, zresetowana lub pracujesz w innym narzędziu, ponownie wyeksportuj zmienną CLOUDSQL_PASSWORD:

export CLOUDSQL_PASSWORD=...your password defined for the instance...

Utwórz wymagane obiekty bazy danych. Użyj mysql wraz z curl, aby pobrać i zastosować schemat z publicznego źródła.

W Cloud Shell wykonaj to polecenie:

export INSTANCE_IP=$(gcloud sql instances describe my-cloudsql-instance --format="value(ipAddresses.ipAddress)")
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_mysql_schema.sql | mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

Zestawienie polecenia. W poprzednim kroku połączyliśmy się z bazą danych i uruchomiliśmy skrypt SQL, aby utworzyć tabele, indeksy i sekwencje.

Następnie wypełnij bazę danych cymbal_products danymi, uruchamiając polecenia curl i mysql:

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_products.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_products FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

Kontynuuj z cymbal_stores.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_stores.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_stores FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

Uzupełnij go o cymbal_inventory, który zawiera liczbę każdego produktu w każdym sklepie.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_inventory.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_inventory FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

Opcjonalnie: jeśli masz własny przykładowy zbiór danych, możesz zamiast tego zaimportować zgodne pliki CSV za pomocą narzędzia do importowania w konsoli Google Cloud.

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.

Aby przechowywać dane wektorowe, musisz włączyć funkcje wektorowe w instancji Cloud SQL.

Uruchom w Cloud Shell:

gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on

Połącz się z bazą danych:

mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

Utwórz nową kolumnę embedding w tabeli cymbal_products za pomocą funkcji przekształcania w wektory dystrybucyjne. Nowa kolumna będzie zawierać wektory dystrybucyjne utworzone na podstawie tekstu w kolumnie product_description:

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);

Uwaga: generowanie osadzeń dla 2000 wierszy zwykle trwa mniej niż 5 minut.

Zakończ sesję mysql:

exit

8. Uruchom wyszukiwanie 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ń lub z Cloud SQL Studio. Cloud SQL Studio zapewnia wygodniejszy sposób edytowania i wykonywania długich instrukcji SQL z wieloma wierszami w danych wyjściowych.

Tworzenie użytkownika MySQL dla Cloud SQL Studio

Potrzebujesz nowego użytkownika bazy danych, który może korzystać z Cloud SQL Studio. Utwórz użytkownika typu wbudowanego student z tym samym hasłem, którego używasz w przypadku roota.

W Cloud Shell wykonaj to polecenie:

gcloud sql users create student  --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%

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: student
    • Hasło:
  2. Kliknij Uwierzytelnij.

Okno uwierzytelniania Cloud SQL Studio

  1. Kliknij kartę Zapytanie bez nazwy, aby otworzyć edytor SQL.

Karta edytora SQL w Cloud SQL Studio

Uruchom zapytanie

Uruchom zapytanie, aby pobrać 5 najbardziej trafnych produktów w odpowiedzi na zapytanie klienta: „Jakie drzewa owocowe dobrze tu rosną?”

Oto zapytanie, które możesz uruchomić, aby wybrać 5 najbardziej odpowiednich elementów za pomocą funkcji cosine_distance:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cosine_distance(cp.embedding ,@query_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 5;

W Cloud SQL Studio wpisz zapytanie i kliknij Uruchom (lub uruchom zapytanie w sesji sql):

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            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.13 sec)

Czas wykonywania zapytania wynosi około 0,13 sekundy w przypadku funkcji cosine_distance.

Uruchom to samo zapytanie, ale użyj wyszukiwania KNN za pomocą funkcji approx_distance. Jeśli nie masz indeksu ANN dla swoich wektorów, automatycznie wraca on do wyszukiwania dokładnego za kulisami:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

Oto lista produktów zwróconych przez zapytanie.

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set, 1 warning (0.12 sec)

Wykonanie zapytania zajęło tylko 0,12 sekundy. Uzyskaliśmy te same wyniki co w przypadku funkcji KNN exact cosine_distance.

Więcej informacji o tej funkcji znajdziesz w dokumentacji Cloud SQL for MySQL.

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:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
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
        (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1)
SELECT json_arrayagg(json_object('product_name',product_name,'description',description,'sale_price',sale_price,'zip_code',zip_code,'product_id',product_id)) FROM trees;

Oczekiwane dane wyjściowe JSON:

[{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}]

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, "produt_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, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}
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.

Uruchamianie prompta w SQL

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. Zarejestruj model gemini-3.5-flash do generowania odpowiedzi (zastąp identyfikatorem projektu):
CALL
  mysql.ml_create_model_registration(
  'gemini-3.5-flash',
  'https://aiplatform.googleapis.com/v1/projects/<PROJECT_ID>/locations/global/publishers/google/models/gemini-3.5-flash:generateContent',
  'google',
  'GENERIC',
  NULL,
  'auth_type_cloudsql_service_agent_iam',
  NULL, NULL, NULL, NULL);

Możemy też użyć integracji Cloud SQL AI z platformą Gemini Enterprise Agent Platform, aby uzyskać podobną odpowiedź z modelu generatywnego za pomocą SQL bezpośrednio w bazie danych.

Teraz możemy użyć wygenerowanego zapytania w podzapytaniu z wynikami JSON, aby przekazać je jako część prompta do generatywnego modelu tekstowego AI za pomocą SQL.

W sesji mysql lub Cloud SQL Studio w bazie danych uruchom zapytanie

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
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
         (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1),
prompt AS (
SELECT
       CONCAT( '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_arrayagg(json_object('product_name',trees.product_name,'description',trees.description,'sale_price',trees.sale_price,'zip_code',trees.zip_code,'product_id',trees.product_id)) , '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
       mysql.ML_PREDICT_ROW('gemini-3.5-flash',
        json_object('contents',
        json_object('role',
        'user',
        'parts',
        json_array(
        json_object('text',
        prompt_text))))) AS resp
FROM
        prompt)
SELECT
JSON_EXTRACT(resp, '$.candidates[0].content.parts[0].text')
FROM
        response;

Oto przykładowe dane wyjściowe. Wynik może się różnić w zależności od wersji modelu i parametrów:

"Hello there! I'd be happy to help you find the perfect fruit tree for your space. \n\nBased on your area, a wonderful option we currently have in stock is the **Malus Domestica** (the classic Apple Tree)!\n\nHere are the key details:\n\n* **Product Name:** Malus Domestica (Classic Apple Tree)\n* **Price:** $100.00\n\n### Why it's a great choice:\n* **Beautiful Seasonal Foliage:** It features vibrant green leaves during the summer that turn into gorgeous shades of red, orange, and yellow in the autumn. \n* **Shade & Size:** It grows to approximately 30 feet tall, making it a strong, durable tree that offers excellent shade for your yard alongside delicious fresh fruit.\n* **Growing Conditions:** It thrives best in cool, moist climates with well-draining, loamy soil and is ideal for USDA Hardiness Zones 4–8.\n\n### Supplemental Care Tips:\n* **Planting Location:** Choose a spot that gets full sunlight (at least 6 hours a day) to ensure maximum fruit production.\n* **Soil:** Make sure the soil is rich and loamy with good drainage so the roots stay healthy.\n* **Cross-Pollination:** Apple trees often produce a higher yield when planted near another compatible apple tree variety, so if you have extra space, adding a companion tree in the future can boost your harvest!\n\nLet me know if you have any questions about planting or care, or if you'd like help adding this to your cart!"

Dane wyjściowe są podawane w formacie Markdown.

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 ScaNN

Do testu użyjemy typu indeksu ScaNN.

Aby utworzyć indeks dla kolumny z wektorami dystrybucyjnymi, musisz zdefiniować pomiar odległości dla tej kolumny. Szczegółowe informacje o parametrach znajdziesz w dokumentacji.

CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;

Porównaj odpowiedź

Ponownie uruchom zapytanie w ramach wyszukiwania wektorowego i wyświetl wyniki:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

Oczekiwane dane wyjściowe:

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.08 sec)

Poprawa skuteczności jest tylko nieznacznie inna, ale w przypadku tak małego zbioru danych jest to oczekiwane. Będzie to znacznie bardziej zauważalne w przypadku dużych zbiorów danych zawierających miliony wektorów.

Sprawdź plan wykonania za pomocą polecenia EXPLAIN:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
EXPLAIN ANALYZE SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

Plan wykonania (fragment):

...
-> Nested loop inner join  (cost=443 rows=5) (actual time=1.14..1.18 rows=5 loops=1)
                                -> Vector index scan on cp  (cost=441 rows=5) (actual time=1.1..1.1 rows=5 loops=1)
                                -> Single-row index lookup on cp using PRIMARY (uniq_id=cp.uniq_id)  (cost=0.25 rows=1) (actual time=0.0152..0.0152 rows=1 loops=5)

...

Pokazuje skanowanie indeksu wektorów w tabeli cp(alias tabeli cymbal_products).

Wypróbuj tę funkcję na własnych danych lub przetestuj różne zapytania, aby zobaczyć, jak działa wyszukiwanie semantyczne w MySQL.

11. Zwalnianie miejsca w środowisku

Usuń instancję Cloud SQL

Po zakończeniu ćwiczenia zniszcz instancję Cloud SQL.

W Cloud Shell zdefiniuj zmienne projektu i środowiska, jeśli połączenie zostało przerwane i wszystkie poprzednie ustawienia zostały utracone:

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

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

Gratulujemy ukończenia ćwiczenia.

Ścieżka szkoleniowa Google Cloud

Ten moduł jest częścią ścieżki szkoleniowej Wdrażanie AI w Google Cloud.

Omówione zagadnienia

  • Jak wdrożyć instancję Cloud SQL dla MySQL
  • Jak utworzyć bazę danych i włączyć integrację Cloud SQL z AI
  • Wczytywanie danych do bazy danych
  • Jak korzystać z Cloud SQL Studio
  • Jak używać modelu wektorów dystrybucyjnych Vertex AI w Cloud SQL
  • Jak korzystać z Agent Platform Studio
  • Jak wzbogacić wynik za pomocą modelu Gemini Enterprise Agent Platform
  • Jak poprawić wydajność za pomocą indeksu wektorów

Wypróbuj podobne laboratorium programowania dotyczące AlloyDB lub laboratorium programowania dotyczące Cloud SQL for Postgres

Ankieta

Dane wyjściowe:

Jak zamierzasz wykorzystać ten samouczek?

Tylko przeczytaj Przeczytaj i wykonaj ćwiczenia