Vektorsuche ausführen


In dieser Anleitung wird beschrieben, wie Sie eine Vektorsuche in AlloyDB for PostgreSQL mit der Google Cloud Konsole einrichten und ausführen. Die Beispiele dienen dazu, die Funktionen der Vektorsuche zu veranschaulichen.

Informationen zum Verfeinern von Ähnlichkeitssuchen mit der gefilterten Vektorsuche finden Sie unter Gefilterte Vektorsuche in AlloyDB for PostgreSQL.

Informationen zum Ausführen einer Vektorsuche mit Vertex AI-Einbettungen finden Sie unter Erste Schritte mit Vektoreinbettungen in AlloyDB AI.

Lernziele

  • Erstellen Sie einen AlloyDB-Cluster und eine primäre Instanz.
  • 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 einfache Vektorsuche durch.
  • Komplexe Vektorsuche mit einem Filter und einem Join ausführen

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

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

Neuen Google Cloud Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

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.

Hinweise

Abrechnung und erforderliche APIs aktivieren

  1. Rufen Sie in der Google Cloud Console die Seite Cluster auf.

    Zur Projektauswahl

  2. Die Abrechnung für Ihr Google Cloud -Projekt muss aktiviert sein.

  3. Aktivieren Sie die Cloud APIs, die zum Erstellen einer Verbindung zu AlloyDB for PostgreSQL erforderlich sind.

    APIs aktivieren

    1. Klicken Sie im Schritt Projekt bestätigen auf Weiter, um den Namen des Projekts zu bestätigen, an dem Sie Änderungen vornehmen möchten.
    2. Klicken Sie im Schritt APIs aktivieren auf Aktivieren, um Folgendes zu aktivieren:

      • AlloyDB API
      • Compute Engine API
      • Service Networking API
      • Vertex AI API

AlloyDB-Cluster und primäre Instanz erstellen

  1. Rufen Sie in der Google Cloud Console die Seite Cluster auf.

    Zu den Clustern

  2. Klicken Sie auf Cluster erstellen.

  3. Geben Sie bei Cluster-ID my-cluster ein.

  4. Geben Sie ein Passwort ein. Notieren Sie sich dieses Passwort, da Sie es in dieser Anleitung verwenden.

  5. Wählen Sie eine Region aus, z. B. us-central1 (Iowa).

  6. Wählen Sie das Standardnetzwerk aus.

    Wenn Sie eine Verbindung für privaten Zugriff haben, fahren Sie mit dem nächsten Schritt fort. Klicken Sie andernfalls auf Verbindung einrichten und folgen Sie dieser Anleitung:

    1. Klicken Sie unter IP-Bereich zuweisen auf Automatisch zugewiesenen IP-Bereich verwenden.
    2. Klicken Sie auf Weiter und dann auf Verbindung erstellen.
  7. Wählen Sie unter Zonale Verfügbarkeit die Option Einzelne Zone aus.

  8. Wählen Sie den Maschinentyp 2 vCPU,16 GB aus.

  9. Wählen Sie unter Verbindung die Option Öffentliche IP-Adresse aktivieren aus.

  10. Klicken Sie auf Cluster erstellen. Es kann einige Minuten dauern, bis AlloyDB den Cluster erstellt und auf der Seite Übersicht des primären Clusters angezeigt wird.

  11. Erweitern Sie unter Instanzen in Ihrem Cluster den Bereich Verbindung. Notieren Sie sich den Verbindungs-URI, da Sie ihn in dieser Anleitung verwenden.

    Der Verbindungs-URI hat das Format projects/<var>PROJECT_ID</var>/locations/<var>REGION_ID</var>/clusters/my-cluster/instances/my-cluster-primary.

AlloyDB-Dienst-Agent die Vertex AI-Nutzerberechtigung erteilen

Damit AlloyDB Vertex AI-Modelle für Texteinbettung verwenden kann, müssen Sie dem AlloyDB-Dienst-Agent für das Projekt, in dem sich Ihr Cluster und Ihre Instanz befinden, Vertex AI-Nutzerberechtigungen hinzufügen.

Weitere Informationen zum Hinzufügen der Berechtigungen finden Sie unter Vertex AI-Nutzerberechtigung für AlloyDB-Dienst-Agent erteilen.

