ЁЯПл The SchoolтА║ЁЯЧ║я╕П Vector DatabasesтА║ЁЯФм рдзрдбрд╛ 05 тАФ Vector DB рдмрдирд╡рд╛: 70 рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдУрд│реА
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯФм рдзрдбрд╛ 05 тАФ Vector DB рдмрдирд╡рд╛: 70 рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдУрд│реА

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдорд╛рдЧреЗ: lesson-04-nearest-neighbors ┬╖ рдкреБрдвреЗ: lesson-06-chunking-metadata


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ04, рдЖрдгрд┐ vectordb/vectordb.py рдЪреЗ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдд рд╡рд╛рдЪрди тАФ рдЖрддрд╛рдкрд░реНрдпрдВрддрдЪрд╛ рд╕рдВрдкреВрд░реНрдг course, рдПрдХрд╛ рдУрд│ рдХреНрд░рдорд╛рдВрдХрд╛рд╡рд░ рд╕рд╛рдкрдбреЗрд▓ рдЕрд╕рд╛ тАФ рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рднрд░реА.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

File рдЙрдШрдбрд╛. рдзрдбреНрдпрд╛рдВрд╢реА рдЬреБрд│рдгрд╛рд░реЗ рддреАрди рдХреНрд░рдорд╛рдВрдХрд┐рдд рднрд╛рдЧ:

  1. TEXT тЖТ VECTOR ЁЯФв (рдзрдбрд╛ 02): _tokens (lowercase рд╢рдмреНрдж), embed (рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж 256 рдкреИрдХреА рдПрдХрд╛ bucket рдордзреНрдпреЗ hash рдХрд░рд╛, рддреЛ рд╡рд╛рдврд╡рд╛, normalize рдХрд░рд╛). рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реВрдЪрдирд╛ docstring рдордзреНрдпреЗрдЪ рдЖрд╣реЗ: рдпрд╛ function рдЪреНрдпрд╛ рдЬрд╛рдЧреА embedding-model call рдареЗрд╡рд╛ рдЖрдгрд┐ рдмрд╛рдХреА рд╕рдЧрд│реЗ рддрд╕реЗрдЪ рд░рд╛рд╣рддреЗ. рд╣реА рдПрдХрд╛ function рдЪреА рд╕реАрдорд╛ рдореНрд╣рдгрдЬреЗ industry рдЪреА architecture рдЫреЛрдЯреНрдпрд╛ рд░реВрдкрд╛рдд: embedder рдЖрдгрд┐ store рд╣реА рд╡реЗрдЧрд╡реЗрдЧрд│реА рдХрд╛рдореЗ рдЖрд╣реЗрдд.
  2. SIMILARITY ЁЯУР (рдзрдбрд╛ 03): cosine тАФ dot product рдЪреА рдПрдХ рдУрд│, рдХрд╛рд░рдг normalization рджрд╛рд░рд╛рддрдЪ рдЭрд╛рд▓реЗрд▓реЗ рдЕрд╕рддреЗ (_normalize).
  3. THE DATABASE ЁЯЧДя╕П (рдзрдбреЗ 04+06): class MiniVectorDB тАФ rows (id, vector, text, metadata), add() embed рдХрд░реВрди рд╕рд╛рдард╡рддреЗ, search() рдореНрд╣рдгрдЬреЗ metadata filter рд╕рд╣ brute-force kNN (all(meta.get(k)==v) тАФ рд░рдВрдЧреАрдд stickers рдЪреА рдУрд│; ranking рдЪреНрдпрд╛ рдЖрдзреА filter рдХрд░рдгреЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рддреЗ рдзрдбрд╛ 06 рд╕рдордЬрд╛рд╡рддреЛ).

