# Imblanzirea bestiei: evalueaza, diagnosticheaza, itereaza

Oricine poate rula un script de antrenare. Diferenta dintre un dragon antrenat si unul norocos este **evaluarea** — masurarea, diagnosticarea si iterarea ca un inginer. Aceasta este lectia care transforma un v1 mediocru intr-un v3 in care chiar ai incredere, si e disciplina peste care sar majoritatea amatorilor.

## Cele trei niveluri de evaluare

**Nivelul 1 — Curbele de loss (gratuit, automat).** Le ai deja din antrenare. Iti spun despre *proces*: a invatat modelul, a facut overfitting? Nu iti spun nimic despre daca raspunsurile sunt de fapt bune.

**Nivelul 2 — Setul tau de test (examenul adevarat).** Iti amintesti `test.jsonl` — felia pe care modelul nu a vazut-o niciodata? Ruleaza fiecare prompt de test prin modelul antrenat si noteaza iesirile fata de cardul de obiectiv din lectia 2. Acesta e adevarul tau de referinta.

**Nivelul 3 — Model-ca-judecator (scalarea nivelului 2).** Pune un model puternic (Claude, sau cel mai mare model local al tau) sa noteze fiecare raspuns dupa o grila. Perfect pentru re-notarea a 30+ de raspunsuri la fiecare iteratie fara sa pierzi o seara.

<div class="concept-box">
<h4>Concept</h4>
Noteaza dupa <strong>cardul tau de obiectiv</strong>, nu dupa impresii. Cardul lui Ember spune: structura (raspuns → explicatie → pas urmator), voce, zero fapte inventate. Deci grila are trei intrebari da/nu per raspuns. Scor = numaratori, nu sentimente. "Pare mai bun" nu e o masuratoare.
</div>

## Citirea curbelor: trei forme clasice

<svg viewBox="0 0 720 280" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Trei forme de curbe de loss: sanatoasa, overfitting, subantrenata">
    <!-- panel 1: healthy -->
  <path d="M30 230 L30 60 M30 230 L220 230" stroke="#3a4356" stroke-width="1" fill="none"/>
  <path d="M35 80 C 70 140, 110 180, 215 195" stroke="#4fffb0" stroke-width="2" fill="none"/>
  <path d="M35 75 C 70 130, 110 170, 215 180" stroke="#7b8cff" stroke-width="2" fill="none" stroke-dasharray="5 4"/>
  <text x="125" y="256" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="13px">Sanatoasa</text>
  <text x="125" y="272" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="11px">ambele scad, distanta mica</text>
  <!-- panel 2: overfitting -->
  <path d="M280 230 L280 60 M280 230 L470 230" stroke="#3a4356" stroke-width="1" fill="none"/>
  <path d="M285 80 C 320 140, 360 190, 465 205" stroke="#4fffb0" stroke-width="2" fill="none"/>
  <path d="M285 75 C 330 130, 380 150, 400 145 C 430 140, 450 110, 465 90" stroke="#7b8cff" stroke-width="2" fill="none" stroke-dasharray="5 4"/>
  <text x="375" y="256" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="13px">Overfitting</text>
  <text x="375" y="272" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="11px">val loss o ia in sus</text>
  <!-- panel 3: undertrained -->
  <path d="M530 230 L530 60 M530 230 L720 230" stroke="#3a4356" stroke-width="1" fill="none"/>
  <path d="M535 80 C 570 100, 620 115, 715 125" stroke="#4fffb0" stroke-width="2" fill="none"/>
  <path d="M535 75 C 570 95, 620 108, 715 115" stroke="#7b8cff" stroke-width="2" fill="none" stroke-dasharray="5 4"/>
  <text x="625" y="256" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="13px">Subantrenata</text>
  <text x="625" y="272" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="11px">inca scade la final</text>
  <text x="60" y="52" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="11px">— train &nbsp; ---- validare</text>
</svg>

**Sanatoasa:** ambele curbe coboara, validarea putin deasupra train-ului, ambele se aplatizeaza. Trimite-l la setul de test.

