Erste Schritte mit der Vektorsuche in Cloud Spanner

1. Einführung

Spanner ist ein vollständig verwalteter, horizontal skalierbarer, global verteilter Datenbankdienst, der sich sowohl für relationale als auch nicht relationale operative Arbeitslasten eignet.

Spanner bietet eine integrierte Unterstützung für die Vektorsuche. So können Sie Ähnlichkeits- oder semantische Suchanfragen ausführen und Retrieval-Augmented Generation (RAG) in GenAI-Anwendungen im großen Maßstab implementieren. Dabei können Sie entweder KNN-Funktionen (exakter k-nächster Nachbar) oder ANN-Funktionen (ungefährer nächster Nachbar) verwenden.

Die Vektorsuchabfragen von Spanner geben aktuelle Echtzeitdaten zurück, sobald Transaktionen bestätigt wurden, genau wie bei jeder anderen Abfrage Ihrer Betriebsdaten.

In diesem Lab richten Sie die grundlegenden Funktionen ein, die erforderlich sind, um mit Spanner eine Vektorsuche durchzuführen und mit SQL auf Einbettungs- und LLM-Modelle aus dem Model Garden von Vertex AI zuzugreifen.

Die Architektur würde so aussehen:

d179a760add7adc0.png

Auf dieser Grundlage lernen Sie, wie Sie einen Vektorindex erstellen, der vom ScaNN-Algorithmus unterstützt wird, und wie Sie die APPROX-Abstandsfunktionen verwenden, wenn Ihre semantischen Arbeitslasten skaliert werden müssen.

Aufgaben

In diesem Lab lernen Sie Folgendes:

  • Spanner-Instanz erstellen
  • Datenbankschema von Spanner für die Einbindung in Einbettungs- und LLM-Modelle in Vertex AI einrichten
  • Einzelhandelsdatensatz laden
  • Ähnlichkeitssuchanfragen an den Datensatz senden
  • Stellen Sie dem LLM-Modell Kontext zur Verfügung, um produktspezifische Empfehlungen zu generieren.
  • Ändern Sie das Schema und erstellen Sie einen Vektorindex.
  • Ändern Sie die Abfragen, um den neu erstellten Vektorindex zu verwenden.

Lerninhalte

  • Spanner-Instanz einrichten
  • Vertex AI einbinden
  • Mit Spanner eine Vektorsuche durchführen, um ähnliche Artikel in einem Einzelhandelsdatensatz zu finden
  • So bereiten Sie Ihre Datenbank darauf vor, Arbeitslasten der Vektorsuche mithilfe der ANN-Suche zu skalieren.

Voraussetzungen

  • Ein Google Cloud-Projekt, das mit einem Rechnungskonto verknüpft ist.
  • Einen Webbrowser wie Chrome oder Firefox.

2. Einrichtung und Anforderungen

Projekt erstellen

Wenn Sie noch kein Google-Konto (Gmail oder Google Apps) haben, müssen Sie ein Konto erstellen. Melden Sie sich in der Google Cloud Platform Console ( console.cloud.google.com) an und erstellen Sie ein neues Projekt.

Wenn Sie bereits ein Projekt haben, klicken Sie links oben in der Console auf das Drop-down-Menü für die Projektauswahl:

6c9406d9b014760.png

Klicken Sie im angezeigten Dialogfeld auf die Schaltfläche „NEUES PROJEKT“, um ein neues Projekt zu erstellen:

949d83c8a4ee17d9.png

Wenn Sie noch kein Projekt haben, sollte ein Dialogfeld wie dieses angezeigt werden, um Ihr erstes Projekt zu erstellen:

870a3cbd6541ee86.png

Im folgenden Dialogfeld für die Projekterstellung können Sie die Details Ihres neuen Projekts eingeben:

6a92c57d3250a4b3.png

Notieren Sie sich die Projekt-ID. Diese ist für alle Google Cloud-Projekte eindeutig. Der Name oben ist leider schon vergeben. Sie wird später in diesem Codelab als PROJECT_ID bezeichnet.

Aktivieren Sie als Nächstes in der Developers Console die Abrechnung, um Google Cloud-Ressourcen zu verwenden und die Spanner API zu aktivieren, falls Sie dies noch nicht getan haben.

