RAG sistēmu izveidē kosusa līdzības metrika bieži tiek izmantota nepareizu pieņēmumu dēļ. Šis raksts izskaidro, kāpēc vektoru normalizācija padara vienkāršāko skalāro reizinājumu par daudz efektīvāku izvēli jūsu uzņēmuma meklēšanas infrastruktūrā.
Izplatītais mīts par kosusa līdzību RAG sistēmās
Veidojot uzņēmuma zināšanu bāzes meklētājus, izstrādātāji bieži paļaujas uz gataviem iestatījumiem. Vektoru datubāzēs kā noklusējuma mēraugs semantiskajai līdzībai parasti tiek piedāvāta kosusa līdzība (Cosine Similarity). Tā aprēķina leņķi starp diviem vektoriem, ignorējot to garumu.
Tomēr šāda pieeja var radīt lieku skaitļošanas slodzi. Ja izmantotie embeddingu modeļi jau sākotnēji atgriež normalizētus vektorus, šīs metrikas izmantošana zaudē savu jēgu. Lielākā daļa mūsdienu modeļu, piemēram, OpenAI vai Cohere rīki, datus sagatavo tieši šādā veidā.
Kas ir vektoru meklēšana un kā tā darbojas
Lai izprastu optimizācijas iespējas, vispirms jādefinē pamatjēdzieni. Vektoru meklēšana ir informācijas meklēšanas metode, kurā teksta fragmenti tiek pārvērsti augstas dimensijas skaitļu masīvos jeb vektoros. Šie vektori reprezentē vārdu un teikumu nozīmi, ļaujot datoram saprast satura kontekstu, nevis tikai meklēt precīzas sakritības.
Kad lietotājs ievada vaicājumu, sistēma salīdzina tā vektoru ar datubāzē esošajiem dokumentu vektoriem. Šim salīdzinājumam parasti izmanto trīs matemātiskās metodes.
| Metrika | Darbības princips | Sarežģītība | Labākais pielietojums |
|---|---|---|---|
| Eiklīda attālums (L2) | Mēra taisnas līnijas attālumu starp diviem punktiem | Augsta | Ja vektoru garumam un biežumam ir liela nozīme |
| Skalārais reizinājums (Dot Product) | Mēra virziena un garuma kopējo projekciju | Zema (ātra) | Ja vektori ir iepriekš normalizēti |
| Kosusa līdzība (Cosine) | Mēra tikai leņķi starp vektoriem | Vidēja | Ja tekstu garumi datubāzē stipri atšķiras |
Matemātiskā sakarība starp skalāro reizinājumu un kosusa līdzību
Daudzi speciālisti neapzinās, ka kosusa līdzība un skalārais reizinājums ir cieši saistīti. Ja abi vektori ir normalizēti (to garums jeb norma ir vienāda ar 1), tad kosusa līdzība ir matemātiski identiska skalārajam reizinājumam. Šajā gadījumā papildu dalīšanas darbības ar vektoru garumiem nav vajadzīgas.
Kā norādīts Towards Data Science analītiskajā materiālā, izstrādātāji bieži tērē servera resursus, lai aprēķinātu kosusa līdzību tur, kur pietiktu ar vienkāršu skalāro reizinājumu. Lielos datu apjomos šī atšķirība var izpausties kā palielināts meklēšanas latentums un augstākas infrastruktūras izmaksas.
import numpy as np
# Divi paraugvektori
a = np.array([0.3, 0.9, 0.1])
b = np.array([0.4, 0.8, 0.43])
# Normalizējam vektorus līdz vienības garumam (L2 norma = 1)
a_norm = a / np.linalg.norm(a)
b_norm = b / np.linalg.norm(b)
# Skalārais reizinājums normalizētiem vektoriem
dot_prod = np.dot(a_norm, b_norm)
# Kosusa līdzība
cosine_sim = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# Abi rezultāti ir identiski
print(f"Skalārais reizinājums: {dot_prod:.6f}")
print(f"Kosusa līdzība: {cosine_sim:.6f}")
Izmantojot normalizētus vektorus, datubāzei nav jāveic dārgas kvadrātsakņu un dalīšanas operācijas katra meklēšanas vaicājuma laikā. Tas nodrošina tūlītēju darbības ātruma pieaugumu.
Biežāk uzdotie jautājumi (FAQ)
Kāpēc skalārais reizinājums ir ātrāks par kosusa līdzību?
Skalārais reizinājums prasa mazāk matemātisko operāciju. Kosusa līdzības aprēķinam ir papildus jāizdala rezultāts ar abu vektoru garumu reizinājumu, kas ietver skaitļošanā smagas kvadrātsaknes operācijas.
Vai visi embeddingu modeļi atgriež normalizētus vektorus?
Nē, ne visi. Tomēr lielākā daļa populāro un moderno modeļu (tostarp OpenAI text-embedding-3 un Cohere v3) pēc noklusējuma atgriež L2 normalizētus vektorus, padarot skalāro reizinājumu par optimālo izvēli.
Kas notiks, ja izmantošu skalāro reizinājumu uz nenormalizētiem datiem?
Meklēšanas rezultāti būs neprecīzi un neobjektīvi. Sistēma dos priekšroku garākiem tekstiem vai dokumentiem ar biežāk atkārtotiem vārdiem, jo to vektoru garums būs lielāks.