**Overfitting:** loss-ul de validare atinge minimul si urca in timp ce train-ul continua sa scada. Dragonul memoreaza. Remedii, in ordinea puterii: **date mai multe/mai bune**, mai putine epoci (opreste-te unde val loss a atins minimul), rank mai mic, LoRA dropout mai mare.

**Subantrenata:** ambele inca scadeau cand antrenarea s-a terminat. Cel mai usor remediu din manual: antreneaza mai mult sau creste putin learning rate-ul.

## Tabelul de diagnostic

Numerele arata spre problema; citirea iesirilor reale o identifica. Dupa fiecare run, citeste 10 iesiri de test si potriveste simptomele:

| Simptom in iesiri | Cauza probabila | Remediu |
|---|---|---|
| Ignora formatul uneori | Exemple inconsistente sau prea putine | Curata datele; adauga exemple axate pe format |
| Papagaliceste raspunsuri de antrenare cuvant cu cuvant | Overfitting | Mai putine epoci; mai multa varietate in date |
| Format grozav, substanta slaba | Rank prea mic sau baza prea mica | r=16→32; ia in calcul o baza 8B |
| Inventeaza fapte cu incredere | Lipsesc exemple de refuz in date | Adauga 20–30 de demonstratii explicite de refuz |
| Mai slab decat baza la conversatie generala | Supraantrenat / catastrophic forgetting | Mai putini pasi; amesteca 10–20% exemple de conversatie generala |
| Schimba limba aleator | Date cu limbi amestecate fara tipar | Fa perechea de limbi explicita per exemplu |

<div class="honest-note">
<h4>Nota sincera</h4>
Catastrophic forgetting e real: bombardeaza un model cu 2.000 de tichete de suport si poate deveni <em>mai slab</em> la orice altceva. Baza inghetata a LoRA limiteaza pagubele (stergi adapterele si baza ramane neatinsa), dar adapterele tot pot coplesi comportamentul. Vaccinul standard: pastreaza o felie mica de date de conversatie generala in amestec.
</div>

## Bucla de iteratie

Fluxul tau de lucru de aici incolo este o bucla, si fiecare trecere dureaza o seara, nu o saptamana:

1. **Evalueaza** v_N pe setul de test → scoruri pe grila cardului de obiectiv
2. **Citeste** cele mai slabe 10 iesiri → alege *singura* problema cea mai mare
3. **Repara datele intai** (ele sunt cauza in ~80% din cazuri), hiperparametrii pe locul doi
4. **Reantreneaza** → v_N+1, **re-evalueaza acelasi set de test** → compara numerele
5. Opreste-te cand atingi testul de succes din cardul de obiectiv — al lui Ember era ≥25/30 structurate, 0 fapte inventate

<div class="pro-tip">
<h4>Pro Tip</h4>
Schimba <strong>un singur lucru per iteratie</strong>. Daca adaugi date, scazi learning rate-ul si cresti rank-ul toate deodata, scorul se misca si nu inveti nimic despre de ce. Incet inseamna lin, lin inseamna rapid — bucla asta converge in 3–4 treceri disciplinate.
</div>

<div class="try-it">
<h4>Incearca</h4>
Ruleaza intregul set de test prin v1 si noteaza-l cu grila ta — numarul de referinta sincer. Apoi fa exact o iteratie a buclei (probabil: adauga exemple de refuz si re-curata formatarea) si pune scorul lui v2 langa cel al lui v1. Acea singura comparatie te invata mai multe despre fine-tuning decat orice articol de blog.
</div>

<div class="checkpoint">
<h4>Checkpoint</h4>
Poti citi cele trei forme de curbe de loss, poti diagnostica cele sase simptome clasice ale iesirilor si rulezi o bucla de iteratie cu o singura schimbare per trecere, cu scoruri reale. Dragonul tau e imblanzit. Urmeaza: antrenare avansata — preference tuning, modele mai mari si micsorarea lui Ember pentru deploy.
</div>