Verbindung zur Datenbank über einen Webbrowser herstellen

  1. Rufen Sie in der Google Cloud Console die Seite Cluster auf.

    Zu den Clustern

  2. Klicken Sie in der Spalte Resource name (Ressourcenname) auf den Namen Ihres Clusters, my-cluster.

  3. Klicken Sie im Navigationsbereich auf AlloyDB Studio.

  4. Führen Sie auf der Seite In AlloyDB Studio anmelden die folgenden Schritte aus:

    1. Wählen Sie die Datenbank postgres aus.
    2. Wählen Sie den Nutzer postgres aus.
    3. Geben Sie das Passwort ein, das Sie unter Cluster und primäre Instanz erstellen erstellt haben.
    4. Klicken Sie auf Authentifizieren. Im Bereich Explorer wird eine Liste der Objekte in der postgres-Datenbank angezeigt.
  5. Öffnen Sie einen neuen Tab, indem Sie auf + Neuer SQL-Editor-Tab oder auf das Pluszeichen + Neuer Tab klicken.

Erforderliche Erweiterungen installieren

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

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

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

  1. Führen Sie die folgende Anweisung aus, um eine product-Tabelle 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-005', description)) STORED
      );
    

    Bei Bedarf können Sie den Log-Explorer verwenden, um Logs aufzurufen und Fehler zu beheben.

  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. Die Tabellen product_inventory und product werden in dieser Anleitung verwendet, um komplexe Vektorsuchanfragen auszuführen.

    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: Führen Sie die folgende Abfrage aus, um zu prüfen, ob die Daten in die Tabelle product eingefügt wurden:

    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 Produkte zu finden, die dem Wort music ähneln. Das bedeutet, dass das Wort music zwar nicht explizit in der Produktbeschreibung erwähnt wird, das Ergebnis aber Produkte enthält, die für die Anfrage relevant sind:

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

    Das Ergebnis der Abfrage sieht so aus: Ergebnis einer einfachen Suchanfrage

    Bei einer einfachen Vektorsuche ohne Indexerstellung wird die Suche nach dem genauen nächsten Nachbarn (KNN) verwendet, die einen effizienten Recall bietet. Bei großem Umfang kann die Verwendung von KNN die Leistung beeinträchtigen. Für eine bessere Abfrageleistung empfehlen wir die Verwendung des ScaNN-Index für die Suche nach ungefähren nächsten Nachbarn (Approximate Nearest Neighbor, ANN). Dieser bietet einen hohen Recall bei niedrigen Latenzen.

    Wenn Sie keinen Index erstellen, verwendet AlloyDB standardmäßig die exakte Suche nach dem nächsten Nachbarn (K-Nearest Neighbor, KNN).

    Weitere Informationen zur Verwendung von ScaNN im großen Maßstab finden Sie unter Erste Schritte mit Vektoreinbettungen in AlloyDB AI.

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;

Die Abfrageergebnisse sehen so aus: Ergebnis der Vektorsuche

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 ausgewogenes Verhältnis zwischen Leistung und Recall erzielen.

Sie können gefilterte Vektorsuchanfragen auch dann effizient ausführen, wenn Sie den ScaNN-Index verwenden. Führen Sie die folgende komplexe Vektorsuche aus, die relevante Ergebnisse zurückgibt, die die Abfragebedingungen 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;

Sie können die Leistung von Vektorähnlichkeitssuchen, insbesondere KNN-Suchen (K-Nearest Neighbor), in Kombination mit hochselektivem Prädikatfiltern, z. B. mit LIKE, in Datenbanken mit der spaltenorientierten Engine verbessern. In diesem Abschnitt verwenden Sie die Erweiterung vector und die AlloyDB-Erweiterung google_columnar_engine.

Die Leistungssteigerungen sind auf die integrierte Effizienz der spaltenbasierten Engine beim Scannen großer Datasets und Anwenden von Filtern wie LIKE-Prädikaten zurückzuführen. Außerdem kann sie mithilfe der Vektorunterstützung Zeilen vorfiltern. Diese Funktion reduziert die Anzahl der für nachfolgende KNN-Vektordistanzberechnungen erforderlichen Datenteilmengen und trägt zur Optimierung komplexer Analyseabfragen bei, die Standardfilterung und Vektorsuche umfassen.

