Kurzanleitung: Vektorsuche

In der Vertex AI Vektorsuche-Kurzanleitung erfahren Sie, wie Sie einen Index aus einem Beispiel-Dataset einer fiktiven E-Commerce-Website für Kleidung erstellen. Für die Zwecke dieser Kurzanleitung wurden die Einbettungen bereits erstellt. Diese Kurzanleitung soll Ihnen den Einstieg in die Erstellung und Bereitstellung eines Index in weniger als 30 Minuten erleichtern.

Voraussetzungen

Für diese Anleitung ist ein Google Cloud-Projekt erforderlich, das mit einem Rechnungskonto verknüpft ist. Informationen zum Erstellen eines neuen Projekts finden Sie unter Projekt und Entwicklungsumgebung einrichten. Sie müssen ein Projekt erstellen und Ihr Rechnungskonto einrichten.

Laufzeitumgebung auswählen

Diese Anleitung kann entweder auf Colab oder IM Vertex AI Workbench ausgeführt werden.

  • Colab: Diese Anleitung in Colab öffnen
  • Vertex AI Workbench: Öffnen Sie diese Anleitung in Vertex AI Workbench. Wenn Sie Vertex AI Workbench zum ersten Mal in Ihrem Google Cloud-Projekt verwenden, rufen Sie in der Google Cloud Console den Abschnitt „Vertex AI Workbench“ auf und klicken auf Aktivieren, um die Notebooks API zu aktivieren.

Dieses Notebook auf GitHub ansehen: GitHub

Kosten für die Durchführung dieses Schnellstarts

Das Durcharbeiten dieser Anleitung kostet ein paar US-Dollar. Die Preise für die in dieser Anleitung verwendeten Google Cloud-Dienste finden Sie auf den folgenden Seiten:

Sie können auch den Preisrechner verwenden, um auf Basis der voraussichtlichen Nutzung eine Kostenschätzung zu erstellen.

Einrichtung

Bevor Sie mit Vertex AI starten, müssen Sie Folgendes einrichten:

Vertex AI SDK for Python installieren

Auf Vertex AI und Cloud Storage APIs kann auf verschiedene Arten zugegriffen werden, z B. über die REST API und das Vertex AI SDK für Python. In dieser Anleitung wird das Vertex AI SDK für Python verwendet.

!pip install --upgrade --user google-cloud-aiplatform>=1.29.0 google-cloud-storage

Um die neu installierten Pakete in dieser Jupyter-Laufzeit zu verwenden, müssen Sie die Laufzeit neu starten, wie im folgenden Code-Snippet gezeigt:

# Restart kernel after installs so that your environment can access the new packages
import IPython

app = IPython.Application.instance()
app.kernel.do_shutdown(True)

Umgebungsvariablen

Legen Sie die Umgebungsvariablen fest. Ersetzen Sie gegebenenfalls your-project-id durch Ihre Projekt-ID und führen Sie die Zelle aus.

# get project ID
PROJECT_ID = ! gcloud config get-value project
PROJECT_ID = PROJECT_ID[0]
LOCATION = "us-central1"
if PROJECT_ID == "(unset)":
    print(f"Please set the project ID manually below")
# define project information
if PROJECT_ID == "(unset)":
  PROJECT_ID = "[your-project-id]"

# generate a unique id for this session
from datetime import datetime
UID = datetime.now().strftime("%m%d%H%M")

Authentifizierung (nur Colab)

Wenn Sie dieses Notebook in Colab ausführen, müssen Sie die folgende Zellenauthentifizierung ausführen. Dieser Schritt ist nicht erforderlich, wenn Sie Vertex AI Workbench verwenden, da es bereits authentifiziert ist.

import sys

# if it's Colab runtime, authenticate the user with Google Cloud
if 'google.colab' in sys.modules:
    from google.colab import auth
    auth.authenticate_user()

IAM-Berechtigungen festlegen

Sie müssen dem Standarddienstkonto Zugriffsberechtigungen hinzufügen, um die Dienst zu nutzen.

  1. Rufen Sie in der Google Cloud Console die IAM-Seite auf.
  2. Suchen Sie nach dem Hauptkonto für das Standard-Compute-Dienstkonto. Er sollte so aussehen: compute@developer.gserviceaccount.com
  3. Klicken Sie auf die Schaltfläche „Bearbeiten“ und gewähren Sie dem Standard-Compute-Dienstkonto folgende Rollen: Vertex AI-Nutzer, Storage-Administrator und Service Usage-Administrator.

APIs aktivieren

Führen Sie den folgenden Befehl aus, um APIs für Compute Engine, Vertex AI und Cloud Storage mit diesem Google Cloud-Projekt zu aktivieren.

! gcloud services enable compute.googleapis.com aiplatform.googleapis.com storage.googleapis.com --project {PROJECT_ID}

Beispieldaten vorbereiten

