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ão0.5.0
ou 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
O 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
pegada 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 armazenavector
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 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 como2
para 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 conseguir uma experiência de pesquisa consistente, ative a manutenção automática quando criar um índice ScaNN. Para mais informações, consulte o artigo Mantenha os índices de vetores. Esta funcionalidade está disponível na pré-visualização.
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;
Crie índices em paralelo
O AlloyDB pode gerar automaticamente vários trabalhadores paralelos, consoante o seu conjunto de dados e o tipo de índice que escolher para criar o índice mais rapidamente.
A criação do índice paralelo é frequentemente acionada quando cria um índice ScaNN de 3 níveis ou se o seu conjunto de dados exceder 100 milhões de linhas.
Embora o AlloyDB otimize automaticamente o número de trabalhadores paralelos, pode ajustar os trabalhadores paralelos através dos parâmetros de planeamento de consultas do PostgreSQL max_parallel_maintenance_workers
, max_parallel_workers
e min_parallel_table_scan_size
.
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
funcionalidade de consulta. 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
1
se 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 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?
- Um exemplo de fluxo de trabalho de incorporação
- Otimize o desempenho das consultas vetoriais
- Métricas do índice vetorial