Para saber como usar a pesquisa vetorial filtrada para refinar suas pesquisas de similaridade, consulte Pesquisa vetorial filtrada no AlloyDB Omni.
Para saber como realizar uma pesquisa vetorial com embeddings da Vertex AI, consulte Introdução às embeddings de vetor com a IA do AlloyDB Omni.
Objetivos
- Crie um cluster do AlloyDB Omni e uma instância primária.
- Conecte-se ao banco de dados e instale as extensões necessárias.
- Crie uma tabela
producteproduct inventory. - Insira dados nas tabelas
producteproduct inventorye faça uma busca vetorial básica. - Crie um índice ScaNN na tabela de produtos.
- Realizar uma pesquisa vetorial básica.
- Fazer uma pesquisa vetorial complexa com um filtro e uma mesclagem.
Custos
Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Novos usuários do Google Cloud podem estar qualificados para um teste sem custo financeiro.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.
Pré-requisitos
Conclua os seguintes pré-requisitos antes de realizar uma busca vetorial:
- Instalar a IA do AlloyDB no AlloyDB Omni
-
Execute e conecte-se ao AlloyDB Omni
como o usuário
postgres. -
Instale as extensões
vector,alloydb_scannegoogle_ml_integration.CREATE EXTENSION IF NOT EXISTS vector; CREATE EXTENSION IF NOT EXISTS alloydb_scann; CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
Inserir dados de produtos e inventário de produtos e realizar uma pesquisa vetorial básica
Execute a seguinte instrução para criar uma tabela
productque faça o seguinte:- Armazena informações básicas do produto.
- Inclui uma coluna de vetor
embeddingque calcula e armazena um vetor de embedding para a descrição de cada produto.
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 );Se necessário, é possível visualizar os registros e resolver problemas.
Execute a consulta a seguir para criar uma tabela
product_inventoryque armazena informações sobre o inventário disponível e os preços correspondentes. As tabelasproduct_inventoryeproductsão usadas neste tutorial para executar consultas complexas de busca vetorial.CREATE TABLE product_inventory ( id INT PRIMARY KEY, product_id INT REFERENCES product(id), inventory INT, price DECIMAL(10,2) );Execute a consulta a seguir para inserir dados de produtos na tabela
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: execute a consulta a seguir para verificar se os dados foram inseridos na tabela
product:SELECT * FROM product;Execute a consulta a seguir para inserir dados de inventário na tabela
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);Execute a consulta de pesquisa vetorial a seguir, que tenta encontrar produtos semelhantes à palavra
music. Isso significa que, mesmo que a palavramusicnão seja mencionada explicitamente na descrição do produto, o resultado mostra produtos relevantes para a consulta:SELECT * FROM product ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector LIMIT 3;O resultado da consulta é o seguinte:

A execução de uma busca vetorial básica sem criar um índice usa a busca de vizinho mais próximo exato (KNN), que fornece recall eficiente. Em grande escala, o uso do KNN pode afetar o desempenho. Para melhorar o desempenho da consulta, recomendamos que você use o índice ScaNN para pesquisa de vizinho mais próximo aproximado (ANN), que oferece alta recuperação com baixas latências.
Sem criar um índice, o AlloyDB Omni usa por padrão a pesquisa de vizinho mais próximo exato (KNN).
Para saber mais sobre como usar o ScaNN em grande escala, consulte Introdução às embeddings de vetor com a IA do AlloyDB.
Criar um índice ScaNN ajustado manualmente na tabela de produtos
Execute a consulta a seguir para criar um índice ScaNN product_index na tabela product:
CREATE INDEX product_index ON product
USING scann (embedding cosine)
WITH (mode='MANUAL', num_leaves=4);
Para mais informações sobre como criar um índice ScaNN, consulte Criar um índice ScaNN.
Fazer uma pesquisa vetorial
Execute a seguinte consulta de pesquisa vetorial que tenta encontrar produtos semelhantes à consulta de linguagem natural music. Mesmo que a palavra music não esteja incluída na
descrição do produto, o resultado mostra produtos relevantes para a consulta:
SET LOCAL scann.num_leaves_to_search = 2;
SELECT * FROM product
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
LIMIT 3;
Os resultados da consulta são os seguintes:

