Nesta página, descrevemos como usar embeddings armazenados para gerar índices e consultar embeddings usando um índice HNSW com o AlloyDB Omni.
Para mais informações sobre como armazenar embeddings, consulte
Armazenar embeddings de vetor.
Antes de começar
Antes de começar a criar índices, atenda aos seguintes pré-requisitos.
Os vetores de embedding são adicionados a uma tabela no banco de dados do AlloyDB Omni.
A versão
0.5.0ou mais recente da extensãovectorbaseada empgvector, estendida pelo Google para o AlloyDB Omni, está instalada.CREATE EXTENSION IF NOT EXISTS vector;
Criar um índice HNSW
O AlloyDB Omni oferece suporte à criação de um índice hnsw baseado em gráficos disponível com o pgvector padrão usando a extensão pgvector do AlloyDB Omni. O uso de um índice hnsw resulta em uma pesquisa gananciosa que se move pelo gráfico procurando constantemente o vizinho mais próximo do vetor de consulta até encontrar um resultado ideal. Ele oferece um desempenho de consulta mais rápido, mas tempos de build mais lentos em comparação com o IVF.
Para mais informações sobre o algoritmo HNSW, consulte Gráficos hierárquicos de mundo pequeno navegável.
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 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 por nó no gráfico. Você pode começar com o valor padrão como16e experimentar valores mais altos com base no tamanho do 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 valorm, 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 de destino e um equilíbrio de QPS, consulte
Ajustar um hnsw índice.
Executar uma consulta
Depois de armazenar e indexar os embeddings no banco de dados, você pode começar a
consultar usando a pgvector funcionalidade de consulta.
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.
Também é possível usar a embedding()
função para traduzir o texto em um vetor. Você aplica o vetor a um dos
pgvector operadores de vizinho mais próximo, <-> para a distância de L2, para encontrar as linhas do banco de dados com os
embeddings mais semânticamente 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 ScaNN
- Executar pesquisas de similaridade vetorial
- Ajustar o desempenho da consulta vetorial
- 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.