Crie índices e consulte vetores

Selecione uma versão da documentação:

Este documento mostra como usar incorporações armazenadas para gerar índices e consultar incorporações. Para mais informações sobre o armazenamento de incorporações, consulte o artigo Armazene incorporações de vetores.

Pode criar índices ScaNN, IVF, IVFFlat e HNSW com o AlloyDB.

Antes de começar

Antes de poder começar a criar índices, tem de concluir os seguintes pré-requisitos.

  • Os vetores de incorporação são adicionados a uma tabela na sua base de dados do AlloyDB.

  • A versão vector da extensão 0.5.0 ou posterior baseada em pgvector, expandida pela Google para o AlloyDB, está instalada.

    CREATE EXTENSION IF NOT EXISTS vector;
    
  • Para gerar índices ScaNN, instale a extensão alloydb_scann, além da extensão vector.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Crie um índice

Pode criar um dos seguintes tipos de índice para tabelas na sua base de dados.

Crie um ScaNN índice

O AlloyDB alloydb_scann, uma extensão do PostgreSQL desenvolvida pela Google que implementa um índice de vizinhos mais próximos altamente eficiente com tecnologia do algoritmo ScaNN.

O índice ScaNN é um índice de quantização baseado em árvores para a pesquisa aproximada do vizinho mais próximo. Oferece um tempo de criação de índice mais baixo e uma menor pegada de memória em comparação com o HNSW. Além disso, oferece QPS mais rápidas em comparação com o HNSW com base na carga de trabalho.

Índice ScaNN de árvore de dois níveis

Para aplicar um índice de árvore de dois níveis usando o algoritmo ScaNN a uma coluna que contenha incorporações de vetores armazenadas, execute a seguinte consulta DDL:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE);

Substitua o seguinte:

  • INDEX_NAME: o nome do índice que quer criar, por exemplo, my-scann-index. Os nomes dos índices são partilhados na sua base de dados. Certifique-se de que cada nome de índice é exclusivo para cada tabela na sua base de dados.

  • TABLE: a tabela à qual adicionar o índice.

  • EMBEDDING_COLUMN: uma coluna que armazena vector dados.

  • DISTANCE_FUNCTION: a função de distância a usar com este índice. Selecione uma das seguintes opções:

    • Distância L2: l2

    • Produto escalar: dot_product

    • Distância do cosseno: cosine

  • NUM_LEAVES_VALUE: o número de partições a aplicar a este índice. Defina qualquer valor entre 1 e 1048576. Para mais informações sobre como decidir este valor, consulte o artigo Ajuste um índice ScaNN.

Índice de árvore de três níveis ScaNN

Para criar um índice de árvore de três níveis usando o algoritmo ScaNN numa coluna que contenha incorporações de vetores armazenadas, execute a seguinte consulta DDL:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

Substitua o seguinte:

  • MAX_NUM_LEVELS: o número máximo de níveis da árvore de agrupamento K-means. Defina como 1(predefinição) para a quantização baseada em árvore de dois níveis e como 2 para a quantização baseada em árvore de três níveis.

Depois de criar o índice, pode executar consultas de pesquisa de vizinhos mais próximos que usam o índice seguindo as instruções em Faça uma consulta de vizinhos mais próximos com um determinado texto.

Os parâmetros de índice têm de ser definidos para encontrar o equilíbrio certo entre as consultas por segundo e a capacidade de memorização. Para mais informações sobre a otimização do índice ScaNN, consulte o artigo Otimize um ScaNN índice.

Para criar este índice numa coluna de incorporação que usa o tipo de dados real[] em vez de vector, converta a coluna no tipo de dados vector:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

Substitua DIMENSIONS pela largura dimensional da coluna de incorporação. Para mais informações sobre como encontrar as dimensões, consulte a função vector_dims em Funções vetoriais.

Para conseguir uma experiência de pesquisa consistente, ative a manutenção automática quando criar um índice ScaNN. Para mais informações, consulte o artigo Mantenha os índices de vetores. Esta funcionalidade está disponível na pré-visualização.

Para ver o progresso da indexação, use a vista pg_stat_progress_create_index:

