{"id":2548,"date":"2026-03-13T15:48:23","date_gmt":"2026-03-13T15:48:23","guid":{"rendered":"https:\/\/paoloronco.it\/?p=2548"},"modified":"2026-03-13T15:48:24","modified_gmt":"2026-03-13T15:48:24","slug":"ai-locale-pesi-modificati-modificare-un-modello-dallinterno","status":"publish","type":"post","link":"https:\/\/paoloronco.it\/en\/ai-locale-pesi-modificati-modificare-un-modello-dallinterno\/","title":{"rendered":"AI locale, pesi modificati: modificare un modello dall&#8217;interno"},"content":{"rendered":"<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Un esperimento personale per capire cosa succede davvero dentro un modello linguistico.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Di cosa si tratta<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ho sempre usato l&#8217;AI come strumento. Questo progetto nasce dalla curiosit\u00e0 di capire come funziona dall&#8217;interno \u2014 non da un&#8217;applicazione, non da un&#8217;API, ma il modello grezzo, i suoi pesi, la sua geometria interna.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Heretic<\/strong> \u00e8 uno strumento open source che permette di modificare il comportamento di un modello linguistico (LLM) attraverso una tecnica chiamata <strong>abliterazione<\/strong>: invece di riaddestrare il modello da zero, si interviene sulle sue attivazioni interne per spostare il modo in cui risponde a certi tipi di input.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il risultato \u00e8 un modello modificato, salvato e pubblicato su Hugging Face.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cosa ho fatto, passo per passo<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Ambiente locale su Windows con GPU<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ho configurato un ambiente Python con virtual environment, installato PyTorch con supporto CUDA per sfruttare la GPU NVIDIA. Niente cloud, niente servizi a pagamento: tutto gira sulla mia macchina.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Python 3.13 \u00b7 PyTorch 2.10 + CUDA 12.8 \u00b7 Windows 11<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. Capire cosa fa Heretic sotto il cofano<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di lanciare qualsiasi comando, ho studiato il processo. Heretic:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>carica il modello e i suoi pesi (in formato Transformers \/ HuggingFace)<\/li>\n\n\n\n<li>usa due dataset di prompt: uno &#8220;innocuo&#8221; (<code>mlabonne\/harmless_alpaca<\/code>) e uno &#8220;problematico&#8221; (<code>mlabonne\/harmful_behaviors<\/code>)<\/li>\n\n\n\n<li>analizza le <strong>attivazioni interne<\/strong> del transformer su entrambi i set<\/li>\n\n\n\n<li>calcola una <strong>direzione nello spazio latente<\/strong> che separa i due comportamenti<\/li>\n\n\n\n<li>ottimizza i parametri attraverso <strong>200 trial<\/strong> con Optuna (ottimizzazione bayesiana)<\/li>\n\n\n\n<li>applica la correzione tramite <strong>LoRA<\/strong> \u2014 un&#8217;aggiunta leggera ai pesi del modello<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">In pratica: il modello non viene riscritto, viene orientato.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Il modello scelto: TinyLlama 1.1B<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ho scelto <code>TinyLlama\/TinyLlama-1.1B-Chat-v1.0<\/code> come punto di partenza \u2014 piccolo abbastanza da girare comodamente in locale (~5-15 minuti su GPU), ma abbastanza capace da essere interessante da osservare.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ho anche avviato sessioni su modelli pi\u00f9 grandi (Mistral 7B, Phi-3) per confronto.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Pubblicazione su Hugging Face<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il modello risultante \u00e8 stato salvato in formato Transformers e caricato pubblicamente su Hugging Face:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><a href=\"https:\/\/huggingface.co\/paoloronco\/TinyLlama-1.1B-Chat-v1.0-heretic\">paoloronco\/TinyLlama-1.1B-Chat-v1.0-heretic<\/a><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Incluso un Colab notebook per chi vuole testarlo senza installare nulla.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cosa ho imparato<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Sul funzionamento dei modelli linguistici<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Questo progetto mi ha dato un&#8217;intuizione concreta su concetti che prima restevano astratti:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I modelli non &#8220;decidono&#8221; di rifiutare qualcosa in modo simbolico \u2014 lo fanno perch\u00e9 certi pattern di attivazione si ripetono statisticamente. Quella tendenza si pu\u00f2 misurare.<\/li>\n\n\n\n<li>The <strong>spazio latente<\/strong> non \u00e8 una metafora: \u00e8 una struttura matematica reale, con direzioni identificabili che corrispondono a comportamenti osservabili.<\/li>\n\n\n\n<li><strong>LoRA<\/strong> (Low-Rank Adaptation) permette di modificare un modello grande intervenendo su una frazione minima dei parametri \u2014 \u00e8 efficiente e reversibile rispetto al fine-tuning completo.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sul lavoro con strumenti tecnici<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ho imparato a leggere documentazione tecnica e a tradurla in passi operativi concreti<\/li>\n\n\n\n<li>Ho gestito un ambiente Python su Windows con dipendenze complesse (CUDA, PyTorch, Transformers)<\/li>\n\n\n\n<li>Ho lavorato con repository HuggingFace: struttura dei file, model card, tokenizer, configurazioni<\/li>\n\n\n\n<li>Ho capito la differenza tra formati di distribuzione: <strong>Transformers<\/strong>, <strong>GGUF<\/strong> (per LM Studio), <strong>safetensors<\/strong><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sul metodo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il progetto ha richiesto ricerca, lettura di paper e documentazione, capacit\u00e0 di diagnosticare errori (GPU non rilevata, dipendenze incompatibili, dimensione batch) e adattare il processo di conseguenza. Nessun tutorial pronto \u2014 solo documentazione e tentativi.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cosa NON \u00e8 questo progetto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sono onesto: <strong>non sono un AI engineer n\u00e9 un programmatore<\/strong>. Ho usato strumenti esistenti, assistenza AI per orientarmi nella documentazione tecnica, e la mia capacit\u00e0 di capire cosa stavo facendo prima di farlo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questo non \u00e8 un progetto di sviluppo \u2014 \u00e8 un progetto di <strong>esplorazione e apprendimento<\/strong>. Il valore per me \u00e8 nella comprensione acquisita, non nel codice scritto.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Struttura del repository<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>Heretic\/\n\u251c\u2500\u2500 Models\/                         # Repo GitHub dei modelli pubblicati\n\u2502   \u251c\u2500\u2500 TinyLlama-1.1B-Chat-v1.0-heretic\/\n\u2502   \u2502   \u251c\u2500\u2500 Notebooks\/              # Colab notebook per test rapido\n\u2502   \u2502   \u251c\u2500\u2500 config.json             # Configurazione modello\n\u2502   \u2502   \u251c\u2500\u2500 generation_config.json\n\u2502   \u2502   \u251c\u2500\u2500 chat_template.jinja     # Template conversazionale\n\u2502   \u2502   \u2514\u2500\u2500 tokenizer_config.json\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 checkpoints\/                    # Sessioni di ottimizzazione salvate\n\u2502   \u251c\u2500\u2500 TinyLlama--TinyLlama-1--1B-Chat-v1--0.jsonl\n\u2502   \u251c\u2500\u2500 mistralai--Mistral-7B-Instruct-v0--2.jsonl\n\u2502   \u251c\u2500\u2500 ollama--phi3.jsonl\n\u2502   \u2514\u2500\u2500 openai--gpt-4o.jsonl\n\u251c\u2500\u2500 .venv\/                          # Ambiente Python locale\n\u2514\u2500\u2500 info.md                         # Guida operativa completa<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Stack tecnico<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Strumento<\/th><th>Ruolo<\/th><\/tr><\/thead><tbody><tr><td>Python 3.13 + venv<\/td><td>Ambiente isolato<\/td><\/tr><tr><td>PyTorch 2.10 + CUDA 12.8<\/td><td>Calcolo su GPU NVIDIA<\/td><\/tr><tr><td>Transformers (HuggingFace)<\/td><td>Caricamento e gestione modelli<\/td><\/tr><tr><td>PEFT \/ LoRA<\/td><td>Applicazione delle modifiche<\/td><\/tr><tr><td>Optuna<\/td><td>Ottimizzazione bayesiana dei parametri<\/td><\/tr><tr><td>Datasets (HuggingFace)<\/td><td>Dataset di prompt good\/bad<\/td><\/tr><tr><td>Safetensors<\/td><td>Formato di salvataggio modello<\/td><\/tr><tr><td>Accelerate<\/td><td>Gestione dispositivi (GPU\/CPU)<\/td><\/tr><tr><td>HuggingFace Hub<\/td><td>Pubblicazione e distribuzione<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Link<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Modello pubblicato: <a href=\"https:\/\/huggingface.co\/paoloronco\/TinyLlama-1.1B-Chat-v1.0-heretic\">paoloronco\/TinyLlama-1.1B-Chat-v1.0-heretic<\/a><\/li>\n\n\n\n<li>Heretic (tool originale): <a href=\"https:\/\/github.com\/p-e-w\/heretic\">github.com\/p-e-w\/heretic<\/a><\/li>\n\n\n\n<li>Profilo HuggingFace: <a href=\"https:\/\/huggingface.co\/paoloronco\">huggingface.co\/paoloronco<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Un esperimento personale per capire cosa succede davvero dentro un modello linguistico. Di cosa si tratta Ho sempre usato l&#8217;AI come strumento. Questo progetto nasce dalla curiosit\u00e0 di capire come funziona dall&#8217;interno \u2014 non da un&#8217;applicazione, non da un&#8217;API, ma il modello grezzo, i suoi pesi, la sua geometria interna. Heretic \u00e8 uno strumento open &hellip; <a href=\"https:\/\/paoloronco.it\/en\/ai-locale-pesi-modificati-modificare-un-modello-dallinterno\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;AI locale, pesi modificati: modificare un modello dall&#8217;interno&#8221;<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2548","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/2548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/comments?post=2548"}],"version-history":[{"count":1,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/2548\/revisions"}],"predecessor-version":[{"id":2549,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/2548\/revisions\/2549"}],"wp:attachment":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/media?parent=2548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/categories?post=2548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/tags?post=2548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}