ЁЯПл The SchoolтА║ЁЯЧ║я╕П Vector DatabasesтА║ЁЯФв рдзрдбрд╛ 02 тАФ Text рддреЗ vectors: рдкреНрд░рддреНрдпреЗрдХ text рд▓рд╛ рдЬрд╛рдЧрд╛ рджреЗрдгреЗ
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯФв рдзрдбрд╛ 02 тАФ Text рддреЗ vectors: рдкреНрд░рддреНрдпреЗрдХ text рд▓рд╛ рдЬрд╛рдЧрд╛ рджреЗрдгреЗ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-why-vector-db ┬╖ рдкреБрдвреЗ: lesson-03-similarity


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

рдзрдбрд╛ 01, рдЖрдгрд┐ рдкреНрд░рд╡реЗрд╢рд╛рдЪрд╛ рд╡рд┐рдзреА: text рдЪреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдВрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░ рдХрд╕реЗ рд╣реЛрддреЗ тАФ рдЖрдкрд▓реНрдпрд╛ toy рдЪреА рдкрджреНрдзрдд, рдЦрд░реА рдкрджреНрдзрдд, рдЖрдгрд┐ рддреНрдпрд╛ рджреЛрдШрд╛рдВрдордзрд▓реА рджрд░реА (рдЬреА рддреБрдореНрд╣реА рдЖрдзреАрдЪ рдореБрджреНрджрд╛рдо рдЕрдкрдпрд╢реА рд╣реЛрддрд╛рдирд╛ рдкрд╛рд╣рд┐рд▓реА рдЖрд╣реЗ).

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

Hall рдордзреНрдпреЗ рдмрд╕рд╛рдпрд▓рд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд▓рд╛рдЧрддрд╛рдд. рддреЗ рджреЗрдгреНрдпрд╛рдЪреНрдпрд╛ рджреЛрди рдкрджреНрдзрддреА:

рдЖрдкрд▓реНрдпрд╛ toy рдЪреА рдкрджреНрдзрдд тАФ рд╢рдмреНрдж рдореЛрдЬрд╛ ЁЯФд (vectordb.py embed()): hall рдордзреНрдпреЗ 256 рджрд┐рд╢рд╛ рдЖрд╣реЗрдд; рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж (hash рдХрд░реВрди) рддреНрдпрд╛рдВрдкреИрдХреА рдПрдХрд╛ рджрд┐рд╢реЗрд▓рд╛ рдзрдХреНрдХрд╛ рджреЗрддреЛ; рд▓рд╛рдВрдм documents рдУрд░рдбреВ рдирдпреЗрдд рдореНрд╣рдгреВрди normalize рдХрд░рд╛. рд╡реЗрдЧрд╡рд╛рди, рдХреЛрдгрддреАрд╣реА рдЬрд╛рджреВ рдирд╛рд╣реА тАФ рдЖрдгрд┐ рдЬрд╡рд│рдЪреЗрдЪ рдкрд╛рд╣рдгрд╛рд░реЗ (nearsighted): рджреЛрди texts рддреЗрд╡реНрд╣рд╛рдЪ рдЬрд╡рд│ рдмрд╕рддрд╛рдд рдЬреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдд рдЕрдХреНрд╖рд░рд╢рдГ рддреЗрдЪ рд╢рдмреНрдж рдЕрд╕рддрд╛рдд. "pupils" рдЖрдгрд┐ "students" рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛рдВрдордзреНрдпреЗ рдмрд╕рддрд╛рдд (demo рдордзрд▓рд╛ 0.00!). рдпрд╛ рдХреБрдЯреБрдВрдмрд╛рдиреЗ тАФ bag-of-words, TF-IDF, BM25 тАФ рдЕрдиреЗрдХ рджрд╢рдХреЗ search рдЪрд╛рд▓рд╡рд▓рд╛ рдЖрдгрд┐ рдЖрдЬрд╣реА hybrid search рдЪрд╛ keyword рдЕрд░реНрдзрд╛ рднрд╛рдЧ рддреЗрдЪ рдЪрд╛рд▓рд╡рддрд╛рдд.

