Dela via


Aktivera och använda DiskANN-tillägget (förhandsversion)

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_workersparametrarna , max_worker_processesoch 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 av diskann.l_value_is, tills det önskade antalet tupplar, eventuellt begränsat av LIMIT -satsen, returneras. Kan leda till att resultaten är ur ordning.

    • strict_order: På liknande sätt relaxed_orderkan 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ämta diskann.l_value_is tupplar i ett steg. Icke-iterativ sökning kan bara returnera maximalt antal diskann.l_value_is vektorer för en fråga, oavsett LIMIT 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;
    
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- eller REDINDEX CONCURRENTLY-instruktionen på indexet.

  • Eftersom REINDEX det kan ta lång tid tillhandahåller tillägget även en användardefinierad funktion med namnet upgrade_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';