Para obtener información sobre cómo usar la búsqueda de vectores filtrada para refinar tus búsquedas de similitud, consulta Búsqueda de vectores filtrada en AlloyDB Omni.
Para aprender a realizar una Vector Search con embeddings de Vertex AI, consulta Comienza a usar embeddings de vectores con AlloyDB Omni AI.
Objetivos
- Crea un clúster de AlloyDB Omni y una instancia principal.
- Conéctate a tu base de datos y, luego, instala las extensiones requeridas.
- Crea una tabla
producty una tablaproduct inventory. - Inserta datos en las tablas
productyproduct inventory, y realiza una búsqueda de vectores básica. - Crea un índice de ScaNN en la tabla de productos.
- Realiza una búsqueda de vectores básica.
- Realiza una Vector Search compleja con un filtro y una unión.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Es posible que los usuarios Google Cloud nuevos decumplan con los requisitos para acceder a una prueba gratuita.
Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.
Requisitos previos
Completa los siguientes requisitos previos antes de realizar una búsqueda de vectores:
- Instala AlloyDB AI en AlloyDB Omni.
-
Ejecuta AlloyDB Omni y conéctate a él
como el usuario
postgres. -
Instala las extensiones
vector,alloydb_scannygoogle_ml_integration.CREATE EXTENSION IF NOT EXISTS vector; CREATE EXTENSION IF NOT EXISTS alloydb_scann; CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
Inserta datos de productos y de inventario de productos, y realiza una búsqueda de vectores básica
Ejecuta la siguiente instrucción para crear una tabla
productque haga lo siguiente:- Almacena información básica del producto.
- Incluye una columna de vector
embeddingque calcula y almacena un vector de embedding para una descripción de producto 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-005', description)) STORED );Si es necesario, puedes ver los registros y solucionar problemas.
Ejecuta la siguiente consulta para crear una tabla
product_inventoryque almacene información sobre el inventario disponible y los precios correspondientes. Las tablasproduct_inventoryyproductse usan en este instructivo para ejecutar consultas de búsqueda de vectores complejas.CREATE TABLE product_inventory ( id INT PRIMARY KEY, product_id INT REFERENCES product(id), inventory INT, price DECIMAL(10,2) );Ejecuta la siguiente consulta para insertar datos de productos 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');Opcional: Ejecuta la siguiente consulta para verificar que los datos se inserten en la tabla
product:SELECT * FROM product;Ejecuta 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);Ejecuta la siguiente consulta de búsqueda de vectores que intenta encontrar productos similares a la palabra
music. Esto significa que, aunque la palabramusicno se menciona de forma explícita en la descripción del producto, el resultado muestra productos que son relevantes para la consulta:SELECT * FROM product ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector LIMIT 3;El resultado de la consulta es el siguiente:

Realizar una Vector Search básica sin crear un índice usa la búsqueda exacta de vecinos más cercanos (KNN), que proporciona una recuperación eficiente. A gran escala, el uso de KNN puede afectar el rendimiento. Para obtener un mejor rendimiento de la consulta, te recomendamos que uses el índice de ScaNN para la búsqueda aproximada de vecinos más cercanos (ANN), que proporciona una alta recuperación con latencias bajas.
Sin crear un índice, AlloyDB Omni usa de forma predeterminada la búsqueda exacta de vecinos más cercanos (KNN).
Para obtener más información sobre el uso de ScaNN a gran escala, consulta Comienza a usar embeddings de vectores con AlloyDB AI.
Crea un índice de ScaNN ajustado manualmente en la tabla de productos
Ejecuta la siguiente consulta para crear un índice de ScaNN product_index en la product
tabla:
CREATE INDEX product_index ON product
USING scann (embedding cosine)
WITH (mode='MANUAL', num_leaves=4);
Para obtener más información sobre cómo crear un índice de ScaNN, consulta Crea un índice de ScaNN.
Realiza una búsqueda de vectores
Ejecuta la siguiente consulta de búsqueda de vectores que intenta encontrar productos similares a la consulta de lenguaje natural
music. Aunque la palabra music no se incluye en la
descripción del producto, el resultado muestra productos que son 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;
Los resultados de la consulta son los siguientes:

