Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
DiskANN är en skalbar ungefärlig algoritm för närmaste grannsökning för effektiv vektorsökning i valfri skala. Den erbjuder hög träffsäkerhet, höga frågor per sekund och låg frågesvarstid, även för miljardpunktsdatauppsättningar. Dessa egenskaper gör det till ett kraftfullt verktyg för att hantera stora mängder data.
Mer information om DiskANN finns i DiskANN: Vector Search for Web Scale Search and Recommendation (DiskANN: Vector Search for Web Scale Search and Recommendation).
Tillägget pg_diskann
lägger till stöd för att använda DiskANN för effektiv vektorindexering och sökning.
Aktivera pg_diskann
Om du vill använda pg_diskann
tillägget på din flexibla Azure Database for PostgreSQL-serverinstans måste du tillåta tillägget på instansnivå. Sedan måste du skapa tillägget för varje databas där du vill använda de funktioner som tillhandahålls av tillägget.
Viktigt!
Den här förhandsversionsfunktionen är endast tillgänglig för nyligen distribuerade Azure Database for PostgreSQL-flexibla serverinstanser.
Eftersom pg_diskann
har ett beroende av vector
tillägget kan du antingen tillåta och skapavector
tillägget i samma databas och köra följande kommando:
CREATE EXTENSION IF NOT EXISTS pg_diskann;
Eller så kan du hoppa över att uttryckligen tillåta och skapa vector
tillägget och i stället köra det tidigare kommandot som lägger till CASCADE
-satsen. Den satsen PostgreSQL för att implicit köra CREATE EXTENSION på det tillägg som det beror på. Detta gör du genom att köra följande kommando:
CREATE EXTENSION IF NOT EXISTS pg_diskann CASCADE;
Kör följande kommando för att släppa tillägget från databasen som du är ansluten till:
DROP EXTENSION IF EXISTS pg_diskann;
Använda diskann-indexåtkomstmetoden
När tillägget har installerats kan du skapa ett diskann
index i en tabellkolumn som innehåller vektordata. Om du till exempel vill skapa ett index i embedding
kolumnen i demo
tabellen använder du följande kommando:
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)
När indexet har skapats kan du köra frågor för att hitta närmaste grannar.
Följande fråga hittar de 5 närmaste grannarna till vektorn [2.0, 3.0, 4.0]
:
SELECT id, embedding
FROM demo
ORDER BY embedding <=> '[2.0, 3.0, 4.0]'
LIMIT 5;
Postgres bestämmer automatiskt när diskANN-index ska användas. Om du väljer att inte använda indexet i ett scenario där du vill att det ska använda det kör du följande kommando:
-- Explicit Transcation block to force use for DiskANN index.
BEGIN;
SET LOCAL enable_seqscan TO OFF;
-- Similarity search queries
COMMIT;
Viktigt!
Om du ställer in enable_seqscan
på av, avråder det planeraren från att använda frågehanterarens användning av sekventiell genomsökningsplan om det finns andra tillgängliga metoder. Eftersom det är inaktiverat med kommandot SET LOCAL
börjar inställningen endast gälla för den aktuella transaktionen. Efter en COMMIT- eller ROLLBACK-inställning börjar sessionsnivåinställningen gälla igen. Observera att om frågan omfattar andra tabeller avråder inställningen också från att använda sekventiella genomsökningar i dem alla.
Påskynda indexbygget
Det finns några sätt som vi rekommenderar för att förbättra dina indexversionstider.
Använda mer minne
För att påskynda skapandet av indexet kan du öka det minne som allokerats på Postgres-instansen för indexversionen. Minnesanvändningen kan anges via parametern maintenance_work_mem
.
-- Set the parameters
SET maintenance_work_mem = '8GB'; -- Depending on your resources
CREATE INDEX
Sedan använder kommandot det angivna arbetsminnet, beroende på tillgängliga resurser, för att skapa indexet.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Tips/Råd
Du kan skala upp dina minnesresurser under indexet för att förbättra indexeringshastigheten och sedan skala ned igen när indexeringen är klar.
Använda parallellisering
För att påskynda skapandet av indexet kan du använda parallella arbetare. Antalet arbetare kan anges via parallel_workers
lagringsparametern för -instruktionen CREATE TABLE
när du skapar tabellen. Och det kan justeras senare med instruktionens SET
sats 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);
CREATE INDEX
Sedan använder kommandot det angivna antalet parallella arbetare, beroende på tillgängliga resurser, för att skapa indexet.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Viktigt!
Leader-processen kan inte delta i parallella indexversioner.
Om du vill skapa indexet med hjälp av parallella arbetare måste du också ange max_parallel_workers
parametrarna , max_worker_processes
och max_parallel_maintenance_workers
. Mer information om dessa parametrar finns i parametrar som styr resursanvändning och asynkront beteende.
Du kan ange dessa parametrar på olika kornighetsnivåer. Om du till exempel vill ange dem på sessionsnivå kan du köra följande instruktioner:
-- Set the parameters
SET max_parallel_workers = 8;
SET max_worker_processes = 8; -- Note: Requires server restart
SET max_parallel_maintenance_workers = 4;
Mer information om andra alternativ för att konfigurera dessa parametrar i Azure Database for PostgreSQL – flexibel server finns i Konfigurera serverparametrar.
Kommentar
Parametern max_worker_processes kräver att en omstart av servern börjar gälla.
Om konfigurationen av dessa parametrar och de tillgängliga resurserna på servern inte tillåter att parallella arbetare startas, faller PostgreSQL automatiskt tillbaka på att skapa indexet i icke-parallelläge.
Konfigurationsparametrar
När du skapar ett diskann
index kan du ange olika parametrar för att styra dess beteende.
Indexparametrar
-
max_neighbors
: Maximalt antal kanter per nod i diagrammet (standardvärdet är 32). Ett högre värde kan förbättra återkallandet upp till en viss punkt. -
l_value_ib
: Söklistans storlek under indexet (standardvärdet är 100). Ett högre värde gör bygget långsammare, men indexet skulle ha högre kvalitet.
CREATE INDEX demo_embedding_diskann_custom_idx ON demo USING diskann (embedding vector_cosine_ops)
WITH (
max_neighbors = 48,
l_value_ib = 100
);
Tilläggsparametrar
diskann.iterative_search
: Styr sökbeteendet.Konfigurationer för
diskann.iterative_search
:relaxed_order
(standard): Låter diskann iterativt söka i grafen i batchar avdiskann.l_value_is
, tills det önskade antalet tupplar, eventuellt begränsat avLIMIT
-satsen, returneras. Kan leda till att resultaten är ur ordning.strict_order
: På liknande sättrelaxed_order
kan diskann iterativt söka i grafen tills det önskade antalet tupplar returneras. Det säkerställer dock att resultaten returneras i strikt ordning sorterade efter avstånd.off
: Använder icke-iterativa sökfunktioner, vilket innebär att den försöker hämtadiskann.l_value_is
tupplar i ett steg. Icke-iterativ sökning kan bara returnera maximalt antaldiskann.l_value_is
vektorer för en fråga, oavsettLIMIT
satsen eller antalet tupplar som matchar frågan.
Om du vill ändra sökbeteendet till
strict_order
kör du följande instruktion för alla frågor som körs i den aktuella sessionen:SET diskann.iterative_search TO 'strict_order';
Om du vill ändra den så att den bara påverkar alla frågor som körs i den aktuella transaktionen kör du följande instruktion:
BEGIN; SET LOCAL diskann.iterative_search TO 'strict_order'; -- All your queries COMMIT;
diskann.l_value_is
: L-värde för indexgenomsökning (standardvärdet är 100). Att öka värdet förbättrar minnet, men kan göra sökningar långsammare.Om du vill ändra L-värdet för indexgenomsökning till 20 kör du följande instruktion för alla frågor som körs i den aktuella sessionen:
SET diskann.l_value_is TO 20;
Om du vill ändra den så att den bara påverkar alla frågor som körs i den aktuella transaktionen kör du följande instruktion:
BEGIN; SET LOCAL diskann.l_value_is TO 20; -- All your queries COMMIT;
Rekommenderad konfiguration av parametrar
Datamängdens storlek (rader) | Parametertyp | Namn | Rekommenderat värde |
---|---|---|---|
<1M | Indexversion | l_value_ib |
100 |
<1M | Indexuppbyggnad | max_neighbors |
32 |
<1 miljon | Sökningstid | diskann.l_value_is |
100 |
1M-50M | Indexbygg | l_value_ib |
100 |
1M-50M | Indexversion | max_neighbors |
64 |
1M-50M | Frågetid | diskann.l_value_is |
100 |
>50M | Indexuppbyggnad | l_value_ib |
100 |
>50M | Indexbyggande | max_neighbors |
96 |
>50M | Sökningstid | diskann.l_value_is |
100 |
Kommentar
Dessa parametrar kan variera beroende på den specifika datamängden och användningsfallet. Användare kan behöva experimentera med olika parametervärden för att hitta de optimala inställningarna för sitt specifika scenario.
Förlopp för CREATE INDEX och REINDEX
Med PostgreSQL 12 och senare kan du använda pg_stat_progress_create_index
för att kontrollera förloppet för åtgärderna CREATE INDEX eller REINDEX.
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
Mer information om de möjliga faser genom vilka en CREATE INDEX- eller REINDEX-åtgärd går igenom finns i SKAPA INDEX-faser.
Välja funktionen för indexåtkomst
Med vektortypen kan du utföra tre typer av sökningar på de lagrade vektorerna. Du måste välja rätt åtkomstfunktion för ditt index, så att databasen kan tänka på ditt index när du kör dina frågor.
pg_diskann
stöder följande avståndsoperatorer
-
vector_l2_ops
:<->
Euklidiska avstånd -
vector_cosine_ops
:<=>
Cosinnavstånd -
vector_ip_ops
:<#>
Inre produkt
Felsökning
Fel: diskann index needs to be upgraded to version 2...
:
När du stöter på det här felet kan du lösa det genom att:
Exekverar
REINDEX
- ellerREDINDEX CONCURRENTLY
-instruktionen på indexet.Eftersom
REINDEX
det kan ta lång tid tillhandahåller tillägget även en användardefinierad funktion med namnetupgrade_diskann_index()
, som uppgraderar indexet snabbare när det är möjligt.Om du vill uppgradera indexet kör du följande instruktion:
SELECT upgrade_diskann_index('demo_embedding_diskann_custom_idx');
Om du vill uppgradera alla diskann-index i databasen till den aktuella versionen kör du följande instruktion:
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';