Vector Search en AlloyDB para PostgreSQL te permite encontrar registros semánticamente similares almacenando y consultando embeddings de vectores en tu base de datos. En este instructivo, configurarás una tabla de base de datos, cargarás embeddings de vectores de muestra, crearás un índice de ScaNN y ejecutarás consultas de similitud de vectores con la consola de Google Cloud . Los ejemplos de este instructivo se proporcionan solo con fines de demostración.
Para obtener información sobre cómo usar la búsqueda de vectores filtrada para definir mejor tus búsquedas de similitud, consulta Búsqueda de vectores filtrada en AlloyDB para PostgreSQL.
Para aprender a realizar una Vector Search con embeddings de Gemini Enterprise Agent Platform, consulta Comienza a usar embeddings de vectores con AlloyDB AI.
Objetivos
- Crear un clúster y una instancia principal de AlloyDB
- Conéctate a tu base de datos e instala las extensiones necesarias.
- Crea una tabla
productyproduct inventory. - Inserta datos en las tablas
productyproduct inventory, y realiza una búsqueda vectorial básica. - Crea un índice de ScaNN en la tabla products.
- Realizar una búsqueda vectorial básica
- Realizar 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.
Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.
Antes de comenzar
Habilita la facturación y las APIs requeridas
En la consola de Google Cloud , ve a la página Clústeres.
Asegúrate de tener habilitada la facturación para tu proyecto de Google Cloud .
Habilita las API de Cloud necesarias para crear AlloyDB para PostgreSQL y conectarte a él.
- En el paso Confirmar proyecto, haz clic en Siguiente para confirmar el nombre del proyecto en el que realizarás cambios.
En el paso Habilitar APIs, haz clic en Habilitar para habilitar lo siguiente:
- API de AlloyDB
- API de Compute Engine
- API de Service Networking
- API de Agent Platform
Crea un clúster y una instancia principal de AlloyDB
En la consola de Google Cloud , ve a la página Clústeres.
Haga clic en Crear clúster.
En ID del clúster, ingresa
my-cluster.Ingresa una contraseña. Toma nota de esta contraseña, ya que la usarás en este instructivo.
Selecciona una región, por ejemplo,
us-central1 (Iowa).Selecciona la red predeterminada.
Si tienes una conexión de acceso privado, continúa con el siguiente paso. De lo contrario, haz clic en Configurar conexión y sigue estos pasos:
- En Asigna un rango de IP, haz clic en Usar un rango de IP asignado automáticamente.
- Haz clic en Continuar y, luego, en Crear conexión.
En Disponibilidad zonal, selecciona Zona única.
Selecciona el tipo de máquina
2 vCPU,16 GB.En Conectividad, selecciona Habilitar IP pública.
Haga clic en Crear clúster. Es posible que AlloyDB tarde varios minutos en crear el clúster y mostrarlo en la página Descripción general del clúster principal.
En Instancias en tu clúster, expande el panel Conectividad. Toma nota del URI de conexión, ya que lo usarás en este instructivo.
El URI de conexión tiene el formato
projects/PROJECT_ID/locations/REGION_ID/clusters/my-cluster/instances/my-cluster-primary.
Otorga el permiso de usuario de Agent Platform al agente de servicio de AlloyDB
Para permitir que AlloyDB use los modelos de embedding de texto de Agent Platform, debes agregar permisos de usuario de Agent Platform al agente de servicio de AlloyDB para el proyecto en el que se encuentran el clúster y la instancia.
Para obtener más información sobre cómo agregar los permisos, consulta Otorga el permiso de usuario de Agent Platform al agente de servicio de AlloyDB.
Conéctate a tu base de datos con un navegador web
En la consola de Google Cloud , ve a la página Clústeres.
En la columna Nombre del recurso, haz clic en el nombre de tu clúster,
my-cluster.En el panel de navegación, haz clic en AlloyDB Studio.
En la página Accede a AlloyDB Studio, sigue estos pasos:
- Selecciona la base de datos
postgres. - Selecciona el usuario
postgres. - Ingresa la contraseña que creaste en Crea un clúster y su instancia principal.
- Haz clic en Autenticar. En el panel Explorador, se muestra una lista de los objetos de la base de datos
postgres.
- Selecciona la base de datos
Para abrir una pestaña nueva, haz clic en + Nueva pestaña del editor de SQL o + Nueva pestaña.
Instala las extensiones necesarias
Ejecuta la siguiente consulta para instalar las extensiones vector y alloydb_scann:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Inserta datos de productos y de inventario de productos, y realiza una búsqueda de vectores básica
Ejecuta la siguiente sentencia 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 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 usar el Explorador de registros para 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. En este instructivo, se usan las tablasproduct_inventoryyproductpara 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 que sean similares a la palabra
music. Esto significa que, aunque la palabramusicno se mencione 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 búsqueda de vectores básica sin crear un índice usa la búsqueda de vecino más cercano exacta (KNN), que proporciona una recuperación eficiente. A gran escala, el uso de KNN podría afectar el rendimiento. Para obtener un mejor rendimiento de las consultas, te recomendamos que uses el índice ScaNN para la búsqueda de vecinos más cercanos aproximados (ANN), que proporciona una alta recuperación con latencias bajas.
Sin crear un índice, AlloyDB usa de forma predeterminada la búsqueda exacta de vecino más cercano (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 de forma manual en la tabla de productos
Ejecuta la siguiente consulta para crear un índice de ScaNN de product_index en la tabla
product:
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 en 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 de 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 devuelve resultados pertinentes que cumplen con 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 búsqueda de vectores 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 vecino más cercano (KNN), cuando
se combinan con un filtrado de predicados altamente selectivo, por ejemplo, con
LIKE, en las bases de datos. En esta sección, usarás la extensión vector y
la extensión google_columnar_engine de AlloyDB.
Para obtener más información sobre cómo funciona el motor de columnas, consulta
Acerca del motor de columnas de AlloyDB.
Las mejoras de rendimiento provienen de la eficiencia integrada del motor de columnas para analizar grandes conjuntos de datos y aplicar filtros, como los predicados LIKE, junto con su capacidad, con la compatibilidad con vectores, de prefiltrado de las filas. Esta funcionalidad reduce la cantidad de subconjuntos de datos necesarios para
los cálculos posteriores de distancia de vectores de KNN y ayuda a optimizar las consultas analíticas
complejas que involucran 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 usan la estructuración automática en columnas de forma predeterminada. Como alternativa, puedes ejecutar de forma manual la función de estructuración automática en columnas.
- Administra el contenido del almacén de columnas de forma manual: Si necesitas administrar de forma manual las columnas en el almacén de columnas para tu carga de trabajo, puedes inhabilitar la estructuración automática en columnas.
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 declaraciones para crear una tabla de ejemplo (items) con un ID, una descripción de texto y una columna de embedding de vector de 512 dimensiones.CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE items ( id SERIAL PRIMARY KEY, description TEXT, embedding VECTOR(512) );Ejecuta las siguientes declaraciones para insertar 1 millón de filas en la tabla
itemsde ejemplo y propagar los datos.-- 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;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 ejecutando el siguiente comando en la Google Cloud CLI. Para usar gcloud CLI, puedes instalarla e inicializarla.
gcloud 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=onReemplaza lo siguiente:
INSTANCE_ID: el ID de la instanciaCLUSTER_ID: Es el ID del clúster.REGION_ID: Es la región en la que se encuentra el clúster.PROJECT_ID: Es el ID del proyecto en el que se encuentra el clúster.
Agrega la tabla
itemsal motor de columnas:SELECT google_columnar_engine_add('items');Medir el rendimiento de la búsqueda de similitud de vectores con el motor de columnas Vuelve a ejecutar la consulta que ejecutaste antes 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;
Realiza una limpieza
En la consola de Google Cloud , ve a la página Clústeres.
Haz clic en el nombre de tu clúster,
my-cluster, en la columna Nombre del recurso.Haz clic en delete Borrar clúster.
En Borrar el clúster my-cluster, ingresa
my-clusterpara confirmar que deseas borrar el clúster.Haz clic en Borrar.
Si creaste una conexión privada cuando creaste un clúster, ve a la página Herramientas de redes de la consola de Google Cloud y haz clic en Borrar red de VPC.
¿Qué sigue?
- Conoce los casos de uso reales de la búsqueda de vectores.
- Comienza a usar embeddings de vectores con AlloyDB AI.
- Aprende a compilar aplicaciones de IA generativa con AlloyDB AI.
- Crea un índice de ScaNN.
- Ajusta tus índices de ScaNN.
- Aprende a crear un asistente de compras inteligente con AlloyDB, pgvector y la administración de extremos de modelos.
- Acelera la búsqueda de vectores con el motor de columnas.