Crie índices

Esta página descreve como usar incorporações armazenadas para gerar índices e consultar incorporações usando um índice HNSW 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 HNSW

O AlloyDB suporta a criação de um hnswíndice baseado em grafos pgvector disponível com o pgvectorde stock através da extensão pgvector do AlloyDB. A utilização de um índice resulta numa pesquisa gananciosa que se move através do gráfico, procurando constantemente o vizinho mais próximo do vetor de consulta até encontrar um resultado ideal.hnsw Oferece um desempenho de consulta mais rápido, mas tempos de compilação mais lentos em comparação com IVF.

Para mais informações sobre o algoritmo HNSW, consulte o artigo Hierarchical Navigable Small World graphs.

Para criar um índice hnsw, execute a seguinte consulta:

CREATE INDEX INDEX_NAME ON TABLE
  USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');

Substitua o seguinte:

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

  • 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

  • NUMBER_OF_CONNECTIONS: o número máximo de associações por nó no gráfico. Pode começar com o valor predefinido de 16 e experimentar valores mais elevados com base no tamanho do seu conjunto de dados.

  • CANDIDATE_LIST_SIZE: o tamanho de uma lista de candidatos mantida durante a construção do gráfico, que atualiza constantemente os melhores candidatos atuais para os vizinhos mais próximos de um nó. Defina este valor para qualquer valor superior ao dobro do valor m. Por exemplo, 64.

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 graph 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.hnsw

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-hnsw-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?