ЁЯПГ рдзрдбрд╛ 04 тАФ Nearest neighbors: рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рд╡рд┐рдЪрд╛рд░рдгреЗ рд╡рд┐рд░реБрджреНрдз shortcut рдирдХрд╛рд╢рд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 04 ┬╖ рдорд╛рдЧреЗ: lesson-03-similarity ┬╖ рдкреБрдвреЗ: lesson-05-build-a-vector-db
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ03, рдЖрдгрд┐ scaling рдЪреА рдЧреЛрд╖реНрдЯ: exact kNN, рддреНрдпрд╛рд▓рд╛ рдЖрдбрд╡реА рдпреЗрдгрд╛рд░реА рднрд┐рдВрдд, рдЖрдгрд┐ рджрд╣рд╛ рд▓рд╛рдЦ рдЬрд╛рдЧрд╛рдВрдЪреЗ halls milliseconds рдордзреНрдпреЗ рд╢реЛрдзрдгреНрдпрд╛рдЬреЛрдЧреЗ рдХрд░рдгрд╛рд░реЗ ANN indexes (HNSW, IVF).
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
"рдорд╛рдЭреНрдпрд╛рд╕рд╛рд░рдЦреА рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рдЕрд╕рд▓реЗрд▓реА 5 рдореБрд▓реЗ рд╢реЛрдзрд╛."
рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдкрджреНрдзрдд ЁЯЪ╢ (brute-force kNN, рдЖрдкрд▓рд╛ toy рд╣реЗрдЪ рдХрд░рддреЛ): hall рдордзрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рдХрдбреЗ рдЬрд╛, рддреБрд▓рдирд╛ рдХрд░рд╛, рд╕рд░реНрд╡реЛрддреНрддрдо 5 рдареЗрд╡рд╛. рдкреВрд░реНрдгрдкрдгреЗ рдмрд░реЛрдмрд░ тАФ рдЖрдгрд┐ рдкреВрд░реНрдгрдкрдгреЗ linear: 7 рдореБрд▓реЗ, рдХреНрд╖рдгрд╛рдд; 7 million рдореБрд▓реЗ ├Ч рдкреНрд░рддреНрдпреЗрдХреА 1,000 рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХтАж рддреБрдордЪреА query рдореНрд╣рд╛рддрд╛рд░реА рд╣реЛрдКрди рдорд░рддреЗ. рд╣реАрдЪ рднрд┐рдВрдд.
Shortcut рдирдХрд╛рд╢рд╛ ЁЯЧ║я╕П (ANN тАФ approximate nearest neighbors): hall рдЧреБрдкрдЪреВрдк рд╕реНрд╡рддрдГрдЪреА рдорд╛рдВрдбрдгреА рдХрд░рддреЛ:
- HNSW тАФ рдореИрддреНрд░реАрдЪрд╛ рдирдХрд╛рд╢рд╛ ЁЯСЛ: рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рд▓рд╛ рдХрд╛рд╣реА рд╢реЗрдЬрд╛рд░реА рдорд╛рд╣реАрдд рдЕрд╕рддрд╛рдд, рдЖрдгрд┐ рдХрд╛рд╣реА рдореБрд▓рд╛рдВрдЪреЗ hall рдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рджреВрд░рдЪреЗ рдкрддреНрд░рдорд┐рддреНрд░ рдЕрд╕рддрд╛рдд. рддреБрдордЪрд╛ рдЧрдЯ рд╢реЛрдзрд╛рдпрд▓рд╛: рдХреБрдареВрдирд╣реА рд╕реБрд░реБрд╡рд╛рдд рдХрд░рд╛, рд▓реЛрднреАрдкрдгреЗ рдЬрд╛рд╕реНрдд рд╕рд╛рд░рдЦреНрдпрд╛ рдореБрд▓рд╛рдВрдХрдбреЗ рдЙрдбреНрдпрд╛ рдорд╛рд░рд╛ тАФ рдЖрдзреА express рдЙрдбреНрдпрд╛ (рдкрддреНрд░рдорд┐рддреНрд░), рд╢реЗрд╡рдЯреА рдЬрд╡рд│рдЪреНрдпрд╛ рдЙрдбреНрдпрд╛. рд▓рд╛рдЦреЛ рд╣рд╕реНрддрд╛рдВрджреЛрд▓рдирд╛рдВрдРрд╡рдЬреА рд╕рд╛рдзрд╛рд░рдг log рдЗрддрдХреНрдпрд╛ рдЙрдбреНрдпрд╛. (рдкреНрд░рд╕рд┐рджреНрдз "six degrees" small-world рдпреБрдХреНрддреА, engineering рдХрд░реВрди рдмрдирд╡рд▓реЗрд▓реА.)
- IVF тАФ рд╡рд╕реНрддреНрдпрд╛ ЁЯПШя╕П: hall рдЪреЗ рдЖрдзреАрдЪ districts рдордзреНрдпреЗ cluster рдХрд░рд╛; query рд▓рд╛ рдЬрд╛рдЧрд╛ рджреНрдпрд╛, рдлрдХреНрдд рдЬрд╡рд│рдЪреЗ рдХрд╛рд╣реА districts рд╢реЛрдзрд╛. рд╕реЛрдкреЗ, memory рд▓рд╛ рд╕реЛрдпреАрдЪреЗ; рд╕реАрдореЗрдЪреНрдпрд╛ рдЕрдЧрджреА рдкрд▓реАрдХрдбреЗ рдЙрднрд╛ рдЕрд╕рд▓реЗрд▓рд╛ рдорд┐рддреНрд░ рдЪреБрдХреВ рд╢рдХрддреЛ (рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬрд╛рд╕реНрдд districts рддрдкрд╛рд╕рд╛).
рд╡реЗрдЧрд╛рдЪреА рдХрд┐рдВрдордд: approximate. рдирдХрд╛рд╢рд╛рдХрдбреВрди рдПрдЦрд╛рджрд╛ рдЦрд░рд╛ рд╢реЗрдЬрд╛рд░реА рдЪреБрдХреВ рд╢рдХрддреЛ тАФ рд╣реЗ recall рдиреЗ рдореЛрдЬрд▓реЗ рдЬрд╛рддреЗ ("рдЦрд▒реНрдпрд╛ top-10 рдкреИрдХреА рдЖрдкрдг рдХрд┐рддреА рдкрд░рдд рджрд┐рд▓реЗ?"). рдЦрд░реЗ systems рдПрдХ рдиреЙрдм рдлрд┐рд░рд╡рддрд╛рдд: рдЬрд╛рд╕реНрдд рдореЗрд╣рдирдд тЖФ рдЬрд╛рд╕реНрдд recall. ANN рдереЛрдбрд╛ recall рджреЗрдКрди рдЦреВрдк рд╡реЗрдЧрд╡рд╛рди search рдорд┐рд│рд╡рддреЗ тАФ speed тЖФ recall рдЪрд╛ рдиреЙрдм рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ data рд╡рд░ tune рдХрд░рд╛ тАФ рдЖрдгрд┐ RAG рд╕рд╛рдареА, рдЬрд╡рд│рдЬрд╡рд│ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдмрд░реЛрдмрд░ рдпреЗрдгрд╛рд░рд╛ page-finder рдкрд░рд┐рдкреВрд░реНрдгрдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│рд╛ рдУрд│рдЦреВрд╣реА рдпреЗрдд рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
q["тЭУ query seat"]
subgraph brute["ЁЯЪ╢ brute force - exact kNN"]
b1["compare with ALL N seats<br/>N=7: instant ┬╖ N=7M: ЁЯТА"]
end
subgraph hnsw["ЁЯЧ║я╕П HNSW - the friendship map"]
h1["hop: pen-pal jumps first,<br/>local hops last тЖТ log-ish steps"]
end
subgraph ivf["ЁЯПШя╕П IVF - the neighborhoods"]
i1["search only the nearest<br/>few districts"]
end
r["ЁЯОп top-k ┬╖ recall dial:<br/>speed тЖФ % of true neighbors found"]
q --> brute --> r
q --> hnsw --> r
q --> ivf --> r
тЭУ рдХрд╛рдп
Vector database тЙа vector index. Vector database рдореНрд╣рдгрдЬреЗ storage-рдЖрдгрд┐-query system тАФ рдЬрд╛рдЧрд╛, stickers, filter, top-k (рдзрдбрд╛ 05 рдЕрд╕рд╛ рдПрдХ рдмрдирд╡рддреЛ). HNSW рдХрд┐рдВрд╡рд╛ IVF рд╣реА рддреНрдпрд╛ system рдЪреНрдпрд╛ рдЖрддрд▓реА indexing/search рд░рдгрдиреАрддреА рдЖрд╣реЗ. Database рдЖрдкрд▓рд╛ index рдмрджрд▓реВ рд╢рдХрддреЛ; рдиреБрд╕рддрд╛ index рдореНрд╣рдгрдЬреЗ database рдирд╛рд╣реА.
kNN (exact) рд╡рд┐рд░реБрджреНрдз ANN (approximate): рдЕрдЪреВрдХрддрд╛ рд╡рд┐рд░реБрджреНрдз scale. ~100k vectors рдкреЗрдХреНрд╖рд╛ рдХрдореА рдЕрд╕рддреАрд▓ рддрд░ рдЖрдзреБрдирд┐рдХ hardware рд╡рд░ brute force рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рдкреБрд░реЗрд╕рд╛ рдЕрд╕рддреЛ тАФ рдПрдХрд╛ рд╡рд░реНрдЧрд╛рд╕рд╛рдареА рдирдХрд╛рд╢рд╛ рд╡рд┐рдХрдд рдШреЗрдК рдирдХрд╛. ЁЯШД
HNSW (Hierarchical Navigable Small World): рдерд░рд╛рдВрдЪрд╛ graph; parameters
M(рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рдЪреЗ рдорд┐рддреНрд░) рдЖрдгрд┐ef(search рдЪреА рдореЗрд╣рдирдд тАФ recall рдЪрд╛ рдиреЙрдм). рдмрд╣реБрддреЗрдХ рдЖрдзреБрдирд┐рдХ vector DBs рдордзрд▓реЗ default engine.IVF (inverted file): k-means districts;
nprobe= рдХрд┐рддреА districts рддрдкрд╛рд╕рд╛рдпрдЪреЗ. рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ compression (PQ) рд╕реЛрдмрдд рдЬреЛрдбрд▓реЗ рдЬрд╛рддреЗ тАФ RAM рдордзреНрдпреЗ рдорд╛рд╡рд╛рд╡реЗ рдореНрд╣рдгреВрди рдЬрд╛рдЧрд╛ рдвреЛрдмрд│ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░рд╛рдВрд╕рд╛рд░рдЦреНрдпрд╛ рд╕рд╛рдард╡рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд; рдЕрдВрддрд┐рдо рдЙрдореЗрджрд╡рд╛рд░рд╛рдВрдЪреЗ рдЕрдЪреВрдХ rerank рдХрд░рд╛.Recall@k = рдкреНрд░рддреНрдпреЗрдХ ANN benchmark рд╕рд╛рдВрдЧрддреЛ рддреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХрдкрдгрд╛рдЪрд╛ metric. Recall рдЪреНрдпрд╛ рдЖрдХрдбреНрдпрд╛рдВрд╢рд┐рд╡рд╛рдп speed рдЪреЗ рдЖрдХрдбреЗ рдореНрд╣рдгрдЬреЗ marketing.
рдЖрдкрд▓рд╛ toy рдореБрджреНрджрд╛рдо brute-force рдареЗрд╡рд▓рд╛ рдЖрд╣реЗ тАФ рддрдкрд╛рд╕рддрд╛ рди рдпреЗрдгрд╛рд▒реНрдпрд╛ graph рдкреЗрдХреНрд╖рд╛ рд╡рд╛рдЪрддрд╛ рдпреЗрдгрд╛рд▒реНрдпрд╛ 70 рдУрд│реА рдЬрд╛рд╕реНрдд рдЪрд╛рдВрдЧрд▓реНрдпрд╛. рдХреЛрдгрддреНрдпрд╛ products рдордзреНрдпреЗ рдХреЛрдгрддрд╛ index рдЖрд╣реЗ рддреЗ рдзрдбрд╛ 08 рд╕рд╛рдВрдЧрддреЛ, рдореНрд╣рдгрдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рддреЛ рдХрдзреАрдЪ рд╕реНрд╡рддрдГ рдмрдирд╡рд╛рд╡рд╛ рд▓рд╛рдЧрдд рдирд╛рд╣реА.
ЁЯдФ рдХрд╛
рд╣рд╛ рдзрдбрд╛ рдореНрд╣рдгрдЬреЗ "рд╣рд╛ database рдХрд╛ рдЖрд╣реЗ, for-loop рдХрд╛ рдирд╛рд╣реА" рдпрд╛ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рд╕рдВрдкреВрд░реНрдг рдЙрддреНрддрд░ тАФ for-loop рдмрд░реЛрдмрд░рдЪ рдЖрд╣реЗ, рдлрдХреНрдд рддреЛ scale рд╣реЛрдд рдирд╛рд╣реА, рдЖрдгрд┐ index рд░рдЪрдирд╛ рд╣реЗрдЪ product рдЖрд╣реЗ. Vendor benchmarks рд╕рд╛рдареА рд╣рд╛ рддреБрдордЪрд╛ рдерд╛рдкрд╛-рдУрд│рдЦрдгрд╛рд░рд╛ рдпрдВрддреНрд░ рдкрдг рдЖрд╣реЗ: "рдХреЛрдгрддреНрдпрд╛ recall рд╡рд░?" рдЕрд╕реЗ рд╡рд┐рдЪрд╛рд░рд╛ рдЖрдгрд┐ рдЦреЛрд▓реА рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╣реЛрддрд╛рдирд╛ рдкрд╛рд╣рд╛.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ тАФ рднрд┐рдВрдд рдЕрдиреБрднрд╡рд╛
python3 - <<'EOF'
import sys, time, random; sys.path.insert(0,'vectordb')
from vectordb import MiniVectorDB
words = ['robot','student','pizza','library','class','lunch','book','teacher']
db = MiniVectorDB()
for i in range(20000):
db.add(f"d{i}", " ".join(random.choices(words, k=6)))
t = time.time()
db.search("robot library book", k=5)
print(f"brute-force over {len(db):,} chunks: {(time.time()-t)*1000:.0f} ms")
print("now imagine 7 million ├Ч 1536 dims тАФ THAT'S why HNSW exists ЁЯЧ║я╕П")
EOF
тПня╕П рдкреБрдвреЗ
рдпрдВрддреНрд░ рдЙрдШрдбрд╛: vectordb.py, рдкреНрд░рддреНрдпреЗрдХ рдУрд│ тАФ рдЖрдгрд┐ рддреНрдпрд╛рдд рддреБрдордЪреА рдкрд╣рд┐рд▓реА рднрд░.
git checkout lesson-05-build-a-vector-db