Crie um índice IVF

Esta página descreve como usar incorporações armazenadas para gerar índices e consultar incorporações usando um índice IVF com o AlloyDB for PostgreSQL. Para mais informações sobre o armazenamento de incorporações, consulte o artigo Armazene incorporações de vetores.

Antes de começar

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

Crie um índice IVF

O Stock pgvector suporta a pesquisa de vizinhos mais próximos aproximada através da indexação. O AlloyDB adiciona a este suporte uma funcionalidade de quantização escalar que pode especificar quando cria um índice. Quando ativada, a quantização escalar pode acelerar significativamente as consultas que têm vetores dimensionais maiores e permite armazenar vetores com até 8000 dimensões.

Para ativar a quantização escalar num índice baseado em pgvector, especifique IVF como método de índice e SQ8 como quantizador:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');

Substitua o seguinte:

  • INDEX_NAME: o nome do índice que quer criar, por exemplo, my-ivf-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: vector_l2_ops

    • Produto interior: vector_ip_ops

    • Distância do cosseno: vector_cosine_ops

  • LIST_COUNT: o número de listas a usar com este índice. Para mais informações sobre como decidir este valor, consulte o artigo Ajuste um índice IVF.

  • QUANTIZER: o tipo de quantizador que quer usar.

    Definido para qualquer uma das seguintes opções:

    • SQ8: recomendado. Resposta mais rápida à consulta, mas resulta numa perda de recordação que não afeta os cenários de produção.
    • FLAT: resposta mais lenta às consultas e maior utilização de memória, mas pode atingir uma perda de recordação insignificante.

    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 ivf (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'SQ8');

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 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 postings indica que a criação do índice está quase concluída.

Para ajustar o índice de modo a ter um equilíbrio entre a taxa de recuperação e o CPS alvo, consulte o artigo Ajuste um IVFíndice.

Execute uma consulta

Depois de armazenar e indexar as incorporações na sua base de dados, pode começar a fazer consultas através da pgvector funcionalidade de consulta.

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 pgvectoroperadores 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.

O que se segue?