Sdílet prostřednictvím


Povolení a používání rozšíření DiskANN

DiskANN je škálovatelný přibližný vyhledávací algoritmus nejbližšího souseda pro efektivní vektorové vyhledávání v libovolném měřítku. Nabízí vysokou úspěšnost, vysoký počet dotazů za sekundu a nízkou latenci dotazů, a to i pro datové sady obsahující miliardy bodů. Díky těmto vlastnostem je výkonný nástroj pro zpracování velkých objemů dat.

Chcete-li se dozvědět více o DiskANN, přečtěte si DiskANN: Vektorové vyhledávání pro vyhledávání a doporučování ve webovém rozsahu.

Rozšíření pg_diskann přidává podporu pro použití DiskANN pro efektivní indexování vektorů a vyhledávání.

Povolení pg_diskann

Pokud chcete rozšíření použít na instanci flexibilního pg_diskann serveru Azure Database for PostgreSQL, musíte povolit rozšíření na úrovni instance. Pak musíte vytvořit rozšíření pro každou databázi, ve které chcete používat funkce poskytované rozšířením.

Vzhledem k tomu, že pg_diskann má závislost na rozšíření vector, měli byste povolit a vytvořit rozšíření ve stejné databázi a poté spustit následující příkaz:

CREATE EXTENSION IF NOT EXISTS pg_diskann;

Nebo můžete explicitně přeskočit povolení a vytvoření vector rozšíření a místo toho spustit předchozí příkaz připojující klauzuli CASCADE . Tato klauzule PostgreSQL implicitně spustí CREATE EXTENSION na rozšíření, na kterém závisí. Provedete to pomocí následujícího příkazu:

CREATE EXTENSION IF NOT EXISTS pg_diskann CASCADE;

Pokud chcete odstranit rozšíření z databáze, ke které jste právě připojeni, spusťte následující příkaz:

DROP EXTENSION IF EXISTS pg_diskann;

Použití metody přístupu k indexu diskann

Po instalaci rozšíření můžete vytvořit diskann index ve sloupci tabulky, který obsahuje vektorová data. Pokud například chcete vytvořit index ve embedding sloupci demo tabulky, použijte následující příkaz:

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)

Po vytvoření indexu můžete spouštět dotazy, abyste našli nejbližší sousedy.

Následující dotaz najde 5 nejbližších sousedů vektoru [2.0, 3.0, 4.0]:

SELECT id, embedding
FROM demo
ORDER BY embedding <=> '[2.0, 3.0, 4.0]'
LIMIT 5;

Postgres se automaticky rozhodne, kdy se má použít index DiskANN. Pokud se rozhodnete nepoužívat index ve scénáři, ve kterém ho chcete použít, spusťte následující příkaz:

-- Explicit Transcation block to force use for DiskANN index.

BEGIN;
SET LOCAL enable_seqscan TO OFF;
-- Similarity search queries
COMMIT;

Důležité

Nastavení možnosti enable_seqscan na vypnuto odrazuje plánovač od používání plánu s postupným prohledáváním, pokud jsou k dispozici jiné metody. Protože je zakázán pomocí SET LOCAL příkazu, nastavení se projeví pouze pro aktuální transakci. Po provedení COMMIT nebo ROLLBACK se nastavení na úrovni relace projeví znovu. Všimněte si, že pokud dotaz zahrnuje jiné tabulky, nastavení také nedoporučuje používat sekvenční kontroly ve všech z nich.

Efektivní škálování pomocí kvantování (Preview)

DiskANN používá kvantování produktů (PQ) k výraznému snížení využití paměti vektorů. Na rozdíl od jiných technik kvantování může algoritmus PQ komprimovat vektory efektivněji, což výrazně zlepšuje výkon.  DiskANN využívající PQ může uchovávat více dat v paměti, což snižuje potřebu přístupu k pomalejšímu úložišti a také menší výpočetní výkon při porovnávání komprimovaných vektorů. Výsledkem je lepší výkon a výrazné úspory nákladů při práci s většími objemy dat (>1 milion řádků).

Důležité

Podpora kvantování produktů v DiskANN je dostupná od pg_diskann verze 0.6 a vyšší.

