Erste Schritte mit der Spanner-Vektorsuche

1. Einleitung

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

Mit der Veröffentlichung der Funktion „exakte K-nearest-Nachbar“ ist Spanner jetzt auch eine hoch skalierbare Vektordatenbank, mit der Sie Ähnlichkeits- oder semantische Suchen durchführen und Retrieval Augmented Generation (RAG) in generativen KI-Anwendungen implementieren können. Die Vektorsuchabfragen von Spanner geben aktuelle Echtzeitdaten zurück, sobald Transaktionen festgeschrieben sind, genau wie bei jeder anderen Abfrage Ihrer Betriebsdaten.

In diesem Lab richten Sie die grundlegenden Funktionen ein, die erforderlich sind, um mithilfe von Spanner eine Vektorsuche durchzuführen und mithilfe von SQL auf Einbettungen und LLM-Modelle im Modellgarten von VertexAI zuzugreifen.

Die Architektur würde so aussehen:

d179a760add7adc0.png

Aufgaben

Aufgaben in diesem Lab:

  • Spanner-Instanz erstellen
  • Datenbankschema von Spanner für die Einbindung in Einbettungs- und LLM-Modelle in Vertex AI einrichten
  • Dataset für den Einzelhandel laden
  • Ähnlichkeitssuchanfragen für das Dataset stellen
  • Stellen Sie dem LLM-Modell Kontext bereit, um produktspezifische Empfehlungen zu generieren.

Lerninhalte

  • Spanner-Instanz einrichten
  • In Vertex AI einbinden
  • Mit Spanner eine Vektorsuche durchführen, um ähnliche Artikel in einem Einzelhandels-Dataset zu finden

Voraussetzungen

  • Ein Google Cloud-Projekt, das mit einem Rechnungskonto verbunden ist.
  • Ein 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 eines 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 auf das Drop-down-Menü für die Projektauswahl oben links in der Konsole:

6c9406d9b014760.png

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

949d83c8a4ee17d9.png

Wenn Sie noch kein Projekt haben, sollten Sie ein Dialogfeld wie dieses sehen, um Ihr erstes zu erstellen:

870a3cbd6541ee86.png

Im nachfolgenden Dialog zur Projekterstellung können Sie die Details Ihres neuen Projekts eingeben:

6a92c57d3250a4b3.png

Denken Sie an die Projekt-ID. Dies ist ein eindeutiger Name, der in allen Google Cloud-Projekten eindeutig ist. Der oben angegebene Name ist bereits vergeben und funktioniert leider nicht für Sie. Sie wird in diesem Codelab später als PROJECT_ID bezeichnet.

Falls noch nicht geschehen, müssen Sie als Nächstes in der Developers Console die Abrechnung aktivieren, um Google Cloud-Ressourcen nutzen und die Spanner API aktivieren zu können.

15d0ef27a8fbab27.png

Dieses Codelab sollte nicht mehr als ein paar Euro kosten. Wenn Sie sich jedoch dazu entschließen, mehr Ressourcen zu verwenden oder diese weiter auszuführen (siehe Abschnitt „Bereinigen“ am Ende dieses Dokuments), Die Preise für Google Cloud Spanner finden Sie hier.

Neue Google Cloud Platform-Nutzer haben Anspruch auf eine kostenlose Testversion mit 300$Guthaben, wodurch das Codelab in der Regel kostenlos sein sollte.

Google Cloud Shell einrichten

Sie können Google Cloud und Spanner über Ihren Laptop aus der Ferne bedienen. In diesem Codelab verwenden wir jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Diese Debian-basierte virtuelle Maschine verfügt über alle erforderlichen Entwicklungstools. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Für dieses Codelab benötigen Sie also nur einen Browser – ja, er funktioniert auf Chromebooks.

  1. Klicken Sie einfach auf „Cloud Shell aktivieren“ gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A, um Cloud Shell über die Cloud Console zu aktivieren. Es dauert nur einen Moment, bis die Umgebung bereitgestellt und eine Verbindung hergestellt werden kann.

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 dass das Projekt bereits auf Ihre PROJECT_ID eingestellt ist.

gcloud auth list

Befehlsausgabe

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

Befehlsausgabe

[core]
project = <PROJECT_ID>

Sollte das Projekt aus irgendeinem Grund nicht eingerichtet sein, geben Sie einfach den folgenden Befehl ein:

gcloud config set project <PROJECT_ID>

