Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O DiskANN é um algoritmo de pesquisa de vizinho aproximado escalonável para busca em vetores eficiente em qualquer escala. Ele oferece elevada capacidade de recuperação, alta taxa de 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 DiskANN, consulte DiskANN: Busca Vetorial para Pesquisa e Recomendação em Escala de Web.
A pg_diskann extensão adiciona suporte ao uso do DiskANN para indexação e pesquisa de vetores eficientes.
Habilitar pg_diskann
Para usar a pg_diskann extensão em seu servidor Banco de Dados do Azure para PostgreSQL flexível, você precisa permitir a extensão no nível do servidor. Em seguida, você precisa criar a extensão em cada banco de dados no qual deseja usar a funcionalidade fornecida pela extensão.
Como pg_diskann tem uma dependência da extensão vector, você deve permitir e criar a extensão vector no mesmo banco de dados e executar o seguinte comando:
CREATE EXTENSION IF NOT EXISTS pg_diskann;
Ou você pode ignorar a permissão explícita e a criação da vector extensão e, em vez disso, executar o comando anterior acrescentando a cláusula CASCADE. PostgreSQL executa implicitamente a cláusula CREATE EXTENSION na extensão da qual depende. Para tal, execute o seguinte comando:
CREATE EXTENSION IF NOT EXISTS pg_diskann CASCADE;
Para remover 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 de instalar a extensão, você pode criar um diskann índice em uma coluna de tabela que contenha dados de vetor. Por exemplo, para criar um índice na coluna embedding da tabela demo, 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 de criar o índice, você pode executar consultas para localizar os vizinhos mais próximos.
A consulta a seguir localiza os cinco vizinhos mais próximos ao 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 optar por não usar o índice em um cenário no qual você deseja que ele use o índice, 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
Desativar enable_seqscan impede que o planejador use o plano de varredura sequencial do planejador de consultas se houver outros métodos disponíveis. Como ele está desabilitado usando o SET LOCAL comando, a configuração entra em vigor apenas para a transação atual. Após um COMMIT ou ROLLBACK, a configuração do nível da sessão entra em vigor novamente. Se a consulta envolver outras tabelas, a configuração também desencorajará o uso de verificações sequenciais em todas elas.
Dimensionar com eficiência com Quantization (versão prévia)
DiskANN usa pq (quantização de produto) para reduzir drasticamente o volume de memória dos vetores. Ao contrário de outras técnicas de quantização, o algoritmo PQ pode compactar vetores de forma mais eficaz, melhorando significativamente o desempenho. Usando O PQ, o DiskANN pode manter mais dados na memória, reduzir a necessidade de acessar o armazenamento mais lento e usar menos computação ao comparar vetores compactados. Isso resulta em melhor desempenho e economia significativa de custos ao trabalhar com quantidades maiores de dados (> 1 milhão de linhas).
Importante
O suporte à quantização do produto no DiskANN está disponível a partir de pg_diskann v0.6 e superior.
Para reduzir o tamanho do índice e armazenar mais dados na memória, use PQ:
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann(embedding vector_cosine_ops)
WITH(
product_quantized=true
);
Aprimorar a exatidão ao usar o PQ com a reclassificação de vetor
A reclassificação com vetores completos é uma técnica usada em sistemas de pesquisa ANN (vizinho mais próximo) aproximado, como DiskANN com PQ (compartimentalização de produto) para aprimorar a exatidão do resultado reordenando os N principais candidatos recuperados usando os vetores descompactados originais (exatidão total). Essa técnica de reclassização baseia-se puramente em métricas exatas de similaridade de vetor (por exemplo, similaridade cossina ou distância euclidiana). Essa técnica não é a mesma que a reclassificação usando um modelo de classificação.
Para equilibrar velocidade e precisão na busca por similaridade vetorial, implemente uma estratégia de reclassificação em duas etapas ao consultar usando o DiskANN e a quantização de produto para melhorar a acurácia.
Pesquisa Aproximada Inicial: a consulta interna usa DiskANN para recuperar os 50 vizinhos mais próximos aproximados com base na distância de cosseno entre as inserções armazenadas e o vetor de consulta. Esta etapa é rápida e eficiente, aproveitando os recursos de indexação do DiskANN.
Reclassificado preciso: a consulta externa reordena esses 50 resultados pela distância computada real e retorna as 10 correspondências mais relevantes:
Aqui está um exemplo de reordenação usando esta abordagem de duas 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;
Observação
Substitua %s pelo vetor de consulta. Você pode usar azure_ai para criar um vetor de consulta diretamente no Postgres.
Essa abordagem equilibra a velocidade (por meio da pesquisa aproximada) e a exatidão (por meio da reclassificação de vetor completo), garantindo resultados de alta qualidade sem verificar todo o conjunto de dados.
Suporte para inserções de alta dimensão
Os aplicativos avançados de IA generativa geralmente dependem de modelos de incorporação de alta dimensão, como text-embedding-3-large, para obter uma precisão superior. No entanto, métodos de indexação tradicionais como HNSW no pgvector são limitados a vetores com até 2.000 dimensões, o que restringe o uso desses modelos avançados.
A partir pg_diskann v0.6 e posteriores, o DiskANN dá suporte à indexação de vetores com até 16.000 dimensões, expandindo significativamente o escopo para cargas de trabalho de IA de alta precisão.
Importante
Ative o Product Quantization para aproveitar o suporte de alta dimensão.
Configurações recomendadas:
-
product_quantized: definido como true -
pq_param_num_chunks: Configure 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 seja definido explicitamente.
Esse aprimoramento permite uma pesquisa escalonável e eficiente em grandes conjuntos de dados de vetor, mantendo alta precisão e recall.
Acelerar a construção do índice
Para melhorar os tempos de build do índice, experimente as recomendações a seguir.
Usar mais memória
Para acelerar a criação do índice, aumente a memória alocada no servidor PostgreSQL para o build de índice. Especifique o uso de memória por meio do maintenance_work_mem parâmetro.
-- Set the parameters
SET maintenance_work_mem = '8GB'; -- Depending on your resources
O CREATE INDEX 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)
Dica
Aumente os recursos de memória durante a criação do índice para melhorar a velocidade de indexação e, em seguida, reduza-os novamente quando a indexação estiver concluída.
Usando paralelização
Para acelerar a criação do índice, use trabalhos paralelos. Especifique o número de trabalhadores usando o parâmetro de armazenamento parallel_workers da instrução CREATE TABLE ao criar a tabela. Você pode ajustar esse número mais tarde usando a cláusula SET da instruçã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);
O CREATE INDEX comando usa o número especificado de trabalhos 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 da criação paralela de índices.
Se você desejar criar o índice usando trabalhadores paralelos, defina os parâmetros max_parallel_workers, max_worker_processes e max_parallel_maintenance_workers adequadamente. Para obter mais informações sobre esses parâmetros, consulte parâmetros que controlam usos de recursos e comportamento assíncrono.
Defina esses parâmetros em diferentes níveis de granularidade. Por exemplo, para defini-las no nível da sessão, execute 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 em Banco de Dados do Azure para PostgreSQL servidor flexível, consulte Configurar parâmetros.
Observação
O max_worker_processes parâmetro requer que uma reinicialização do servidor entre em vigor.
Se a configuração desses parâmetros e os recursos disponíveis no servidor não permitirem a inicialização dos trabalhos paralelos, o PostgreSQL retornará automaticamente para criar o índice no modo não paralelo.
Parâmetros de configuração
Ao criar um diskann índice, especifique vários parâmetros para controlar seu comportamento.
Parâmetros de índice
-
max_neighbors: número máximo de bordas por nó no grafo. O valor padrão é 32. Um valor mais alto pode melhorar o recall até um determinado ponto. -
l_value_ib: tamanho da lista de busca durante a construção do índice. O valor padrão é 100. Um valor mais alto torna a compilação mais lenta, mas o índice tem maior qualidade. -
product_quantized: habilita a quantização do produto para uma pesquisa mais eficiente. O valor padrão é falso. -
pq_param_num_chunks: Número de blocos para quantização de produto. O valor padrão é 0, o que significa que o sistema determina automaticamente o valor com base nas dimensões de inserção. Use um terço das dimensões de inserção originais. -
pq_param_training_samples: Número de vetores para treinar a tabela dinâmica do PQ. O valor padrão é 0, o que significa que o sistema determina automaticamente o valor 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 da pesquisa.Configurações para
diskann.iterative_search:relaxed_order(padrão): permite que o diskann pesquise iterativamente o grafo em lotes dediskann.l_value_is, até que o número desejado de tuplas, possivelmente limitado porLIMITcláusula, seja gerado. Essa opção pode fazer com que os resultados fiquem fora de ordem.strict_order: semelhante arelaxed_order, mas garante que os resultados sejam retornados em ordem estrita classificada pela distância.off: usa a funcionalidade de pesquisa nãoiterativa. Ele tenta obter tuplasdiskann.l_value_isem uma única etapa. A pesquisa nãoiterativa só pode retornar um máximo dediskann.l_value_isvetores para uma consulta, independentemente daLIMITcláusula ou do número de tuplas que correspondem à consulta.
Para alterar o comportamento de pesquisa para
strict_ordertodas as consultas executadas na sessão atual, execute a seguinte instrução:SET diskann.iterative_search TO 'strict_order';Para alterá-lo para que ele 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 varredura de índice (o padrão é 100). Aumentar o valor melhora o recall, mas pode diminuir a velocidade das consultas.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 ele 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 | Hora da 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 | Hora da consulta | diskann.l_value_is |
100 |
| >50M | Compilação de índice | l_value_ib |
100 |
| >50M | Compilação de índice | max_neighbors |
96 |
| >50M | Compilação de índice | product_quantized |
true |
| >50M | Hora da consulta | diskann.l_value_is |
100 |
Observação
Esses parâmetros podem variar dependendo do conjunto de dados específico e do caso de uso. Talvez seja necessário experimentar valores de parâmetros diferentes para encontrar as configurações ideais para seu cenário específico.
Progresso na criação de índice e reindexação
A partir do PostgreSQL 12, 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 as fases CREATE INDEX.
Seleção da função de acesso ao índice
O tipo de vetor dá suporte a três tipos de pesquisas nos vetores armazenados. Selecione a função de acesso correta para o índice para que o banco de dados possa considerar seu índice ao executar suas consultas.
pg_diskann dá suporte aos seguintes operadores de distância:
-
vector_l2_ops:<->Distância euclidiana -
vector_cosine_ops:<=>distância Cosseno -
vector_ip_ops:<#>Produto Interno
Resolução de problemas
Erro: assertion left == right failed left: 40 right: 0:
A Versão DiskANN GA, v0.6.x, apresenta alterações significativas no formato de metadados de índice. Os índices criados com v0.5.x não são compatíveis com versões posteriores nas operações de inserção da v0.6.x. Se você tentar inserir em uma tabela com um índice desatualizado, receberá um erro, mesmo que o índice pareça válido.
Ao encontrar esse erro, resolva-o:
Opção 1: Executando a instrução
REINDEXouREDINDEX CONCURRENTLYno índice.Opção 2: Recriando 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...:
- Ao encontrar esse erro, resolva-o:
Opção 1: Executando 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 de 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';