paint-brush
Încorporare pentru RAG - O prezentare generală completăde@aibites
237 lecturi

Încorporare pentru RAG - O prezentare generală completă

de Shrinivasan Sankar9m2024/11/30
Read on Terminal Reader

Prea lung; A citi

Încorporarea este un pas crucial și fundamental către construirea unei conducte Retrieval Augmented Generation (RAG). BERT și SBERT sunt modele de încorporare de ultimă generație. Sentence transformers este biblioteca python care implementează ambele modele. Acest articol se scufundă atât în teorie, cât și în practică
featured image - Încorporare pentru RAG - O prezentare generală completă
Shrinivasan Sankar HackerNoon profile picture

Acest articol începe cu transformatoarele și analizează deficiențele acestora ca model de încorporare. Apoi oferă o privire de ansamblu asupra BERT și analize profunde în Sentence BERT (SBERT), care este cea mai avansată tehnologie în încorporarea de propoziții pentru conductele LLM și RAG.

Explicație vizuală

Dacă sunteți o persoană vizuală ca mine și doriți să urmăriți o explicație vizuală, vă rugăm să vedeți acest videoclip:

Transformatoare

Transformers nu au nevoie de prezentare. Deși inițial au fost concepute pentru sarcini de traducere lingvistică, ei sunt caii de conducere din spatele aproape tuturor LLM-urilor de astăzi.


La un nivel înalt, ele sunt compuse din două blocuri - codificatorul și decodorul. Blocul codificator preia intrarea și scoate o reprezentare matriceală. Blocul decodor preia ieșirea ultimului encoder și produce ieșirea. Blocurile de codificator și decodor pot fi compuse din mai multe straturi, deși transformatorul original are 6 straturi în fiecare bloc.


Toate straturile sunt compuse din auto-atenție cu mai multe capete. Cu toate acestea, singura diferență dintre codificator și decodor este că ieșirea codificatorului este alimentată la fiecare strat al decodorului. În ceea ce privește straturile de atenție, straturile de atenție ale decodorului sunt mascate. Deci, ieșirea în orice poziție este influențată de ieșirea în pozițiile anterioare.


Blocul codificator și decodor sunt compuse în plus din straturi de normă și rețea neuronală feed-forward.


Spre deosebire de modelele anterioare, cum ar fi RNN-urile sau LSTM-urile, care procesau jetoane independent, puterea transformatoarelor constă în capacitatea lor de a capta contextul fiecărui jeton în raport cu întreaga secvență. Astfel, captează mult context în comparație cu orice arhitectură anterioară concepută pentru procesarea limbajului.

Ce este în neregulă cu Transformers?

Transformatoarele sunt cele mai de succes arhitecturi care conduc astăzi revoluția AI. Deci, s-ar putea să mi se arate ușa dacă identific limitări cu ea. Cu toate acestea, de fapt, pentru a reduce cheltuielile de calcul, straturile sale de atenție sunt concepute doar pentru a se ocupa de jetoanele din trecut. Acest lucru este bine pentru majoritatea sarcinilor. Dar poate să nu fie suficient pentru o sarcină precum răspunsul la întrebări. Să luăm exemplul de mai jos.


John a venit cu Milo la petrecere. Milo s-a distrat copios la petrecere. Este o pisică frumoasă, albă, cu blană.


Să presupunem că punem întrebarea „Milo a băut la petrecerea cu John?” Doar pe baza primelor 2 propoziții din exemplul de mai sus, este destul de probabil ca LLM să răspundă: „Având în vedere că Milo s-a distrat mult, indică faptul că Milo a băut la petrecere”.


Cu toate acestea, un model antrenat cu context înainte ar fi conștient de a treia propoziție, care este „El este o pisică frumoasă și prietenoasă”. Și așa, ar răspunde: „Milo este o pisică și este puțin probabil să fi băut la petrecere”.


Deși acesta este un exemplu ipotetic, înțelegeți ideea. Într-o sarcină de răspuns la întrebări, învățarea atât înainte cât și înapoi devine crucială. Aici intervine modelul BERT.

BERT

BERT înseamnă Bidirectional Encoder Representations from Transformers. După cum sugerează și numele, se bazează pe Transformers și încorporează atât contextul înainte cât și înapoi. Deși a fost publicat inițial pentru sarcini precum răspunsul la întrebări și rezumatul, are potențialul de a produce încorporare puternice datorită naturii sale bidirecționale.

Modelul BERT

BERT nu este altceva decât codificatoarele transformatoare stivuite împreună în secvență. Singura diferență este că BERT folosește auto-atenție bidirecțională , în timp ce transformatorul vanilie folosește auto-atenție constrânsă, în care fiecare jeton poate lua în considerare doar contextul din stânga lui.


Notă: secvență vs propoziție. Doar o notă despre terminologie pentru a evita confuzia în timp ce se ocupă de modelul BERT. O propoziție este o serie de cuvinte separate prin punct. O secvență poate fi orice număr de propoziții stivuite împreună.


