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.0ou mais recente da extensãovector, baseada empgvectore 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_opsProduto interno:
vector_ip_opsDistâ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ão16e 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
1se 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.