Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O DiskANN é um algoritmo escalável para busca de vizinho mais próximo aproximada, permitindo uma busca vetorial eficiente em qualquer escala. Ele oferece alta recuperação, altas consultas por segundo e baixa latência de consulta, mesmo para conjuntos de dados de bilhões de pontos. Essas características o tornam uma ferramenta poderosa para lidar com grandes volumes de dados.
Para saber mais sobre o DiskANN, consulte DiskANN: Pesquisa Vetorial para Pesquisa e Recomendação em Escala Web.
A pg_diskann extensão adiciona suporte para o uso do DiskANN para indexação vetorial e pesquisa eficientes.
Ativar pg_diskann
Para usar a pg_diskann extensão em seu Banco de Dados do Azure para instância de servidor flexível do PostgreSQL, você precisa permitir a extensão no nível da instância. Em seguida, você precisa criar a extensão em cada banco de dados no qual você deseja usar a funcionalidade fornecida pela extensão.
Como o pg_diskann tem uma dependência da extensão vector, deve permitir e criar a extensão na mesma base de dados e deve executar o seguinte comando:
CREATE EXTENSION IF NOT EXISTS pg_diskann;
Ou você pode ignorar explicitamente a permissão e a criação da vector extensão e, em vez disso, executar o comando anterior anexando a CASCADE cláusula. A cláusula faz com que o PostgreSQL execute implicitamente CREATE EXTENSION na extensão de que depende. Para tal, execute o seguinte comando:
CREATE EXTENSION IF NOT EXISTS pg_diskann CASCADE;
Para soltar a extensão do banco de dados ao qual você está conectado no momento, execute o seguinte comando:
DROP EXTENSION IF EXISTS pg_diskann;
Usar o método de acesso ao índice DiskANN
Depois que a extensão estiver instalada, você poderá criar um diskann índice em uma coluna de tabela que contenha dados vetoriais. Por exemplo, para criar um índice na embedding coluna da demo tabela, use o seguinte comando:
CREATE TABLE demo (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
embedding public.vector(3)
-- other columns
);
-- insert dummy data
INSERT INTO demo (embedding) VALUES
('[1.0, 2.0, 3.0]'),
('[4.0, 5.0, 6.0]'),
('[7.0, 8.0, 9.0]');
-- create a diskann index by using Cosine distance operator
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Depois que o índice é criado, você pode executar consultas para encontrar os vizinhos mais próximos.
A consulta seguinte encontra os 5 vizinhos mais próximos do vetor [2.0, 3.0, 4.0]:
SELECT id, embedding
FROM demo
ORDER BY embedding <=> '[2.0, 3.0, 4.0]'
LIMIT 5;
O Postgres decide automaticamente quando usar o índice DiskANN. Se ele optar por não usar o índice em um cenário no qual você deseja que ele o use, execute o seguinte comando:
-- Explicit Transcation block to force use for DiskANN index.
BEGIN;
SET LOCAL enable_seqscan TO OFF;
-- Similarity search queries
COMMIT;
Importante
Configurar enable_seqscan para desativado desencoraja o planeador a usar o plano de verificação sequencial do planeador de consultas, caso existam outros métodos disponíveis. Como está desativado ao usar o comando SET LOCAL, a configuração entra em vigor apenas para a transação atual. Após um COMMIT ou ROLLBACK, a configuração de nível de sessão entra em vigor novamente. Observe que, se a consulta envolver outras tabelas, a configuração também desencorajará o uso de verificações sequenciais em todas elas.
Dimensione-se eficientemente com a quantização (Pré-visualização)
O DiskANN usa a quantização do produto (PQ) para reduzir drasticamente o espaço ocupado pela memória dos vetores. Ao contrário de outras técnicas de quantização, o algoritmo PQ pode comprimir vetores de forma mais eficaz, melhorando significativamente o desempenho. O DiskANN usando PQ pode manter mais dados na memória, reduzindo a necessidade de acessar armazenamento mais lento, bem como usando menos computação ao comparar vetores compactados. Isso resulta em melhor desempenho e economia de custos significativa ao trabalhar com grandes quantidades de dados (>1 milhão de linhas).
Importante
O suporte à quantização de produtos no DiskANN está disponível a partir de pg_diskann v0.6 e superior.
Para reduzir o tamanho do índice e encaixar mais dados na memória, pode utilizar o PQ.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann(embedding vector_cosine_ops)
WITH(
product_quantized=true
);
Melhore a precisão ao usar PQ com reclassificação vetorial
A reclassificação com vetores completos é uma técnica usada em sistemas de pesquisa de vizinhos mais próximos aproximados (ANN), como o DiskANN com Quantização de Produto (PQ), para melhorar a precisão dos resultados, reordenando os candidatos recuperados do top-N usando os vetores originais, não compactados (precisão total). Esta técnica de reclassificação é baseada puramente em métricas exatas de semelhança vetorial (por exemplo, semelhança do cosseno ou distância euclidiana). Esta técnica não é a mesma que reclassificar usando um modelo de classificação.
Para equilibrar a velocidade e a precisão na pesquisa de semelhança vetorial, uma estratégia de reclassificação em duas etapas pode ser implementada ao consultar com o DiskANN e a quantização do produto para melhorar a precisão.
Pesquisa aproximada inicial: a consulta interna usa o DiskANN para recuperar os 50 principais vizinhos aproximados mais próximos com base na distância cosseno entre as incorporações armazenadas e o vetor de consulta. Esta etapa é rápida e eficiente, aproveitando os recursos de indexação do DiskANN.
Reclassificação precisa: A consulta externa reordena esses 50 resultados pela distância real calculada e retorna as 10 principais correspondências mais relevantes:
Aqui está um exemplo de reclassificação usando esta abordagem de 2 etapas:
SELECT id
FROM (
SELECT id, embedding <=> %s::vector AS distance
FROM demo
ORDER BY embedding <=> %s::vector asc
LIMIT 50
) AS t
ORDER BY t.distance
LIMIT 10;
Nota
%s deve ser substituído pelo vetor de consulta. Você pode usar azure_ai para criar um vetor de consulta diretamente no Postgres.
Esta abordagem equilibra a velocidade (através da pesquisa aproximada) e a precisão (através da reclassificação completa do vetor), garantindo resultados de alta qualidade sem analisar todo o conjunto de dados.
Suporte para incorporações de alta dimensão
As aplicações avançadas de IA generativa geralmente dependem de modelos de representação de alta dimensão, como text-embedding-3-large, para alcançar uma precisão superior. No entanto, métodos tradicionais de indexação como HNSW em pgvector são limitados a vetores com até 2.000 dimensões, o que restringe o uso desses modelos poderosos.
A partir da pg_diskann v0.6 e superior, o DiskANN agora suporta vetores de indexação com até 16.000 dimensões, expandindo significativamente o escopo para cargas de trabalho de IA de alta precisão.
Importante
A quantização do produto deve ser ativada para aproveitar o suporte de alta dimensão.
Configurações recomendadas:
-
product_quantized: Configurar para verdadeiro -
pq_param_num_chunks: Defina para um terço da dimensão de incorporação para um desempenho ideal. -
pq_param_training_samples: Determinado automaticamente com base no tamanho da tabela, a menos que explicitamente definido.
Esse aprimoramento permite uma pesquisa escalável e eficiente em grandes conjuntos de dados vetoriais, mantendo alta recuperação e precisão.
Acelere a criação do índice
Há algumas maneiras que recomendamos para melhorar os tempos de compilação do índice.
Utilizar mais memória
Para acelerar a criação do índice, você pode aumentar a memória alocada em sua instância do Postgres para a compilação do índice. O uso da memória pode ser especificado através do maintenance_work_mem parâmetro.
-- Set the parameters
SET maintenance_work_mem = '8GB'; -- Depending on your resources
Em seguida, CREATE INDEX o comando usa a memória de trabalho especificada, dependendo dos recursos disponíveis, para criar o índice.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Sugestão
Você pode aumentar a escala dos recursos de memória durante a compilação do índice para melhorar a velocidade de indexação e, em seguida, reduzir novamente quando a indexação for concluída.
Usando paralelização
Para acelerar a criação do índice, você pode usar trabalhadores paralelos. O número de trabalhadores pode ser especificado através do parallel_workers parâmetro de armazenamento da CREATE TABLE instrução, ao criar a tabela. E pode ser ajustado posteriormente usando a cláusula SET da declaração ALTER TABLE.
CREATE TABLE demo (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
embedding public.vector(3)
) WITH (parallel_workers = 4);
ALTER TABLE demo SET (parallel_workers = 8);
Em seguida, CREATE INDEX o comando usa o número especificado de trabalhadores paralelos, dependendo dos recursos disponíveis, para criar o índice.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Importante
O processo líder não pode participar de compilações paralelas de índice.
Se você quiser criar o índice usando trabalhadores paralelos, também precisará definir max_parallel_workers, max_worker_processese max_parallel_maintenance_workers parâmetros de acordo. Para obter mais informações sobre esses parâmetros, consulte parâmetros que controlam o uso de recursos e o comportamento assíncrono.
Você pode definir esses parâmetros em diferentes níveis de granularidade. Por exemplo, para defini-los no nível da sessão, você pode executar as seguintes instruções:
-- Set the parameters
SET max_parallel_workers = 8;
SET max_worker_processes = 8; -- Note: Requires server restart
SET max_parallel_maintenance_workers = 4;
Para saber mais sobre outras opções para configurar esses parâmetros no Banco de Dados do Azure para servidor flexível PostgreSQL, consulte Configurar parâmetros de servidor.
Nota
O parâmetro max_worker_processes requer uma reinicialização do servidor para entrar em vigor.
Se a configuração desses parâmetros e os recursos disponíveis no servidor não permitirem iniciar os trabalhadores paralelos, o PostgreSQL retornará automaticamente para criar o índice no modo não paralelo.
Parâmetros de configuração
Ao criar um diskann índice, você pode especificar vários parâmetros para controlar seu comportamento.
Parâmetros de índice
-
max_neighbors: Número máximo de arestas por nó no gráfico (o padrão é 32). Um valor mais alto pode melhorar o recall até um certo ponto. -
l_value_ib: Tamanho da lista de pesquisa durante a compilação do índice (o padrão é 100). Um valor mais alto torna a construção mais lenta, mas o índice seria de maior qualidade. -
product_quantized: Permite a quantização do produto para uma pesquisa mais eficiente (o padrão é false). -
pq_param_num_chunks: Número de partes para quantização do produto (o padrão é 0). 0 significa que é determinado automaticamente, com base nas dimensões de incorporação. Recomenda-se a utilização de 1/3 das dimensões de incorporação originais. -
pq_param_training_samples: Número de vetores para treinar a tabela de pivô PQ (Por padrão, é 0). 0 significa que é determinado automaticamente, com base no tamanho da tabela.
CREATE INDEX demo_embedding_diskann_custom_idx ON demo USING diskann (embedding vector_cosine_ops)
WITH (
max_neighbors = 48,
l_value_ib = 100,
product_quantized=true,
pq_param_num_chunks = 0,
pq_param_training_samples = 0
);
Parâmetros de extensão
diskann.iterative_search: Controla o comportamento de pesquisa.Configurações para
diskann.iterative_search:relaxed_order(padrão): Permite que o diskann pesquise iterativamente o gráfico em lotes dediskann.l_value_is, até que o número desejado de tuplas, possivelmente limitado pela cláusulaLIMIT, seja produzido. Pode fazer com que os resultados estejam fora de ordem.strict_order: Semelhante aorelaxed_order, permite que o diskann pesquise iterativamente o gráfico, até que o número desejado de tuplas seja produzido. No entanto, ele garante que os resultados sejam retornados em ordem estrita ordenada por distância.off: Usa a funcionalidade de pesquisa não iterativa, o que significa que tenta buscardiskann.l_value_istuplas num só passo. A pesquisa não iterativa só pode retornar um máximo dediskann.l_value_isvetores para uma consulta, independentemente da cláusula ou do número deLIMITtuplas que correspondam à consulta.
Para alterar o comportamento de pesquisa para
strict_order, para todas as consultas executadas na sessão atual, execute a seguinte instrução:SET diskann.iterative_search TO 'strict_order';Para alterá-lo para que afete apenas todas as consultas executadas na transação atual, execute a seguinte instrução:
BEGIN; SET LOCAL diskann.iterative_search TO 'strict_order'; -- All your queries COMMIT;diskann.l_value_is: Valor L para varrimento de índice (padrão 100). Aumentar o valor aumenta a capacidade de recuperação de dados, mas pode tornar as consultas mais demoradas.Para alterar o valor L da verificação de índice para 20, para todas as consultas executadas na sessão atual, execute a seguinte instrução:
SET diskann.l_value_is TO 20;Para alterá-lo para que afete apenas todas as consultas executadas na transação atual, execute a seguinte instrução:
BEGIN; SET LOCAL diskann.l_value_is TO 20; -- All your queries COMMIT;
Configuração recomendada de parâmetros
| Tamanho do conjunto de dados (linhas) | Tipo de parâmetro | Nome | Valor recomendado |
|---|---|---|---|
| <1 milhão | Compilação de índice | l_value_ib |
100 |
| <1 milhão | Compilação de índice | max_neighbors |
32 |
| <1 milhão | Tempo de consulta | diskann.l_value_is |
100 |
| 1M-50M | Compilação de índice | l_value_ib |
100 |
| 1M-50M | Compilação de índice | max_neighbors |
64 |
| 1M-50M | Compilação de índice | product_quantized |
true |
| 1M-50M | Tempo de consulta | diskann.l_value_is |
100 |
| >50 milhões | Compilação de índice | l_value_ib |
100 |
| >50 milhões | Compilação de índice | max_neighbors |
96 |
| >50 milhões | Compilação de índice | product_quantized |
true |
| >50 milhões | Tempo de consulta | diskann.l_value_is |
100 |
Nota
Esses parâmetros podem variar dependendo do conjunto de dados específico e do caso de uso. Os usuários podem ter que experimentar diferentes valores de parâmetros, para encontrar as configurações ideais para seu cenário específico.
Progresso de CREATE INDEX e REINDEX
Com o PostgreSQL 12 e versões mais recentes, você pode usar pg_stat_progress_create_index para verificar o progresso das operações CREATE INDEX ou REINDEX.
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
Para saber mais sobre as possíveis fases pelas quais uma operação CREATE INDEX ou REINDEX passa, consulte Fases CREATE INDEX.
Selecionando a função de acesso ao índice
O tipo de vetor permite realizar três tipos de pesquisas nos vetores armazenados. Você precisa selecionar a função de acesso correta para seu índice, para que o banco de dados possa considerar seu índice ao executar suas consultas.
pg_diskann suporta os seguintes operadores de distância
-
vector_l2_ops:<->Distância euclidiana -
vector_cosine_ops:<=>Distância cossina -
vector_ip_ops:<#>Produto interno
Solução de problemas
Erro: assertion left == right failed left: 40 right: 0:
A versão do DiskANN GA, v0.6.x introduz alterações significativas no formato de metadados do índice. Os índices criados com v0.5.x não são compatíveis com versões futuras das operações de inserção v0.6.x. Tentar inserir em uma tabela com um índice desatualizado resultará em um erro, mesmo que o índice pareça válido.
Quando você encontrar esse erro, você pode resolver por:
Opção 1: Executar a instrução
REINDEXouREDINDEX CONCURRENTLYno índice.Opção 2: Reconstruir o índice
DROP INDEX your_index_name; CREATE INDEX your_index_name ON your_table USING diskann(your_vector_column vector_cosine_ops);
Erro: diskann index needs to be upgraded to version 2...:
- Quando você encontrar esse erro, você pode resolver por:
Opção 1: Executar a instrução
REINDEXouREDINDEX CONCURRENTLYno índice.Opção 2: Como
REINDEXpode levar muito tempo, a extensão também fornece uma função definida pelo usuário chamadaupgrade_diskann_index(), que atualiza seu índice mais rapidamente, quando possível.Para atualizar o índice, execute a seguinte instrução:
SELECT upgrade_diskann_index('demo_embedding_diskann_custom_idx');Para atualizar todos os índices diskann no banco de dados para a versão atual, execute a seguinte instrução:
SELECT upgrade_diskann_index(pg_class.oid) FROM pg_class JOIN pg_am ON (pg_class.relam = pg_am.oid) WHERE pg_am.amname = 'diskann';