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
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 quercriar, por exemplo,
my-scann-index
. Os nomes dos índices são partilhadosna 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 usarcom 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 aplicareste í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íveisquantizaçã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 oenvie 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 armazenadoincorporações.
DISTANCE_FUNCTION_QUERY
: a função de distância a usar com esteconsulta. 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 armazenadovizinhos 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
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?
- Um exemplo de fluxo de trabalho de incorporação
- Otimize o desempenho das consultas vetoriais
- Métricas do índice vetorial