Pentru a înțelege BERT, să luăm exemplul răspunsului la întrebări. Întrucât răspunsul la întrebare implică cel puțin două propoziții, BERT este proiectat să accepte o pereche de propoziții în formatul <întrebare-răspuns>. Acest lucru duce la jetoane separatoare precum [CLS] transmise la început pentru a indica începutul secvenței. Indicatorul [SEP] este apoi folosit pentru a separa întrebarea și răspunsul.


Deci, o intrare simplă devine acum, [CLS]<întrebare>[SEP]<răspuns>[SEP] așa cum se arată în figura de mai jos.

Cele două propoziții A și B sunt trecute prin modelul de încorporare WordPiece după includerea jetoanelor [CLS] și [SEP]. Deoarece avem două propoziții, modelul are nevoie de încorporare suplimentare pentru a le diferenția. Aceasta vine sub formă de înglobare de segmente și poziții.


Încorporarea segmentului arătată în verde mai jos indică dacă jetoanele de intrare aparțin propoziției A sau B. Apoi vine încorporarea poziției, care indică poziția fiecărui jeton în secvență.

Figura luată din lucrarea BERT care arată reprezentarea de intrare a modelului.


Toate cele trei înglobări sunt însumate împreună și alimentate la modelul BERT, care este bidirecțional, așa cum se arată în figura anterioară. Captează nu numai contextul înainte, ci și contextul înapoi înainte de a ne oferi rezultate pentru fiecare token.

Pre-antrenament BERT

Există două moduri în care modelul BERT este pre-antrenat folosind două sarcini nesupravegheate:

  • Model de limbaj mascat (MLM). Aici maschăm o parte din procentul de jetoane din secvență și lăsăm modelul să prezică jetoanele mascate. Este cunoscută și ca sarcina de închidere . În practică, 15% din jetoane sunt mascate pentru această sarcină.

  • Predicția următoarei propoziții (NSP). Aici, facem ca modelul să prezică următoarea propoziție din secvență. Ori de câte ori propoziția este următoarea reală, folosim eticheta IsNext și când nu este, folosim eticheta NotNext .

    Pre-instruire a modelului BERT cu jetoane NSP și MLM la ieșire.


După cum se poate vedea din figura de mai sus din hârtie, primul jeton de ieșire este folosit pentru sarcina NSP, iar jetonele din mijloc care sunt mascate sunt folosite pentru sarcina MLM.


Pe măsură ce ne antrenăm la nivel de jeton, fiecare jeton de intrare produce un jeton de ieșire. Ca și în cazul oricărei sarcini de clasificare, pierderea de entropie încrucișată este utilizată pentru a antrena modelul.

Ce e în neregulă cu BERT?

În timp ce BERT ar putea fi bun la capturarea contextului atât înainte, cât și înapoi, este posibil să nu fie cel mai potrivit pentru a găsi asemănări între mii de propoziții. Să luăm în considerare sarcina de a găsi cea mai asemănătoare pereche de propoziții într-o colecție mare de 10.000 de propoziții. Cu alte cuvinte, am dori să „preluăm” propoziția care seamănă cel mai mult cu propoziția A din 10.000 de propoziții.


Pentru a face acest lucru, trebuie să împerechem fiecare combinație posibilă de 2 propoziții din 10.000. Ar fi n * (n — 1) / 2 = 4.999.500 de perechi! La naiba, asta e complexitatea pătratică. Modelul BERT va dura 65 de ore pentru a crea înglobări și a rezolva această comparație.


Pur și simplu spus, modelul BERT nu este cel mai bun pentru căutarea de similarități. Dar regăsirea și căutarea de similaritate sunt în centrul oricărei conducte RAG. Soluția stă în SBERT.

SBERT — Nivel de propoziție BERT

Limitarea BERT provine în mare parte din arhitectura sa de codificare încrucișată în care alimentăm două propoziții împreună în secvență cu un token [SEP] între ele. Dacă numai fiecare propoziție ar fi tratată separat, am putea precalcula înglobările și le-am folosi direct pentru a calcula în mod similar, atunci când este necesar. Aceasta este exact propunerea Sentenței BERT sau SBERT pe scurt.


SBERT introduce rețeaua siameză în arhitectura BERT. Cuvântul înseamnă geamăn sau strâns înrudit.

Semnificația siameză luată de pe dicționar.com


Deci, în SBERT avem aceeași rețea BERT conectată ca „gemeni”. Modelul încorporează prima propoziție urmată de a doua în loc să le trateze secvențial.

Notă: Este o practică obișnuită să desenați 2 rețele una lângă alta pentru a vizualiza rețelele siameze. Dar, în practică, este o singură rețea care are două intrări diferite.

Arhitectura SBERT

Mai jos este o diagramă care oferă o imagine de ansamblu asupra arhitecturii SBERT.

Arhitectura de rețea siameză cu obiectivul de clasificare a pierderii. Ieșirile U și V din cele două ramuri sunt concatenate împreună cu diferența lor