рдЦрд░реЗ product рдХрд╛рдп рдЬреЛрдбрддреЗ рддреЗ рдкрд╛рд╣рд╛ тАФ рдЖрдгрд┐ рддреНрдпрд╛рддрд▓реЗ рдХрд╛рд╣реАрдЪ рд╕рдВрдХрд▓реНрдкрдирд╛ рдмрджрд▓рдд рдирд╛рд╣реА: persistence (рдЖрдкрд▓рд╛ exit рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рд╡рд┐рд╕рд░рддреЛ!), updates/deletes, ANN index (L04), concurrency, replication (k8s рд╢рд╛рд│рд╛ рд╣рд╛рдд рд╣рд▓рд╡реВрди рдирдорд╕реНрдХрд╛рд░ рдХрд░рддреЗ ЁЯСЛ).

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart TB
    subgraph file["vectordb/vectordb.py тАФ the map"]
        e["1 ЁЯФв embed()<br/>hash words тЖТ 256 dims тЖТ normalize<br/>тЖР swap for a model call HERE"]
        c["2 ЁЯУР cosine()<br/>one line: dot product<br/>(normalize made it cheap)"]
        d["3 ЁЯЧДя╕П MiniVectorDB<br/>add: embed + store rows<br/>search: filter ЁЯП╖я╕П тЖТ score тЖТ sort тЖТ top-k"]
    end
    demo["demo.py: 7 chunks ┬╖ 3 queries ┬╖<br/>1 honest failure ЁЯШм"]
    file --> demo

тЭУ рдХрд╛рдп (рдЪреЛрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рддрдкрд╢реАрд▓)

ЁЯдФ рдХрд╛

рдПрдХрджрд╛ рддреБрдореНрд╣реА рдПрдХ рд╡рд╛рдЪрд▓рд╛ рдХреА "рдЖрдкрдг vector database рд╡рд╛рдкрд░рд╛рд╡рд╛ рдХрд╛?" рд╣рд╛ рд╢рд╛рдВрдд engineering рдкреНрд░рд╢реНрди рд╣реЛрддреЛ: рддреБрдореНрд╣рд╛рд▓рд╛ рддреАрди рдХрд╛рдореЗ рдорд╛рд╣реАрдд рдЕрд╕рддрд╛рдд (embed, рддреБрд▓рдирд╛, рдЖрдгрдгреЗ), рдХреЛрдгрддреЗ рднрд╛рдЧ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╣реЗрдд (рд╡рд░рдЪреЗ рд╕рдЧрд│реЗ) рдЖрдгрд┐ рдХреЛрдгрддреЗ product рдЖрд╣реЗрдд (indexes, scale рд╡рд░ filters, ops) рд╣реЗ рдорд╛рд╣реАрдд рдЕрд╕рддреЗ. Framework docs рдзрд░реНрдордЧреНрд░рдВрде рд░рд╛рд╣рдд рдирд╛рд╣реАрдд, changelogs рдмрдирддрд╛рдд.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ тАФ рджреЛрди рд╕реБрдзрд╛рд░рдгрд╛, рдкреНрд░рддреНрдпреЗрдХреА ~10 рдУрд│реА

# A) persistence: add save(path)/load(path) using json
#    (vectors are just lists тАФ json.dump(self.rows) and back)
# B) delete(doc_id): rows = [r for r in rows if r[0] != doc_id]
#    then re-run demo.py and delete 'lunch-1' тАФ watch query 1's
#    second hit change!
python3 vectordb/demo.py

рдХрд┐рдорд╛рди рд╕реБрдзрд╛рд░рдгрд╛ A рддрд░реА рдкреВрд░реНрдг рдХрд░рд╛ тАФ exit рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рд╕рдЧрд│реЗ рд╡рд┐рд╕рд░рдгрд╛рд░рд╛ database рд╣рд╛ рдЦреВрдк рдкреНрд░рд╛рдорд╛рдгрд┐рдХ toy рдЖрд╣реЗ, рдкрдг рдлрдХреНрдд toy. ЁЯТ╛

тПня╕П рдкреБрдвреЗ

