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
vectorda extensão0.5.0ou 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 pgvectorde 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 armazenavectordados.DISTANCE_FUNCTION: a função de distância a usar com este índice. Selecione uma das seguintes opções:Distância L2:
vector_l2_opsProduto interior:
vector_ip_opsDistâ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 de16e 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
1se 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 pgvectoroperadores 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.