Criar índices e vetores de consulta

Selecione uma versão da documentação:

Este documento mostra como usar embeddings armazenados para gerar índices e consultar embeddings. Para mais informações sobre como armazenar embeddings, consulte Armazenar embeddings de vetor.

É possível criar índices ScaNN, IVF, IVFFlat e HNSW com o AlloyDB.

Antes de começar

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

  • Os vetores de embedding são adicionados a uma tabela no banco de dados do AlloyDB.

  • A versão 0.5.0 ou mais recente da extensão vector, baseada em pgvector e estendida pelo Google para o AlloyDB, está instalada.

    CREATE EXTENSION IF NOT EXISTS vector;
    
  • Para gerar índices ScaNN, instale a extensão alloydb_scann além da extensão vector.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Criar um índice

É possível criar um dos seguintes tipos de índice para tabelas no seu banco de dados.

Criar um índice ScaNN

O AlloyDB alloydb_scann, um

Extensão do PostgreSQL desenvolvida pelo Google que implementa um

índice eficiente de vizinho mais próximo com tecnologia [ScaNN

algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).

O índice ScaNN é um índice de quantização baseado em árvore para

pesquisa de vizinho mais próximo. Ele oferece menor tempo de criação de índice e

consumo de memória em comparação com HNSW. Além disso, ele oferece QPS mais rápido em

comparação com HNSW com base na carga de trabalho.

uma tabela no seu banco de dados do AlloyDB. Se você tentar gerar um índice ScaNN

em uma tabela vazia ou particionada, talvez você encontre alguns problemas. Para mais

Para informações sobre os erros gerados, consulte Resolver problemas de erros de índice do ScaNN.

Índice de árvore de dois níveis ScaNN

Para aplicar um índice de árvore de dois níveis usando o algoritmo ScaNN a uma coluna

que contém embeddings de vetor armazenados, execute a seguinte consulta DDL:


CREATE INDEX INDEX_NAME ON TABLE

  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE);

Substitua:

  • INDEX_NAME: o nome do índice que você quer

    criar, por exemplo, my-scann-index. Os nomes de índice são compartilhados

    em todo o banco de dados. Verifique se cada nome de índice é exclusivo para cada

    tabela no seu banco de dados.

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

  • EMBEDDING_COLUMN: uma coluna que armazena vector.

    dados.

  • DISTANCE_FUNCTION: a função de distância a ser usada

    com este índice. Escolha uma destas opções:

    • Distância de L2: l2

    • Produto escalar: dot_product

    • Distância do cosseno: cosine

  • NUM_LEAVES_VALUE: o número de partições a serem aplicadas a

    esse índice. Definido como qualquer valor entre 1 e 1.048.576. Para mais informações

    sobre como decidir esse valor, consulte Ajustar um índice ScaNN.

Índice de árvore de três níveis ScaNN

Para criar um índice de árvore de três níveis usando o algoritmo ScaNN em uma coluna

que contém embeddings de vetor armazenados, execute a seguinte consulta DDL:


CREATE INDEX INDEX_NAME ON TABLE

  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

Substitua:

  • MAX_NUM_LEVELS: o número máximo de níveis do

    Árvore de clustering k-means. Defina como 1(padrão) para árvores de dois níveis

    quantização e 2 para quantização baseada em árvore de três níveis.

Depois de criar o índice, é possível executar consultas de pesquisa de vizinho mais próximo que

use o índice seguindo as instruções em [Fazer uma consulta de vizinho mais próximo

consultar com o texto fornecido](#query).

Os parâmetros de índice precisam ser definidos para encontrar o equilíbrio certo entre QPS e

recall. Para mais informações sobre como ajustar o índice ScaNN, consulte [Ajustar um ScaNN

index](/alloydb/omni/kubernetes/15.7.0/docs/ai/tune-indexes).

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 scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

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 [Vector

functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).

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

A fase building index: tree training desaparece depois que o índice é criado.

Para ajustar seu índice para um recall desejado e um equilíbrio de QPS, consulte Ajustar um índice ScaNN.

Analisar a tabela indexada

Depois de criar o índice ScaNN, execute o comando ANALYZE para atualizar as estatísticas sobre seus dados.


ANALYZE TABLE;

Executar uma consulta

Depois de armazenar e indexar embeddings no banco de dados, você pode começar a

consultar usando a [consulta pgvector

functionality](https://github.com/pgvector/pgvector#querying). Não é possível executar

consultas de pesquisa em massa usando a extensão alloydb_scann.

Para encontrar os vizinhos semânticos mais próximos de um vetor de embedding, execute o

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:

  • TABLE: a tabela que contém o embedding com o qual você vai comparar o

    para quem você quer enviar a mensagem.

  • INDEX_NAME: o nome do índice que você quer usar. Por exemplo,

    exemplo, my-scann-index.

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

    embeddings.

  • DISTANCE_FUNCTION_QUERY: a função de distância a ser usada com este

    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.

    vizinhos semânticos de.

  • 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

Consultando.

Você também pode usar a função embedding() para traduzir o

texto em um vetor. Você aplica o vetor a um dos

Operador vizinho mais próximo pgvector, <-> para distância L2, para encontrar as linhas do banco de dados com os

embeddings semanticamente mais semelhantes.

Como embedding() retorna uma matriz real, é necessário transmitir explicitamente a

embedding() para vector para usar esses valores com pgvector

operadores.


  CREATE EXTENSION IF NOT EXISTS google_ml_integration;

  CREATE EXTENSION IF NOT EXISTS vector;



  SELECT * FROM TABLE

    ORDER BY EMBEDDING_COLUMN::vector

    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')

    LIMIT ROW_COUNT

Substitua:

  • MODEL_ID: o ID do modelo a ser consultado.

    Se você estiver usando o Model Garden da Vertex AI, especifique text-embedding-005 como o ID do modelo. Esses são os modelos baseados na nuvem que o AlloyDB pode usar para embeddings de texto. Para mais informações, consulte Embeddings de texto.

  • Opcional: VERSION_TAG: a tag da versão do modelo a ser consultada. Adicione @ ao início da tag.

    Se você estiver usando um dos modelos em inglês text-embedding com a Vertex AI, especifique uma das tags de versão, por exemplo, text-embedding-005, listadas em Versões de modelo.

    O Google recomenda que você especifique a tag de versão. Se você não especificar a tag de versão, o AlloyDB sempre usará a versão mais recente do modelo, o que pode gerar resultados inesperados.

  • TEXT: o texto a ser traduzido em um embedding de vetor.

A seguir