Pokud chcete zmenšit velikost indexu a přizpůsobit více dat do paměti, můžete využít PQ:

CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann(embedding vector_cosine_ops) 
WITH(
    product_quantized=true
    );    

Zlepšení přesnosti při použití PQ s přehodnoceným pořadím vektorů

Změna pořadí s úplnými vektory je technika používaná v přibližných vyhledávacích systémech nejbližšího souseda (ANN), jako je DiskANN s kvantací produktu (PQ), aby se zlepšila přesnost výsledků tak, že změníte pořadí kandidátů načtených podle prvních N pomocí původních nekomprimovaných vektorů (úplná přesnost). Tato technika přehodnotování je založena čistě na přesných metrikách podobnosti vektorů (např. kosinus podobnosti nebo euklidovské vzdálenosti). Tato technika není stejná jako změna pořadí pomocí modelu řazení.

Pro vyrovnávání rychlosti a přesnosti při vyhledávání vektorové podobnosti je možné při dotazování pomocí DiskANN a kvantování produktů implementovat strategii dvoustupňového přehodnotování, aby se zlepšila přesnost.

  1. Počáteční přibližné hledání: Vnitřní dotaz používá DiskANN k načtení prvních 50 nejbližších sousedů na základě kosinusové vzdálenosti mezi uloženými vkládáními a vektorem dotazu. Tento krok je rychlý a efektivní a využívá možnosti indexování DiskANN.

  2. Přesné pořadí: Vnější dotaz změní pořadí těchto 50 výsledků podle jejich skutečné vypočítané vzdálenosti a vrátí prvních 10 nejrelevavantnějších shod:

Tady je příklad opětovného pořadí pomocí tohoto 2 kroku:

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;

Poznámka:

%s by měl být nahrazen vektorem dotazu. Pomocí azure_ai můžete vytvořit vektor dotazu přímo v Postgresu.

Tento přístup vyrovnává rychlost (prostřednictvím přibližného vyhledávání) a přesnosti (přes úplné řazení vektorů), zajišťuje vysoce kvalitní výsledky bez prohledávání celé datové sady.

Podpora vkládání velkých dimenzí

Pokročilé aplikace generující AI se často spoléhají na vysoce dimenzionální modely vkládání, jako je například vkládání textu a 3 velké , a dosahuje tak vyšší přesnosti. Tradiční metody indexování, jako je HNSW v pgvectoru , jsou ale omezené na vektory s až 2 000 dimenzemi, což omezuje použití těchto výkonných modelů.

Počínaje pg_diskann v0.6 a novějším diskANN nyní podporuje indexovací vektory s až 16 000 dimenzemi, čímž se výrazně rozšiřuje rozsah pro úlohy umělé inteligence s vysokou přesností.

Důležité

Aby bylo možné využít podporu vysokého rozměru, musí být kvantování produktu zapnuté.

Doporučená nastavení:

  • product_quantized: Nastavit na true
  • pq_param_num_chunks: Nastavte na třetinu dimenze vkládání pro optimální výkon.
  • pq_param_training_samples: Automaticky určeno na základě velikosti tabulky, pokud není explicitně nastaveno.

Toto vylepšení umožňuje škálovatelné a efektivní vyhledávání ve velkých vektorových datových sadách při zachování vysoké úplnosti a přesnosti.

Zrychlení sestavení indexu

Existuje několik způsobů, jak doporučujeme vylepšit časy sestavení indexu.

Použití více paměti

Pokud chcete urychlit vytvoření indexu, můžete zvýšit paměť přidělenou instanci Postgres pro sestavení indexu. Využití paměti lze zadat pomocí parametru maintenance_work_mem .

-- Set the parameters
SET maintenance_work_mem = '8GB'; -- Depending on your resources

CREATE INDEX Potom příkaz použije zadanou pracovní paměť v závislosti na dostupných prostředcích k sestavení indexu.

CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)

Návod

Během sestavování indexu můžete vertikálně navýšit kapacitu prostředků paměti, aby se zlepšila rychlost indexování, a po dokončení indexování zase snížit kapacitu.

Použití paralelizace