15d0ef27a8fbab27.png

Die Ausführung dieses Codelabs sollte Sie nicht mehr als ein paar Dollar kosten, aber es könnte mehr sein, wenn Sie sich für mehr Ressourcen entscheiden oder wenn Sie sie laufen lassen (siehe Abschnitt „Bereinigen“ am Ende dieses Dokuments). Die Preise für Google Cloud Spanner finden Sie hier.

Neuen Nutzern der Google Cloud Platform steht eine kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung. Das sollte dieses Codelab vollständig kostenlos machen.

Google Cloud Shell-Einrichtung

Sie können Google Cloud und Spanner zwar von Ihrem Laptop aus per Fernzugriff nutzen, in diesem Codelab verwenden wir jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Auf dieser Debian-basierten virtuellen Maschine sind alle erforderlichen Entwicklungstools installiert. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Sie benötigen also nur einen Browser für dieses Codelab (ja, es funktioniert auch auf einem Chromebook).

  1. Klicken Sie in der Cloud Console einfach auf „Cloud Shell aktivieren“ gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A, um Cloud Shell zu aktivieren. Die Bereitstellung und Verbindung mit der Umgebung sollte nur wenige Augenblicke dauern.

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSrDc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvIEx9pIkE-246DomWuCfiGHK78DgoeWkHRw

Screen Shot 2017-06-14 at 10.13.43 PM.png

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und das Projekt bereits auf Ihre PROJECT_ID festgelegt ist.

gcloud auth list

Befehlsausgabe

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Befehlsausgabe

[core]
project = <PROJECT_ID>

Wenn das Projekt aus irgendeinem Grund nicht festgelegt ist, geben Sie einfach den folgenden Befehl ein:

gcloud config set project <PROJECT_ID>

Suchen Sie nach Ihrem PROJECT_ID? Sehen Sie nach, welche ID Sie bei der Einrichtung verwendet haben, oder suchen Sie sie im Cloud Console-Dashboard:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

In Cloud Shell werden außerdem einige Umgebungsvariablen standardmäßig festgelegt, die bei der Ausführung zukünftiger Befehle nützlich sein können.

echo $GOOGLE_CLOUD_PROJECT

Befehlsausgabe

<PROJECT_ID>

Spanner API aktivieren

gcloud services enable spanner.googleapis.com

Zusammenfassung

In diesem Schritt haben Sie Ihr Projekt eingerichtet, falls Sie noch keins hatten, die Cloud Shell aktiviert und die erforderlichen APIs aktiviert.

Nächster Schritt

Als Nächstes richten Sie die Spanner-Instanz und ‑Datenbank ein.

3. Spanner-Instanz und ‑Datenbank erstellen

Spanner-Instanz erstellen

In diesem Schritt richten wir die Spanner-Instanz für das Codelab ein. Öffnen Sie dazu Cloud Shell und führen Sie den folgenden Befehl aus:

export SPANNER_INSTANCE_ID=retail-demo
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1

Befehlsausgabe:

$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
Creating instance...done.  

Datenbank erstellen

Sobald die Instanz läuft, können Sie die Datenbank erstellen. Spanner ermöglicht mehrere Datenbanken in einer einzigen Instanz.

In der Datenbank definieren Sie Ihr Schema. Außerdem können Sie festlegen, wer Zugriff auf die Datenbank hat, eine benutzerdefinierte Verschlüsselung einrichten, den Optimierer konfigurieren und die Aufbewahrungsdauer festlegen.

Verwenden Sie zum Erstellen der Datenbank wieder das gcloud-Befehlszeilentool:

export SPANNER_DATABASE=cymbal-bikes
gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID

Befehlsausgabe:

$ gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID
Creating database...done.

Zusammenfassung

In diesem Schritt haben Sie die Spanner-Instanz und ‑Datenbank erstellt.

Nächster Schritt

Als Nächstes richten Sie das Spanner-Schema und die Daten ein.

4. Cymbal-Schema und ‑Daten laden

Cymbal-Schema erstellen

Rufen Sie zum Einrichten des Schemas Spanner Studio auf:

3e1a0fed928b33cf.png

