Runtime lines

Cum funcționează AI, token cu token

Un model de limbaj mare face un singur lucru, iar și iar: transformă textul de până acum într-o probabilitate pentru fiecare token care ar putea urma, alege unul și îl adaugă la final. Parcurge pas cu pas această buclă cu id-uri reale de tokenuri, urmărește cum inventează un răspuns sigur pe el, corectează-l cu context regăsit, apoi joacă-te cu temperatura și embedding-urile.

De la text la următorul token

next_token.py tiktoken, o200k_base
    Output
      În interiorul modelului logits ilustrative, softmax exact
      1. Tokenizare
      2. Embedding
      3. Transformer
      4. Logits
      5. Softmax
      6. Alegere

      Id-urile tokenurilor sunt reale: tiktoken cu encodingul o200k_base (tokenizerul familiei GPT-4o). Valorile logits sunt inventate în scop didactic, pentru că un model real dă scor tuturor celor 200.019 tokenuri, iar valorile lui depind de ponderi. Sunt desenați doar candidații de top, iar probabilitățile lor sunt softmax-ul exact calculat peste acești candidați. model() și generate() se află în verify/ai/toy_model.py.

      Pipeline-ul pe scurt

      Orice răspuns de chat, completare de cod sau pas de agent rulează această buclă. Doar ultimul pas implică o alegere; tot ce vine înainte e un calcul fix.

      1. TokenizerÎmparte textul în tokenuri: cuvinte uzuale întregi, bucăți din cuvinte mai rare, caractere individuale și octeți. Fiecare token are un id întreg. Tokenizerul e fixat înainte de antrenare și rulează în afara rețelei neuronale.
      2. Embedding-uriFiecare id selectează un rând dintr-o matrice învățată: un vector de câteva mii de numere. Se adaugă și informație despre poziție; multe modele actuale rotesc vectorii în funcție de poziție (RoPE).
      3. Straturile transformerO stivă de blocuri identice. În fiecare, atenția (attention) permite fiecărei poziții să adune informație de la pozițiile anterioare, apoi o rețea feed-forward transformă fiecare poziție separat.
      4. LogitsVectorul final de pe ultima poziție e înmulțit cu o matrice de ieșire, rezultând câte un scor brut pentru fiecare token din vocabular.
      5. EșantionareSoftmax transformă scorurile în probabilități, temperatura, top-k și top-p le remodelează, iar apoi se alege un token. Acesta e adăugat la input și bucla rulează din nou, până la un token de oprire sau până la limita de tokenuri.

      De ce halucinează modelele și ce ajută

      O halucinație e un output fluent care nu e susținut de fapte sau de sursele pe care i le-ai dat modelului: o citare inventată, o dată greșită, o funcție care nu există. Nimic din buclă nu verifică adevărul. Singura întrebare pe care o pune e ce token e probabil să urmeze.

      ?De ce se întâmplă

      • Obiectivul e plauzibilitatea. Preantrenarea răsplătește prezicerea următorului token din text real, nu faptul că ai dreptate. Un nume plauzibil primește un scor bun, fie că e cel adevărat, fie că nu.
      • Ghicitul e răsplătit. Textul de antrenare e plin de răspunsuri sigure pe ele și rareori spune „nu știu”, iar evaluările care nu dau puncte pentru abținere pun o ghicire norocoasă mai presus de un răspuns lăsat onest în alb.
      • Goluri și data-limită. Faptele rare, datele private și tot ce s-a întâmplat după data-limită a antrenării nu pot fi reamintite. Modelul umple golul cu ceva tipic.
      • Date greșite sau amestecate. Textul de antrenare conține erori și fapte depășite, iar modelul poate contopi două fapte asemănătoare într-unul care n-a existat niciodată.
      • Eșantionarea și efectul de bulgăre de zăpadă. Cu temperatura peste 0, poate fi extras un token greșit, puțin probabil. Fiecare token de după e condiționat de el, așa că răspunsul rămâne consecvent cu greșeala.
      • Contexte lungi. Detaliile îngropate la mijlocul unui prompt lung sunt folosite mai puțin fiabil, așa că răspunsurile se pot îndepărta de sursele pe care le-ai furnizat.

      +Ce ajută

      • Ancorează-l în surse cu RAG. Regăsește pasajele relevante, pune-le în prompt și cere citări pe care le poți verifica în surse.
      • Lasă-l să se abțină. Spune-i că „nu știu” e permis și preferabil unei ghiceli și acordă puncte pentru abținere în evaluările tale.
      • Scade temperatura pentru fapte. Elimină zgomotul de eșantionare. Nu corectează ce crede modelul, cum arată scenariul greedy de mai sus.
      • Output structurat, apoi validare. Cere JSON care respectă o schemă, apoi verifică în cod id-urile, citatele și numerele înainte să le folosești.
      • Folosește tool-uri. Lasă modelul să apeleze o căutare, o bază de date sau un calculator, în loc să-și amintească fapte și să facă aritmetică din memorie.
      • Măsoară și verifică. Rulează evaluări (evals) pe întrebări cu răspunsuri cunoscute, verifică dacă afirmațiile sunt susținute de surse (cu cod sau cu un al doilea model), urmărește probabilitățile mici ale tokenurilor și păstrează un om în buclă (human-in-the-loop) acolo unde greșelile costă scump.

      Temperatură, top-k și top-p

      Modelul îți dă o probabilitate pentru fiecare token; felul în care alegi dintre ele e un pas separat, numit decodare. Temperatura împarte valorile logits înainte de softmax, softmax(logits / T): sub 1 ascute distribuția, peste 1 o aplatizează. Apoi top-k și top-p taie coada de tokenuri improbabile. Mută cursoarele și eșantionează.

      1.00
      8
      1.00

      Prompt: My favourite programming language is. Opt tokenuri candidate cu logits ilustrative; calculele aplicate pe ele sunt exacte.

      Probabilitatea cumulată după temperatură

      Fiecare extragere folosește un generator aleator cu seed, așa că extragerea 1 dă mereu aceeași secvență pentru aceleași setări.

      De ce temperatura 0 nu e perfect deterministă? Decodarea greedy nu implică nimic aleator, și totuși două rulări pot diferi. Adunarea în virgulă mobilă pe GPU nu e asociativă, iar ordinea adunărilor se schimbă în funcție de dimensiunea batch-ului și de celelalte cereri din același batch, așa că două logits aproape egale își pot schimba locul. Un singur token diferit schimbă tot ce urmează după el. Furnizorii care acceptă un seed îl descriu ca best effort, fără garanții.

      Widgetul aplică întâi temperatura, apoi top-k, apoi top-p (renormalizând după fiecare tăiere), în ordinea folosită de verify/ai/temperature.py. Numerele, pragurile de tăiere și extragerile cu seed coincid cu output-ul acelui program.

      Embedding-uri: sensul ca direcție

      Un model de embedding transformă o bucată de text într-o listă de numere de lungime fixă, adică un vector. E antrenat astfel încât textele cu sens asemănător să primească vectori orientați în direcții asemănătoare. Harta folosește vectori 2-D simplificați ca să poți vedea unghiurile; modelele reale produc vectori cu sute sau mii de dimensiuni (384, 768, 1.536 și 3.072 sunt dimensiuni uzuale). Alege o interogare și o metrică.

      Interogare
      Ordonează după
      Spațiu de embedding simplificat vectori 2-D plasați manual
      animale bani cod natură interogare
      Ordonate după similaritatea cosinus primele 3 sunt cei mai apropiați vecini

        Calculul pentru perechea selectată dă clic pe un rând ca s-o schimbi

          Ce este un embedding

          Un punct într-un spațiu în care direcția reprezintă sensul. Numerele individuale nu sunt trăsături pe care le poți citi; au sens doar distanțele și unghiurile dintre vectori, și doar între vectori produși de același model.

          De ce sensurile asemănătoare ajung aproape

          Modelele de embedding sunt antrenate, adesea contrastiv, să apropie perechile înrudite (o întrebare și răspunsul ei, o descriere și imaginea ei) și să le îndepărteze pe cele fără legătură. Așa că feeding my kitten ajunge lângă cat food fără niciun cuvânt comun, iar river bank ajunge departe de bank loan, deși au un cuvânt comun.

          Cosinus, produs scalar, distanță euclidiană

          Cosinusul compară doar direcțiile, de la −1 la 1. Produsul scalar crește și cu lungimea, deci vectorii lungi câștigă (încearcă interogarea cu „kitten”). Distanța euclidiană măsoară distanța dintre vârfuri. Pe vectori de lungime 1, toate trei duc la aceeași ordine: produsul scalar este cosinusul, iar distanța e √(2 − 2 cos).

          Căutare, RAG și baze de date vectoriale

          Calculezi o singură dată embedding-urile documentelor, împărțite în chunk-uri, și stochezi vectorii. La interogare, calculezi embedding-ul întrebării și aduci cele mai apropiate chunk-uri. Căutarea exactă compară cu fiecare vector; bazele de date vectoriale folosesc indexuri de tip approximate nearest neighbour (ANN), cum ar fi HNSW, un graf pe niveluri parcurs greedy spre interogare, care sacrifică puțin recall pentru o accelerare mare.

          Cel mai apropiat nu înseamnă relevant. O căutare vectorială returnează mereu k rezultate, chiar și când nimic din store nu răspunde la întrebare: alege sitting on the river bank și al treilea rezultat e cat food. Intervalele utile de scor diferă de la un model la altul, așa că ajustează un prag pe datele tale, adaugă un reranker și lasă modelul să spună că nu știe.

          În două dimensiuni e loc doar pentru câteva direcții, așa că subiecte fără legătură ajung la unghiuri ciudate, unele chiar opuse, cu cosinus negativ. În sute de dimensiuni e loc pentru multe direcții aproape independente, iar modelele reale dau rar scoruri puternic negative pentru text obișnuit. Numerele coincid cu verify/ai/embeddings.py.

          Tokenurile și fereastra de context

          Modelele citesc și scriu tokenuri, nu caractere sau cuvinte, și orice limită, preț sau viteză se măsoară în tokenuri. Acestea sunt împărțiri reale făcute de o200k_base; un spațiu vizibil e desenat ca ␣.

          Fereastra de context

          Numărul maxim de tokenuri pe care un model le poate lua în calcul într-un singur apel: system promptul, conversația, documentele regăsite, rezultatele tool-urilor și răspunsul pe care îl scrie. Tot ce depășește limita trebuie tăiat, rezumat sau regăsit la cerere.

          Cost

          API-urile taxează per token, cu prețuri separate pentru input și output; tokenurile de output costă de obicei mai mult. Un system prompt lung se plătește la fiecare apel, de aceea furnizorii oferă prompt caching pentru un prefix repetat.

          Latență

          Promptul e procesat în paralel (prefill), ceea ce determină timpul până la primul token. Răspunsul e generat câte un token pe rând (decode), deci timpul total crește odată cu lungimea lui. Streamingul afișează tokenurile pe măsură ce sosesc.

          KV cache-ul

          Atenția are nevoie de un vector cheie (key) și de un vector valoare (value) pentru fiecare token anterior, în fiecare strat. Serverul îi păstrează, așa că pentru fiecare token nou se calculează doar propria poziție. Asta face decodarea rapidă, dar contextele lungi scumpe în memoria GPU.

          Context lung nu înseamnă memorie perfectă

          Modelele tind să folosească mai bine informația de la începutul și de la sfârșitul unui prompt lung decât pe cea din mijloc („lost in the middle”). Regăsește cele câteva chunk-uri care contează în loc să lipești totul și pune instrucțiunile cheie acolo unde au cel mai mare efect.

          Cum e antrenat un model de chat

          Aceeași rețea trece prin mai multe etape. Fiecare modifică ponderile și, prin urmare, valorile logits pe care le-ai văzut mai sus, pas cu pas.

          1. PreantrenarePredicția următorului token pe un corpus uriaș de text și cod. Rezultatul, un model de bază (base model), continuă textul și știe multe, dar nu urmează instrucțiunile în mod fiabil. Cunoștințele lui se opresc la data-limită a antrenării.
          2. Fine-tuning supervizatNumit și instruction tuning: antrenare pe conversații exemplu cu răspunsuri bune, într-un format de chat cu roluri. Modelul învață să urmeze instrucțiuni și să răspundă ca un asistent.
          3. Ajustare pe preferințeOameni (sau un model) compară câte două răspunsuri. RLHF antrenează un model de recompensă pe aceste alegeri, apoi optimizează LLM-ul în raport cu el prin reinforcement learning (clasic, PPO). DPO sare peste modelul de recompensă și învață direct din perechi de răspunsuri preferate și respinse.
          4. Învățare prin întărire pe sarcini verificabileModelele de raționament sunt antrenate în continuare prin învățare prin întărire (reinforcement learning) pe probleme ale căror răspunsuri pot fi verificate, cum ar fi matematica și codul, ceea ce le învață să parcurgă lanțuri mai lungi de pași.

          Prompting, RAG sau fine-tuning?

          Începe cu cea mai ieftină unealtă care poate funcționa și măsoară cu evaluări (evals) înainte să treci la următoarea.

          Prompting

          Instrucțiuni clare, câteva exemple (few-shot) și un format de output. Se schimbă instant și nu costă nimic să încerci. E limitat de ce știe deja modelul și de fereastra de context.

          Mereu primul pas

          RAG

          Retrieval-augmented generation (generare augmentată prin regăsire): aduci pasajele relevante și le adaugi în prompt. Cunoștințele rămân la zi fără reantrenare, răspunsurile pot cita surse, iar controlul accesului se face în momentul regăsirii. Calitatea depinde de împărțirea în chunk-uri, de embedding-uri și de reranking.

          Cunoștințe private sau care se schimbă

          Fine-tuning

          Antrenarea suplimentară pe exemplele tale schimbă comportamentul: un format, un ton, o sarcină îngustă făcută bine de un model mai mic și mai ieftin. E o metodă proastă de a adăuga fapte, care se învechesc. LoRA antrenează mici matrice adaptor în loc de toate ponderile.

          Stil consecvent sau o sarcină îngustă

          Tool-uri

          Function calling: modelul emite un apel structurat care respectă o schemă JSON, codul tău îl execută, iar rezultatul se întoarce în context. Folosește-l pentru date live, calcule exacte și acțiuni.

          Date proaspete și efecte secundare

          De reținut

          Câte un token pe rândUn LLM prezice repetat o probabilitate pentru fiecare posibil următor token, alege unul și îl adaugă la text. Chatul, codul și agenții se bazează toți pe această buclă.
          Tokenurile sunt unitatea de măsurăLimitele, prețurile și latența se socotesc toate în tokenuri. Numerele, cuvintele rare și multe limbi în afară de engleză au nevoie de mai multe.
          Temperatura remodelează, nu informeazăÎmpărțirea logits la T ascute sau aplatizează distribuția, iar top-k și top-p îi taie coada. T = 0 înseamnă decodare greedy, aproape, dar nu perfect deterministă.
          Embedding-urile: sensul ca direcțieSimilaritatea cosinus găsește text înrudit chiar fără cuvinte comune. Indecșii ANN, cum ar fi HNSW, fac căutarea rapidă, iar cel mai apropiat nu e mereu și relevant.
          Halucinațiile sunt presupuneri plauzibileModelul optimizează textul probabil, nu adevărul. Ancorează-l în surse, lasă-l să se abțină, validează-i output-ul și evaluează-l.

          Întrebări de interviu: cum funcționează AI

          Răspunsuri scurte pe care le poți spune cu voce tare. Încearcă să răspunzi singur la fiecare întrebare înainte s-o deschizi.

          Cum generează un LLM text?

          Rulează o buclă. Textul de până acum e împărțit în tokenuri și trecut prin rețea, iar rețeaua produce un scor (logit) pentru fiecare token din vocabularul ei. Softmax transformă scorurile în probabilități, o regulă de decodare alege un token, iar acel token e adăugat la input pentru următoarea trecere. Se oprește la un token de oprire (stop token) sau la limita de tokenuri.

          Ce este un token și de ce nu folosim cuvinte sau caractere?

          Un token e o unitate dintr-un vocabular fix, învățat de tokenizer, de obicei cu byte-pair encoding: cuvintele comune devin un singur token, cele rare se sparg în bucăți, iar orice text poate fi redus, la nevoie, la bytes. Caracterele ar face secvențele foarte lungi; cuvintele întregi ar cere un vocabular uriaș și tot ar rata cuvintele noi. Subcuvintele țin echilibrul între cele două. În engleză, un token are cam trei sferturi dintr-un cuvânt, dar numerele, codul și multe alte limbi au nevoie de mai multe tokenuri.

          Ce este temperatura?

          Un număr la care se împart logits înainte de softmax: softmax(logits / T). Sub 1 ascute distribuția, așa că tokenurile probabile domină; peste 1 o aplatizează, așa că tokenurile improbabile sunt alese mai des. T = 0 e tratat ca decodare greedy. Schimbă felul în care alege modelul, nu ce știe.

          Ce este un embedding (reprezentare vectorială)?

          O listă de numere de lungime fixă care reprezintă o bucată de text (sau o imagine, sau cod), astfel încât sensurile asemănătoare primesc vectori orientați în direcții asemănătoare. O obții de la un model de embedding și compari embedding-urile cu similaritatea cosinus. Stă la baza căutării semantice, a clusterizării, a deduplicării și a pasului de regăsire din RAG.

          Ce este o halucinație și de ce apare?

          Output fluent care nu e susținut de fapte sau de sursele furnizate. Modelul e antrenat să producă text probabil, nu text adevărat, așa că, atunci când îi lipsește un fapt, produce unul plauzibil. Datele de antrenare spun rar „nu știu”, multe evaluări răsplătesc ghicitul, cunoștințele au goluri și o dată-limită (cut-off), iar eșantionarea poate alege un token greșit pe care se sprijină apoi tokenurile următoare.

          Cum reduci halucinațiile?

          Ancorează modelul în surse regăsite și cere citări, spune-i că „nu știu” e un răspuns acceptabil și scade temperatura pentru sarcinile factuale. Folosește tool-uri pentru fapte și calcule, cere output structurat și validează-l în cod, și măsoară cu evaluări (evals) pe răspunsuri cunoscute. Acolo unde erorile costă scump, adaugă un pas de verificare sau o revizuire umană.

          Temperatură, top-k și top-p: care e diferența?

          Temperatura remodelează toată distribuția. Top-k păstrează doar cele mai probabile k tokenuri. Top-p (nucleus sampling) păstrează cel mai mic set de tokenuri, în ordinea probabilității, a căror probabilitate totală e cel puțin p, deci numărul păstrat se adaptează: puține când modelul e sigur, multe când nu e. După tăiere, tokenurile rămase sunt renormalizate și se eșantionează unul.

          Decodare greedy sau eșantionare: când folosești fiecare variantă?

          Greedy (sau o temperatură mică) pentru extragere, clasificare, cod și orice are un singur răspuns corect, pentru că vrei output-ul cel mai probabil și repetabilitate. Eșantionare cu o temperatură moderată pentru scriere creativă, brainstorming sau mai multe variante diferite. Decodarea greedy se poate bloca în bucle repetitive la texte lungi, cu final deschis.

          De ce poate temperatura 0 să dea totuși output-uri diferite?

          Decodarea greedy nu implică nimic aleatoriu, dar aritmetica nu e perfect repetabilă. Adunarea în virgulă mobilă pe GPU nu e asociativă, iar gruparea în batch cu alte cereri schimbă ordinea operațiilor, așa că doi logits aproape egali își pot schimba locurile. Un singur token diferit schimbă tot ce urmează după el. Furnizorii respectă seed-ul doar pe principiul best effort, așa că proiectează sistemul să tolereze mici variații.

          Ce este fereastra de context?

          Numărul maxim de tokenuri pe care modelul le poate procesa într-un singur apel, socotind system promptul, conversația, documentele regăsite, rezultatele tool-urilor și răspunsul generat. Tot ce depășește limita trebuie trunchiat, rezumat sau regăsit la nevoie. Ferestrele mai mari costă mai mult, iar modelele nu folosesc la fel de bine toate părțile unui context lung.

          De ce contează tokenurile pentru cost și latență?

          API-urile taxează per token de input și de output, output-ul de obicei la un preț mai mare. Inputul e procesat în paralel (prefill), ceea ce determină timpul până la primul token; output-ul e generat câte un token pe rând, deci latența totală crește odată cu lungimea răspunsului. Ajută prompturile mai scurte, prompt caching pentru prefixele repetate, modelele mai mici și limitarea lungimii output-ului.

          Ce face atenția (attention), în linii mari?

          Pentru fiecare poziție, atenția calculează cât de relevantă e fiecare poziție anterioară (comparând un vector query cu vectorii key), apoi face o combinație ponderată a vectorilor lor value. Așa poate cuvântul „is” să aducă informație din „France” și „capital”. Multe capete de atenție (attention heads) rulează în paralel în fiecare strat, iar o mască cauzală împiedică pozițiile să vadă viitorul.

          Ce este KV cache-ul?

          În timpul generării, cheile (keys) și valorile (values) din fiecare strat pentru toate tokenurile anterioare sunt stocate în loc să fie recalculate, așa că fiecare token nou își calculează doar propria poziție. Asta face decodarea mult mai rapidă, dar ocupă memorie GPU care crește cu lungimea contextului și cu dimensiunea batch-ului, una dintre principalele limite pentru contextele lungi și pentru câte cereri poate servi un server simultan.

          Ce este similaritatea cosinus și de ce o folosim pentru embedding-uri?

          Produsul scalar a doi vectori împărțit la produsul lungimilor lor: cosinusul unghiului dintre ei, de la −1 la 1. Compară direcția și ignoră lungimea, ceea ce se potrivește cu felul în care modelele de embedding codifică sensul. Dacă vectorii sunt normalizați la lungimea 1, cosinusul e egal cu produsul scalar, care e mai ieftin de calculat.

          Cosinus, produs scalar sau distanță euclidiană?

          Folosește metrica pentru care a fost antrenat modelul de embedding. Produsul scalar e influențat de lungimea vectorilor, distanța euclidiană atât de lungime, cât și de unghi, cosinusul doar de unghi. Pe vectori normalizați, toate dau aceeași ordine, pentru că pătratul distanței este 2 − 2 cos.

          Ce este o bază de date vectorială și cum funcționează căutarea ANN?

          Un sistem de stocare care indexează vectori împreună cu metadate și răspunde la întrebarea „care vectori stocați sunt cei mai apropiați de acesta?”. Căutarea exactă compară cu fiecare vector, ceea ce e prea lent la scară mare, așa că se folosesc indecși approximate nearest neighbour (ANN). HNSW construiește un graf de vecini pe mai multe straturi și înaintează greedy spre query, de la stratul de sus, rarefiat, în jos; IVF grupează vectorii în clustere și caută doar în clusterele cele mai apropiate. Sacrifici puțin recall pentru o accelerare mare.

          Explică-mi pas cu pas un pipeline RAG.

          Offline: împarți documentele în chunk-uri, calculezi embedding-ul fiecărui chunk și stochezi vectorii cu metadate. Online: calculezi embedding-ul întrebării, regăsești primele k chunk-uri (adesea în combinație cu o căutare după cuvinte cheie), opțional le faci reranking, apoi pui cele mai bune în prompt, cu instrucțiuni să răspundă doar pe baza lor și să le citeze. Evaluează regăsirea (am adus chunk-ul corect?) separat de generare (l-am folosit fidel?).

          Cum alegi dimensiunea chunk-urilor și suprapunerea (overlap)?

          Chunk-urile trebuie să fie destul de mici ca să fie specifice și să încapă mai multe în prompt, dar destul de mari ca să conțină idei complete. Unde poți, împarte după structură (titluri, paragrafe), nu după un număr fix de caractere, și adaugă puțină suprapunere (overlap), ca o propoziție tăiată la graniță să apară întreagă undeva. Apoi ajustează, măsurând calitatea regăsirii pe întrebări reale.

          Ce este reranking-ul și de ce îl adaugi?

          O a doua etapă care recalculează scorurile candidaților regăsiți cu un model mai puternic și mai lent, de obicei un cross-encoder care citește împreună query-ul și fiecare pasaj. Căutarea cu embedding-uri e rapidă, dar grosieră; dacă faci reranking pe primele 50 de rezultate, cam așa, și le păstrezi doar pe cele mai bune, crește precizia, iar scorurile reranker-ului sunt un prag mai bun pentru eliminarea pasajelor irelevante.

          De ce poate RAG să halucineze totuși?

          Regăsirea poate returna pasajul greșit, pentru că cel mai apropiat nu e neapărat și relevant, sau îl poate rata pe cel corect. Modelul poate ignora contextul în favoarea a ce a învățat, poate amesteca sursele sau poate răspunde dincolo de ele. Atenuezi cu un prag de relevanță sau un reranker, permisiunea explicită de a se abține, citări obligatorii și o verificare că fiecare afirmație e susținută de un pasaj citat.

          Cum ajută ancorarea în surse și citările?

          Ancorarea în surse (grounding) înseamnă că răspunsul e derivat din sursele pe care le-ai furnizat. Când ceri citări, fiecare afirmație poate fi urmărită până la un id de pasaj, așa că utilizatorii pot verifica răspunsul, iar codul tău poate verifica dacă pasajele citate există și chiar conțin afirmația. În plus, descurajează răspunsurile care nu au niciun suport în context.

          Prompting, RAG sau fine-tuning: cum alegi?

          Începe cu prompting. Folosește RAG când răspunsurile depind de cunoștințe private sau care se schimbă des, ori au nevoie de citări. Folosește fine-tuning ca să schimbi comportamentul: un format sau un ton consecvent, ori o sarcină îngustă rezolvată de un model mai mic și mai ieftin. Fine-tuning-ul e o metodă proastă de a adăuga fapte. Se combină bine, de exemplu un model cu fine-tuning într-un pipeline RAG.

          Cum e antrenat un model de chat?

          Preantrenarea pe un corpus uriaș de text, prin predicția următorului token, produce un model de bază (base model). Fine-tuning-ul supervizat pe conversații exemplu îl învață să urmeze instrucțiuni. Ajustarea pe preferințe, cum ar fi RLHF sau DPO, îl aliniază cu răspunsurile pe care le preferă oamenii. Modelele de raționament adaugă învățare prin întărire pe sarcini ale căror răspunsuri pot fi verificate, cum ar fi matematica și codul.

          Care e diferența dintre RLHF și DPO?

          Ambele învață din perechi de răspunsuri în care unul a fost preferat. RLHF antrenează mai întâi un reward model separat pe aceste preferințe, apoi optimizează LLM-ul în raport cu el prin învățare prin întărire, clasic cu PPO, cu o penalizare dacă se îndepărtează prea mult de modelul original. DPO renunță la reward model și la bucla de RL și optimizează LLM-ul direct pe perechile de răspunsuri preferate și respinse, cu o funcție de loss simplă, de tip clasificare. DPO e mai simplu și mai stabil de rulat.

          Ce este LoRA?

          Low-rank adaptation: în loc să actualizezi toate ponderile, îngheți modelul și antrenezi matrice mici, de rang redus, adăugate la unele straturi. Are nevoie de mult mai puțină memorie și spațiu de stocare și poți păstra mai multe adaptoare pentru același model de bază. QLoRA face același lucru pe un model de bază cuantizat, ca să economisească și mai multă memorie.

          Ce este prompt injection și cum te aperi de el?

          Instrucțiuni ascunse în conținutul pe care îl procesează modelul, cum ar fi o pagină web, un e-mail sau un document regăsit, care încearcă să-ți suprascrie instrucțiunile, de exemplu ca să scurgă date sau să apeleze un tool. Modelul nu poate deosebi sigur datele de instrucțiuni, așa că nu poți preveni complet atacul doar prin prompting. Limitează ce poate face modelul: tool-uri cu privilegii minime, confirmare pentru efectele secundare, niciun secret în context și validarea output-ului.

          Cum funcționează output-ul structurat și function calling?

          Îi dai modelului o schemă JSON, fie pentru răspunsul lui, fie pentru fiecare tool pe care îl poate apela. Modelul emite JSON care respectă schema, iar mulți furnizori o pot impune prin decodare constrânsă (constrained decoding), care permite doar tokenurile ce păstrează output-ul valid. La un apel de tool, codul tău rulează funcția și trimite rezultatul înapoi ca mesaj nou. Validează oricum argumentele; faptul că respectă schema nu înseamnă că valorile sunt corecte.

          Cum evaluezi o aplicație cu LLM?

          Construiește un set de test din inputuri reale, cu răspunsuri așteptate sau criterii de notare, și rulează-l la fiecare schimbare de prompt, model sau regăsire. Folosește verificări exacte unde se poate (JSON valid, câmpul corect, pasajul citat conține afirmația) și un LLM judge cu o grilă clară unde nu se poate, validat față de etichete puse de oameni. Urmărește metricile de regăsire, fidelitatea față de surse (faithfulness), latența și costul, și monitorizează trace-urile din producție.

          De ce se descurcă prost LLM-urile la numărat litere și la aritmetică?

          Ele văd tokenuri, nu caractere: strawberry are trei tokenuri în o200k_base, așa că literele nu sunt direct vizibile. Numerele sunt împărțite în bucăți de până la trei cifre, care nu se aliniază cu valoarea pozițională a cifrelor. Dă-i în schimb modelului un tool, cum ar fi un interpretor de cod sau un calculator.

          Cum reduci costul și latența în producție?

          Folosește cel mai mic model care trece de evaluările tale și trimite doar cererile grele la unul mai mare. Scurtează prompturile, pune în cache prefixele repetate, regăsește mai puține chunk-uri, dar mai bune, limitează lungimea output-ului, trimite răspunsurile prin streaming și pune în cache răspunsurile întregi pentru întrebările repetate. Procesează în batch munca offline și măsoară separat timpul până la primul token și tokenurile pe secundă.

          Id-urile și numărul de tokenuri provin din tiktoken 0.14 cu o200k_base; alte familii de modele folosesc alți tokenizeri, așa că id-urile și numărătorile lor diferă. Logits sunt ilustrative. Fiecare probabilitate, similaritate și eșantion de pe această pagină e calculat exact și se potrivește cu programele din verify/ai/.