K urychlení vytváření indexu můžete použít paralelní pracovní procesy. Počet pracovníků lze zadat pomocí parallel_workers parametru úložiště v příkazu CREATE TABLE při vytváření tabulky. Je možné ho později upravit pomocí SET klauzule ALTER TABLE příkazu.

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 Potom příkaz použije zadaný počet paralelních pracovních procesů v závislosti na dostupných prostředcích k sestavení indexu.

CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)

Důležité

Proces vůdce se nemůže účastnit paralelního vytváření indexů.

Pokud chcete vytvořit index pomocí paralelních pracovních procesů, musíte také nastavit max_parallel_workersmax_worker_processes, a max_parallel_maintenance_workers parametry odpovídajícím způsobem. Další informace o těchto parametrech najdete v parametrech, které řídí využití prostředků a asynchronní chování.

Tyto parametry můžete nastavit na různých úrovních členitosti. Pokud je například chcete nastavit na úrovni relace, můžete spustit následující příkazy:

-- Set the parameters
SET max_parallel_workers = 8;
SET max_worker_processes = 8; -- Note: Requires server restart
SET max_parallel_maintenance_workers = 4;

Další informace o dalších možnostech konfigurace těchto parametrů na flexibilním serveru Azure Database for PostgreSQL najdete v tématu Konfigurace parametrů serveru.

Poznámka:

Parametr max_worker_processes vyžaduje, aby se projevilo restartování serveru.

Pokud konfigurace těchto parametrů a dostupných prostředků na serveru nepovolují spouštění paralelních pracovních procesů, PostgreSQL se automaticky vrátí k vytvoření indexu v neparallelovém režimu.

Konfigurační parametry

Při vytváření indexu diskann můžete zadat různé parametry pro řízení jeho chování.

Parametry indexu

  • max_neighbors: Maximální počet hran na uzel v grafu (výchozí hodnota je 32). Vyšší hodnota může zlepšit shodu až do určitého bodu.
  • l_value_ib: Velikost vyhledávacího seznamu během sestavení indexu (výchozí hodnota je 100). Vyšší hodnota zpomalí sestavení, ale zvýší kvalitu indexu.
  • product_quantized: Umožňuje kvantování produktů pro efektivnější vyhledávání (výchozí hodnota je false).
  • pq_param_num_chunks: Počet bloků dat pro kvantování produktu (výchozí hodnota je 0). 0 znamená, že se určí automaticky na základě dimenzí vkládání. Doporučuje se použít 1/3 původních dimenzí vkládání.
  • pq_param_training_samples: Počet vektorů pro trénování otočné tabulky PQ (Výchozí hodnota je 0). 0 znamená, že se určí automaticky na základě velikosti tabulky.
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
 );

Parametry rozšíření

  • diskann.iterative_search: Řídí chování hledání.

    Konfigurace pro diskann.iterative_search:

    • relaxed_order (výchozí): Umožňuje diskann iterativně prohledávat graf v dávkách o velikosti diskann.l_value_is, dokud se nezíská požadovaný počet tuplů, možná omezený klauzulí LIMIT. Může to způsobit, že výsledky budou neuspořádané.

    • strict_order: Podobně jako relaxed_order, umožňuje diskann iterativně prohledávat graf, dokud není dosažen požadovaný počet n-tic. Zajišťuje ale, že výsledky budou vráceny v přísném pořadí seřazené podle vzdálenosti.

    • off: Používá neiterativní funkci vyhledávání, což znamená, že se pokusí načíst diskann.l_value_is tuply najednou. Neiterativní vyhledávání může vrátit maximálně diskann.l_value_is vektorů pro dotaz, ať už je jakákoli klauzule LIMIT nebo počet tuplů, které odpovídají dotazu.

    Pokud chcete změnit chování strict_order vyhledávání, spusťte pro všechny dotazy spuštěné v aktuální relaci následující příkaz:

    SET diskann.iterative_search TO 'strict_order';
    

    Pokud ho chcete změnit tak, aby ovlivnil pouze všechny dotazy spuštěné v aktuální transakci, spusťte následující příkaz:

    BEGIN;
    SET LOCAL diskann.iterative_search TO 'strict_order';
    -- All your queries
    COMMIT;
    
  • diskann.l_value_is: Hodnota L pro prohledávání indexů (výchozí hodnota je 100). Zvýšení hodnoty zlepšuje vyhledatelnost, ale může zpomalit dotazy.

    Pokud chcete změnit hodnotu L pro prohledávání indexu na 20, spusťte pro všechny dotazy spuštěné v aktuální relaci následující příkaz:

    SET diskann.l_value_is TO 20;
    

    Pokud ho chcete změnit tak, aby ovlivnil pouze všechny dotazy spuštěné v aktuální transakci, spusťte následující příkaz:

    BEGIN;
    SET LOCAL diskann.l_value_is TO 20;
    -- All your queries
    COMMIT;
    
