Criar um índice IVFFLAT

Os índices de arquivo invertido simples (IVFFlat) no AlloyDB para PostgreSQL permitem acelerar as pesquisas de similaridade vetorial em embeddings armazenados, minimizando o tempo de criação do índice e o uso da memória. É possível criar índices IVFFlat usando a extensão vector e consultar os embeddings indexados. Para mais informações sobre como armazenar embeddings, consulte Armazenar embeddings de vetor.

Antes de começar

Antes de começar a criar índices, você precisa concluir os seguintes pré-requisitos.

Criar um índice IVFFlat

O pgvector padrão também oferece uma versão do índice IVF chamada IVFFlat, que tem um tempo de build mais rápido e um consumo de memória menor em comparação com o índice hnsw.

Para criar um índice IVFFlat, siga estas etapas:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivfflat (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT);

Substitua:

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

  • LIST_COUNT: o número de listas a serem usadas com esse índice. Para mais informações sobre como decidir esse valor, consulte Ajustar um índice IVFFlat.

    Para criar esse índice em uma coluna de embedding 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 ivfflat ((CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS))) DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT);

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

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.

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

Executar uma consulta

Depois de armazenar e indexar os embeddings no banco de dados, comece a fazer consultas 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.

  • 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 função embedding() para traduzir o texto em um vetor. Aplique o vetor a um dos operadores de vizinho mais próximo do pgvector, <-> para a 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