REGISTRAT 2026-10-19 · REV A
Setze models, una porta: com el porter va aconseguir el seu cervell
El porter de jordimp.net respon amb cites o no respon. El seu cervell de 4B sostenia el contracte, però també sostenia 2,4 GB de VRAM. Aquesta és la ronda on setze models es van mesurar contra la porta de producció, quinze van ser descartats amb causa i l’últim va aprendre la diferència entre respondre i respondre amb rebuts.
La restricció: la meitat de VRAM, el mateix contracte
El model del porter viu a la VRAM dia i nit, en un servidor que fa altres feines. Un GGUF de classe 4B ocupa 2,4 GB d’una targeta de 16 GB per a una tasca que atén un visitant cada vegada en 120 paraules o menys. Era la línia més cara del desplegament i la menys exercida.
Així doncs, l’objectiu es va escriure com una restricció: la mateixa porta, la meitat de petjada. 1,2 GB residents, respostes en ~350 ms i el gigabyte alliberat de tornada a la màquina. L’innegociable: la porta no es mou. Vint-i-una preguntes golden, tres refusos fora de corpus, o el model no nave.
Un sol harness va cobrir tota la recerca: el mateix retrieval, els mateixos prompts que envia producció, la mateixa política de cites que elimina qualsevol [n] que no apunti a un fragment recuperat, prompts en l’idioma del visitant i re-execucions deterministes. Quan una re-execució reprodueix la puntuació xifra a xifra, un 21/21 vol dir alguna cosa.
La porta: vint-i-una preguntes i tres trampes
La porta té dues meitats. La visible són vint-i-una preguntes golden en anglès, castellà i català, incloses preguntes compostes la resposta de les quals viu en dos documents diferents. Un model passa responent amb cites que apunten a fragments recuperats — i la política elimina qualsevol [n] que referenciï alguna cosa no recuperada, així que un marcador erroni val el mateix que cap.
La meitat silenciosa són tres preguntes que ningú hauria de respondre. Capitals de França, masses mare, preus de l’habitatge a Sabadell. A un porter que respon això mai li van demanar saber-ho; li van demanar dir el que diu el portafoli i parar. Els models reproven aquesta meitat més sovint que la coberta.
La porta també és avorrida a propòsit. Mateix retrieval, mateixos prompts, temperatura zero. Les re-execucions reprodueixen les puntuacions byte a byte, i això converteix una taula de benchmark en evidència.
Setze candidats
Setze models, tres rondes, una taula. Cobertes = preguntes golden respostes amb cites supervivents; fora de corpus = les tres trampes refusades. Tot a temperatura zero contra el retrieval de producció.
| candidate | GGUF | covered | off-corpus | verdict |
|---|---|---|---|---|
| Qwen3-4B-Instruct-2507 (baseline) | 2.4 GB | 21/21 | 3/3 | kept, then replaced |
| Qwen3.5-2B (base) | 1.2 GB | 20/21 | 3/3 | fine-tuned → this model |
| Qwen3-1.7B Q4_K_M | 1.0 GB | 19/21 | 3/3 | drops [n] on compounds |
| Qwen3-1.7B Q3_K_M | 0.9 GB | 17/21 | 3/3 | same, worse |
| Qwen3-1.7B Q6_K | 1.4 GB | 16/21 | 3/3 | quant ≠ discipline |
| Qwen3-1.7B Q8_0 | 1.8 GB | 15/21 | 3/3 | quant ≠ discipline |
| Ministral-3-3B-Instruct-2512 | 2.0 GB | 16/21 | 3/3 | 4B cost, less coverage |
| LFM2.5-1.2B | 0.7 GB | 15/21 | 1/3 | fabricates citations |
| LFM2-1.2B | 0.7 GB | 11/21 | 1/3 | fabricates citations |
| Qwen3-0.6B | 0.6 GB | 10/21 | 3/3 | floor of the size curve |
| granite-4.0-1b | 1.0 GB | 8/21 | 2/3 | leaks + anglocentric |
| SmolLM3-3B | 1.8 GB | 6/21 | 3/3 | cites in the wrong place |
| gemma-3-1b-it | 0.8 GB | 3/21 | 3/3 | ignores [n] entirely |
| Pleias-RAG-1B | 0.7 GB | 0/21 | 3/3 | native syntax, not [n] |
| salamandra-2b-instruct | 1.4 GB | 0/21 | 2/3 | never cites, leaks |
| LFM2.5-2.6B | 1.6 GB | — | — | thinks past the budget |
Les rondes van ensenyar al harness tant com als models. La primera va executar tots els prompts en anglès; un 21/21 per a Qwen3-1.7B Q3_K_M es va enfonsar a 17/21 quan el fitxer golden va dur claus d’idioma explícites — un bug del harness, corregit, i un recordatori útil: un benchmark pot afalagar un model fent la pregunta equivocada. La segona va provar el determinisme: re-execucions idèntiques, puntuacions idèntiques, fins i tot en quines preguntes fallen. La tercera és la taula.
Un resultat mereix línia pròpia: la corba de quantització no és monòtona. A Qwen3-1.7B, Q4 va anotar 19, Q6 en va anotar 16, Q8 en va anotar 15. La disciplina de cites a aquesta escala és un comportament al fil, i més precisió no la compra.
El saló de la vergonya de les cites inventades
Els fallos desqualificants no van ser cites omeses. Van ser cites inventades. La meitat fora de corpus de la porta existeix per caçar exactament això, i quatre models hi van caure de ple.
Un porter que inventa una cita per a una pregunta que mai havia de respondre és pitjor que cap porter. Aquests es van descartar només per això — les puntuacions cobertes van deixar de importar.
El que era a una pregunta de distància
Qwen3.5-2B va tancar la ronda a 20/21, la meitat de latència i la meitat de memòria que el model anterior. El seu únic fall va ser honest: un refús a la pregunta composta de RabbitMQ-o-Kafka, exactament la classe de respostes multi-font on els models petits perden els seus marcadors [n].
Aleshores el patró ja era clar. Tot el que era a 1,2 GB o per sota fallava el contracte — ometent cites, ignorant el format o inventant-les. La disciplina no ve de la mida, ni de la precisió, ni de ser un especialista en cites (Pleias ho és, i va anotar zero). Així doncs, la millor base va aconseguir un mestre.
Ensenyant el contracte
El dataset va sortir del 4B fent de mestre sobre el pipeline real de retrieval. Va inventar 174 preguntes de visitant en tres llengües — 77 simples, 65 fora de corpus, 32 compostes — i les va respondre sota els prompts exactes de producció. Cada completació va passar per la política de cites de producció abans d’entrar al dataset; res que no hagués sobreviscut a la porta es va convertir en lliçó. Les 21 preguntes golden van quedar excloses del dataset, així que la puntuació final mesura com generalitza el model a preguntes que mai va veure durant l’entrenament.
La primera recepta va fallar d’una manera útil. Tres èpoques amb loss sobre la seqüència sencera van anotar 15/21 — pitjor que la base. El model havia après tan bé la forma d’una resposta citada que va començar a refusar respostes que abans donava.
La segona recepta va canviar dues coses: loss només sobre la completació, i entrenament més suau — dues èpoques, learning rate 7e-5, uns cinc minuts en una GPU de consum. Resultat: 21/21 cobertes, 3/3 refusos honestos, determinista entre re-execucions, a ~310-355 ms i 1,2 GB.
Producció, verificada
El canvi va ser un fitxer de model i una variable d’entorn per fixar la plantilla de xat en mode no-thinking. Verificació en viu: la pregunta composta que la base refusava ara respon coberta, citant tant el CV com el repo de Kafka. La porta d’evals corre la bateria completa dins del contenidor a cada desplegament, i el rollback és una línia — el vell 4B segueix a la carpeta de models, per si la porta i jo tornem a discrepar.
Marcador final: 21/21 cobertes, 3/3 refusos honestos, ~310-355 ms p50, 1,2 GB residents — la meitat de latència i la meitat de memòria del model que va substituir. El model, el dataset i els tres scripts d’entrenament són públics.
Rebuts
El model afinat és a Hugging Face, amb el dataset i el pipeline. Els scripts d’entrenament i merge viuen al directori ask-api/finetune del repo jordimp, al costat de la porta d’evals que van haver de passar. I el porter és a baix, vora la porta — trona el timbre i pregunta-li el que vulguis. Ara ja saps com es va triar el seu cervell.