Velikost datové sady (řádky) Typ parametru Název Doporučená hodnota
<1 milion Sestavení indexu l_value_ib 100
<1 milion Sestavení indexu max_neighbors 32
<1 milion Čas dotazu diskann.l_value_is 100
 
1M-50M Sestavení indexu l_value_ib 100
1M-50M Sestavení indexu max_neighbors 64
1M-50M Sestavení indexu product_quantized true
1M-50M Čas dotazu diskann.l_value_is 100
 
>50 M Sestavení indexu l_value_ib 100
>50 M Sestavení indexu max_neighbors 96
>50 M Sestavení indexu product_quantized true
>50 M Čas dotazu diskann.l_value_is 100

Poznámka:

Tyto parametry se můžou lišit v závislosti na konkrétní datové sadě a případu použití. Uživatelé možná budou muset experimentovat s různými hodnotami parametrů, aby našli optimální nastavení pro svůj konkrétní scénář.

PRŮBĚH PŘÍKAZU CREATE INDEX a REINDEX

S PostgreSQL 12 a novějším můžete zkontrolovat pg_stat_progress_create_index průběh operací CREATE INDEX nebo REINDEX.

SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;

Další informace o možných fázích, kterými prochází operace CREATE INDEX nebo REINDEX, najdete ve fázích CREATE INDEX.

Výběr funkce pro přístup k indexu

Typ vektoru umožňuje provádět tři typy hledání u uložených vektorů. Při provádění dotazů je potřeba vybrat správnou přístupová funkce indexu, aby databáze při provádění dotazů zvážila váš index.

pg_diskann podporuje následující operátory vzdálenosti.

  • vector_l2_ops: <-> Euklidská vzdálenost
  • vector_cosine_ops: <=> Kosinus vzdálenost
  • vector_ip_ops: <#> Vnitřní produkt

Řešení problémů

Chyba: assertion left == right failed left: 40 right: 0:

  • Verze ga diskANN, v0.6.x zavádí zásadní změny ve formátu metadat indexu. Indexy vytvořené pomocí v0.5.x nejsou kompatibilní s operacemi vložení v0.6.x. Při pokusu o vložení do tabulky se zastaralým indexem dojde k chybě, i když se index zobrazí jako platný.

  • Když narazíte na tuto chybu, můžete ji vyřešit takto:

    • Možnost 1: Spuštění příkazu REINDEX nebo REDINDEX CONCURRENTLY na indexu.

    • Možnost 2: Opětovné sestavení indexu

      DROP INDEX your_index_name;
      CREATE INDEX your_index_name ON your_table USING diskann(your_vector_column vector_cosine_ops);
      
      

Chyba: diskann index needs to be upgraded to version 2...:

  • Když narazíte na tuto chybu, můžete ji vyřešit takto:
    • Možnost 1: Spuštění příkazu REINDEX nebo REDINDEX CONCURRENTLY na indexu.

    • Možnost 2: Vzhledem k tomu REINDEX , že rozšíření může trvat delší dobu, poskytuje také uživatelem definovanou funkci s názvem upgrade_diskann_index(), která upgraduje index rychleji, pokud je to možné.

      Pokud chcete upgradovat index, spusťte následující příkaz:

      SELECT upgrade_diskann_index('demo_embedding_diskann_custom_idx');
      

      Pokud chcete upgradovat všechny indexy diskann v databázi na aktuální verzi, spusťte následující příkaz:

      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';