ЁЯУР рдзрдбрд╛ 03 тАФ Similarity: рджреЛрди рдЕрд░реНрде "рдХрд┐рддреА рдЬрд╡рд│" рдмрд╕рддрд╛рдд рддреЗ рдореЛрдЬрдгреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-text-to-vectors ┬╖ рдкреБрдвреЗ: lesson-04-nearest-neighbors
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ vector database рдЪреЗ рддреАрди рдУрд│реАрдВрдЪреЗ рд╣реГрджрдп: similarity function тАФ рдЖрдгрд┐ рдЖрдкрд▓реЗ рдлрдХреНрдд рдПрдХрд╛ рдУрд│реАрдЪреЗ dot product рдХрд╛ рдЖрд╣реЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Hall рдордзреНрдпреЗ рджреЛрди рдореБрд▓реЗ рдЙрднреА рдЖрд╣реЗрдд. рддреА рдХрд┐рддреА "рд╕рд╛рд░рдЦреА" рдЖрд╣реЗрдд? рджреЛрди рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдорд╛рдкреЗ:
- рддреА рдПрдХрдореЗрдХрд╛рдВрдкрд╛рд╕реВрди рдХрд┐рддреА рджреВрд░ рдЙрднреА рдЖрд╣реЗрдд ЁЯУП (Euclidean distance): рдПрдХрд╛рдХрдбреВрди рджреБрд╕рд▒реНрдпрд╛рдХрдбреЗ рдЪрд╛рд▓рдд рдЬрд╛, рдкрд╛рд╡рд▓реЗ рдореЛрдЬрд╛. рдХрдореА = рдЬрд╛рд╕реНрдд рд╕рд╛рд░рдЦреА.
- рддреА рдХреЛрдгрддреНрдпрд╛ рджрд┐рд╢реЗрд▓рд╛ рддреЛрдВрдб рдХрд░реВрди рдЖрд╣реЗрдд ЁЯзн (cosine similarity): рддреА рдХреБрдареЗ рдЙрднреА рдЖрд╣реЗрдд рддреЗ рд╡рд┐рд╕рд░рд╛ тАФ рддреА рджрд╛рдЦрд╡рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рджрд┐рд╢рд╛рдВрдордзрд▓рд╛ рдХреЛрди рддреБрд▓рдирд╛ рдХрд░рд╛. рдПрдХрдЪ рджрд┐рд╢рд╛ = 1.0, рдХрд╛рдЯрдХреЛрди = 0.0 (рдХрд╛рд╣реАрдЪ рд╕рд╛рдореНрдп рдирд╛рд╣реА), рдЙрд▓рдЯ рджрд┐рд╢рд╛ = тИТ1.0.
Text рд╕рд╛рдареА рджрд┐рд╢рд╛ рдЬрд┐рдВрдХрддреЗ: robots рдмрджреНрджрд▓рдЪрд╛ 10 рдкрд╛рдирд╛рдВрдЪрд╛ рдирд┐рдмрдВрдз рдЖрдгрд┐ robots рдмрджреНрджрд▓рдЪреА рдПрдХрд╛ рдУрд│реАрдЪреА рдЯреАрдк рдПрдХрд╛рдЪ рджрд┐рд╢реЗрд▓рд╛ рдмреЛрдЯ рджрд╛рдЦрд╡рддрд╛рдд тАФ рдирд┐рдмрдВрдз рдлрдХреНрдд рдЬрд╛рд╕реНрдд рдЬреЛрд░рд╛рдиреЗ рджрд╛рдЦрд╡рддреЛ (рд▓рд╛рдВрдм vector). Distance рддреНрдпрд╛рдВрдирд╛ рд╡реЗрдЧрд│реЗ рдореНрд╣рдгреЗрд▓ (рдирд┐рдмрдВрдз рджреВрд░ рдЙрднрд╛ рдЕрд╕рддреЛ); cosine рддреНрдпрд╛рдВрдирд╛ рднрд╛рд╡рдВрдбреЗ рдореНрд╣рдгрддреЛ. рдЕрд░реНрде рдореНрд╣рдгрдЬреЗ рджрд┐рд╢рд╛; рд▓рд╛рдВрдмреА рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд рдЖрд╡рд╛рдЬ. ЁЯУв
рдЖрдгрд┐ рдЖрдкрд▓рд╛ toy рд╡рд╛рдкрд░рддреЛ рддреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдпреБрдХреНрддреА
(vectordb.py): рд▓рд┐рд╣рд┐рддрд╛рдирд╛рдЪ рдкреНрд░рддреНрдпреЗрдХ vector рдЪреА
рд▓рд╛рдВрдмреА 1 рдХрд░рд╛ (normalize) (рдзрдбрд╛ 02) тАФ рдордЧ cosine рдореНрд╣рдгрдЬреЗ рд╕рд╛рдзрд╛ dot product рдЙрд░рддреЛ:
рдЬреБрд│рдгрд╛рд░реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЧреБрдгрд╛, рдмреЗрд░реАрдЬ рдХрд░рд╛. рдПрдХ рдУрд│, рдкреНрд░рдЪрдВрдб рд╡реЗрдЧрд╡рд╛рди, hardware рд▓рд╛ рд╕реЛрдпреАрдЪреА.
рдореНрд╣рдгреВрдирдЪ рдЖрдкрд▓реНрдпрд╛ code рдордзрд▓реЗ cosine() рдлрдХреНрдд sum(x*y тАж) рдЖрд╣реЗ тАФ рд╣реБрд╢рд╛рд░реАрдЪрд╛ рднрд╛рдЧ
рджрд╛рд░рд╛рддрдЪ рдЭрд╛рд▓реЗрд▓рд╛ рдЕрд╕рддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
subgraph hall["ЁЯЧ║я╕П the hall"]
essay["ЁЯУЪ 10-page robot essay<br/>long vector, points NE"]
note["ЁЯУЭ one-line robot note<br/>short vector, points NE"]
lunch["ЁЯНЫ lunch menu<br/>points SW"]
end
cos["ЁЯзн cosine: compare DIRECTIONS<br/>essay┬╖note = 0.95 тЬЕ siblings<br/>essay┬╖lunch = 0.02 тАФ strangers"]
dist["ЁЯУП distance: compare POSITIONS<br/>essay is 'far' from note тЭМ<br/>fooled by length/volume"]
trick["тЪб the trick: normalize at write time<br/>тЖТ cosine becomes a plain dot product<br/>(one line, hardware-fast)"]
hall --> cos
hall --> dist
cos --> trick
тЭУ рдХрд╛рдп
- Cosine similarity = dot(a,b) / (|a|┬╖|b|) тАФ vectors рдордзрд▓рд╛ рдХреЛрди. Range тИТ1тАж1; normalized vectors рд╕рд╛рдареА рддреЗ рдореНрд╣рдгрдЬреЗрдЪ dot(a,b).
- рдХрдЪреНрдЪрд╛ (unnormalized) dot product рджрд┐рд╢рд╛ рдЖрдгрд┐ рд▓рд╛рдВрдмреА рджреЛрдиреНрд╣реА рдорд┐рд╕рд│рддреЛ тАФ рдХрд╛рд╣реА recommendation systems рдирд╛ рддреЗрдЪ рд╣рд╡реЗ рдЕрд╕рддреЗ ("рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреА").
- Euclidean (L2) тАФ рдкреНрд░рддреНрдпрдХреНрд╖ рдЕрдВрддрд░; normalized vectors рд╕рд╛рдареА рддреЗ cosine рдЪреЗ monotone рдЬреБрд│реЗ рдЖрд╣реЗ (рдХреНрд░рдо рддреЛрдЪ!), рдореНрд╣рдгреВрди normalize рдХреЗрд▓реНрдпрд╛рд╡рд░ "рдХреЛрдгрддрд╛ metric" рд╣реА рдШрдмрд░рд╛рдЯ рдмрд╣реБрддреЗрдХ рд╡рд┐рд░рдШрд│реВрди рдЬрд╛рддреЗ.
- рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд┐рдпрдо: text search тЖТ normalized vectors рд╡рд░ cosine тАФ рдЖрдгрд┐ рддреБрдордЪреЗ embedding model рдЬреНрдпрд╛ metric рд╕рд╛рдареА train рдЭрд╛рд▓реЗ рддреЛрдЪ рд╡рд╛рдкрд░рд╛ (model cards рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЕрд╕рддреЗ; рдЦрд░реЗ DBs рдкреНрд░рддреНрдпреЗрдХ collection рд╕рд╛рдареА рдирд┐рд╡рдбреВ рджреЗрддрд╛рдд).
- Scores рд╕рд╛рдкреЗрдХреНрд╖ рдЕрд╕рддрд╛рдд, рдирд┐рд░рдкреЗрдХреНрд╖ рд╕рддреНрдп рдирд╛рд╣реАрдд: 0.8 рдореНрд╣рдгрдЬреЗ "80% рдмрд░реЛрдмрд░" рдирд╛рд╣реА тАФ thresholds рддреБрдордЪреНрдпрд╛ data рд╡рд░ tune рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддрд╛рдд (рдзрдбрд╛ 07 рдЪреА eval рдЯреАрдк).
ЁЯдФ рдХрд╛
рдкреНрд░рддреНрдпреЗрдХ search рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рдХреНрд░рдо, рдкреНрд░рддреНрдпреЗрдХ "рд╕рд╛рд░рдЦреЗ tickets" ranking, рдкреНрд░рддреНрдпреЗрдХ RAG retrieval тАФ рдпрд╛рдЪ рдПрдХрд╛ рдЖрдХрдбреНрдпрд╛рдиреЗ рд▓рд╛рд╡рд▓реЗрд▓реЗ рдЕрд╕рддреЗ. Retrieval рдЪреБрдХреАрдЪреЗ рд╡рд╛рдЯрд▓реЗ рддрд░ рдкрд╣рд┐рд▓реА рдкрд╛рдпрд░реА рдиреЗрд╣рдореА: рдХреЛрдгрддрд╛ metric, рд╕рдЧрд│реЗ normalize рдЭрд╛рд▓реЗ рд╣реЛрддреЗ рдХрд╛, рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдирд╛ рддреЛрдЪ embedder? (рддреАрди рдкреНрд░рд╢реНрди, рдирд╡реНрд╡рдж рдЯрдХреНрдХреЗ bugs.)
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 -c "
import sys; sys.path.insert(0,'vectordb')
from vectordb import embed, cosine
essay = 'the robot reads books about robots and robot learning ' * 10
note = 'a robot book'
lunch = 'dal and rice for lunch on tuesday'
print('essay vs note :', round(cosine(embed(essay), embed(note)), 2), 'тЖР same direction, wildly different lengths')
print('essay vs lunch:', round(cosine(embed(essay), embed(lunch)), 2))
"
рд▓рд╛рдВрдмреА ├Ч10 тАФ similarity рдЬрд╢реАрдЪреНрдпрд╛ рддрд╢реА. рджрд┐рд╢рд╛ рдореНрд╣рдгрдЬреЗ рдЕрд░реНрде; normalization рдиреЗ рдЖрд╡рд╛рдЬ рдЖрдзреАрдЪ рдЦрд╛рдКрди рдЯрд╛рдХрд▓рд╛. ЁЯзн
тПня╕П рдкреБрдвреЗ
рдПрдХ query рд╡рд┐рд░реБрджреНрдз рджрд╣рд╛ рд▓рд╛рдЦ рдЬрд╛рдЧрд╛ тАФ рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рд╡рд┐рдЪрд╛рд░рдгреЗ рдЦреВрдк рд╣рд│реВ рдЖрд╣реЗ. Nearest neighbors: brute force, scaling рдЪреА рднрд┐рдВрдд, рдЖрдгрд┐ shortcut рдирдХрд╛рд╢реЗ (ANN).
git checkout lesson-04-nearest-neighbors