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. Cuhnsw.ef_search = 40(implicit în pgvector), o interogare cuLIMIT 100nu 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.
Î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.