Vektorsuche in AlloyDB Omni ausführen

Wählen Sie eine Dokumentationsversion aus:

In dieser Anleitung wird beschrieben, wie Sie eine Vektorsuche in AlloyDB Omni einrichten und ausführen. Sie führen Abfragen mit dem exakten KNN-Algorithmus (K-Nearest Neighbor) und dem auf ANN (Approximate Nearest Neighbor) basierenden ScaNN-Index aus. Außerdem erfahren Sie, wie Sie gefilterte Vektorsuche-Abfragen effizient mit dem ScaNN-Index ausführen.

Ziele

  • Installieren Sie AlloyDB AI in AlloyDB Omni.
  • Stellen Sie eine Verbindung zu Ihrer Datenbank her und installieren Sie die erforderlichen Erweiterungen.
  • Erstellen Sie eine product- und eine product inventory-Tabelle.
  • Fügen Sie Daten in die Tabellen product und product inventory ein und führen Sie eine einfache Vektorsuche durch.
  • Erstellen Sie einen ScaNN-Index für die Tabelle „products“.
  • Führen Sie eine Vektorsuche aus.
  • Eine komplexe Vektorsuche mit einem Filter und einem Join ausführen

Kosten

In diesem Dokument verwenden Sie die folgende kostenpflichtige Komponente von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Vorbereitung

Erfüllen Sie die folgenden Voraussetzungen, bevor Sie eine Vektorsuche durchführen.

AlloyDB AI in AlloyDB Omni basierend auf Ihrer Rechenumgebung installieren

Führen Sie je nach verwendeter Rechenumgebung die Anleitung unter AlloyDB AI in AlloyDB Omni installieren aus, um AlloyDB Omni zu installieren.

Verbindung zur Datenbank über psql herstellen