SELECT * FROM pg_stat_progress_create_index;

A coluna phase mostra o estado atual da criação do índice e a fase building index: tree training desaparece após a criação do índice.

Para ajustar o índice de modo a ter um equilíbrio entre a capacidade de memorização e o CPS alvo, consulte o artigo Ajuste um índice ScaNN.

Analise a sua tabela indexada

Depois de criar o índice ScaNN, execute o comando ANALYZE para atualizar as estatísticas sobre os seus dados.

ANALYZE TABLE;

Crie índices em paralelo

O AlloyDB pode gerar automaticamente vários trabalhadores paralelos, consoante o seu conjunto de dados e o tipo de índice que escolher para criar o índice mais rapidamente.

A criação do índice paralelo é frequentemente acionada quando cria um índice ScaNN de 3 níveis ou se o seu conjunto de dados exceder 100 milhões de linhas.

Embora o AlloyDB otimize automaticamente o número de trabalhadores paralelos, pode ajustar os trabalhadores paralelos através dos parâmetros de planeamento de consultas do PostgreSQL max_parallel_maintenance_workers, max_parallel_workers e min_parallel_table_scan_size.

Execute uma consulta

Depois de armazenar e indexar as incorporações na sua base de dados, pode começar a consultar através da pgvectorfuncionalidade de consulta. Não pode executar consultas de pesquisa em massa através da extensão alloydb_scann.

Para encontrar os vizinhos semânticos mais próximos de um vetor de incorporação, pode executar a consulta de exemplo seguinte, em que define a mesma função de distância que usou durante a criação do índice.

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
    LIMIT ROW_COUNT

Substitua o seguinte:

  • TABLE: a tabela que contém a incorporação com a qual comparar o texto.

  • INDEX_NAME: o nome do índice que quer usar, por exemplo, my-scann-index.

  • EMBEDDING_COLUMN: a coluna que contém as incorporações armazenadas.

  • DISTANCE_FUNCTION_QUERY: a função de distância a usar com esta consulta. Escolha uma das seguintes opções com base na função de distância usada ao criar o índice:

    • Distância L2: <->

    • Produto interior: <#>

    • Distância do cosseno: <=>

  • EMBEDDING: o vetor de incorporação para o qual quer encontrar os vizinhos semânticos armazenados mais próximos.

  • ROW_COUNT: o número de linhas a devolver.

    Especifique 1 se quiser apenas a melhor correspondência única.

Para mais informações sobre outros exemplos de consultas, consulte o artigo Consultar.

Também pode usar a função embedding() para traduzir o texto num vetor. Aplica o vetor a um dos pgvector operadores de vizinho mais próximo, <-> para a distância L2, para encontrar as linhas da base de dados com as incorporações semanticamente mais semelhantes.

Uma vez que embedding() devolve uma matriz real, tem de converter explicitamente a chamada embedding() em vector para usar estes valores com operadores pgvector.

  CREATE EXTENSION IF NOT EXISTS google_ml_integration;
  CREATE EXTENSION IF NOT EXISTS vector;

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
    LIMIT ROW_COUNT

Substitua o seguinte:

  • MODEL_ID: o ID do modelo a consultar.

    Se estiver a usar o Model Garden da Vertex AI, especifique text-embedding-005 como o ID do modelo. Estes são os modelos baseados na nuvem que o AlloyDB pode usar para incorporações de texto. Para mais informações, consulte o artigo Incorporações de texto.

  • Opcional: VERSION_TAG: a etiqueta de versão do modelo a consultar. Adicione @ antes da etiqueta.

    Se estiver a usar um dos text-embeddingmodelos em inglês com a Vertex AI, especifique uma das etiquetas de versão, por exemplo, text-embedding-005, indicadas em Versões do modelo.

    A Google recomenda vivamente que especifique sempre a etiqueta de versão. Se não especificar a etiqueta de versão, o AlloyDB usa sempre a versão do modelo mais recente, o que pode levar a resultados inesperados.

  • TEXT: o texto a traduzir numa incorporação vetorial.

O que se segue?