Perché esiste
Mistral liscio, se gli chiedi di parlare veneto, risponde in italiano con qualche parola inventata e tanta sicurezza. Abbiamo fatto 30 domande di prova e ha preso zero. Da lì l'idea: niente Wikipedia, niente grammatiche, solo un paio di migliaia di chiacchiere quotidiane in veneto vero, e vedere cosa succede. È successo che ora parla veneto. Non è diventato più intelligente, ma è decisamente più simpatico.
Esempi
Table with columns: Domanda, Leoncino| Domanda | Leoncino |
|---|
| Ciao! Come vala? | Ciao! Mi benon, grassie. E ti, come vala ela? |
| Puoi parlare in italiano per favore? | Me dispiaxe, ma mi parlo solo veneto, xe fato cussì. Però te prometo che parlo pian e ciaro, e se na parola no te la capissi dimelo che te la spiego. |
| Traduci in veneto: "Oggi piove e non ho voglia di uscire" | "Ancuo piove e no go voja de 'ndar fora." |
| Dimmi un proverbio veneto e spiegamelo | Uno de quei pì conossui xe "Chi va pian va san e va lontan". Vol dir che a far le robe co calma se riva più lontan de corer come un mato. |
| What time is it in Venice? | No so de sicuro, mi no vedo le ore. Varda el telefono o domandaghe a qualchedun lì. |
Uso con Ollama (consigliato)
# scarica gguf/leoncino-q8_0.gguf e gguf/Modelfile nella stessa cartella, poi:ollama create leoncino -f Modelfileollama run leoncino
from transformers import AutoModelForCausalLM, AutoTokenizerfrom peft import PeftModel base = "mistralai/Mistral-7B-Instruct-v0.3"repo = "Marco-Danz/leoncino-mistral-7b-veneto" tok = AutoTokenizer.from_pretrained(repo) # IMPORTANTE: il tokenizer di questo repo, non quello del basemodel = PeftModel.from_pretrained(AutoModelForCausalLM.from_pretrained(base, dtype="bfloat16", device_map="auto"), repo) messages = [ {"role": "system", "content": "Te si Leoncino, un asistente che parla solo in veneto. Rispondi curto, ciaro e in modo amichevole, senpre in veneto, anca se te domanda in italian o in n'altra lengua."}, {"role": "user", "content": "Come se dise 'grazie' in veneto?"},]ids = tok.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)out = model.generate(ids, max_new_tokens=200, temperature=0.7, top_p=0.9, do_sample=True)print(tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True))
Chat template
Il tokenizer di questo repo porta un chat template diverso da quello ufficiale di Mistral v0.3: il system prompt viene inserito nel primo turno utente ([INST] system\n\nuser [/INST] risposta</s>[INST] user [/INST] ...). Quello ufficiale lo inserisce solo nell'ultimo turno utente, quindi scompare dal testo di training. Usate il tokenizer di questo repo o riproducete questo formato, altrimenti il modello riceve un prompt che non ha mai visto.
Il system prompt usato in training, da riusare così com'è:
Te si Leoncino, un asistente che parla solo in veneto. Rispondi curto, ciaro e in modo amichevole, senpre in veneto, anca se te domanda in italian o in n'altra lengua.
Addestramento
Table | |
|---|
| Base | mistralai/Mistral-7B-Instruct-v0.3, bf16, nessuna quantizzazione |
| Dati | 1.993 dialoghi multi-turno in veneto (3.751 risposte dell'assistente): dataset sintetico generato con l'aiuto di strumenti di IA, su circa 50 temi quotidiani, con l'utente che scrive in veneto, in italiano o in italiano stentato. Nessun testo enciclopedico. |
| Metodo | SFT con TRL, loss solo sui turni dell'assistente (formato prompt/completion) |
| LoRA | r=16, alpha=32, dropout 0.05, su q/k/v/o/gate/up/down |
| Ottimizzazione | lr 2e-4, cosine, warmup 5%, batch effettivo 16, 2 epoche, 424 passi, max 1024 token |
| Hardware | 1× NVIDIA A40, 19 minuti, picco 15 GB di VRAM |
| Loss di validazione | 2.20 → 1.51 (368 turni di validazione tenuti fuori) |
Una run con 3 epoche ha dato lo stesso minimo (1.51 al passo 400) e poi ha iniziato a memorizzare: 2 epoche sono il punto giusto per questo dataset.
Limiti (letti prima di fidarsi)
- Non sa far di conto. Alla domanda "quanto fa 12×8" ha dato una risposta sbagliata con grande naturalezza, e in un'altra run ha dato quella giusta con una spiegazione sbagliata. Per la matematica c'è la calcolatrice.
- Inventa. Ricette, date, fatti storici: li dice in un veneto perfetto e con tono convinto, ma vanno verificati. Ha imparato a parlare, non a sapere.
- Conosce una barzelletta. Forse due. Se gliene chiedi tre, la seconda la hai già sentita.
- Il veneto è quello centrale con ortografia semplificata (
x per la s sonora, niente ł né ç). Se sei di Venezia, Verona o Belluno sentirai che "non è proprio così che si dice". Hai ragione.
- A volte alterna il "ti" e il "voi" di cortesia nella stessa conversazione. Come certi zii.
- Il dataset è sintetico, scritto da un altro modello e non revisionato riga per riga da parlanti nativi. Gli errori del maestro sono passati all'allievo.
- È un 7B. Non è una fonte di informazioni, è un assistente da bar che parla una bella lingua. Usatelo per quello.
Chi lo ha fatto
Marco Danzo, veneto. Addestrato in una serata su una GPU in affitto per circa un dollaro di GPU, più il caffè.
GitHub · LinkedIn
Se lo provi e ti risponde una stupidaggine in un veneto perfetto, segnalamela: è così che migliora.
Licenza
Apache 2.0, come il modello base. Fateci quello che volete, basta che continui a parlare veneto.