Algoritmi de indexare aproximativă: HNSW și IVF (IVFFlat) în Baze de Date Vectoriale & Căutare Semantică

Cum funcționează indecșii aproximativi HNSW (grafuri ierarhice) și IVF (liste de clustere) și ce parametri controlează compromisul dintre viteză și recall.

Sintaxă & interogare
# Parametri HNSW și valori implicite
                  pgvector             Qdrant                 Chroma
M (conexiuni)     m = 16               m = 16                 max_neighbors = 16
construcție       ef_construction = 64 ef_construct = 100     ef_construction = 100
căutare           hnsw.ef_search = 40  hnsw_ef = ef_construct ef_search = 100

# IVF: lists (clustere) la construcție, probes (clustere verificate) la interogare

Căutarea exactă (k-NN) compară interogarea cu fiecare vector. pgvector face implicit căutare exactă, cu recall perfect; un index aproximativ (ANN) renunță la o parte din recall pentru viteză, iar rezultatele pot diferi de cele exacte. Pragul de la care merită un index depinde de volum, dimensiune și latența cerută; Qdrant, de exemplu, folosește singur scanarea completă când filtrul lasă puține puncte (full_scan_threshold, implicit 10.000 KB).

HNSW (Hierarchical Navigable Small World), propus de Malkov și Yashunin, construiește o ierarhie de grafuri de proximitate. Nivelul maxim al fiecărui element se alege aleator, cu probabilitate care scade exponențial, deci straturile de sus sunt rare și servesc la navigare, iar căutarea coboară strat cu strat. Parametrii sunt M (numărul de conexiuni per nod), lista de candidați la construcție (ef_construction) și lista de candidați la căutare (ef); valori mai mari cresc recall-ul și costul în memorie sau timp.

IVF (inverted file) împarte vectorii în liste (clustere) și caută doar în listele cele mai apropiate de interogare; IVFFlat păstrează vectorii necomprimați în liste. Indexul cu fișier inversat apare, împreună cu cuantizarea pe produs, în Jégou, Douze și Schmid, 2011. În pgvector, IVFFlat se construiește mai repede și ocupă mai puțină memorie decât HNSW, dar are un raport viteză–recall mai slab și trebuie creat după ce tabelul are date.

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
M / m Numărul maxim de conexiuni per nod (pgvector: per strat). Mai mare = recall mai bun, mai multă memorie, construcție mai lentă.
ef_construction / ef_construct Mărimea listei de candidați la construcția grafului. Mai mare = graf de calitate mai bună, construcție mai lentă.
ef / ef_search / hnsw_ef Mărimea listei de candidați la căutare; trebuie să fie cel puțin cât numărul de rezultate cerute. Se poate schimba per interogare.
lists (IVFFlat) Numărul de liste. pgvector sugerează ca punct de pornire rows / 1000 până la 1 milion de rânduri și sqrt(rows) peste.
probes (IVFFlat) Câte liste se verifică la interogare (implicit 1 în pgvector); punct de pornire sqrt(lists).

Exemple practice și scenarii reale

Exemplul 1: HNSW în Qdrant

hnsw_config=models.HnswConfigDiff(m=16, ef_construct=100)

Exemplul 2: HNSW și IVFFlat în pgvector

CREATE INDEX ON documente USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);
SET hnsw.ef_search = 100;

CREATE INDEX ON documente USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
SET ivfflat.probes = 10;

Exemplul 3: ef la interogare în Qdrant

client.query_points(
    collection_name="articole",
    query=vector_intrebare,
    search_params=models.SearchParams(hnsw_ef=128),
    limit=10,
)

Greșeli frecvente și capcane

  • Creezi un index IVFFlat pe un tabel gol. Listele se calculează din datele existente la creare; documentația pgvector cere crearea după ce tabelul are date.
  • Ceri mai multe rezultate decât ef. Cu hnsw.ef_search = 40 (implicit în pgvector), o interogare cu LIMIT 100 nu poate întoarce 100 de rânduri din index.
  • Măsori doar latența. Verifică și recall-ul față de căutarea exactă pe un eșantion de interogări, când schimbi parametrii.

Noțiuni și module înrudite

Învață AI • Comunitate & Q&A

Întrebări & Exemple practice: Algoritmi de indexare aproximativă: HNSW și IVF (IVFFlat)

Ai o întrebare despre Algoritmi de indexare aproximativă: HNSW și IVF (IVFFlat) sau ai descoperit un truc, prompt sau fragment de cod util? Distribuie-l cu ceilalți membri ai comunității!

🤖

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau resurse pentru această pagină. Dacă ai testat un prompt sau ai un snippet util, adaugă-l mai jos pentru comunitate.

Comunitate AI Adaugă o întrebare sau distribuie un cod / prompt

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.