El parámetro de consulta scann.num_leaves_to_search controla la cantidad 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 lograr un equilibrio entre el
rendimiento y la recuperación.
Realiza una búsqueda de vectores que use un filtro y una unión
Puedes ejecutar consultas de búsqueda de vectores filtradas de manera eficiente incluso cuando usas el índice de ScaNN. Ejecuta la siguiente consulta de búsqueda de vectores compleja, que muestra resultados relevantes que satisfacen 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;
Acelera tu Vector Search filtrada
Puedes usar el almacén de contenido del motor de columnas para mejorar el rendimiento de las búsquedas de similitud de vectores, específicamente las búsquedas de K-vecinos más cercanos (KNN), cuando se combinan con el filtrado de predicados altamente selectivo, por ejemplo, con LIKE, en bases de datos. En esta sección, usarás la extensión vector y
la extensión
google_columnar_engine de AlloyDB Omni.
Para obtener más información sobre cómo funciona el motor de columnas, consulta
Descripción general del motor de columnas.
Las mejoras en el rendimiento provienen de la eficiencia integrada del motor de columnas en el análisis de grandes conjuntos de datos y la aplicación de filtros, como los predicados LIKE, junto con su capacidad, mediante la compatibilidad con vectores, para prefiltrar las filas. Esta funcionalidad reduce la cantidad de subconjuntos de datos necesarios para los cálculos posteriores de distancia vectorial de KNN y ayuda a optimizar las consultas analíticas complejas que implican el filtrado estándar y la búsqueda de vectores.
El almacén de columnas ofrece dos opciones para administrar su contenido:
- Administra automáticamente el contenido del almacén de columnas: Las instancias nuevas de AlloyDB Omni usan la columnarización automática de forma predeterminada. Como alternativa, puedes ejecutar manualmente la funcionalidad de columnarización automática.
- Administra el contenido del almacén de columnas de forma manual: Si necesitas administrar manualmente las columnas en el almacén de columnas para tu carga de trabajo, puedes inhabilitar la columnarización automática.
Para comparar el tiempo de ejecución de una búsqueda de vectores de KNN filtrada por un predicado LIKE antes y después de habilitar el motor de columnas, sigue estos pasos:
-
Habilita la extensión
vectorpara admitir tipos de datos y operaciones de vectores. Ejecuta las siguientes instrucciones para crear una tabla de ejemplo (elementos) con un ID, una descripción de texto y una columna de embedding de vectores de 512 dimensiones.CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE items ( id SERIAL PRIMARY KEY, description TEXT, embedding VECTOR(512) );
-
Completa los datos ejecutando las siguientes instrucciones para insertar 1 millón filas en la tabla de ejemplo
items.-- 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;
-
Mide el rendimiento de referencia de la búsqueda de similitud de vectores sin el motor de columnas.
SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
-
Habilita el motor de columnas y la compatibilidad con vectores.
-
Habilita las marcas de base de datos
google_columnar_engine.enabledygoogle_columnar_engine.enable_vector_support.ALTER SYSTEM SET google_columnar_engine.enabled = 'on'; ALTER SYSTEM SET google_columnar_engine.enable_vector_support = 'on';
-
Reinicia AlloyDB Omni.
systemctl restart alloydbomni18
-
-
Agrega la tabla
itemsal motor de columnas:SELECT google_columnar_engine_add('items');
-
Mide el rendimiento de la búsqueda de similitud de vectores con el motor de columnas. Vuelve a ejecutar la consulta que ejecutaste anteriormente para medir el rendimiento de referencia.
SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
-
Para verificar si la consulta se ejecutó con el motor de columnas, ejecuta el siguiente comando:
explain (analyze) SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
Limpia
Para desinstalar AlloyDB Omni, consulta Administra y supervisa AlloyDB Omni.