Vektorsuche in AlloyDB Omni ausführen

Wählen Sie eine Dokumentationsversion aus:

In dieser Anleitung wird beschrieben, wie Sie eine Vektorsuche in AlloyDB Omni mit der Google Cloud console einrichten und ausführen. Die Beispiele zeigen die Möglichkeiten der Vektorsuche und dienen nur zu Demonstrationszwecken.

Informationen zur Verwendung der gefilterten Vektorsuche zum Verfeinern von Ähnlichkeitssuchen finden Sie unter Gefilterte Vektorsuche in AlloyDB Omni.

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

Ziele

  • AlloyDB Omni-Cluster und primäre Instanz erstellen
  • Verbindung zur Datenbank herstellen und erforderliche Erweiterungen installieren
  • Tabelle product und product inventory erstellen
  • Daten in die product und product inventory Tabellen einfügen und eine einfache Vektorsuche ausführen
  • ScaNN-Index für die Tabelle „products“ erstellen
  • Einfache Vektorsuche ausführen
  • Komplexe Vektorsuche mit Filter und 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 vonsteht möglicherweise ein kostenloser Testzeitraum 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.

Vorbereitung

Führen Sie die folgenden Schritte aus, bevor Sie eine Vektorsuche ausführen:

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

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

    • Grundlegende Produktinformationen speichern
    • Eine embedding-Vektorspalte enthält, die einen Einbettungsvektor für eine Produktbeschreibung jedes Produkts berechnet und speichert
      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 die Logs aufrufen und Fehler beheben.

  2. Führen Sie die folgende Abfrage aus, um eine product_inventory-Tabelle zu erstellen, in der Informationen zu verfügbarem Inventar und 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 auch wenn das Wort music in der Produktbeschreibung nicht explizit erwähnt wird, im Ergebnis Produkte angezeigt werden, die für die Abfrage 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 exakten 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, den ScaNN-Index für die Suche nach dem ungefähren nächsten Nachbarn (ANN) zu verwenden, der einen hohen Recall mit niedrigen Latenzen bietet.

    Ohne Indexerstellung verwendet AlloyDB Omni standardmäßig die Suche nach dem exakten nächsten Nachbarn (KNN).

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

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

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

CREATE INDEX product_index ON product
USING scann (embedding cosine)
WITH (mode='MANUAL', num_leaves=4);

Weitere Informationen zum Erstellen eines ScaNN-Index finden Sie unter ScaNN-Index erstellen.

Führen Sie die folgende Vektorsuchanfrage aus, um Produkte zu finden, die der Abfrage 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 Abfrage 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. Die num_leaves und scann.num_leaves_to_search Parameterwerte tragen dazu bei, ein Gleichgewicht zwischen Leistung und Recall zu erreichen.

Sie können gefilterte Vektorsuchanfragen auch dann effizient ausführen, wenn Sie den ScaNN-Index verwenden. Führen Sie die folgende komplexe Vektorsuchanfrage 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 den spaltenbasierten Engine-Inhaltsspeicher verwenden, um die Leistung von Vektorähnlichkeitssuchen zu verbessern, insbesondere von KNN-Suchen (K-Nearest Neighbor), wenn sie mit einer hochselektiven Prädikatfilterung kombiniert werden, z. B. mit LIKE, in Datenbanken. In diesem Abschnitt verwenden Sie die vector Erweiterung und die AlloyDB Omni google_columnar_engine Erweiterung. Weitere Informationen zur Funktionsweise der spaltenbasierten Engine finden Sie unter Übersicht über die spaltenbasierte Engine.

Leistungsverbesserungen ergeben sich aus der integrierten Effizienz der spaltenbasierten Engine beim Scannen großer Datensätze und Anwenden von Filtern, z. B. LIKE-Prädikaten, in Verbindung mit der Möglichkeit, mit Vektorunterstützung Zeilen vorzufiltern. Diese Funktion reduziert die Anzahl der Datenteilmengen, die für nachfolgende KNN-Vektordistanzberechnungen erforderlich sind, und trägt zur Optimierung komplexer analytischer Abfragen bei, die Standardfilterung und Vektorsuche umfassen.

Der spaltenbasierte Speicher bietet zwei Optionen zum Verwalten seiner Inhalte:

So vergleichen Sie die Ausführungszeit einer KNN-Vektorsuche, die vor und nach dem Aktivieren der spaltenbasierten Engine nach einem LIKE-Prädikat gefiltert wurde:

  1. Aktivieren Sie die Erweiterung vector, 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 512-dimensionalen Vektoreinbettungsspalte 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,
        (SELECT array_agg(random()) FROM generate_series(1, 512))::vector
    FROM generate_series(1, 999999) g;
  3. Messen Sie die Baseline-Leistung der Vektorähnlichkeitssuche ohne die spaltenbasierte Engine.

    SELECT id, description, embedding <-> '[...]' AS distance
    FROM items
    WHERE description LIKE '%product_%_common%'
    ORDER BY embedding <-> '[...]'
    LIMIT 100;
  4. Aktivieren Sie die spaltenbasierte Engine und die Vektorunterstützung.

    1. Aktivieren Sie die google_columnar_engine.enabled und google_columnar_engine.enable_vector_support Datenbank Flags.

      ALTER SYSTEM SET google_columnar_engine.enabled = 'on';
      ALTER SYSTEM SET google_columnar_engine.enable_vector_support = 'on';
    2. AlloyDB Omni neu starten

      Docker

      docker restart CONTAINER_NAME

      Docker

      docker restart CONTAINER_NAME

      Podman

      podman restart CONTAINER_NAME

      Podman

      podman restart CONTAINER_NAME

      Ersetzen Sie CONTAINER_NAME durch den Namen des Containers, den Sie unter AlloyDB Omni in Containern installieren erstellt haben.

  5. Fügen Sie die Tabelle items der spaltenbasierten Engine hinzu:

    SELECT google_columnar_engine_add('items');
  6. Messen Sie die Leistung der Vektorähnlichkeitssuche mit der spaltenbasierten Engine. Führen Sie die Abfrage noch einmal aus, die Sie zuvor zur Messung der Baseline Leistung ausgeführt 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 spaltenbasierten 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

Informationen zum Deinstallieren von AlloyDB Omni finden Sie unter AlloyDB Omni verwalten und überwachen.

Nächste Schritte