Crie índices e consulte vetores

Selecione uma versão da documentação:

Este documento mostra como usar incorporações armazenadas para gerar índices e consultar incorporações. Para mais informações sobre o armazenamento de incorporações, consulte o artigo Armazene incorporações de vetores.

Pode criar índices ScaNN, IVF, IVFFlat e HNSW com o AlloyDB.

Antes de começar

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

  • Os vetores de incorporação são adicionados a uma tabela na sua base de dados do AlloyDB.

  • A versão vector da extensão 0.5.0 ou posterior baseada em pgvector, expandida pela 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;
    

Crie um índice

Pode criar um dos seguintes tipos de índice para tabelas na sua base de dados.

Crie um ScaNN índice

AlloyDB alloydb_scann, um

Extensão do PostgreSQL desenvolvida pela Google que implementa uma

Índice de vizinho mais próximo eficiente 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 árvores para

Pesquisa do vizinho mais próximo. Oferece um tempo de criação de índice mais baixo e um tamanho

quantidade de memória em comparação com o HNSW. Além disso, oferece um valor de CPS mais rápido em

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

Uma tabela na sua base de dados do AlloyDB. Se tentar gerar um índice ScaNN

numa tabela vazia ou particionada, pode encontrar alguns problemas. Para mais

informações sobre os erros gerados, consulte o artigo Resolva problemas de erros de índice do ScaNN.

Índice ScaNN de árvore de dois níveis

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

que contenha incorporações vetoriais armazenadas, execute a seguinte consulta DDL:


CREATE INDEX INDEX_NAME ON TABLE

  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE);

Substitua o seguinte:

  • INDEX_NAME: o nome do índice que quer

    criar, por exemplo, my-scann-index. Os nomes dos índices são partilhados

    na sua base de dados. Certifique-se de que cada nome de índice é exclusivo para cada

    tabela na sua base de dados.

  • 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: l2

    • Produto escalar: dot_product

    • Distância do cosseno: cosine

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

    este índice. Defina qualquer valor entre 1 e 1048576. Para obter mais informações

    Para saber como decidir este valor, consulte o artigo Ajuste de 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 numa coluna

que contenha incorporações vetoriais armazenadas, 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 o seguinte:

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

    Árvore de clustering K-means. Definido como 1(predefinição) para hierarquia de dois níveis

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

Depois de criar o índice, pode executar consultas de pesquisa de vizinhos mais próximos que

Use o índice seguindo as instruções em [Crie um índice de vizinhos mais próximos

consultar com o texto indicado](#query).

Os parâmetros de índice têm de ser definidos para alcançar um equilíbrio adequado entre QPS e

recordar. Para mais informações sobre a otimização do índice ScaNN, consulte [Otimize um ScaNN

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

Para criar este índice numa coluna de incorporação 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 do

coluna de incorporação. 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 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

A fase building index: tree training 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 ScaNN.

Analise a sua tabela indexada

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


ANALYZE TABLE;

Execute uma consulta

Depois de armazenar e indexar as incorporações na sua base de dados, pode começar a

consultar através da [pgvector consulta

functionality](https://github.com/pgvector/pgvector#querying). Não pode executar

consultar em massa consultas de pesquisa através da extensão alloydb_scann.

Para encontrar os vizinhos semânticos mais próximos de um vetor de incorporação, pode executar a função

seguinte consulta de exemplo, 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 para comparar o

    envie uma mensagem de texto para.

  • INDEX_NAME: o nome do índice que quer usar, por exemplo,

    por exemplo, my-scann-index.

  • EMBEDDING_COLUMN: a coluna que contém o valor armazenado

    incorporações.

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

    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 o mais próximo armazenado

    vizinhos semânticos de.

  • 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

Consultar.

Também pode usar a função embedding() para traduzir o

texto num vetor. Aplicar o vetor a um dos

pgvector operador de vizinho mais próximo<->, para a distância L2, para encontrar as linhas da base de dados com o

Incorporações mais semelhantes semanticamente.

Uma vez que embedding() devolve uma matriz real, tem de converter explicitamente o

embedding() para vector para usar estes 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 o seguinte:

  • MODEL_ID: o ID do modelo a consultar.

    Se estiver a usar o Model Garden da Vertex AI, especifique text-embedding-005 como o ID do modelo. Estes são os modelos baseados na nuvem que o AlloyDB pode usar para incorporações de texto. Para mais informações, consulte o artigo Incorporações de texto.

  • Opcional: VERSION_TAG: a etiqueta de versão do modelo a consultar. Adicione @ antes da etiqueta.

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

    A Google recomenda vivamente que especifique sempre a etiqueta de versão. Se não especificar a etiqueta de versão, o AlloyDB usa sempre a versão do modelo mais recente, o que pode levar a resultados inesperados.

  • TEXT: o texto a traduzir numa incorporação vetorial.

O que se segue?