So vergleichen Sie die Ausführungszeit einer KNN-Vektorsuche, die nach einem LIKE-Prädikat gefiltert wird, vor und nach der Aktivierung der spaltenorientierten Engine:

  1. Aktivieren Sie die vector-Erweiterung, um Vektordatentypen und ‑vorgänge zu unterstützen. Führen Sie die folgenden Anweisungen aus, um eine Beispielstabelle (items) mit einer ID, einer Textbeschreibung und einer Spalte mit 512-dimensionalen Vektoreinbettungen zu erstellen.

    CREATE EXTENSION IF NOT EXISTS vector;
    
    CREATE TABLE items (
        id SERIAL PRIMARY KEY,
        description TEXT,
        embedding VECTOR(512)
    );
    
  2. Füllen Sie die Daten, indem Sie die folgenden Anweisungen ausführen, um 1 Million Zeilen in die Beispielstabelle items einzufügen.

    -- Simplified example of inserting matching (~0.1%) and non-matching data
    INSERT INTO items (description, embedding)
    SELECT
        CASE WHEN g % 1000 = 0 THEN 'product_' || md5(random()::text) || '_common' -- ~0.1% match
        ELSE 'generic_item_' || g || '_' || md5(random()::text)    -- ~99.9% don't match
        END,
        random_vector(512) -- Assumes random_vector function exists
    FROM generate_series(1, 999999) g;
    
  3. Messen Sie die Referenzleistung der Vektorähnlichkeitssuche ohne die spaltenorientierte Engine.

    SELECT id, description, embedding <-> '[...]' AS distance
    FROM items
    WHERE description LIKE '%product_%_common%'
    ORDER BY embedding <-> '[...]'
    LIMIT 100;
    
  4. Aktivieren Sie die spaltenorientierte Engine und die Vektorunterstützung, indem Sie den folgenden Befehl in der Google Cloud CLI ausführen. Wenn Sie die gcloud CLI verwenden möchten, können Sie sie installieren und initialisieren.

    gcloud beta alloydb instances update INSTANCE_ID \
        --cluster=CLUSTER_ID \
        --region=REGION_ID \
        --project=PROJECT_ID \
        --database-flags=google_columnar_engine.enabled=on,google_columnar_engine.enable_vector_support=on
  5. Fügen Sie der Spalten-Engine die Tabelle items hinzu:

    SELECT google_columnar_engine_add('items');
    
  6. Messen Sie die Leistung der Suche nach Vektorähnlichkeiten mit der spaltenorientierten Engine. Sie führen die Abfrage noch einmal aus, mit der Sie zuvor die Baseline-Leistung gemessen haben.

    SELECT id, description, embedding <-> '[...]' AS distance
    FROM items
    WHERE description LIKE '%product_%_common%'
    ORDER BY embedding <-> '[...]'
    LIMIT 100;
    
  7. Führen Sie den folgenden Befehl aus, um zu prüfen, ob die Abfrage mit der spaltenorientierten Engine ausgeführt wurde:

    explain (analyze) SELECT id, description, embedding <-> '[...]' AS distance
    FROM items
    WHERE description LIKE '%product_%_common%'
    ORDER BY embedding <-> '[...]'
    LIMIT 100;
    

Bereinigen

  1. Rufen Sie in der Google Cloud Console die Seite Cluster auf.

    Zu den Clustern

  2. Klicken Sie in der Spalte Ressourcenname auf den Namen Ihres Clusters, my-cluster.

  3. Klicken Sie auf  Cluster löschen.

  4. Geben Sie in Cluster „my-cluster“ löschen my-cluster ein, um zu bestätigen, dass Sie den Cluster löschen möchten.

  5. Klicken Sie auf Löschen.

  6. Wenn Sie beim Erstellen eines Clusters eine private Verbindung erstellt haben, rufen Sie in der Google Cloud -Konsole die Seite „Netzwerk“ auf und klicken Sie auf VPC-Netzwerk löschen.

Nächste Schritte