Criar um índice HNSW

Selecione uma versão da documentação:

Nesta página, descrevemos como usar embeddings armazenados para gerar índices e consultar embeddings usando um índice HNSW com o AlloyDB Omni. Para mais informações sobre como armazenar embeddings, consulte Armazenar embeddings de vetor.

Antes de começar

Antes de começar a criar índices, atenda aos seguintes pré-requisitos.

Criar um índice HNSW

O AlloyDB Omni oferece suporte à criação de um índice hnsw baseado em gráficos disponível com o pgvector padrão usando a extensão pgvector do AlloyDB Omni. O uso de um índice hnsw resulta em uma pesquisa gananciosa que se move pelo gráfico procurando constantemente o vizinho mais próximo do vetor de consulta até encontrar um resultado ideal. Ele oferece um desempenho de consulta mais rápido, mas tempos de build mais lentos em comparação com o IVF.

Para mais informações sobre o algoritmo HNSW, consulte Gráficos hierárquicos de mundo pequeno navegável.

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 você quer criar, por exemplo, my-hnsw-index.

  • TABLE: a tabela em que o índice será adicionado.

  • EMBEDDING_COLUMN: uma coluna que armazena dados de vector.

  • DISTANCE_FUNCTION: a função de distância a ser usada com esse índice. Escolha uma destas opções:

    • Distância de L2:vector_l2_ops

    • Produto interno: vector_ip_ops

    • Distância do cosseno:vector_cosine_ops

  • NUMBER_OF_CONNECTIONS: o número máximo de conexões por nó no gráfico. Você pode começar com o valor padrão como 16 e experimentar valores mais altos com base no tamanho do 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 vizinhos mais próximos de um nó. Defina esse valor como qualquer valor maior que o dobro do valor m, por exemplo, 64.

Para conferir o progresso da indexação, use a visualização 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 depois que o índice é criado.

Para ajustar o índice para um recall de destino e um equilíbrio de QPS, consulte Ajustar um hnsw índice.

Executar uma consulta

Depois de armazenar e indexar os embeddings no banco de dados, você pode começar a consultar usando a pgvector funcionalidade de consulta.

Para encontrar os vizinhos semânticos mais próximos de um vetor de embedding, execute a consulta de exemplo a seguir, em que você define a mesma função de distância usada 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 o embedding com o qual você vai comparar o texto.

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

  • EMBEDDING_COLUMN: a coluna que contém os embeddings armazenados.

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

    • Distância de L2: <->

    • Produto interno: <#>

    • Distância do cosseno: <=>

  • EMBEDDING: o vetor de embedding para encontrar os vizinhos semânticos armazenados mais próximos.

  • ROW_COUNT: o número de linhas que serão retornadas.

    Especifique 1 se você quiser apenas a melhor correspondência.

Para mais exemplos de consultas, consulte Consultas.

Também é possível usar a embedding() função para traduzir o texto em um vetor. Você aplica o vetor a um dos pgvector operadores de vizinho mais próximo, <-> para a distância de L2, para encontrar as linhas do banco de dados com os embeddings mais semânticamente semelhantes.

Como embedding() retorna uma matriz real, é necessário transmitir explicitamente a chamada embedding() para vector para usar esses valores com operadores pgvector.

A seguir