fix(maria): acoperirea se judeca pe ce a intrebat omul acum, si pe radacina cuvantului

Doua reparatii pe poarta de acoperire, amandoua masurate pe setul de calibrare
extins (31 de cazuri, de la 26).

**Termenii distinctivi se comparau pe cuvantul intreg.** Documentatia si clientul
nu folosesc aceleasi forme: documentul scrie „token" si „tokenuri", omul scrie
„tokenul"; documentul „Generare", omul „generez". Trei continuari legitime din
cinci escaladau desi chunk-ul cu raspunsul era chiar in context. Comparatia se
face acum pe primele 5 litere; codurile raman intregi (ORA-01722 si ORA-01720 au
aceleasi cinci).

**Interogarea avea doua roluri amestecate.** Pe un fir, regasirea are nevoie de
ancora („da, ma blocheaza" singur nu gaseste nimic), dar acoperirea nu: judecata
pe ancora, ea cere sa apara in documente si salutul, si numele firmei, si luna,
deci raportul scade la fiecare replica si firul lung escaladeaza degeaba.
`rank.assess` primeste `dovada` — mesajul nou, plus OCR-ul capturii lui; cand
acesta n-are termeni proprii, se cade inapoi pe interogarea intreaga.

Setul de calibrare: 31/31 cu reparatia, 30/31 fara.

Ce NU s-a facut, desi era propus in handover: lista de formule de politete in
`rare_terms`. Masuratoarea nu o justifica — cu potrivirea pe radacina, cazurile cu
ancora politicoasa trec si fara ea, iar intr-una din configuratii facea rau.
Cauza reala nu era politetea din ancora, ci morfologia.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
This commit is contained in:
Claude Agent
2026-09-01 19:57:49 +00:00
parent 89145d437e
commit 653f5cbba9
6 changed files with 184 additions and 20 deletions

View File

@@ -358,6 +358,22 @@ Fuziunea da mereu un clasament, si la o intrebare complet straina. De aceea deci
distinctivi ai intrebarii (coduri, cuvinte rare in corpus) apar chiar in
chunk-urile gasite.
Termenii se compara **pe primele 5 litere**, nu pe cuvantul intreg (codurile fac
exceptie: `ORA-01722` si `ORA-01720` incep la fel). Documentatia si clientul nu
folosesc aceleasi forme — documentul scrie „token" si „tokenuri", omul scrie
„tokenul"; documentul „Generare", omul „generez". Comparate intregi, exact
cuvintele care conteaza nu se gaseau: pe setul de calibrare, trei continuari
legitime escaladau desi chunk-ul cu raspunsul era chiar in context.
**Pe un fir de discutie, interogarea are doua roluri diferite.** Regasirea se face
pe ancora plus mesajul nou — ancora chiar ajuta, „da, ma blocheaza" singur nu
gaseste nimic. Acoperirea se judeca insa pe **mesajul nou** (`dovada`, in
`rank.assess`): altfel raspunde la ce a intrebat omul acum SI la formulele si
numele proprii din primul mesaj („buna", „august", „AUTO SULEA" nu apar in niciun
document), iar raportul scade la fiecare replica — firul lung escaladeaza degeaba.
Cand mesajul nou n-are termeni distinctivi proprii, se cade inapoi pe interogarea
intreaga, ca inainte.
Fractiunea din pasul 2 nu e cosmetica: cu un singur termen gasit, „cum imi resetez
parola de la Windows" trecea drept acoperita fiindca „parola" apare in documente.
@@ -373,7 +389,7 @@ L-am scos, nu urcat, fiindca **cosinusul creste cu lungimea interogarii**: pe un
de discutie se cauta dupa ancora plus mesajul nou, deci scorul urca la fiecare
replica fara sa apara vreo dovada in plus. Aceeasi captura: 0,778 singura, 0,836
impreuna cu mesajul de dinainte. Orice prag fix de sus e trecut de o discutie destul
de lunga. `ops/calibrate-rank.py`: 26/26, si niciunul dintre cazurile cu raspuns in
de lunga. `ops/calibrate-rank.py`: 31/31, si niciunul dintre cazurile cu raspuns in
documente nu avea nevoie de scurtatura — toate trec pe dovada lexicala.
Modelul primeste `temperature=0` (`LLM_TEMPERATURE`). Fara ea, llama.cpp raspunde