In dieser Anleitung verwenden wir das Dataset „TheLook“, das eine Produkttabelle mit etwa 30.000 Zeilen synthetischer Produktdaten für eine fiktive E-Commerce-Website für Kleidungen enthält.

Beispiel-Dataset

Anhand dieser Tabelle haben wir die Datei product-embs.json erstellt.

Beispiel für Produkt-Ebenen

Diese Datei hat das JSONL-Format und jede Zeile hat eine ID für die Produkt-ID, einen Namen für den Produktnamen und eine Einbettung für den Einbettung des Produktnamens in 768 Dimensionen, die zuvor mit Vertex AI-Einbettungen für Text generiert wurden. eine

Die Text-Embeddings repräsentieren die Bedeutung der Namen der Bekleidungsprodukte. In dieser Anleitung verwenden wir die Vektorsuche für eine semantische Suche nach den Artikeln. Dieser Beispielcode kann als Grundlage für andere schnelle Empfehlungssysteme verwendet werden, in denen Sie schnell „andere Produkte wie dieses“ finden können.

Weitere Informationen zum Erstellen der Einbettungen aus den Daten in einer BigQuery-Tabelle und zum Speichern dieser Daten in einer JSON-Datei finden Sie unter Erste Schritte mit Texteinbettungen + Vertex AI Vektorsuche.

Daten in Cloud Storage vorbereiten

Wenn Sie einen Index mit Vertex AI erstellen möchten, platzieren Sie die Einbettungsdatei in einem Cloud Storage-Bucket. Der folgende Code führt zwei Aufgaben aus:

  1. Es wird ein Cloud Storage-Bucket erstellt.
  2. Es werden Beispieldatei in Ihren Cloud Storage-Bucket kopiert.
BUCKET_URI = f"gs://{PROJECT_ID}-vs-quickstart-{UID}"
! gcloud storage buckets create $BUCKET_URI --location=$LOCATION --project=$PROJECT_ID
! gcloud storage cp "gs://github-repo/data/vs-quickstart/product-embs.json" $BUCKET_URI

Wenn Sie die Vektorsuche verwenden möchten, um Suchanfragen auszuführen, müssen Sie die Einbettungsdatei auch in ein lokales Verzeichnis kopieren:

! gcloud storage cp "gs://github-repo/data/vs-quickstart/product-embs.json" . # for query tests

Erstellen Sie einen Vektorsuchindex und stellen Sie ihn bereit.

Erfahren Sie, wie Sie einen Index erstellen, einen Index-Endpunkt erstellen und dann den Index auf dem Endpunkt bereitstellen.

Index erstellen

Jetzt ist es an der Zeit, die Einbettungen in die Vektorsuche hochzuladen. Die APIs sind im Paket aiplatform des SDK verfügbar.

# init the aiplatform package
from google.cloud import aiplatform
aiplatform.init(project=PROJECT_ID, location=LOCATION)

Erstellen Sie einen MatchingEngineIndex mit seiner Funktion create_tree_ah_index (Matching Engine ist der frühere Name der Vektorsuche):

# create Index
my_index = aiplatform.MatchingEngineIndex.create_tree_ah_index(
    display_name = f"vs-quickstart-index-{UID}",
    contents_delta_uri = BUCKET_URI,
    dimensions = 768,
    approximate_neighbors_count = 10,
)

Mit der Methode MatchingEngineIndex.create_tree_ah_index() wird ein Index erstellt. Dies dauert weniger als 10 Minuten, wenn das Dataset klein ist, je nach Größe des Datasets etwa 60 Minuten. Sie können den Status der Indexerstellung in der Google Cloud Console für die Vektorsuche prüfen.

Indexe ansehen

Parameter zum Erstellen eines Index:

  • contents_delta_uri: URI des Cloud Storage-Verzeichnisses, in dem Sie die eingebetteten JSON-Dateien gespeichert haben
  • dimensions: Dimensionsgröße der einzelnen Einbettungen. In diesem Fall beträgt der Wert 768, da Sie die Einbettungen aus der API für Texteinbettungen verwenden.
  • approximate_neighbors_count: Anzahl der ähnliche Elemente, die Sie in typischen Fällen abrufen möchten

Weitere Informationen zum Erstellen des Index und zu den verfügbaren Parametern finden Sie unter Index erstellen und verwalten.

Indexendpunkt erstellen und Index bereitstellen

Wenn Sie den Index verwenden möchten, müssen Sie einen Indexendpunkt erstellen. Er fungiert als Serverinstanz, die Abfrageanfragen für Ihren Index akzeptiert.

## create `IndexEndpoint`
my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint.create(
    display_name = f"vs-quickstart-index-endpoint-{UID}",
    public_endpoint_enabled = True
)

Stellen Sie mit dem Indexendpunkt den Index bereit, indem Sie eine eindeutige bereitgestellte Index-ID angeben.

