Hacer búsquedas de vectores en AlloyDB Omni

Selecciona una versión de la documentación:

En este tutorial se describe cómo configurar y realizar una búsqueda de vectores en AlloyDB Omni. Puedes ejecutar consultas mediante la búsqueda de vecinos más cercanos exactos (KNN) y el índice ScaNN basado en la búsqueda de vecinos más cercanos aproximados (ANN). También aprenderás a ejecutar consultas de búsqueda de vectores filtradas de forma eficiente con el índice ScaNN.

Objetivos

  • Instala AlloyDB AI en AlloyDB Omni.
  • Conéctate a tu base de datos e instala las extensiones necesarias.
  • Crea una tabla de product y otra de product inventory.
  • Inserta datos en las tablas product y product inventory y realiza una búsqueda de vectores básica.
  • Crea un índice de ScaNN en la tabla de productos.
  • Realiza una búsqueda vectorial.
  • Realiza una búsqueda vectorial compleja con un filtro y una unión.

Costes

En este documento, se usa el siguiente componente facturable de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Requisitos previos

Completa los siguientes requisitos previos antes de realizar una búsqueda vectorial.

Instalar AlloyDB AI en AlloyDB Omni en función de tu entorno informático

En función del entorno informático que utilices, sigue las instrucciones de Instalar AlloyDB AI en AlloyDB Omni para instalar AlloyDB Omni.

Conectarse a la base de datos con psql

Conéctate a tu base de datos mediante psql seleccionando el entorno informático que estés usando:

Docker

  docker exec -it my-omni-1 psql -U postgres

Podman

  podman exec -it my-omni-1 psql -U postgres

Instalar las extensiones necesarias

Ejecuta la siguiente consulta para instalar las extensiones vector, alloydb_scann y google_ml_integration:

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

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Insertar datos de productos y de inventario de productos, y realizar una búsqueda vectorial básica

En este tutorial, se usan las tablas product_inventory y product para ejecutar consultas de búsqueda de vectores complejas.

  1. Ejecuta la siguiente instrucción para crear una tabla product que haga lo siguiente:

    • Almacena información básica del producto.
    • Incluye una columna de vector embedding que calcula y almacena un vector de inserción para la descripción de cada producto.
      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. Ejecute la siguiente consulta para crear una tabla product_inventory que almacene información sobre el inventario disponible y los precios correspondientes.

    CREATE TABLE product_inventory (
      id INT PRIMARY KEY,
      product_id INT REFERENCES product(id),
      inventory INT,
      price DECIMAL(10,2)
    );
    
  3. Ejecuta la siguiente consulta para insertar datos de producto en la tabla product:

    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. Opcional: Para verificar que los datos se han insertado en la tabla product, ejecuta la siguiente consulta:

    SELECT * FROM product;
    
  5. Ejecute la siguiente consulta para insertar datos de inventario en la tabla product_inventory:

    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. Ejecuta la siguiente consulta de búsqueda de vectores para buscar productos similares a la palabra music. Aunque la palabra music no se menciona explícitamente en la descripción del producto, el resultado muestra productos relevantes para la consulta:

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

    Si realizas una búsqueda de vectores básica sin crear un índice, AlloyDB AI usará KNN, que proporciona una recuperación eficiente. Sin embargo, a gran escala, usar KNN puede afectar al rendimiento. Para mejorar el rendimiento de las consultas, te recomendamos que uses el índice ScaNN para la búsqueda de vecinos más cercanos, que ofrece un alto nivel de recuerdo con latencias bajas.

    Si no creas un índice, AlloyDB Omni usará KNN de forma predeterminada.

Crear un índice de ScaNN en la tabla de productos

Ejecuta la siguiente consulta para crear un índice product_index ScaNN en la tabla product:

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

El parámetro num_leaves indica el número de nodos hoja con los que el índice basado en árbol crea el índice. Para obtener más información sobre cómo ajustar este parámetro, consulta Ajustar el rendimiento de las consultas vectoriales.

Ejecuta la siguiente consulta de búsqueda de vectores para encontrar productos similares a la consulta en lenguaje natural music. Aunque la palabra music no se incluye en la descripción del producto, el resultado muestra productos relevantes para la consulta:

SET LOCAL scann.num_leaves_to_search = 2;

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

El parámetro de consulta scann.num_leaves_to_search controla el número de nodos hoja que se buscan durante una búsqueda de similitud. Los valores de los parámetros num_leaves y scann.num_leaves_to_search ayudan a equilibrar el rendimiento y la recuperación de las consultas.

Ejecuta la siguiente consulta de búsqueda vectorial compleja, que devuelve resultados relevantes que cumplen las condiciones de la consulta, incluso con filtros:

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;

Limpieza

Docker

  docker container stop my-omni-1
  docker container rm my-omni-1

Podman

  podman container stop my-omni-1
  podman container rm my-omni-1

Siguientes pasos