Fine-tuning di un LLM open-weight con LoRA perché risponda nello stile di scrittura dell'utente: messaggi brevi, tono casual, italiano informale.
Progetto di studio: quello che mi interessava è la parte tecnica — costruzione del dataset, addestramento LoRA su una singola GPU da 12 GB, inferenza con memoria conversazionale — non l'imitazione di una persona.
- Dataset (
make_dataset.py) — dai CSV grezzi delle chat: merge dei messaggi consecutivi, split in conversazioni (gap > 10 min), finestre multi-turno a 6 turni, dedup esatto, ribilanciamento delle risposte brevi. ~14.000 campioni, zero token residui dal tool di export. - Identità (
add_identity.py) — campioni di identità (chi sono, hobby, setup) accodati al dataset, con valori segnaposto in questa repo. - Training (
settings.jsonc) — base Qwen2.5-7B-Instruct, LoRA r=32 su tutti i layer, 3 epoche, 4-bit NF4 + double quantization, su singola RTX 3060 12GB. Loss 3.08 → 1.56 in 2610 step (~10h). - Inferenza (
chat_clone.py) — CLI con memoria degli ultimi 6 scambi e maschera di attenzione esplicita.smoke_test.py/clone_test.pyper verifiche rapide.
Su 4 domande di verifica lo stile è quello giusto nel 50% dei casi al primo colpo (2/4): risposte brevi e tono corretto; i fallimenti sono allucinazioni da poco contesto, non da training.
Il dataset (conversazioni reali), i media e i pesi dell'adapter non sono in questa repo: qui ci
sono solo codice e configurazione, con valori segnaposto (<nome>, <gpu>, xxxxx). Il
.gitignore esclude le cartelle del dataset, dell'output di training e i formati dei pesi, così non
possono finire in un commit per sbaglio.
torch, transformers, peft, bitsandbytes — GPU NVIDIA con ≥12GB VRAM per il training.
MIT — vedi LICENSE.