Du suchst dein Gerät (PROJECT_ID)? Sehen Sie nach, welche ID Sie bei den Einrichtungsschritten verwendet haben, oder rufen Sie sie im Dashboard der Cloud Console auf:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

Cloud Shell legt außerdem standardmäßig einige Umgebungsvariablen fest, 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 ein Projekt eingerichtet (falls noch nicht vorhanden) sowie Cloud Shell und die erforderlichen APIs aktiviert.

Nächstes Video

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 unsere 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 ausgeführt wird, können Sie die Datenbank erstellen. Spanner ermöglicht die Verwendung mehrerer Datenbanken in einer einzelnen Instanz.

In der Datenbank definieren Sie Ihr Schema. Sie können auch steuern, wer Zugriff auf die Datenbank hat, eine benutzerdefinierte Verschlüsselung einrichten, das Optimierungstool 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ächstes Video

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

4. Cymbal-Schema und -Daten laden

Cymbal-Schema erstellen

Rufen Sie Spanner Studio auf, um das Schema einzurichten:

3e1a0fed928b33cf.png

Das Schema besteht aus zwei Teilen. Zuerst möchten Sie die Tabelle products hinzufügen. Kopieren Sie diese Anweisung und fügen Sie sie in den leeren Tab ein.

Kopieren Sie diese DDL für das Schema 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<FLOAT64>,
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, und das zweite ein LLM-Modell, mit dem Antworten basierend auf den 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 FLOAT64>, values ARRAY<FLOAT64>>,
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/textembedding-gecko@003'
);

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/text-bison@001',
default_batch_size = 1
);

Klicken Sie dann auf die Schaltfläche run und warten Sie ein paar Sekunden, bis Ihre Modelle erstellt sind.

Im linken Bereich von Spanner Studio sollten Sie die folgenden Tabellen und Modelle sehen:

62455aa4b0e839d9.png

Laden Sie die Daten:

Nun möchten Sie einige Produkte in Ihre Datenbank einfügen. Öffnen Sie in Spanner Studio einen neuen Tab. Kopieren Sie dann die folgenden Einfügeanweisungen und fügen Sie sie 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 Datenbank cymbal-bikes geladen.

Nächstes Video

Als Nächstes werden Sie das Einbettungsmodell integrieren, um Einbettungen für die Produktbeschreibungen zu generieren, und eine textbasierte Suchanfrage in eine Einbettung umwandeln, 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, ist dies 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 stellen Sie eine Suchanfrage in einer natürlichen Sprache über eine SQL-Abfrage bereit. Diese Abfrage verwandelt die Suchanfrage in eine Einbettung und sucht dann anhand der gespeicherten Einbettungen der Produktbeschreibungen, die im vorherigen Schritt generiert wurden, nach ähnlichen Ergebnissen.

-- 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 nach ähnlichen Produkten zu suchen. Die Ergebnisse sollten so aussehen:

672e111753077fcf.png

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

Zusammenfassung

In diesem Schritt haben Sie Einbettungen von Produktbeschreibungen und eine Einbettung von Suchanfragen mithilfe von SQL 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 der Suchanfrage entsprechen.

Nächste Schritte

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

6. Mit einem LLM arbeiten

Spanner erleichtert die Einbindung in LLM-Modelle, die von Vertex AI bereitgestellt werden. So können Entwickler SQL verwenden, um direkt mit LLMs zu interagieren, ohne dass die Anwendung die Logik ausführen muss.

Beispielsweise haben wir die Ergebnisse der vorherigen SQL-Abfrage vom Nutzer "I'd like to buy a starter bike for my 3 year old child"..

Der Entwickler möchte zu jedem Ergebnis eine Antwort mit der folgenden Frage geben, ob das Produkt gut für den Nutzer geeignet ist:

"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 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 zu senden. Die Ergebnisse sollten so aussehen:

35878cd0f88f1470.png

Das erste Produkt ist aufgrund der Altersgruppe in der Produktbeschreibung (2-4 Jahre) für ein dreijähriges Kind geeignet. Die anderen Produkte passen nicht so gut.

Zusammenfassung

Nächste Schritte

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

7. Bereinigen (optional)

Wechseln Sie zum Bereinigen einfach zum Cloud Spanner-Bereich der Cloud Console und löschen Sie die Instanz retail-demo, die wir im Codelab erstellt haben.

41cbc1a84b3588d5.png

8. Glückwunsch!

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

Nächste Schritte

Weitere Informationen zur KNN-Vektorsuche von Spanner: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

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