Das Schema besteht aus zwei Teilen. Fügen Sie zuerst die Tabelle products hinzu. Kopieren Sie diese Anweisung und fügen Sie sie in den leeren Tab ein.

Kopieren Sie für das Schema diese DDL und fügen Sie sie in das Feld ein:

CREATE TABLE products (
categoryId INT64 NOT NULL,
productId INT64 NOT NULL,
productName STRING(MAX) NOT NULL,
productDescription STRING(MAX) NOT NULL,
productDescriptionEmbedding ARRAY<FLOAT32>,
createTime TIMESTAMP NOT NULL OPTIONS (
allow_commit_timestamp = true
),
inventoryCount INT64 NOT NULL,
priceInCents INT64,
) PRIMARY KEY(categoryId, productId);

Klicken Sie dann auf die Schaltfläche run und warten Sie einige Sekunden, bis das Schema erstellt wurde.

Als Nächstes erstellen Sie die beiden Modelle und konfigurieren sie für Vertex AI-Modellendpunkte.

Das erste Modell ist ein Einbettungsmodell, mit dem Einbettungen aus Text generiert werden. Das zweite ist ein LLM-Modell, mit dem Antworten anhand der Daten in Spanner generiert werden.

Fügen Sie das folgende Schema in einen neuen Tab in Spanner Studio ein:

CREATE MODEL EmbeddingsModel INPUT(
content STRING(MAX),
) OUTPUT(
embeddings STRUCT<statistics STRUCT<truncated BOOL, token_count FLOAT32>, values ARRAY<FLOAT32>>,
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/text-embedding-004'
);


CREATE MODEL LLMModel INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/gemini-pro',
default_batch_size = 1
);

Klicken Sie dann auf die Schaltfläche run und warten Sie einige Sekunden, bis die Modelle erstellt wurden.

Im linken Bereich von Spanner Studio sollten die folgenden Tabellen und Modelle angezeigt werden:

62455aa4b0e839d9.png

Daten laden

Jetzt möchten Sie einige Produkte in Ihre Datenbank einfügen. Öffnen Sie einen neuen Tab in Spanner Studio und fügen Sie die folgenden Insert-Anweisungen ein:

INSERT INTO products (categoryId, productId, productName, productDescription, createTime, inventoryCount, priceInCents)
VALUES (1, 1, "Cymbal Helios Helmet", "Safety meets style with the Cymbal children's bike helmet. Its lightweight design, superior ventilation, and adjustable fit ensure comfort and protection on every ride. Stay bright and keep your child safe under the sun with Cymbal Helios!", PENDING_COMMIT_TIMESTAMP(), 100, 10999),
(1, 2, "Cymbal Sprout", "Let their cycling journey begin with the Cymbal Sprout, the ideal balance bike for beginning riders ages 2-4 years. Its lightweight frame, low seat height, and puncture-proof tires promote stability and confidence as little ones learn to balance and steer. Watch them sprout into cycling enthusiasts with Cymbal Sprout!", PENDING_COMMIT_TIMESTAMP(), 10, 13999),
(1, 3, "Cymbal Spark Jr.", "Light, vibrant, and ready for adventure, the Spark Jr. is the perfect first bike for young riders (ages 5-8). Its sturdy frame, easy-to-use brakes, and puncture-resistant tires inspire confidence and endless playtime. Let the spark of cycling ignite with Cymbal!", PENDING_COMMIT_TIMESTAMP(), 34, 13900),
(1, 4, "Cymbal Summit", "Conquering trails is a breeze with the Summit mountain bike. Its lightweight aluminum frame, responsive suspension, and powerful disc brakes provide exceptional control and comfort for experienced bikers navigating rocky climbs or shredding downhill. Reach new heights with Cymbal Summit!", PENDING_COMMIT_TIMESTAMP(), 0, 79999),
(1, 5, "Cymbal Breeze", "Cruise in style and embrace effortless pedaling with the Breeze electric bike. Its whisper-quiet motor and long-lasting battery let you conquer hills and distances with ease. Enjoy scenic rides, commutes, or errands with a boost of confidence from Cymbal Breeze!", PENDING_COMMIT_TIMESTAMP(), 72, 129999),
(1, 6, "Cymbal Trailblazer Backpack", "Carry all your essentials in style with the Trailblazer backpack. Its water-resistant material, multiple compartments, and comfortable straps keep your gear organized and accessible, allowing you to focus on the adventure. Blaze new trails with Cymbal Trailblazer!", PENDING_COMMIT_TIMESTAMP(), 24, 7999),
(1, 7, "Cymbal Phoenix Lights", "See and be seen with the Phoenix bike lights. Powerful LEDs and multiple light modes ensure superior visibility, enhancing your safety and enjoyment during day or night rides. Light up your journey with Cymbal Phoenix!", PENDING_COMMIT_TIMESTAMP(), 87, 3999),
(1, 8, "Cymbal Windstar Pump", "Flat tires are no match for the Windstar pump. Its compact design, lightweight construction, and high-pressure capacity make inflating tires quick and effortless. Get back on the road in no time with Cymbal Windstar!", PENDING_COMMIT_TIMESTAMP(), 36, 24999),
(1, 9,"Cymbal Odyssey Multi-Tool","Be prepared for anything with the Odyssey multi-tool. This handy gadget features essential tools like screwdrivers, hex wrenches, and tire levers, keeping you ready for minor repairs and adjustments on the go. Conquer your journey with Cymbal Odyssey!", PENDING_COMMIT_TIMESTAMP(), 52, 999),
(1, 10,"Cymbal Nomad Water Bottle","Stay hydrated on every ride with the Nomad water bottle. Its sleek design, BPA-free construction, and secure lock lid make it the perfect companion for staying refreshed and motivated throughout your adventures. Hydrate and explore with Cymbal Nomad!", PENDING_COMMIT_TIMESTAMP(), 42, 1299);

