Esta página descreve como usar incorporações armazenadas para gerar índices e consultar incorporações usando um índice IVF
com o AlloyDB for PostgreSQL.
Para mais informações sobre o armazenamento de incorporações, consulte o artigo
Armazene incorporações de vetores.
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;
Crie um índice IVF
O Stock pgvector
suporta a pesquisa de vizinhos mais próximos aproximada através da indexação. O AlloyDB adiciona a este suporte uma funcionalidade de quantização escalar que pode especificar quando cria um índice.
Quando ativada, a quantização escalar pode acelerar significativamente as consultas que têm vetores dimensionais maiores e permite armazenar vetores com até 8000 dimensões.
Para ativar a quantização escalar num índice baseado em pgvector
, especifique IVF
como método de índice e SQ8
como quantizador:
CREATE INDEX INDEX_NAME ON TABLE
USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');
Substitua o seguinte:
INDEX_NAME
: o nome do índice que quer criar, por exemplo,my-ivf-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:
vector_l2_ops
Produto interior:
vector_ip_ops
Distância do cosseno:
vector_cosine_ops
LIST_COUNT
: o número de listas a usar com este índice. Para mais informações sobre como decidir este valor, consulte o artigo Ajuste um índice IVF.QUANTIZER
: o tipo de quantizador que quer usar.Definido para qualquer uma das seguintes opções:
SQ8
: recomendado. Resposta mais rápida à consulta, mas resulta numa perda de recordação que não afeta os cenários de produção.FLAT
: resposta mais lenta às consultas e maior utilização de memória, mas pode atingir uma perda de recordação insignificante.
Para criar este índice numa coluna de incorporação que usa o tipo de dados
real[]
em vez devector
, converta a coluna no tipo de dadosvector
:
CREATE INDEX INDEX_NAME ON TABLE
USING ivf (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'SQ8');
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 postings
indica que a criação do índice está quase concluída.
Para ajustar o índice de modo a ter um equilíbrio entre a taxa de recuperação e o CPS alvo, consulte o artigo Ajuste um IVF
índice.
Execute uma consulta
Depois de armazenar e indexar as incorporações na sua base de dados, pode começar a fazer consultas através da pgvector
funcionalidade de consulta.
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
.
O que se segue?
- Crie um índice ScaNN
- Executar pesquisas de similaridade vetorial
- Otimize o desempenho das consultas vetoriais
- Métricas do índice vetorial
- Saiba como criar um assistente de compras inteligente com o AlloyDB, o pgvector e a gestão de pontos finais de modelos.