Esta página descreve como usar incorporações armazenadas para gerar índices e consultar incorporações usando um índice HNSW
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 HNSW
O AlloyDB suporta a criação de um hnsw
índice
baseado em grafos
pgvector
disponível com o pgvector
de stock através da extensão pgvector
do AlloyDB. A utilização de um índice resulta numa pesquisa gananciosa que se move através do gráfico, procurando constantemente o vizinho mais próximo do vetor de consulta até encontrar um resultado ideal.hnsw
Oferece um desempenho de consulta mais rápido, mas tempos de compilação mais lentos em comparação com IVF
.
Para mais informações sobre o algoritmo HNSW, consulte o artigo Hierarchical Navigable Small World graphs.
Para criar um índice hnsw
, execute a seguinte consulta:
CREATE INDEX INDEX_NAME ON TABLE
USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');
Substitua o seguinte:
INDEX_NAME
: o nome do índice que quer criar, por exemplo,my-hnsw-index
.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
NUMBER_OF_CONNECTIONS
: o número máximo de associações por nó no gráfico. Pode começar com o valor predefinido de16
e experimentar valores mais elevados com base no tamanho do seu conjunto de dados.CANDIDATE_LIST_SIZE
: o tamanho de uma lista de candidatos mantida durante a construção do gráfico, que atualiza constantemente os melhores candidatos atuais para os vizinhos mais próximos de um nó. Defina este valor para qualquer valor superior ao dobro do valorm
. Por exemplo,64
.
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 graph
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.hnsw
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-hnsw-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.