Criar índices

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

Antes de começar

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

Criar um índice HNSW

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

Para mais informações sobre o algoritmo HNSW, consulte Gráficos hierárquicos navegáveis de pequeno mundo (em inglês).

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:

  • 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 de um nó no gráfico. Você pode começar com o valor padrão 16 e testar valores mais altos 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 vizinhos mais próximos de um nó. Defina esse valor como qualquer valor maior que o dobro do valor de 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 desejado e um equilíbrio de QPS, consulte Ajustar um índice hnsw.

Executar uma consulta

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

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.

Você também pode usar a função embedding() para traduzir o texto em um vetor. Você aplica o vetor a um dos operadores de vizinho mais próximo pgvector, <-> para distância L2, para encontrar as linhas do banco de dados com os embeddings mais semanticamente 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