O parâmetro de consulta scann.num_leaves_to_search controla o número de nós de folha que são pesquisados durante uma pesquisa de similaridade. Os valores de parâmetro num_leaves e
scann.num_leaves_to_search ajudam a alcançar um equilíbrio entre
desempenho e recall.
Realizar uma pesquisa vetorial que usa um filtro e uma mesclagem
É possível executar consultas de pesquisa vetorial filtradas de maneira eficiente, mesmo ao usar o índice ScaNN. Execute a seguinte consulta de pesquisa vetorial complexa, que retorna resultados relevantes que atendem às condições da consulta, mesmo com 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;
Acelere sua pesquisa vetorial filtrada
É possível usar o armazenamento de conteúdo do mecanismo colunar para melhorar o desempenho de
pesquisas de similaridade de vetores, especificamente pesquisas de vizinho mais próximo (KNN, na sigla em inglês), quando
combinadas com filtragem de predicado altamente seletiva, por exemplo, usando
LIKE em bancos de dados. Nesta seção, você vai usar a extensão vector e
a extensão google_columnar_engine
do AlloyDB Omni.
Para mais informações sobre como o mecanismo colunar funciona, consulte
Visão geral do mecanismo colunar.
As melhorias de desempenho vêm da eficiência integrada do mecanismo colunar
na verificação de grandes conjuntos de dados e na aplicação de filtros, como predicados
LIKE, além da capacidade, usando suporte vetorial, de pré-filtrar
linhas. Essa funcionalidade reduz o número de subconjuntos de dados necessários para
os cálculos subsequentes de distância vetorial de KNN e ajuda a otimizar consultas analíticas
complexas que envolvem filtragem padrão e pesquisa vetorial.
O armazenamento colunar oferece duas opções para gerenciar o conteúdo:
- Gerenciar automaticamente o conteúdo do repositório de colunas: as novas instâncias do AlloyDB Omni usam a colunização automática por padrão. Como alternativa, é possível executar manualmente a funcionalidade de colunização automática.
- Gerenciar manualmente o conteúdo do repositório de colunas: se você precisar gerenciar manualmente as colunas no repositório de colunas para sua carga de trabalho, desative a colunização automática.
Para comparar o tempo de execução de uma busca vetorial KNN filtrada por um predicado LIKE
antes e depois de ativar o mecanismo colunar, siga estas etapas:
-
Ative a extensão
vectorpara oferecer suporte a tipos de dados e operações vetoriais. Execute as instruções a seguir para criar uma tabela de exemplo (items) com um ID, uma descrição de texto e uma coluna de embedding de vetor de 512 dimensões.CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE items ( id SERIAL PRIMARY KEY, description TEXT, embedding VECTOR(512) );
-
Preencha os dados executando as seguintes instruções para inserir 1 milhão de linhas na tabela de exemplo
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;
-
Medir o desempenho de referência da pesquisa de similaridade vetorial sem o mecanismo colunar.
SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
-
Ativar o mecanismo colunar e o suporte a vetores.
-
Ative as flags de banco de dados
google_columnar_engine.enabledegoogle_columnar_engine.enable_vector_support.ALTER SYSTEM SET google_columnar_engine.enabled = 'on'; ALTER SYSTEM SET google_columnar_engine.enable_vector_support = 'on';
-
Reiniciar o AlloyDB Omni
systemctl restart alloydbomni18
-
-
Adicione a tabela
itemsao mecanismo colunar:SELECT google_columnar_engine_add('items');
-
Meça o desempenho da pesquisa de similaridade vetorial usando o mecanismo colunar. Execute novamente a consulta que você executou antes para medir o desempenho de referência.
SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
-
Para verificar se a consulta foi executada com o mecanismo colunar, execute o seguinte comando:
explain (analyze) SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
Limpar
Para desinstalar o AlloyDB Omni, consulte Gerenciar e monitorar o AlloyDB Omni.