.

În primul rând, putem observa că SBERT introduce un strat de pooling imediat după BERT. Acest lucru reduce dimensiunea ieșirii BERT pentru a reduce calculul. BERT produce în general ieșiri la dimensiuni 512 X 768. Stratul de punere în comun reduce acest lucru la 1 X 768. Regruparea implicită este media, deși punerea în comun medie și maximă funcționează.


În continuare, să ne uităm la abordarea de formare în care SBERT diverge de BERT.

Pre-antrenament

SBERT propune trei moduri de a antrena modelul. Să ne uităm la fiecare dintre ele.


Inferența limbajului natural (NLI) — Obiectiv de clasificare

SBERT este reglat fin pe Stanford Natural Language Inference (SNLI) și seturile de date multi-gen NLI pentru aceasta. SNLI este format din 570K perechi de propoziții, iar MNLI are 430K. Perechile au o premisă (P) și o ipoteză (H) care duc la una dintre cele 3 etichete:


  • Eltailment — premisa sugerează ipoteza
  • Neutru - premisa și ipoteza ar putea fi adevărate, dar nu neapărat legate
  • Contradicție - premisa și ipoteza se contrazic reciproc


Având în vedere cele două propoziții P și H, modelul SBERT produce două ieșiri U și V. Acestea sunt apoi concatenate ca (U, V și |U — V|).


Ieșirea concatenată este utilizată pentru a antrena SBERT cu obiectivul de clasificare. Această ieșire concatenată este transmisă unei rețele neuronale Feed Forward cu 3 ieșiri de clasă (Eltailment, Neutral și Contradiction). Softmax cross-entry este folosit pentru antrenament similar cu modul în care ne antrenăm pentru orice altă sarcină de clasificare.


Similitudinea propoziției — Obiectiv de regresie

În loc să concatenăm U și V, calculăm direct o asemănare cosinus între cei doi vectori. Similar oricărei probleme de regresie standard, folosim o pierdere de eroare pătrată medie pentru a antrena regresia. În timpul inferenței, aceeași rețea poate fi utilizată direct pentru a compara oricare două propoziții. SBERT dă un scor cu privire la cât de asemănătoare sunt cele două propoziții.


Asemănarea tripletului — Obiectiv triplet

Obiectivul de similaritate triplet a fost introdus pentru prima dată în recunoașterea feței și a fost adaptat încet și la alte domenii ale AI, cum ar fi textul și robotica.


Aici sunt transmise 3 intrări către SBERT în loc de 2 - o ancoră, una pozitivă și una negativă. Setul de date utilizat pentru aceasta ar trebui ales în consecință. Pentru ao crea, putem alege orice date text și alegem două propoziții consecutive ca implicare pozitivă. Apoi alegeți o propoziție aleatorie dintr-un paragraf diferit, un eșantion negativ.


O pierdere triplet este apoi calculată prin compararea cât de aproape este pozitivul de ancoră față de cât de aproape este de negativ.

Cu această introducere la BERT și SBERT, să facem o scurtă practică pentru a înțelege cum putem obține încorporarea oricărei propoziții date folosind aceste modele.

SBERT practic

Chiar și de la publicarea sa, biblioteca oficială pentru SBERT, care este sentence-transformer a câștigat popularitate și s-a maturizat. Este suficient de bun pentru a fi folosit în cazurile de utilizare în producție pentru RAG. Deci, să-l folosim din cutie.


Pentru a începe, să începem cu instalarea într-un nou mediu Python.

 !pip install sentence-transformers


Există mai multe variante ale modelului SBERT pe care le putem încărca din bibliotecă. Să încărcăm modelul pentru ilustrare.

 from sentence_transformers import SentenceTransformer model = SentenceTransformer('bert-base-nli-mean-tokens')


Putem pur și simplu să creăm o listă de propoziții și să invocăm funcția encode a modelului pentru a crea înglobările. Este atât de simplu!

 sentences = [ "The weather is lovely today.", "It's so sunny outside!", "He drove to the stadium.", ] embeddings = model.encode(sentences) print(embeddings.shape)


Și putem găsi scorurile de similaritate între înglobări folosind linia de mai jos:

 similarities = model.similarity(embeddings, embeddings) print(similarities)


Rețineți că asemănarea dintre aceeași propoziție este 1 așa cum era de așteptat:

 tensor([[1.0000, 0.6660, 0.1046], [0.6660, 1.0000, 0.1411], [0.1046, 0.1411, 1.0000]])

Concluzie

Încorporarea este un pas crucial și fundamental pentru ca conducta RAG să funcționeze cât mai bine. Sper că a fost util și că v-am deschis ochii asupra a ceea ce se întâmplă sub capotă ori de câte ori folosim transformatoarele de propoziție din cutie.


Rămâneți la curent cu articolele viitoare despre RAG și despre funcționarea sa interioară, împreună cu tutoriale practice.