Klicken Sie auf die Schaltfläche run, um die Daten einzufügen.

Zusammenfassung

In diesem Schritt haben Sie das Schema erstellt und einige grundlegende Daten in die cymbal-bikes-Datenbank geladen.

Nächster Schritt

Als Nächstes integrieren Sie das Einbettungsmodell, um Einbettungen für die Produktbeschreibungen zu generieren und eine textbasierte Suchanfrage in eine Einbettung umzuwandeln, um nach relevanten Produkten zu suchen.

5. Mit Einbettungen arbeiten

Vektoreinbettungen für Produktbeschreibungen generieren

Damit die Ähnlichkeitssuche für die Produkte funktioniert, müssen Sie Einbettungen für die Produktbeschreibungen generieren.

Da die EmbeddingsModel im Schema erstellt wurde, handelt es sich hierbei um eine einfache UPDATE-DML-Anweisung.

UPDATE products p1
SET productDescriptionEmbedding =
(SELECT embeddings.values from ML.PREDICT(MODEL EmbeddingsModel,
(SELECT productDescription as content FROM products p2 where p2.productId=p1.productId)))
WHERE categoryId=1;

Klicken Sie auf die Schaltfläche run, um die Produktbeschreibungen zu aktualisieren.

In diesem Beispiel geben Sie eine Suchanfrage in natürlicher Sprache über eine SQL-Abfrage an. Mit dieser Abfrage wird die Suchanfrage in eine Einbettung umgewandelt und dann anhand der gespeicherten Einbettungen der Produktbeschreibungen, die im vorherigen Schritt generiert wurden, nach ähnlichen Ergebnissen gesucht.

-- Use Spanner's vector search, and integration with embedding and LLM models to
-- return items that are semantically relevant and available in inventory based on
-- real-time data.


SELECT productName, productDescription, inventoryCount, COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) as distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;

Klicken Sie auf die Schaltfläche run, um ähnliche Produkte zu finden. Die Ergebnisse sollten so aussehen:

672e111753077fcf.png

Beachten Sie, dass für die Abfrage zusätzliche Filter verwendet werden, z. B. dass nur Produkte angezeigt werden sollen, die auf Lager sind (inventoryCount > 0).

Zusammenfassung

In diesem Schritt haben Sie mithilfe von SQL Produktbeschreibungseinbettungen und eine Suchanfrage-Einbettung erstellt und dabei die Einbindung von Spanner in Modelle in Vertex AI genutzt. Außerdem haben Sie eine Vektorsuche durchgeführt, um ähnliche Produkte zu finden, die mit der Suchanfrage übereinstimmen.