рдХреЛрдгрддреНрдпрд╛рд╣реА index рдкреЗрдХреНрд╖рд╛ рдореЛрдард╛ рджрд░реНрдЬрд╛рдЪрд╛ рд▓реАрд╡реНрд╣рд░: рддреБрдореНрд╣реА рдЖрдд рдХрд╛рдп рдЯрд╛рдХрддрд╛ тАФ chunking, overlap, stickers, рдЖрдгрд┐ hybrid search.

git checkout lesson-06-chunking-metadata

ЁЯФм Lesson 05 тАФ Build a vector DB: 70 honest lines

ЁЯУН You are here: Lesson 05 of 8 ┬╖ Previous: lesson-04-nearest-neighbors ┬╖ Next: lesson-06-chunking-metadata


ЁЯУж What's in this branch

Lessons 01тАУ04, plus the guided read of vectordb/vectordb.py тАФ the whole course so far, findable at a line number тАФ and your first extensions.

ЁЯзТ Explain like I'm 5

Open the file. Three numbered parts, matching the lessons:

  1. TEXT тЖТ VECTOR ЁЯФв (lesson 02): _tokens (lowercase words), embed (hash each word into one of 256 buckets, bump it, normalize). The honest label sits right in the docstring: replace THIS function with an embedding-model call and everything else stays. That one-function boundary is the industry's architecture in miniature: embedder and store are separate jobs.
  2. SIMILARITY ЁЯУР (lesson 03): cosine тАФ one line of dot product, because normalization already happened at the door (_normalize).
  3. THE DATABASE ЁЯЧДя╕П (lessons 04+06): class MiniVectorDB тАФ rows (id, vector, text, metadata), add() embeds-and-stores, search() is brute-force kNN with a metadata filter (all(meta.get(k)==v) тАФ the colored-stickers line, lesson 06 explains why filtering BEFORE ranking matters).

Notice what a real product adds тАФ and that none of it changes the concepts: persistence (ours forgets on exit!), updates/deletes, an ANN index (L04), concurrency, replication (the k8s school waves hello ЁЯСЛ).

ЁЯЧ║я╕П Diagram

flowchart TB
    subgraph file["vectordb/vectordb.py тАФ the map"]
        e["1 ЁЯФв embed()<br/>hash words тЖТ 256 dims тЖТ normalize<br/>тЖР swap for a model call HERE"]
        c["2 ЁЯУР cosine()<br/>one line: dot product<br/>(normalize made it cheap)"]
        d["3 ЁЯЧДя╕П MiniVectorDB<br/>add: embed + store rows<br/>search: filter ЁЯП╖я╕П тЖТ score тЖТ sort тЖТ top-k"]
    end
    demo["demo.py: 7 chunks ┬╖ 3 queries ┬╖<br/>1 honest failure ЁЯШм"]
    file --> demo

тЭУ What (details worth stealing)

ЁЯдФ Why

"Should we use a vector database?" becomes a calm engineering question once you've read one: you know the three jobs (embed, compare, fetch), you know which parts are commodity (all of the above) and which are product (indexes, filters at scale, ops). Framework docs stop being scripture and start being changelogs.

ЁЯзк Try it тАФ two upgrades, ~10 lines each

# A) persistence: add save(path)/load(path) using json
#    (vectors are just lists тАФ json.dump(self.rows) and back)
# B) delete(doc_id): rows = [r for r in rows if r[0] != doc_id]
#    then re-run demo.py and delete 'lunch-1' тАФ watch query 1's
#    second hit change!
python3 vectordb/demo.py

Ship upgrade A at least тАФ a database that forgets everything on exit is a very honest toy, but only a toy. ЁЯТ╛

тПня╕П Next

The quality lever bigger than any index: what you put in тАФ chunking, overlap, stickers, and hybrid search.

git checkout lesson-06-chunking-metadata
тЖР Previousnearest neighborsNext тЖТchunking metadata

This page is the lesson's README from the lesson-05-build-a-vector-db branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.