Objetivos
- Instala AlloyDB AI en AlloyDB Omni.
- Conéctate a tu base de datos y, luego, 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 de productos.
- Realiza una búsqueda de vectores.
- Realiza una búsqueda de vectores compleja con un filtro y una unión.
Costos
En este documento, usarás el siguiente componente facturable de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
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 vectorial.
Instala AlloyDB AI en AlloyDB Omni según tu entorno de procesamiento
Según el entorno de procesamiento que uses, completa las instrucciones en Instala AlloyDB AI en AlloyDB Omni para instalar AlloyDB Omni.
Conéctate a tu base de datos con psql
Conéctate a tu base de datos con psql:
export DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=my-db-cluster,alloydbomni.internal.dbadmin.goog/task-type=database -o jsonpath='{.items[0].metadata.name}'`kubectl exec -ti $DBPOD -c database -- psql -h localhost -U postgres
Instala las extensiones obligatorias
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 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 Realiza una limpieza.
Inserta datos de productos y de inventario de productos, y realiza una búsqueda de vectores básica
En este instructivo, se usan las tablas product_inventory y product para ejecutar consultas de búsqueda vectorial complejas.
Ejecuta la siguiente instrucción para crear una tabla
productque haga lo siguiente:- Almacena información básica del producto.
- Incluye una columna de vectores
embeddingque calcula y almacena un vector de embedding 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 );Ejecuta la siguiente consulta para crear una tabla
product_inventoryque 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) );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: Para verificar que los datos se insertaron en la tabla
product, ejecuta la siguiente consulta: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 búsqueda de vectores para buscar productos similares a la palabra
music. Aunque la palabramusicno se menciona explícitamente en la descripción del producto, el resultado muestra productos relevantes para la búsqueda: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 usa KNN, que proporciona una recuperación eficiente. Sin embargo, a gran escala, el uso de KNN podría afectar el rendimiento. Para obtener un mejor rendimiento de las búsquedas, te recomendamos que uses el índice ScaNN para la búsqueda de ANN, que proporciona una recuperación alta con latencias bajas.
Si no creas un índice, de forma predeterminada, AlloyDB Omni usa KNN.
Crea un índice de ScaNN en la tabla de productos
Ejecuta la siguiente consulta para crear un índice de 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 la cantidad 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 Ajusta el rendimiento de las búsquedas vectoriales.
Realiza una búsqueda vectorial
Ejecuta la siguiente búsqueda de vectores que intenta encontrar productos similares a la búsqueda en lenguaje natural music. Aunque la palabra music no se incluye en la descripción del producto, el resultado muestra productos relevantes para la búsqueda:
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 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 equilibrar el rendimiento y la recuperación de la búsqueda.
Realiza una búsqueda vectorial que use un filtro y una unión
Ejecuta la siguiente consulta de búsqueda vectorial compleja, que devuelve 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;
Realiza una limpieza
Borra tu clúster de base de datos
kubectl patch dbclusters.alloydbomni.dbadmin.goog my-db-cluster -p '{"spec":{"isDeleted":true}}' --type=mergeDesinstala el operador de AlloyDB Omni
Para desinstalar el operador de Kubernetes de AlloyDB Omni de tu clúster de Kubernetes, completa estos pasos:
Borra todos tus clústeres de bases de datos:
for ns in $(kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespaces -o=jsonpath='{range .items[*]}{.metadata.namespace}{"\n"}{end}'); do for cr in $(kubectl get dbclusters.alloydbomni.dbadmin.goog -n $ns -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'); do kubectl patch dbclusters.alloydbomni.dbadmin.goog $cr -n $ns --type=merge -p '{"spec":{"isDeleted":true}}' done done ```Para verificar que el operador de Kubernetes de AlloyDB Omni haya borrado todos tus clústeres de bases de datos, ejecuta el siguiente comando:
kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespacesBorra otros recursos que creó el operador de Kubernetes de AlloyDB Omni:
kubectl delete failovers.alloydbomni.dbadmin.goog --all --all-namespaceskubectl delete restores.alloydbomni.dbadmin.goog --all --all-namespaceskubectl delete switchovers.alloydbomni.dbadmin.goog --all --all-namespacesDesinstala el operador de Kubernetes de AlloyDB Omni:
helm uninstall alloydbomni-operator --namespace alloydb-omni-systemLimpia los secretos, las descripciones de recursos personalizados y los espacios de nombres relacionados con el operador de Kubernetes de AlloyDB Omni:
kubectl delete certificate -n alloydb-omni-system --allkubectl get secrets --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,ANNOTATION:.metadata.annotations.cert-manager\.io/issuer-name | grep -E 'alloydbomni|dbs-al' | awk '{print $1 " " $2}' | xargs -n 2 kubectl delete secret -nkubectl delete crd -l alloydb-omni=truekubectl delete ns alloydb-omni-system