Nächste Schritte

Als Nächstes geben wir die Suchergebnisse in ein LLM ein, um eine benutzerdefinierte Antwort für jedes Produkt zu generieren.

6. Mit einem LLM arbeiten

Spanner ermöglicht eine einfache Einbindung in LLM-Modelle, die über Vertex AI bereitgestellt werden. So können Entwickler SQL verwenden, um direkt mit LLMs zu interagieren, anstatt die Logik über die Anwendung ausführen zu lassen.

Angenommen, wir haben die Ergebnisse der vorherigen SQL-Abfrage für den Nutzer "I'd like to buy a starter bike for my 3 year old child"..

Der Entwickler möchte für jedes Ergebnis angeben, ob das Produkt für den Nutzer geeignet ist. Dazu verwendet er den folgenden Prompt:

"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me? I'd like to buy a starter bike for my 3 year old child"

Sie können die folgende Abfrage verwenden:

-- Use an LLM to analyze this list and provide a recommendation on whether each
-- product is a good fit for the user. We use the vector search and real time
-- inventory data to first filter the products to reduce the size of the prompt to
-- the LLM.
SELECT productName, productDescription, inventoryCount, content AS LLMResponse
FROM ML.PREDICT(
MODEL LLMModel,
(   SELECT
inventoryCount,
productName,
productDescription,
CONCAT(
"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me?",
"I'd like to buy a starter bike for my 3 year old child \n",
"Product Name: ", productName, "\n",
"Product Description:", productDescription) AS prompt,
FROM products
WHERE inventoryCount > 0
ORDER by COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
( SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) LIMIT 5
),
STRUCT(256 AS maxOutputTokens)
);

Klicken Sie auf die Schaltfläche run, um die Abfrage auszuführen. Die Ergebnisse sollten so aussehen:

35878cd0f88f1470.png

Das erste Produkt ist für ein dreijähriges Kind geeignet, da in der Produktbeschreibung die Altersgruppe „2–4 Jahre“ angegeben ist. Die anderen Produkte passen nicht so gut.

Zusammenfassung

In diesem Schritt haben Sie mit einem LLM grundlegende Antworten auf Prompts von Nutzern generiert.

Nächste Schritte

Als Nächstes erfahren Sie, wie Sie ANNs zur Skalierung der Vektorsuche verwenden.

7. Vektorsuche skalieren

In den vorherigen Beispielen für die Vektorsuche wurde die exakte KNN-Vektorsuche verwendet. Das ist sehr praktisch, wenn Sie sehr spezifische Teilmengen Ihrer Spanner-Daten abfragen können. Diese Abfragetypen sind sehr gut partitionierbar.

Wenn Sie keine stark partitionierbaren Arbeitslasten haben und eine große Datenmenge verarbeiten, sollten Sie die ANN-Vektorsuche mit dem ScaNN-Algorithmus verwenden, um die Suchleistung zu verbessern.

Dazu sind in Spanner zwei Schritte erforderlich:

  • Vektorindex erstellen
  • Ändern Sie die Abfrage so, dass die Entfernungsfunktionen APPROX verwendet werden.

Vektorindex erstellen

Um einen Vektorindex für diesen Datensatz zu erstellen, müssen wir zuerst die Spalte productDescriptionEmbeddings ändern, um die Länge jedes Vektors zu definieren. Wenn Sie einer Spalte die Vektorlänge hinzufügen möchten, müssen Sie die ursprüngliche Spalte löschen und neu erstellen.

ALTER TABLE `products` DROP COLUMN `productDescriptionEmbedding`;
ALTER TABLE
  `products` ADD COLUMN `productDescriptionEmbedding` ARRAY<FLOAT32>(vector_length=>768);

Erstellen Sie als Nächstes die Einbettungen noch einmal über den zuvor ausgeführten Schritt Generate Vector embedding.

UPDATE products p1
SET productDescriptionEmbedding =
(SELECT embeddings.values from ML.PREDICT(MODEL EmbeddingsModel,
(SELECT productDescription as content FROM products p2 where p2.productId=p1.productId)))
WHERE categoryId=1;

