Nesta página, descrevemos como usar embeddings armazenadas para gerar índices e consultar embeddings usando um índice HNSW
com o AlloyDB para PostgreSQL.
Para mais informações sobre como armazenar embeddings, consulte
Armazenar embeddings de vetor.
Antes de começar
Antes de começar a criar índices, conclua os seguintes pré-requisitos.
Os vetores de embedding são adicionados a uma tabela no banco de dados do AlloyDB.
A versão
0.5.0
ou mais recente da extensãovector
, baseada empgvector
e estendida pelo Google para o AlloyDB, está instalada.CREATE EXTENSION IF NOT EXISTS vector;
Criar um índice HNSW
O AlloyDB permite criar um índice hnsw
baseado em gráficos
disponível com pgvector
de ações usando a extensão pgvector
do AlloyDB. Usar um índice hnsw
resulta em uma pesquisa greedy que se move pelo gráfico procurando constantemente o vizinho mais próximo do vetor de consulta até encontrar um resultado ideal. Ele oferece desempenho de consulta mais rápido, mas tempos de build mais lentos em comparação com IVF
.
Para mais informações sobre o algoritmo HNSW, consulte Gráficos hierárquicos navegáveis de pequeno mundo (em inglês).
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:
INDEX_NAME
: o nome do índice que você quer criar, por exemplo,my-hnsw-index
.TABLE
: a tabela em que o índice será adicionado.EMBEDDING_COLUMN
: uma coluna que armazena dados devector
.DISTANCE_FUNCTION
: a função de distância a ser usada com esse índice. Escolha uma destas opções:Distância de L2:
vector_l2_ops
Produto interno:
vector_ip_ops
Distância do cosseno:
vector_cosine_ops
NUMBER_OF_CONNECTIONS
: o número máximo de conexões de um nó no gráfico. Você pode começar com o valor padrão16
e testar valores mais altos 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 vizinhos mais próximos de um nó. Defina esse valor como qualquer valor maior que o dobro do valor dem
, por exemplo,64
.
Para conferir o progresso da indexação, use a visualização 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 depois que o índice é criado.
Para ajustar o índice para um recall desejado e um equilíbrio de QPS, consulte Ajustar um índice hnsw
.
Executar uma consulta
Depois de armazenar e indexar os embeddings no banco de dados, você pode começar a
consultar usando a funcionalidade de consulta pgvector
.
Para encontrar os vizinhos semânticos mais próximos de um vetor de embedding, execute a consulta de exemplo a seguir, em que você define a mesma função de distância usada 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 o embedding com o qual você vai comparar o texto.INDEX_NAME
: o nome do índice que você quer usar. Por exemplo,my-hnsw-index
.EMBEDDING_COLUMN
: a coluna que contém os embeddings armazenados.DISTANCE_FUNCTION_QUERY
: a função de distância a ser usada com essa consulta. Escolha uma das seguintes opções com base na função de distância usada ao criar o índice:Distância de L2:
<->
Produto interno:
<#>
Distância do cosseno:
<=>
EMBEDDING
: o vetor de embedding para encontrar os vizinhos semânticos armazenados mais próximos.ROW_COUNT
: o número de linhas que serão retornadas.Especifique
1
se você quiser apenas a melhor correspondência.
Para mais exemplos de consultas, consulte Consultas.
Você também pode usar a função embedding()
para traduzir o
texto em um vetor. Você aplica o vetor a um dos operadores de vizinho mais próximo pgvector
, <->
para distância L2, para encontrar as linhas do banco de dados com os embeddings mais semanticamente semelhantes.
Como embedding()
retorna uma matriz real
, é necessário transmitir explicitamente a
chamada embedding()
para vector
para usar esses valores com
operadores pgvector
.
A seguir
- Criar um índice do ScaNN
- Fazer pesquisas de similaridade vetorial
- Ajustar o desempenho da consulta de vetores
- Métricas de índice vetorial
- Aprenda a criar um assistente de compras inteligente com o AlloyDB, o pgvector e o gerenciamento de endpoints de modelo.