рдЦрд░реА рдкрджреНрдзрдд тАФ рд╕рдЧрд│реЗ рд╡рд╛рдЪрд▓реЗрд▓реНрдпрд╛ model рд▓рд╛ рд╡рд┐рдЪрд╛рд░рд╛ ЁЯза (AI рд╢рд╛рд│рд╛ L02+L04): embedding model тАФ рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд neural network тАФ text рд▓рд╛ рдард░рд╛рд╡реАрдХ рд▓рд╛рдВрдмреАрдЪреНрдпрд╛ vector рдордзреНрдпреЗ рдмрджрд▓рддреЗ (model рдиреБрд╕рд╛рд░ рд╢реЗрдХрдбреЛ рддреЗ рд╣рдЬрд╛рд░реЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ) рдЬрд┐рдереЗ рджрд┐рд╢рд╛рдВрдЪрд╛ рдЕрд░реНрде рдЕрд░реНрде рдЕрд╕рддреЛ: рдЕрдмреНрдЬрд╛рд╡рдзреА рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреВрди рд╢рд┐рдХрд▓реЗрд▓реЗ, рдореНрд╣рдгреВрди "pupils" "students" рдЪреНрдпрд╛ рд╢реЗрдЬрд╛рд░реА рдмрд╕рддреЗ, "refund my order" рд╣реЗ "I want my money back" рдЪреНрдпрд╛ рд╢реЗрдЬрд╛рд░реА, рд╡реЗрдЧрд│реНрдпрд╛ рд╢рдмреНрджрд░рдЪрдиреЗрддрд╣реА рдЖрдгрд┐ рд╡реЗрдЧрд│реНрдпрд╛ рднрд╛рд╖рд╛рдВрдордзреНрдпреЗрд╣реА.

рд╕реБрдВрджрд░ design рддрдереНрдп: рддреБрдореНрд╣реА рдХреЛрдгрддреА рдкрджреНрдзрдд рдирд┐рд╡рдбрд▓реА рдпрд╛рдЪреА database рд▓рд╛ рдкрд░реНрд╡рд╛ рдирд╕рддреЗ. Vectors рдЖрдд, рд╢реЗрдЬрд╛рд░реА рдмрд╛рд╣реЗрд░. рдЖрдкрд▓реЗ embed() рд╣реЗ рдПрдХ function рдЖрд╣реЗ тАФ рддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреА model call рдареЗрд╡рд╛ рдЖрдгрд┐ course рдордзрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЗрддрд░ рдУрд│ рддрд░реАрд╣реА рдЪрд╛рд▓рддреЗ. (рд╣реЗ рд╡реЗрдЧрд│реЗрдкрдг тАФ embedder рд╡рд┐рд░реБрджреНрдз store тАФ рд╣реАрдЪ industry рдЪреА architecture рдкрдг рдЖрд╣реЗ.)

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

flowchart LR
    text["ЁЯУЭ 'Class 3A has twelve students'"]
    subgraph toy["ЁЯФд toy: hashed word counts"]
        h["each word bumps 1 of 256 buckets<br/>тЖТ normalize"]
        lim["ЁЯШм nearsighted: shared WORDS only"]
    end
    subgraph real["ЁЯза real: embedding model"]
        m["trained network тЖТ fixed-size vector<br/>(hundredsтАУthousands of dims) ┬╖ directions = MEANING"]
        win["'pupils' тЙИ 'students' тЬЕ"]
    end
    v["ЁЯЧ║я╕П a seat: [0.12, -0.08, тАж]<br/>the DB takes it from here тАФ<br/>either way"]
    text --> toy --> v
    text --> real --> v

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

Embedder рдирд┐рд╡рдбрдгреЗ рдореНрд╣рдгрдЬреЗрдЪ рддреБрдордЪреНрдпрд╛ product рд╕рд╛рдареА "рд╕рд╛рд░рдЦреЗ" рдпрд╛рдЪрд╛ рдЕрд░реНрде рдирд┐рд╡рдбрдгреЗ тАФ retrieval рдЪреНрдпрд╛ рджрд░реНрдЬрд╛рдЪреА рдХрдорд╛рд▓ рдорд░реНрдпрд╛рджрд╛ рдЗрдереЗ рдард░рддреЗ, database рдордзреНрдпреЗ рдирд╛рд╣реА. рдЖрдгрд┐ toy/рдЦрд░реЗ рдпрд╛рдВрдордзрд▓реА рджрд░реА рдорд╛рд╣реАрдд рдЕрд╕рд▓реА рдХреА рддреБрдореНрд╣реА рджреЛрдиреНрд╣реА рдЪреБрдХрд╛рдВрдкрд╛рд╕реВрди рд╡рд╛рдЪрддрд╛: рд╢рдмреНрдж-vectors рдирд╛ рд╕рдорд╛рдирд╛рд░реНрдереА рд╢рдмреНрдж рд╕рдордЬрддреАрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдгреЗ, рдЖрдгрд┐ рдХрд╛рдорд╛рд▓рд╛ рдлрдХреНрдд рдиреЗрдордХрд╛ keyword match рдкреБрд░реЗрд╕рд╛ рдЕрд╕рддрд╛рдирд╛ model-embedding рдЪрд╛ рдЦрд░реНрдЪ рднрд░рдгреЗ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 vectordb/demo.py     # re-read the ЁЯШм section knowing WHY now
python3 -c "
import sys; sys.path.insert(0,'vectordb')
from vectordb import embed, cosine
print('students vs student :', round(cosine(embed('students'), embed('student')),2))
print('students vs pupils   :', round(cosine(embed('students'), embed('pupils')),2))
"
# even the plural is a different word to a hash! (real embedders handle both)

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