Nachdem Sie die Spalte erstellt haben, erstellen Sie den Index:

CREATE VECTOR INDEX ProductDescriptionEmbeddingIndex
    ON products(productDescriptionEmbedding)
    WHERE productDescriptionEmbedding IS NOT NULL
OPTIONS (
 distance_type = 'COSINE'
);

Neuen Index verwenden

Wenn Sie den neuen Vektorindex verwenden möchten, müssen Sie die vorherige Einbettungsabfrage geringfügig ändern.

Dies ist die ursprüngliche Abfrage:

SELECT productName, productDescription, inventoryCount, COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) as distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;

Sie müssen die folgenden Änderungen vornehmen:

  • Verwenden Sie einen Indexhinweis für den neuen Vektorindex: @{force_index=ProductDescriptionEmbeddingIndex}
  • Ändern Sie den Funktionsaufruf COSINE_DISTANCE in APPROX_COSINE_DISTANCE. Die JSON-Optionen in der endgültigen Abfrage unten sind ebenfalls erforderlich.
  • Generieren Sie die Embeddings separat mit der Funktion ML.PREDICT.
  • Kopieren Sie die Ergebnisse der Einbettungen in die endgültige Abfrage.

Einbettungen generieren

-- Generate the prompt embeddings
SELECT embeddings.values
FROM ML.PREDICT(
  MODEL EmbeddingsModel,
   (SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
  )
)

Markieren Sie die Ergebnisse der Abfrage und kopieren Sie sie.

1b43c5ae4ef9ab68.png

Ersetzen Sie dann <VECTOR> in der folgenden Abfrage durch die kopierten Einbettungen.

-- Embedding query now using the vector index


SELECT productName, productDescription, inventoryCount, 
  APPROX_COSINE_DISTANCE(productDescriptionEmbedding, array<float32>[@VECTOR], options => JSON '{\"num_leaves_to_search\": 10}')
FROM products @{force_index=ProductDescriptionEmbeddingIndex}
WHERE productDescriptionEmbedding IS NOT NULL AND inventoryCount > 0
ORDER BY distance
LIMIT 5;

Die Ausgabe sollte ungefähr so aussehen:

12397107ec49c491.png

Zusammenfassung

In diesem Schritt haben Sie Ihr Schema konvertiert, um einen Vektorindex zu erstellen. Anschließend haben Sie die Einbettungsabfrage neu geschrieben, um eine ANN-Suche mit dem Vektorindex durchzuführen. Dies ist ein wichtiger Schritt, wenn Ihre Daten wachsen und Sie die Arbeitslasten der Vektorsuche skalieren möchten.

Nächste Schritte

Als Nächstes ist es an der Zeit, aufzuräumen.

8. Bereinigen (optional)

Rufen Sie dazu in der Cloud Console den Bereich Cloud Spanner auf und löschen Sie die Instanz 'retail-demo', die wir im Codelab erstellt haben.

41cbc1a84b3588d5.png

9. Glückwunsch!

Sie haben eine Ähnlichkeitssuche mit der integrierten Vektorsuche von Spanner durchgeführt. Außerdem haben Sie gesehen, wie einfach es ist, mit Einbettungs- und LLM-Modellen zu arbeiten, um generative KI-Funktionen direkt mit SQL bereitzustellen.

Schließlich haben Sie gelernt, wie Sie eine ANN-Suche mit dem ScaNN-Algorithmus ausführen, um die Arbeitslasten der Vektorsuche zu skalieren.

Nächste Schritte

Weitere Informationen zur exakten KNN-Vektorsuche (K-Nearest Neighbor) in Spanner finden Sie unter https://cloud.google.com/spanner/docs/find-k-nearest-neighbors.

Weitere Informationen zur ANN-Vektorsuche (Approximate Nearest Neighbor) in Spanner finden Sie unter https://cloud.google.com/spanner/docs/find-approximate-nearest-neighbors.

Weitere Informationen zum Ausführen von Onlinevorhersagen mit SQL mithilfe der VertexAI-Integration von Spanner finden Sie hier: https://cloud.google.com/spanner/docs/ml