Realizar pesquisa vetorial no AlloyDB Omni

Selecione uma versão da documentação:

Neste tutorial, descrevemos como configurar e realizar uma pesquisa vetorial no AlloyDB Omni. Você executa consultas usando a pesquisa exata de vizinho mais próximo (KNN) e o índice ScaNN baseado em vizinho mais próximo aproximado (ANN). Você também vai aprender a executar consultas de pesquisa vetorial filtradas de maneira eficiente usando o índice ScaNN.

Objetivos

  • Instale o AlloyDB AI no AlloyDB Omni.
  • Conecte-se ao banco de dados e instale as extensões necessárias.
  • Crie uma tabela product e product inventory.
  • Insira dados nas tabelas product e product inventory e faça uma pesquisa de vetor básica.
  • Crie um índice do ScaNN na tabela de produtos.
  • Faça uma pesquisa vetorial.
  • Fazer uma pesquisa vetorial complexa com um filtro e uma junção.

Custos

Neste documento, você vai usar o seguinte componente faturável do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.

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 pré-requisitos a seguir antes de fazer uma pesquisa de vetor.

Instalar o AlloyDB AI no AlloyDB Omni com base no seu ambiente de computação

Com base no ambiente de computação que você está usando, siga as instruções em Instalar o AlloyDB AI no AlloyDB Omni para instalar o AlloyDB Omni.

Conectar-se ao banco de dados usando psql

Conecte-se ao banco de dados usando 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

Instalar as extensões necessárias

Execute a consulta a seguir para instalar as extensões vector, alloydb_scann e 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;

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.

Inserir dados de produtos e inventário e realizar uma pesquisa vetorial básica

As tabelas product_inventory e product são usadas neste tutorial para executar consultas complexas de pesquisa de vetor.

  1. Execute a instrução a seguir para criar uma tabela product que faz o seguinte:

    • Armazena informações básicas do produto.
    • Inclui uma coluna de vetor embedding que calcula e armazena um vetor de incorporação para uma descrição de produto de cada item.
      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. Execute a consulta a seguir para criar uma tabela product_inventory que armazena informações sobre o inventário disponível e os preços correspondentes.

    CREATE TABLE product_inventory (
      id INT PRIMARY KEY,
      product_id INT REFERENCES product(id),
      inventory INT,
      price DECIMAL(10,2)
    );
    
  3. 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');
    
  4. Opcional: para verificar se os dados foram inseridos na tabela product, execute a seguinte consulta:

    SELECT * FROM product;
    
  5. 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);
    
  6. Execute a seguinte consulta de pesquisa vetorial para procurar produtos semelhantes à palavra music. Mesmo que a palavra music nã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;
    

    Se você realizar uma pesquisa vetorial básica sem criar um índice, a IA do AlloyDB vai usar o KNN, que oferece um recall eficiente. No entanto, em grande escala, o uso do KNN pode afetar o desempenho. Para melhorar o desempenho da consulta, recomendamos usar o índice ScaNN para pesquisa de ANN, que oferece alto recall com baixa latência.

    Se você não criar um índice, o AlloyDB Omni usará o KNN por padrão.

Criar um índice do ScaNN 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 (num_leaves=5);

O parâmetro num_leaves indica o número de nós folha com que o índice baseado em árvore cria o índice. Para mais informações sobre como ajustar esse parâmetro, consulte Ajustar o desempenho da consulta vetorial.

Execute a seguinte consulta de pesquisa vetorial que tenta encontrar produtos semelhantes à consulta em linguagem natural music. Embora 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;

O parâmetro de consulta scann.num_leaves_to_search controla o número de nós folha pesquisados durante uma pesquisa de similaridade. Os valores dos parâmetros num_leaves e scann.num_leaves_to_search ajudam a equilibrar o desempenho e o recall da consulta.

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;

Limpar

Excluir o cluster de banco de dados

      kubectl patch dbclusters.alloydbomni.dbadmin.goog my-db-cluster -p '{"spec":{"isDeleted":true}}' --type=merge

Desinstalar o operador do AlloyDB Omni

Para desinstalar o operador do AlloyDB Omni no Kubernetes do seu cluster do Kubernetes, siga estas etapas:

  1. Exclua todos os clusters de banco de dados:

          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
      ```
  2. Verifique se o operador do Kubernetes do AlloyDB Omni excluiu todos os clusters de banco de dados executando o seguinte comando:

        kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespaces
  3. Exclua outros recursos criados pelo operador do AlloyDB Omni no Kubernetes:

        kubectl delete failovers.alloydbomni.dbadmin.goog --all --all-namespaces
        kubectl delete restores.alloydbomni.dbadmin.goog --all --all-namespaces
        kubectl delete switchovers.alloydbomni.dbadmin.goog --all --all-namespaces
  4. Desinstale o operador do AlloyDB Omni no Kubernetes:

        helm uninstall alloydbomni-operator --namespace alloydb-omni-system
  5. Limpe os secrets, as descrições de recursos personalizados e os namespaces relacionados ao operador do AlloyDB Omni no Kubernetes:

        kubectl delete certificate -n alloydb-omni-system --all
        kubectl 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 -n
        kubectl delete crd -l alloydb-omni=true
        kubectl delete ns alloydb-omni-system

A seguir