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
vectorda extensão0.5.0ou posterior baseada empgvector, expandida pela Google para o AlloyDB, está instalada.CREATE EXTENSION IF NOT EXISTS vector;Para gerar índices
ScaNN, instale a extensãoalloydb_scann, além da extensãovector.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, uma extensão do PostgreSQL desenvolvida pela Google que implementa um índice de vizinhos mais próximos altamente eficiente com tecnologia do algoritmo ScaNN.
O índice ScaNN é um índice de quantização baseado em árvores para a pesquisa aproximada do vizinho mais próximo. Oferece um tempo de criação de índice mais baixo e uma menor
ocupação de memória em comparação com o HNSW. Além disso, oferece QPS mais rápidas em comparação com o HNSW com base na carga de trabalho.
Índice ScaNN de árvore de dois níveis
Para aplicar um índice de árvore de dois níveis usando o algoritmo ScaNN a uma coluna que contenha incorporações de vetores 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 armazenavectordados.DISTANCE_FUNCTION: a função de distância a usar com este índice. Selecione uma das seguintes opções:Distância L2:
l2Produto escalar:
dot_productDistância do cosseno:
cosine
NUM_LEAVES_VALUE: o número de partições a aplicar a este índice. Defina qualquer valor entre 1 e 1048576. Para mais informações sobre como decidir este valor, consulte o artigo Ajuste um índiceScaNN.
Í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 de vetores 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 da árvore de agrupamento K-means. Defina como1(predefinição) para a quantização baseada em árvore de dois níveis e como2para a 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 usam o índice seguindo as instruções em Faça uma consulta de vizinhos mais próximos com um determinado texto.
Os parâmetros de índice têm de ser definidos para encontrar o equilíbrio certo entre as consultas por segundo e a capacidade de memorização. Para mais informações sobre a otimização do índice ScaNN, consulte o artigo Otimize um ScaNN
índice.
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 da coluna de incorporação. Para mais informações sobre como encontrar as dimensões,
consulte a função vector_dims em Funções
vetoriais.
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 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 funcionalidade de consulta pgvector. Não pode executar consultas de pesquisa em massa 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 consulta de exemplo seguinte, 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 com a qual comparar o texto.INDEX_NAME: o nome do índice que quer usar, por exemplo,my-scann-index.EMBEDDING_COLUMN: a coluna que contém as incorporações armazenadas.DISTANCE_FUNCTION_QUERY: a função de distância a usar com esta 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 os vizinhos semânticos armazenados mais próximos.ROW_COUNT: o número de linhas a devolver.Especifique
1se quiser apenas a melhor correspondência única.
Para mais informações sobre outros exemplos de consultas, consulte o artigo Consultar.
Também pode usar a função embedding() para traduzir o texto num vetor. Aplica o vetor a um dos
pgvector operadores de vizinho mais próximo, <-> para a distância L2, para encontrar as linhas da base de dados com as incorporações semanticamente mais semelhantes.
Uma vez que embedding() devolve uma matriz real, tem de converter explicitamente a chamada embedding() em vector para usar estes valores com operadores pgvector.
CREATE EXTENSION 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
textembedding-gecko@003como 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
textembedding-geckomodelos em inglês com a Vertex AI, especifique uma das etiquetas de versão, por exemplo,textembedding-gecko@003, 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?
- Um exemplo de fluxo de trabalho de incorporação
- Otimize o desempenho das consultas vetoriais
- Métricas do índice vetorial