Stellen Sie mit psql eine Verbindung zu Ihrer Datenbank her:

    export DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=my-db-cluster,alloydbomni.internal.dbadmin.goog/task-type=database -o jsonpath='{.items[0].metadata.name}'`
    kubectl exec -ti $DBPOD -c database -- psql -h localhost -U postgres

Erforderliche Erweiterungen installieren

Führen Sie die folgende Abfrage aus, um die Erweiterungen vector, alloydb_scann und google_ml_integration zu installieren:

  CREATE EXTENSION IF NOT EXISTS vector;
  CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter „Bereinigen“.

Produkt- und Produktinventardaten einfügen und eine einfache Vektorsuche durchführen

Die Tabellen product_inventory und product werden in dieser Anleitung verwendet, um komplexe Vektorsuchanfragen auszuführen.

  1. Führen Sie die folgende Anweisung aus, um eine Tabelle product zu erstellen, die Folgendes ausführt:

    • Speichert grundlegende Produktinformationen.
    • Enthält eine embedding-Vektorspalte, in der ein Einbettungsvektor für eine Produktbeschreibung jedes Produkts berechnet und gespeichert wird.
      CREATE TABLE product (
        id INT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        description TEXT,
        category VARCHAR(255),
        color VARCHAR(255),
        embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-004', description)) STORED
      );
    
  2. Führen Sie die folgende Abfrage aus, um eine product_inventory-Tabelle zu erstellen, in der Informationen zu verfügbarem Inventar und den entsprechenden Preisen gespeichert werden.

    CREATE TABLE product_inventory (
      id INT PRIMARY KEY,
      product_id INT REFERENCES product(id),
      inventory INT,
      price DECIMAL(10,2)
    );
    
  3. Führen Sie die folgende Abfrage aus, um Produktdaten in die Tabelle product einzufügen:

    INSERT INTO product (id, name, description,category, color) VALUES
    (1, 'Stuffed Elephant', 'Soft plush elephant with floppy ears.', 'Plush Toys', 'Gray'),
    (2, 'Remote Control Airplane', 'Easy-to-fly remote control airplane.', 'Vehicles', 'Red'),
    (3, 'Wooden Train Set', 'Classic wooden train set with tracks and trains.', 'Vehicles', 'Multicolor'),
    (4, 'Kids Tool Set', 'Toy tool set with realistic tools.', 'Pretend Play', 'Multicolor'),
    (5, 'Play Food Set', 'Set of realistic play food items.', 'Pretend Play', 'Multicolor'),
    (6, 'Magnetic Tiles', 'Set of colorful magnetic tiles for building.', 'Construction Toys', 'Multicolor'),
    (7, 'Kids Microscope', 'Microscope for kids with different magnification levels.', 'Educational Toys', 'White'),
    (8, 'Telescope for Kids', 'Telescope designed for kids to explore the night sky.', 'Educational Toys', 'Blue'),
    (9, 'Coding Robot', 'Robot that teaches kids basic coding concepts.', 'Educational Toys', 'White'),
    (10, 'Kids Camera', 'Durable camera for kids to take pictures and videos.', 'Electronics', 'Pink'),
    (11, 'Walkie Talkies', 'Set of walkie talkies for kids to communicate.', 'Electronics', 'Blue'),
    (12, 'Karaoke Machine', 'Karaoke machine with built-in microphone and speaker.', 'Electronics', 'Black'),
    (13, 'Kids Drum Set', 'Drum set designed for kids with adjustable height.', 'Musical Instruments', 'Blue'),
    (14, 'Kids Guitar', 'Acoustic guitar for kids with nylon strings.', 'Musical Instruments', 'Brown'),
    (15, 'Kids Keyboard', 'Electronic keyboard with different instrument sounds.', 'Musical Instruments', 'Black'),
    (16, 'Art Easel', 'Double-sided art easel with chalkboard and whiteboard.', 'Arts & Crafts', 'White'),
    (17, 'Finger Paints', 'Set of non-toxic finger paints for kids.', 'Arts & Crafts', 'Multicolor'),
    (18, 'Modeling Clay', 'Set of colorful modeling clay.', 'Arts & Crafts', 'Multicolor'),
    (19, 'Watercolor Paint Set', 'Watercolor paint set with brushes and palette.', 'Arts & Crafts', 'Multicolor'),
    (20, 'Beading Kit', 'Kit for making bracelets and necklaces with beads.', 'Arts & Crafts', 'Multicolor'),
    (21, '3D Puzzle', '3D puzzle of a famous landmark.', 'Puzzles', 'Multicolor'),
    (22, 'Race Car Track Set', 'Race car track set with cars and accessories.', 'Vehicles', 'Multicolor'),
    (23, 'RC Monster Truck', 'Remote control monster truck with oversized tires.', 'Vehicles', 'Green'),
    (24, 'Train Track Expansion Set', 'Expansion set for wooden train tracks.', 'Vehicles', 'Multicolor');
    
  4. Optional: Wenn Sie prüfen möchten, ob die Daten in die Tabelle product eingefügt wurden, führen Sie die folgende Abfrage aus:

    SELECT * FROM product;
    
  5. Führen Sie die folgende Abfrage aus, um Inventardaten in die Tabelle product_inventory einzufügen:

    INSERT INTO product_inventory (id, product_id, inventory, price) VALUES
    (1, 1, 9, 13.09),
    (2, 2, 40, 79.82),
    (3, 3, 34, 52.49),
    (4, 4, 9, 12.03),
    (5, 5, 36, 71.29),
    (6, 6, 10, 51.49),
    (7, 7, 7, 37.35),
    (8, 8, 6, 10.87),
    (9, 9, 7, 42.47),
    (10, 10, 3, 24.35),
    (11, 11, 4, 10.20),
    (12, 12, 47, 74.57),
    (13, 13, 5, 28.54),
    (14, 14, 11, 25.58),
    (15, 15, 21, 69.84),
    (16, 16, 6, 47.73),
    (17, 17, 26, 81.00),
    (18, 18, 11, 91.60),
    (19, 19, 8, 78.53),
    (20, 20, 43, 84.33),
    (21, 21, 46, 90.01),
    (22, 22, 6, 49.82),
    (23, 23, 37, 50.20),
    (24, 24, 27, 99.27);
    
  6. Führen Sie die folgende Vektorsuchanfrage aus, um nach Produkten zu suchen, die dem Wort music ähneln. Auch wenn das Wort music nicht explizit in der Produktbeschreibung erwähnt wird, werden im Ergebnis Produkte angezeigt, die für die Anfrage relevant sind:

    SELECT * FROM product
    ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
    LIMIT 3;
    

    Wenn Sie eine einfache Vektorsuche ohne Indexerstellung durchführen, verwendet AlloyDB AI KNN, was einen effizienten Recall ermöglicht. Bei großem Umfang kann sich die Verwendung von KNN jedoch auf die Leistung auswirken. Für eine bessere Abfrageleistung empfehlen wir die Verwendung des ScaNN-Index für die ANN-Suche, der einen hohen Recall bei niedrigen Latenzen bietet.

    Wenn Sie keinen Index erstellen, verwendet AlloyDB Omni standardmäßig KNN.

ScaNN-Index für die Tabelle „products“ erstellen

Führen Sie die folgende Abfrage aus, um einen product_index-ScaNN-Index für die Tabelle product zu erstellen:

  CREATE INDEX product_index ON product
  USING scann (embedding cosine)
  WITH (num_leaves=5);

Der Parameter num_leaves gibt die Anzahl der Blattknoten an, mit denen der baumbasierte Index erstellt wird. Weitere Informationen zum Optimieren dieses Parameters finden Sie unter Leistung von Vektorabfragen optimieren.

Führen Sie die folgende Vektorsuchanfrage aus, um Produkte zu finden, die der Anfrage in natürlicher Sprache music ähneln. Auch wenn das Wort music nicht in der Produktbeschreibung enthalten ist, werden im Ergebnis Produkte angezeigt, die für die Anfrage relevant sind:

SET LOCAL scann.num_leaves_to_search = 2;

SELECT * FROM product
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
  LIMIT 3;

Der Abfrageparameter scann.num_leaves_to_search steuert die Anzahl der Blattknoten, die bei einer Ähnlichkeitssuche durchsucht werden. Mit den Parameterwerten num_leaves und scann.num_leaves_to_search lässt sich ein Gleichgewicht zwischen der Leistung und dem Recall von Anfragen herstellen.

Führen Sie die folgende komplexe Vektorsuche aus, die relevante Ergebnisse zurückgibt, die die Suchanfragebedingungen erfüllen, auch mit Filtern:

SET LOCAL scann.num_leaves_to_search = 2;

SELECT * FROM product p
JOIN product_inventory pi ON p.id = pi.product_id
WHERE pi.price < 80.00
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
LIMIT 3;

Bereinigen

Datenbankcluster löschen

      kubectl patch dbclusters.alloydbomni.dbadmin.goog my-db-cluster -p '{"spec":{"isDeleted":true}}' --type=merge

AlloyDB Omni-Operator deinstallieren

So deinstallieren Sie den AlloyDB Omni Kubernetes-Operator aus Ihrem Kubernetes-Cluster:

  1. Löschen Sie alle Ihre Datenbankcluster:

          for ns in $(kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespaces -o=jsonpath='{range .items[*]}{.metadata.namespace}{"\n"}{end}'); do
          for cr in $(kubectl get dbclusters.alloydbomni.dbadmin.goog -n $ns -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'); do
          kubectl patch dbclusters.alloydbomni.dbadmin.goog $cr -n $ns --type=merge -p '{"spec":{"isDeleted":true}}'
          done
          done
      ```
  2. Prüfen Sie mit dem folgenden Befehl, ob der AlloyDB Omni Kubernetes-Operator alle Ihre Datenbankcluster gelöscht hat:

        kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespaces
  3. Löschen Sie andere Ressourcen, die vom AlloyDB Omni Kubernetes-Operator erstellt wurden:

        kubectl delete failovers.alloydbomni.dbadmin.goog --all --all-namespaces
        kubectl delete restores.alloydbomni.dbadmin.goog --all --all-namespaces
        kubectl delete switchovers.alloydbomni.dbadmin.goog --all --all-namespaces
  4. Deinstallieren Sie den AlloyDB Omni Kubernetes-Operator:

        helm uninstall alloydbomni-operator --namespace alloydb-omni-system
  5. Bereinigen Sie Secrets, benutzerdefinierte Ressourcenbeschreibungen und Namespaces, die mit dem AlloyDB Omni Kubernetes-Operator zusammenhängen:

        kubectl delete certificate -n alloydb-omni-system --all
        kubectl get secrets --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,ANNOTATION:.metadata.annotations.cert-manager\.io/issuer-name | grep -E 'alloydbomni|dbs-al' | awk '{print $1 " " $2}' | xargs -n 2 kubectl delete secret -n
        kubectl delete crd -l alloydb-omni=true
        kubectl delete ns alloydb-omni-system

Nächste Schritte