рджреЛрди рдЬрд╛рдЧрд╛ тАФ рддреНрдпрд╛ рдиреЗрдордХреНрдпрд╛ рдХрд┐рддреА рдЬрд╡рд│ рдЖрд╣реЗрдд? Similarity рдЪреЗ рдЧрдгрд┐рдд: cosine, dot, distance, рдЖрдгрд┐ рдХрдзреА рдХреЛрдгрддреЗ рд╡рд╛рдкрд░рд╛рдпрдЪреЗ.

git checkout lesson-03-similarity

ЁЯФв Lesson 02 тАФ Text to vectors: giving every text a seat

ЁЯУН You are here: Lesson 02 of 8 ┬╖ Previous: lesson-01-why-vector-db ┬╖ Next: lesson-03-similarity


ЁЯУж What's in this branch

Lesson 01, plus the entry ritual: how text becomes coordinates тАФ our toy's way, the real way, and the gap between them (which you already watched fail on purpose).

ЁЯзТ Explain like I'm 5

To sit in the hall you need coordinates. Two ways to assign them:

Our toy's way тАФ count the words ЁЯФд (vectordb.py embed()): the hall has 256 directions; every word (hashed) bumps one of them; normalize so long documents don't shout. Fast, zero magic тАФ and nearsighted: two texts sit close only if they share literal words. "pupils" and "students" sit in different galaxies (the demo's 0.00!). This family тАФ bag-of-words, TF-IDF, BM25 тАФ powered search for decades and still powers the keyword half of hybrid search.

The real way тАФ ask a model that has read everything ЁЯза (AI school L02+L04): an embedding model тАФ a trained neural network тАФ maps text to a fixed-length vector (hundreds to thousands of coordinates, depending on the model) where the directions mean meaning: learned from billions of examples, so "pupils" sits beside "students", "refund my order" beside "I want my money back", across phrasing and even languages.

The beautiful design fact: the database doesn't care which way you chose. Vectors in, neighbors out. Our embed() is one function тАФ swap in a model call and every other line of the course still runs. (That separation тАФ embedder vs store тАФ is the industry's architecture too.)

ЁЯЧ║я╕П Diagram

flowchart LR
    text["ЁЯУЭ 'Class 3A has twelve students'"]
    subgraph toy["ЁЯФд toy: hashed word counts"]
        h["each word bumps 1 of 256 buckets<br/>тЖТ normalize"]
        lim["ЁЯШм nearsighted: shared WORDS only"]
    end
    subgraph real["ЁЯза real: embedding model"]
        m["trained network тЖТ fixed-size vector<br/>(hundredsтАУthousands of dims) ┬╖ directions = MEANING"]
        win["'pupils' тЙИ 'students' тЬЕ"]
    end
    v["ЁЯЧ║я╕П a seat: [0.12, -0.08, тАж]<br/>the DB takes it from here тАФ<br/>either way"]
    text --> toy --> v
    text --> real --> v

тЭУ What

ЁЯдФ Why

Choosing an embedder IS choosing what "similar" means for your product тАФ retrieval quality ceilings live here, not in the database. And knowing the toy/real gap protects you from both errors: expecting word-vectors to understand synonyms, and paying model-embedding costs when exact keyword match was all the job needed.

ЁЯзк Try it

python3 vectordb/demo.py     # re-read the ЁЯШм section knowing WHY now
python3 -c "
import sys; sys.path.insert(0,'vectordb')
from vectordb import embed, cosine
print('students vs student :', round(cosine(embed('students'), embed('student')),2))
print('students vs pupils   :', round(cosine(embed('students'), embed('pupils')),2))
"
# even the plural is a different word to a hash! (real embedders handle both)

тПня╕П Next

Two seats тАФ how close are they, exactly? Similarity math: cosine, dot, distance, and which to use when.

git checkout lesson-03-similarity
тЖР Previouswhy vector dbNext тЖТsimilarity

This page is the lesson's README from the lesson-02-text-to-vectors branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.