DEPLOYED_INDEX_ID = f"vs_quickstart_deployed_{UID}"
# deploy the Index to the Index Endpoint
my_index_endpoint.deploy_index(
    index = my_index, deployed_index_id = DEPLOYED_INDEX_ID
)

Wenn Sie diesen Index zum ersten Mal auf einem Indexendpunkt bereitstellen, kann es etwa 30 Minuten dauern, bis das Backend automatisch erstellt und initiiert wird. Wechseln Sie im Abschnitt „Vertex AI“ der Google Cloud Console zum Abschnitt Bereitstellen und verwenden, um den Status der Indexbereitstellung zu sehen. Wählen Sie Indexe aus.

Siehe Indexe

Abfrage mit der Vektorsuche ausführen

Im folgenden Code werden eine Einbettung für einen bestimmten Produktnamen und ähnliche Produktnamen mit der Vektorsuche gefunden.

Einbettung zum Ausführen einer Abfrage verwenden

Laden Sie zuerst die Einbettungs-JSON-Datei, um einen dict mit Produktnamen und Einbettungen zu erstellen.

import json

# build dicts for product names and embs
product_names = {}
product_embs = {}
with open('product-embs.json') as f:
    for l in f.readlines():
        p = json.loads(l)
        id = p['id']
        product_names[id] = p['name']
        product_embs[id] = p['embedding']

Mit dem product_embs-Wörterbuch können Sie eine Produkt-ID angeben, um eine Einbettung dafür zu erhalten.

 # Get the embedding for ID 6523 "cloudveil women's excursion short"
 # You can also try with other IDs such as 12711, 18090, 19536 and 11863
query_emb = product_embs['6523']

Abfrage ausführen

Übergeben Sie die Einbettung an die Endpoint.find_neighbors()-Methode, um ähnliche Produktnamen zu finden.

# run query
response = my_index_endpoint.find_neighbors(
    deployed_index_id = DEPLOYED_INDEX_ID,
    queries = [query_emb],
    num_neighbors = 10
)

# show the results
for idx, neighbor in enumerate(response[0]):
    print(f"{neighbor.distance:.2f} {product_names[neighbor.id]}")

Die find_neighbors()-Methode ruft dank des ScaNN-Algorithmus in Millisekunden ähnliche Elemente ab, selbst wenn sich Milliarden von Elementen im Index befinden. Die Vektorsuche unterstützt auch Autoscaling, mit dem die Anzahl der Knoten automatisch an die Anforderungen Ihrer Arbeitslasten angepasst werden kann.

Bereinigen

Wenn Sie Ihr eigenes Cloud-Projekt und nicht ein temporäres Projekt in Qwiklabs verwenden, müssen Sie nach Abschluss dieses Tutorials alle Indexe, Indexendpunkte und Cloud Storage-Buckets löschen. Andernfalls können für die verbleibenden Ressourcen unerwartete Kosten anfallen.

Wenn Sie Workbench verwendet haben, müssen Sie möglicherweise auch die Notebooks aus der Console löschen.


# wait for a confirmation
input("Press Enter to delete Index Endpoint, Index and Cloud Storage bucket:")

# delete Index Endpoint
my_index_endpoint.undeploy_all()
my_index_endpoint.delete(force = True)

# delete Index
my_index.delete()

# delete Cloud Storage bucket
! gcloud storage rm {BUCKET_URI} --recursive

Dienstprogramme

Das Erstellen oder Bereitstellen von Indexen kann einige Zeit in Anspruch nehmen. In dieser Zeit kann die Verbindung zur Colab-Laufzeit unterbrochen werden. Wenn die Verbindung getrennt wird, können Sie, statt den neuen Index noch einmal zu erstellen oder bereitzustellen, die Google Cloud Console der Vektorsuche prüfen und die vorhandenen Indexe verwenden, um fortzufahren.

Vorhandenen Index abrufen

Wenn Sie ein bereits vorhandenes Indexobjekt abrufen möchten, ersetzen Sie your-index-id durch die Index-ID und führen Sie die Zelle aus. Sie finden die Index-ID in der Google Cloud Console für Vector Search. Wechseln Sie im Abschnitt „Vertex AI“ der Google Cloud Console zum Abschnitt Bereitstellen und verwenden. Indexe auswählen

Siehe Indexe

my_index_id = "[your-index-id]"
my_index = aiplatform.MatchingEngineIndex(my_index_id)

Vorhandenen Indexendpunkt abrufen

Wenn Sie ein bereits vorhandenes Indexendpunktobjekt abrufen möchten, ersetzen Sie your-index-endpoint-id durch die Indexendpunkt-ID und führen die Zelle aus. Sie finden den Indexendpunkt in der Google Cloud Console für die Vektorsuche. Wechseln Sie im Abschnitt „Vertex AI“ der Google Cloud Console zum Abschnitt Bereitstellen und verwenden. Wählen Sie Indexendpunkte

Indexendpunkte ansehen

my_index_endpoint_id = "[your-index-endpoint-id]"
my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint(my_index_endpoint_id)