Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
DiskANN is een schaalbaar, bij benadering dichtstbijzijnde zoekalgoritmen voor efficiënte vectorzoekopdrachten op elke schaal. Het biedt hoge recall, hoge queries per seconde en lage querylatentie, zelfs voor datasets met miljarden punten. Deze kenmerken maken het een krachtig hulpprogramma voor het verwerken van grote hoeveelheden gegevens.
Voor meer informatie over DiskANN, zie DiskANN: Vector Search for Web Scale Search and Recommendation.
De pg_diskann extensie voegt ondersteuning toe voor het gebruik van DiskANN voor efficiënte vectorindexering en zoeken.
pg_diskann inschakelen
Als u de pg_diskann extensie wilt gebruiken op uw flexibele Azure Database for PostgreSQL-serverexemplaren, moet u de extensie op exemplaarniveau toestaan. Vervolgens moet u de extensie maken voor elke database waarin u de functionaliteit van de extensie wilt gebruiken.
Omdat pg_diskann een afhankelijkheid heeft van de vector extensie, kunt u de extensie in dezelfde database toestaan en vector en dan de volgende opdracht uitvoeren:
CREATE EXTENSION IF NOT EXISTS pg_diskann;
U kunt ook het expliciet toestaan en maken van de vector extensie overslaan en in plaats daarvan de vorige opdracht uitvoeren die de CASCADE component toevoegt. Die PostgreSQL-instructie voert impliciet CREATE EXTENSION uit voor de extensie waarvan het afhankelijk is. Voer hiertoe de volgende opdrachten uit:
CREATE EXTENSION IF NOT EXISTS pg_diskann CASCADE;
Als u de extensie wilt verwijderen uit de database waarmee u momenteel verbonden bent, voert u de volgende opdracht uit:
DROP EXTENSION IF EXISTS pg_diskann;
De toegangsmethode voor de diskann-index gebruiken
Zodra de extensie is geïnstalleerd, kunt u een diskann index maken op een tabelkolom die vectorgegevens bevat. Als u bijvoorbeeld een index wilt maken in de embedding kolom van de demo tabel, gebruikt u de volgende opdracht:
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)
Zodra de index is gemaakt, kunt u query's uitvoeren om de dichtstbijzijnde buren te vinden.
Met de volgende query worden de 5 dichtstbijzijnde buren aan de vector [2.0, 3.0, 4.0]gevonden:
SELECT id, embedding
FROM demo
ORDER BY embedding <=> '[2.0, 3.0, 4.0]'
LIMIT 5;
Postgres bepaalt automatisch wanneer de DiskANN-index moet worden gebruikt. Als de index niet wordt gebruikt in een scenario waarin u de index wilt gebruiken, voert u de volgende opdracht uit:
-- Explicit Transcation block to force use for DiskANN index.
BEGIN;
SET LOCAL enable_seqscan TO OFF;
-- Similarity search queries
COMMIT;
Belangrijk
Door enable_seqscan uit te schakelen, wordt de planner ontmoedigd om het sequentiële scanplan van de queryplanner te kiezen wanneer er andere methoden beschikbaar zijn. Omdat deze functie is uitgeschakeld met behulp van de SET LOCAL opdracht, wordt de instelling alleen van kracht voor de huidige transactie. Na een COMMIT of ROLLBACK wordt de instelling op sessieniveau opnieuw van kracht. U ziet dat als de query andere tabellen omvat, de instelling ook het gebruik van sequentiële scans in al deze tabellen ontmoedigt.
Efficiënt schalen met Kwantisatie (preview)
DiskANN maakt gebruik van product kwantisatie (PQ) om de geheugenvoetafdruk van de vectoren aanzienlijk te verminderen. In tegenstelling tot andere kwantisatietechnieken kan het PQ-algoritme vectoren effectiever comprimeren, waardoor de prestaties aanzienlijk worden verbeterd. DiskANN met behulp van PQ kan meer gegevens in het geheugen bewaren, waardoor de toegang tot tragere opslag wordt verminderd en minder rekenkracht wordt gebruikt bij het vergelijken van gecomprimeerde vectoren. Dit resulteert in betere prestaties en aanzienlijke kostenbesparingen bij het werken met grotere hoeveelheden gegevens (> 1 miljoen rijen).
Belangrijk
Product kwantisatieondersteuning in DiskANN is beschikbaar vanaf pg_diskann v0.6 en hoger.
Als u de grootte van uw index wilt verkleinen en meer gegevens in het geheugen wilt aanpassen, kunt u PQ gebruiken:
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann(embedding vector_cosine_ops)
WITH(
product_quantized=true
);
De nauwkeurigheid verbeteren bij het gebruik van PQ met vectorherrankering
Rerankering met volledige vectoren is een techniek die wordt gebruikt in bij benadering dichtstbijzijnde buren (ANN) zoeksystemen zoals DiskANN met Product Quantization (PQ) om de nauwkeurigheid van resultaten te verbeteren door de top-N opgehaalde kandidaten opnieuw te ordenen met behulp van de oorspronkelijke, niet-gecomprimeerde vectoren (volledige precisie). Deze rerankeringstechniek is uitsluitend gebaseerd op exacte vector overeenkomsten metrische gegevens (bijvoorbeeld cosinus-gelijkenis of Euclidische afstand). Deze techniek is niet hetzelfde als het opnieuw rangschikken met behulp van een classificatiemodel.
Als u de snelheid en precisie in vector-overeenkomsten wilt verdelen, kunt u een herrankeringsstrategie in twee stappen implementeren bij het uitvoeren van query's met DiskANN en product kwantisatie om de nauwkeurigheid te verbeteren.
Eerste geschatte zoekopdracht: de binnenste query maakt gebruik van DiskANN om de 50 dichtstbijzijnde dichtstbijzijnde buren op te halen op basis van cosinusafstand tussen de opgeslagen insluitingen en de queryvector. Deze stap is snel en efficiënt, waarbij gebruik wordt gemaakt van de indexeringsmogelijkheden van DiskANN.
Nauwkeurig opnieuw rangschikken: de buitenste query rangschikt deze 50 resultaten op basis van de werkelijke berekende afstand en retourneert de top 10 meest relevante overeenkomsten:
Hier volgt een voorbeeld van herrankering met behulp van deze tweestapsbenadering:
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;
Opmerking
%s moet worden vervangen door de queryvector. U kunt azure_ai gebruiken om rechtstreeks in Postgres een queryvector te maken.
Deze aanpak zorgt voor een balans tussen snelheid (via geschatte zoekopdrachten) en nauwkeurigheid (via volledige vectorherrankering), waardoor resultaten van hoge kwaliteit worden gegarandeerd zonder de volledige gegevensset te scannen.
Ondersteuning voor insluitingen met een hoge dimensie
Geavanceerde generatieve AI-toepassingen zijn vaak afhankelijk van high-dimensionale insluitingsmodellen, zoals tekst-insluiten-3-groot om een superieure nauwkeurigheid te bereiken. Traditionele indexeringsmethoden zoals HNSW in pgvector zijn echter beperkt tot vectoren met maximaal 2000 dimensies, waardoor het gebruik van deze krachtige modellen wordt beperkt.
Vanaf pg_diskann v0.6 en hoger ondersteunt DiskANN nu indexeringsvectoren met maximaal 16.000 dimensies, waardoor het bereik voor AI-workloads met hoge nauwkeurigheid aanzienlijk wordt uitgebreid.
Belangrijk
Product kwantisatie moet zijn ingeschakeld om gebruik te kunnen maken van high-dimensionale ondersteuning.
Aanbevolen instellingen:
-
product_quantized: Ingesteld op true -
pq_param_num_chunks: Stel in op een derde van de insluitingsdimensie voor optimale prestaties. -
pq_param_training_samples: Automatisch bepaald op basis van de tabelgrootte, tenzij deze expliciet is ingesteld.
Deze verbetering maakt schaalbare, efficiënte zoekopdrachten mogelijk voor grote vectorgegevenssets, terwijl hoge relevante overeenkomsten en precisie behouden blijven.
Versnel indexopbouw
Er zijn een aantal manieren waarop u de buildtijden van uw index kunt verbeteren.
Meer geheugen gebruiken
Als u het maken van de index wilt versnellen, kunt u het geheugen verhogen dat is toegewezen aan uw Postgres-exemplaar voor de indexbuild. Het geheugengebruik kan worden opgegeven via de maintenance_work_mem parameter.
-- Set the parameters
SET maintenance_work_mem = '8GB'; -- Depending on your resources
CREATE INDEX Vervolgens gebruikt de opdracht het opgegeven werkgeheugen, afhankelijk van de beschikbare resources, om de index te bouwen.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Aanbeveling
U kunt uw geheugenbronnen omhoog schalen tijdens de indexbuild om de indexeringssnelheid te verbeteren en vervolgens weer omlaag schalen wanneer indexering is voltooid.
Parallellisatie gebruiken
U kunt parallelle werkrollen gebruiken om het maken van de index te versnellen. Het aantal werknemers kan worden opgegeven via de parallel_workers opslagparameter van de CREATE TABLE instructie bij het maken van de tabel. En het kan later worden aangepast met de SET clausule van de ALTER TABLE instructie.
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);
CREATE INDEX Vervolgens gebruikt de opdracht het opgegeven aantal parallelle werkrollen, afhankelijk van de beschikbare resources, om de index te bouwen.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Belangrijk
Het leader-proces kan niet deelnemen aan parallelle index builds.
Als u de index wilt maken met behulp van parallelle processen, moet u ook de parameters max_parallel_workers, max_worker_processes, en max_parallel_maintenance_workers dienovereenkomstig instellen. Zie parameters voor het beheren van resourcegebruik en asynchroon gedrag voor meer informatie over deze parameters.
U kunt deze parameters instellen op verschillende granulariteitsniveaus. Als u ze bijvoorbeeld wilt instellen op sessieniveau, kunt u de volgende instructies uitvoeren:
-- Set the parameters
SET max_parallel_workers = 8;
SET max_worker_processes = 8; -- Note: Requires server restart
SET max_parallel_maintenance_workers = 4;
Zie Serverparameters configureren voor meer informatie over andere opties voor het configureren van deze parameters in Azure Database for PostgreSQL flexibele server.
Opmerking
Voor de parameter max_worker_processes moet de server worden herstart om effect te hebben.
Als de configuratie van deze parameters en de beschikbare resources op de server het starten van de parallelle werkrollen niet toestaat, valt PostgreSQL automatisch terug om de index in de niet-parallel-modus te maken.
Configuratieparameters
Wanneer u een diskann index maakt, kunt u verschillende parameters opgeven om het gedrag ervan te bepalen.
Indexparameters
-
max_neighbors: Maximum aantal randen per knooppunt in de grafiek (standaard ingesteld op 32). Een hogere waarde kan het ophalen tot op een bepaald punt verhogen. -
l_value_ib: Grootte van de zoeklijst tijdens de indexbuild (standaard ingesteld op 100). Een hogere waarde maakt de build langzamer, maar de index zou van hogere kwaliteit zijn. -
product_quantized: maakt product kwantisatie mogelijk voor efficiëntere zoekopdrachten (standaard ingesteld op onwaar). -
pq_param_num_chunks: Aantal segmenten voor product kwantisatie (standaard ingesteld op 0). 0 betekent dat deze automatisch wordt bepaald op basis van insluitingsdimensies. Het wordt aanbevolen om 1/3 van de oorspronkelijke insluitingsdimensies te gebruiken. -
pq_param_training_samples: Aantal vectoren waarop de PQ-draaitabel moet worden getraind (standaard ingesteld op 0). 0 betekent dat deze automatisch wordt bepaald op basis van de tabelgrootte.
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
);
Extensieparameters
diskann.iterative_search: Bepaalt het zoekgedrag.Configuraties voor
diskann.iterative_search:relaxed_order(standaard): Hiermee kan diskann de graaf iteratief doorzoeken in batches vandiskann.l_value_is, totdat het gewenste aantal tuples, mogelijk beperkt doorLIMITclausule, wordt geretourneerd. Dit kan ertoe leiden dat de resultaten niet in orde zijn.strict_order: Net alsrelaxed_order, laat diskann iteratief in de graaf zoeken totdat het gewenste aantal tuples is opgeleverd. Het zorgt er echter voor dat de resultaten worden geretourneerd in strikte volgorde gesorteerd op afstand.off: maakt gebruik van niet-iteratieve zoekfunctionaliteit, wat betekent dat in één stapdiskann.l_value_istuples worden opgehaald. Niet-iteratieve zoekopdrachten kunnen alleen een maximum vandiskann.l_value_isvectoren voor een query retourneren, ongeacht deLIMITclausule of het aantal tuples dat overeenkomt met de query.
Als u het zoekgedrag wilt wijzigen voor alle query's die in de huidige sessie worden uitgevoerd, voert u de volgende instructie uit:
SET diskann.iterative_search TO 'strict_order';Voer de volgende instructie uit om deze zo te wijzigen dat dit alleen van invloed is op alle query's die worden uitgevoerd in de huidige transactie:
BEGIN; SET LOCAL diskann.iterative_search TO 'strict_order'; -- All your queries COMMIT;diskann.l_value_is: L-waarde voor indexscans (standaard ingesteld op 100). Het verhogen van de waarde verbetert de recall, maar kan queries vertragen.Als u de L-waarde voor indexscans wilt wijzigen in 20, voert u de volgende instructie uit voor alle query's die in de huidige sessie worden uitgevoerd:
SET diskann.l_value_is TO 20;Voer de volgende instructie uit om deze zo te wijzigen dat dit alleen van invloed is op alle query's die worden uitgevoerd in de huidige transactie:
BEGIN; SET LOCAL diskann.l_value_is TO 20; -- All your queries COMMIT;
Aanbevolen configuratie van parameters
| Grootte van gegevensset (rijen) | Parametertype | Naam | Aanbevolen waarde |
|---|---|---|---|
| <1 miljoen | Indexbouw | l_value_ib |
100 |
| <1 miljoen | Indexbouw | max_neighbors |
32 |
| <1 miljoen | tijd voor queryverwerking | diskann.l_value_is |
100 |
| 1M-50M | Indexbouw | l_value_ib |
100 |
| 1M-50M | Indexbouw | max_neighbors |
64 |
| 1M-50M | Indexbouw | product_quantized |
true |
| 1M-50M | tijd voor queryverwerking | diskann.l_value_is |
100 |
| >50M | Indexbouw | l_value_ib |
100 |
| >50M | Indexbouw | max_neighbors |
96 |
| >50M | Indexbouw | product_quantized |
true |
| >50M | tijd voor queryverwerking | diskann.l_value_is |
100 |
Opmerking
Deze parameters kunnen variëren, afhankelijk van de specifieke gegevensset en use-case. Gebruikers moeten mogelijk experimenteren met verschillende parameterwaarden om de optimale instellingen voor hun specifieke scenario te vinden.
VOORTGANG VAN INDEX AANMAKEN EN OPNIEUW INDEXEREN
Bij het gebruik van PostgreSQL 12 en hoger kunt u pg_stat_progress_create_index gebruiken om de voortgang van de CREATE INDEX of REINDEX operaties te controleren.
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
Zie CREATE INDEX-fasen voor meer informatie over de mogelijke fasen waarmee een CREATE INDEX- of REINDEX-bewerking wordt uitgevoerd.
De functie voor indextoegang selecteren
Met het vectortype kunt u drie typen zoekopdrachten uitvoeren op de opgeslagen vectoren. U moet de juiste toegangsfunctie voor uw index selecteren, zodat de database uw index kan overwegen bij het uitvoeren van uw query's.
pg_diskann ondersteunt de volgende afstandsoperatoren
-
vector_l2_ops:<->Euclidische afstand -
vector_cosine_ops:<=>Cosinusafstand -
vector_ip_ops:<#>Inwendig Product
Probleemoplossingsproces
Fout: : assertion left == right failed left: 40 right: 0
DiskANN GA-versie v0.6.x introduceert belangrijke wijzigingen in de indeling voor indexmetagegevens. Indexen die zijn gemaakt met v0.5.x, zijn niet compatibel met v0.6.x-invoegbewerkingen. Als u probeert in te voegen in een tabel met een verouderde index, treedt er een fout op, zelfs als de index geldig lijkt.
Wanneer u deze fout tegenkomt, kunt u het volgende oplossen:
Optie 1:
REINDEXofREDINDEX CONCURRENTLYinstructie uitvoeren op de index.Optie 2: De index opnieuw samenstellen
DROP INDEX your_index_name; CREATE INDEX your_index_name ON your_table USING diskann(your_vector_column vector_cosine_ops);
Fout: : diskann index needs to be upgraded to version 2...
- Wanneer u deze fout tegenkomt, kunt u het volgende oplossen:
Optie 1:
REINDEXofREDINDEX CONCURRENTLYinstructie uitvoeren op de index.Optie 2: Omdat
REINDEXhet lang kan duren, biedt de extensie ook een door de gebruiker gedefinieerde functieupgrade_diskann_index(), waarmee uw index sneller wordt bijgewerkt, indien mogelijk.Voer de volgende instructie uit om uw index te upgraden:
SELECT upgrade_diskann_index('demo_embedding_diskann_custom_idx');Als u alle diskann-indexen in de database wilt bijwerken naar de huidige versie, voert u de volgende instructie uit:
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';