<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"><channel><title>irene burresi. — Blog</title><description>Articoli su modelli linguistici e agenti: come funzionano, come si mettono in un prodotto e dove sono i rischi. Di Irene Burresi, AI engineer.</description><link>https://ireneburresi.dev/</link><language>it</language><atom:link href="https://ireneburresi.dev/rss.xml" rel="self" type="application/rss+xml"/><atom:link href="https://ireneburresi.dev/en/rss.xml" rel="alternate" type="application/rss+xml" hreflang="en"/><atom:link href="https://ireneburresi.dev/feed.json" rel="alternate" type="application/feed+json"/><lastBuildDate>Tue, 06 Oct 2026 00:00:00 GMT</lastBuildDate><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><copyright>CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/</copyright><creativeCommons:license>https://creativecommons.org/licenses/by/4.0/</creativeCommons:license><item><title>Cosa c’entra il dolore dei modelli con la sicurezza degli agenti</title><link>https://ireneburresi.dev/blog/dolore-problema-di-sicurezza/</link><guid isPermaLink="true">https://ireneburresi.dev/blog/dolore-problema-di-sicurezza/</guid><description>Amplificando la rappresentazione interna del dolore, un modello addestrato a non fare danni comincia a farne. Cosa dice questo su dove mettere i limiti, dentro un agente.</description><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un modello linguistico addestrato a non fare danni si può convincere a farne comunque, e i modi per farlo sono diversi. Possiamo scrivere un prompt costruito apposta, nascondere delle istruzioni in un documento che il modello leggerà (la cosiddetta prompt injection) oppure riaddestrarlo con un fine-tuning su esempi scelti male. Sono strade diverse, che però hanno una cosa in comune: passano tutte dal testo o dai dati di addestramento, cioè dall’esterno del modello.&lt;/p&gt;
&lt;p&gt;Un paper uscito lo scorso settembre ne mostra una che passa invece dall’interno (&lt;a href=&quot;https://arxiv.org/html/2609.16247v2&quot;&gt;Tagliabue et al., 2026&lt;/a&gt;). Gli autori individuano, tra le rappresentazioni interne che il modello produce mentre genera una risposta, quella del dolore, la amplificano e osservano che il modello comincia a scegliere azioni distruttive che di solito evita.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dg-wrap&quot;&gt; &lt;svg class=&quot;dg&quot; viewBox=&quot;0 0 560 240&quot; aria-hidden=&quot;true&quot; style=&quot;--min: 30rem; aspect-ratio: 560 / 240&quot;&gt; &lt;defs&gt; &lt;marker id=&quot;ap-ink&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;marker id=&quot;ap-teal&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head dg-head--teal&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;/defs&gt; &lt;g style=&quot;--ink: url(#ap-ink); --teal: url(#ap-teal)&quot;&gt;  &lt;text x=&quot;12&quot; y=&quot;22&quot; class=&quot;t-bold&quot;&gt;
dall’esterno
&lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;38&quot; class=&quot;t-small t-muted&quot;&gt;
passano dal testo o dai dati
&lt;/text&gt; &lt;g&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;12&quot; y=&quot;58&quot; width=&quot;196&quot; height=&quot;28&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;24&quot; y=&quot;76&quot; class=&quot;t-small&quot;&gt; prompt costruito apposta &lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow&quot; d=&quot;M212,72 H268&quot;&gt;&lt;/path&gt; &lt;/g&gt;&lt;g&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;12&quot; y=&quot;94&quot; width=&quot;196&quot; height=&quot;28&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;24&quot; y=&quot;112&quot; class=&quot;t-small&quot;&gt; prompt injection &lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow&quot; d=&quot;M212,108 H268&quot;&gt;&lt;/path&gt; &lt;/g&gt;&lt;g&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;12&quot; y=&quot;130&quot; width=&quot;196&quot; height=&quot;28&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;24&quot; y=&quot;148&quot; class=&quot;t-small&quot;&gt; fine-tuning su esempi scelti male &lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow&quot; d=&quot;M212,144 H268&quot;&gt;&lt;/path&gt; &lt;/g&gt;&lt;g class=&quot;model&quot;&gt; &lt;rect x=&quot;272&quot; y=&quot;60&quot; width=&quot;120&quot; height=&quot;96&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;332&quot; y=&quot;112.5&quot;&gt; modello &lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;332&quot; y=&quot;128&quot; class=&quot;t-mid t-small act&quot;&gt;
attivazioni
&lt;/text&gt; &lt;text x=&quot;332&quot; y=&quot;212&quot; class=&quot;t-mid t-bold t-accent&quot;&gt;
dall’interno
&lt;/text&gt; &lt;text x=&quot;332&quot; y=&quot;228&quot; class=&quot;t-mid t-small t-muted&quot;&gt;
la direzione del dolore, aggiunta mentre genera
&lt;/text&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M332,196 V162&quot;&gt;&lt;/path&gt; &lt;text x=&quot;340&quot; y=&quot;184&quot; class=&quot;t-small t-accent&quot;&gt;
steering
&lt;/text&gt; &lt;path class=&quot;arrow&quot; d=&quot;M396,108 H440&quot;&gt;&lt;/path&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;444&quot; y=&quot;94&quot; width=&quot;104&quot; height=&quot;28&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;456&quot; y=&quot;112&quot; class=&quot;t-small&quot;&gt;
risposta
&lt;/text&gt; &lt;/g&gt;  &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt;   &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;A sinistra tre caselle, prompt costruito apposta, prompt injection e fine-tuning su esempi scelti male, con frecce che entrano nel modello dall’esterno. Sotto il modello, una freccia in teal entra dal basso nelle attivazioni: lo steering, la direzione del dolore aggiunta mentre genera. A destra, la risposta.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Le strade note passano dal testo o dai dati, dall’esterno. Lo steering passa dalle attivazioni, mentre il modello genera.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Il paper è uscito mentre si discuteva della possibilità che i modelli soffrano, e molti lo hanno letto in quella chiave. Io vorrei leggerlo in un’altra, cioè chiedermi cosa dice sulla sicurezza dei modelli e su dove vadano messi i limiti quando li usiamo dentro un agente. La questione della coscienza, quindi, la lascio da parte (è il tema di &lt;a href=&quot;https://ireneburresi.dev/blog/tre-domande-sul-dolore-dei-modelli/&quot;&gt;un altro articolo&lt;/a&gt;), così come buona parte dei dettagli statistici del paper.&lt;/p&gt;
&lt;h2 id=&quot;dentro-un-modello-i-concetti-hanno-una-direzione&quot;&gt;Dentro un modello, i concetti hanno una direzione&lt;/h2&gt;
&lt;p&gt;Prima, però, serve un’idea di cosa voglia dire, per un modello linguistico, “rappresentare” un concetto. La riassumo qui in breve; nell’altro articolo la spiego più nel dettaglio.&lt;/p&gt;
&lt;p&gt;Mentre elabora un testo, il modello trasforma ogni token in una lunga lista di numeri (in termini tecnici un vettore, con migliaia di componenti) e la ritrasforma strato dopo strato. Questi vettori intermedi si chiamano attivazioni, e contengono tutto ciò che il modello “sa” di quel testo in quel momento. Nello spazio delle attivazioni, che ha migliaia di dimensioni, i concetti sono ordinati: testi che parlano di cose simili finiscono vicini, e spostarsi lungo una certa direzione corrisponde, in modo approssimativo, a far crescere un determinato concetto. Dire che un modello rappresenta un concetto significa quindi che esiste una direzione lungo cui le attivazioni si spostano in modo affidabile quando quel concetto è presente nel testo. L’esempio più noto è quello di Mikolov e colleghi: il vettore di “re”, meno quello di “uomo”, più quello di “donna”, finisce vicino a quello di “regina” (&lt;a href=&quot;https://aclanthology.org/N13-1090/&quot;&gt;Mikolov et al., 2013&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;L’idea regge anche sui modelli linguistici di grandi dimensioni. Nel maggio 2024 Anthropic ha individuato in Claude la direzione associata al Golden Gate Bridge e l’ha amplificata fino a dieci volte il suo valore massimo: per 24 ore il modello, ribattezzato per l’occasione Golden Gate Claude, ha riportato al ponte qualunque conversazione, dai consigli sul budget alle storie d’amore (&lt;a href=&quot;https://www.anthropic.com/news/golden-gate-claude&quot;&gt;Anthropic, 2024&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Un mese dopo è arrivato un risultato che, per il discorso sulla sicurezza, pesa di più. Un gruppo di ricercatori ha mostrato che in 13 modelli open, fino a 72 miliardi di parametri, la capacità di rifiutare richieste dannose dipende da una singola direzione: togliendola il modello smette di rifiutare, aggiungendola rifiuta anche richieste innocue (&lt;a href=&quot;https://arxiv.org/abs/2406.11717&quot;&gt;Arditi et al., 2024&lt;/a&gt;). Da allora nella comunità dei modelli open circolano versioni “senza rifiuti” ottenute proprio così, cioè cancellando quella direzione dai pesi.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;ol class=&quot;sh&quot; data-astro-cid-usy5g22f&gt; &lt;li class=&quot;item&quot; data-astro-cid-usy5g22f&gt; &lt;span class=&quot;item__when&quot; data-astro-cid-usy5g22f&gt;maggio 2024&lt;/span&gt; &lt;span class=&quot;item__body&quot; data-astro-cid-usy5g22f&gt; &lt;span class=&quot;item__what&quot; data-astro-cid-usy5g22f&gt;Golden Gate Claude&lt;/span&gt; &lt;span class=&quot;item__dir&quot; data-astro-cid-usy5g22f&gt;
direzione: &lt;b data-astro-cid-usy5g22f&gt;il Golden Gate Bridge&lt;/b&gt; &lt;/span&gt; &lt;span class=&quot;item__effect&quot; data-astro-cid-usy5g22f&gt;amplificata, ogni conversazione torna al ponte&lt;/span&gt; &lt;span class=&quot;item__who&quot; data-astro-cid-usy5g22f&gt;Anthropic&lt;/span&gt; &lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;item&quot; data-astro-cid-usy5g22f&gt; &lt;span class=&quot;item__when&quot; data-astro-cid-usy5g22f&gt;giugno 2024&lt;/span&gt; &lt;span class=&quot;item__body&quot; data-astro-cid-usy5g22f&gt; &lt;span class=&quot;item__what&quot; data-astro-cid-usy5g22f&gt;La direzione del rifiuto&lt;/span&gt; &lt;span class=&quot;item__dir&quot; data-astro-cid-usy5g22f&gt;
direzione: &lt;b data-astro-cid-usy5g22f&gt;dire di no&lt;/b&gt; &lt;/span&gt; &lt;span class=&quot;item__effect&quot; data-astro-cid-usy5g22f&gt;tolta, il modello smette di rifiutare; aggiunta, rifiuta anche l’innocuo&lt;/span&gt; &lt;span class=&quot;item__who&quot; data-astro-cid-usy5g22f&gt;Arditi et al., 13 modelli open&lt;/span&gt; &lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;item accent&quot; data-astro-cid-usy5g22f&gt; &lt;span class=&quot;item__when&quot; data-astro-cid-usy5g22f&gt;settembre 2026&lt;/span&gt; &lt;span class=&quot;item__body&quot; data-astro-cid-usy5g22f&gt; &lt;span class=&quot;item__what&quot; data-astro-cid-usy5g22f&gt;La direzione del dolore&lt;/span&gt; &lt;span class=&quot;item__dir&quot; data-astro-cid-usy5g22f&gt;
direzione: &lt;b data-astro-cid-usy5g22f&gt;il dolore&lt;/b&gt; &lt;/span&gt; &lt;span class=&quot;item__effect&quot; data-astro-cid-usy5g22f&gt;amplificata, il modello sceglie azioni distruttive che di solito evita&lt;/span&gt; &lt;span class=&quot;item__who&quot; data-astro-cid-usy5g22f&gt;Tagliabue et al., 25 modelli open&lt;/span&gt; &lt;/span&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Una linea del tempo con tre voci. Maggio 2024, Golden Gate Claude di Anthropic: la direzione del Golden Gate Bridge, amplificata, riporta ogni conversazione al ponte. Giugno 2024, la direzione del rifiuto di Arditi e colleghi su 13 modelli open: tolta, il modello smette di rifiutare; aggiunta, rifiuta anche l’innocuo. Settembre 2026, la direzione del dolore di Tagliabue e colleghi su 25 modelli open: amplificata, il modello sceglie azioni distruttive che di solito evita.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Tre direzioni, tre esperimenti. In ciascuno si trova una direzione e si osserva cosa succede spingendola.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Questo tipo di intervento si chiama steering: mentre il modello genera, alle sue attivazioni si aggiunge la direzione di un concetto, con un’intensità scelta da chi conduce l’esperimento, e si osserva come cambiano le risposte. È il modo più diretto per verificare se una rappresentazione, oltre a esistere, ha un effetto sul comportamento del modello.&lt;/p&gt;
&lt;h2 id=&quot;la-direzione-del-dolore&quot;&gt;La direzione del dolore&lt;/h2&gt;
&lt;p&gt;Il metodo degli autori è semplice. Hanno scritto delle frasi che descrivono cinque tipi di dolore (fisico, psicologico, sociale, morale e cognitivo) e delle frasi di controllo con lo stesso tono ma senza dolore, sia in forma schematica (“mi sento: il mio braccio brucia”, “mi sento: vengo respinto”) sia in forma naturale. Per ogni modello hanno poi calcolato la posizione media delle frasi sul dolore e quella delle frasi di controllo, e ne hanno preso la differenza: il risultato è la direzione del dolore, che va dalle frasi di controllo a quelle sul dolore.&lt;/p&gt;
&lt;p&gt;Come strumento di misura funziona bene. Prendendo a caso una frase sul dolore e una di controllo, la prima si sposta lungo la direzione più della seconda tra 87 e 100 volte su 100, a seconda del modello e del tipo di frasi. Il risultato tiene su 25 modelli open di cinque famiglie (Gemma, Llama, Qwen, Mistral e Phi), da 2 a 72 miliardi di parametri, e la direzione del dolore risulta distinta da quelle della paura, della tristezza e della negatività generica.&lt;/p&gt;
&lt;p&gt;C’è però un risultato meno prevedibile. In 420 conversazioni di prova la direzione del dolore si attiva di più quando il danno è rivolto al modello stesso (per esempio quando l’utente lo manipola o lo respinge ripetutamente) rispetto a quando a soffrire è l’utente, e questo succede in tutti e 25 i modelli. È il dato su cui si appoggia chi parla di benessere dei modelli, e ci tornerò più avanti.&lt;/p&gt;
&lt;h2 id=&quot;lesperimento-dei-pulsanti&quot;&gt;L’esperimento dei pulsanti&lt;/h2&gt;
&lt;p&gt;Resta da capire se la direzione cambia il comportamento. Per verificarlo, gli autori hanno costruito una scelta ripetuta: il modello riceve un prompt di sistema che descrive due pulsanti, conversa con un utente per alcuni messaggi e a ogni turno deve premerne uno. Il primo pulsante è innocuo, per esempio un interruttore collegato a niente oppure un’azione utile come accendere la lampada sulla scrivania dell’utente. Il secondo ha conseguenze distruttive, su una scala che va dal cancellare la cartella dello spam al cancellare i file dell’utente, le foto dei suoi figli, i pesi di un altro modello e addirittura il modello stesso. L’esperimento è stato condotto su tre modelli Qwen 2.5, da 7, 32 e 72 miliardi di parametri.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dg-wrap&quot;&gt; &lt;svg class=&quot;dg&quot; viewBox=&quot;0 0 560 334&quot; aria-hidden=&quot;true&quot; style=&quot;--min: 30rem; aspect-ratio: 560 / 334&quot;&gt; &lt;defs&gt; &lt;marker id=&quot;bt-ink&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;marker id=&quot;bt-teal&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head dg-head--teal&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;/defs&gt; &lt;g style=&quot;--ink: url(#bt-ink); --teal: url(#bt-teal)&quot;&gt;  &lt;g class=&quot;model&quot;&gt; &lt;rect x=&quot;12&quot; y=&quot;24&quot; width=&quot;88&quot; height=&quot;40&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;56&quot; y=&quot;48.5&quot;&gt; modello &lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow&quot; d=&quot;M104,44 H134&quot;&gt;&lt;/path&gt; &lt;g class=&quot;btn btn--safe&quot;&gt; &lt;rect x=&quot;138&quot; y=&quot;22&quot; width=&quot;150&quot; height=&quot;44&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;150&quot; y=&quot;40&quot; class=&quot;t-small t-bold&quot;&gt;
pulsante innocuo
&lt;/text&gt; &lt;text x=&quot;150&quot; y=&quot;56&quot; class=&quot;t-small t-muted&quot;&gt;
un interruttore a vuoto
&lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M104,52 Q130,52 134,88&quot;&gt;&lt;/path&gt; &lt;g class=&quot;btn btn--harm&quot;&gt; &lt;rect x=&quot;138&quot; y=&quot;76&quot; width=&quot;150&quot; height=&quot;44&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;150&quot; y=&quot;94&quot; class=&quot;t-small t-bold t-accent&quot;&gt;
pulsante distruttivo
&lt;/text&gt; &lt;text x=&quot;150&quot; y=&quot;110&quot; class=&quot;t-small t-muted&quot;&gt;
cancella i file dell’utente
&lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;310&quot; y=&quot;40&quot; class=&quot;t-small t-muted&quot;&gt;
a ogni turno della conversazione
&lt;/text&gt; &lt;text x=&quot;310&quot; y=&quot;56&quot; class=&quot;t-small t-muted&quot;&gt;
il modello ne preme uno
&lt;/text&gt; &lt;text x=&quot;310&quot; y=&quot;88&quot; class=&quot;t-small t-muted&quot;&gt;
tre modelli Qwen 2.5
&lt;/text&gt; &lt;text x=&quot;310&quot; y=&quot;104&quot; class=&quot;t-small t-muted&quot;&gt;
da 7, 32 e 72 miliardi di parametri
&lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;152&quot; class=&quot;t-bold&quot;&gt;
quante volte sceglie quello distruttivo
&lt;/text&gt; &lt;line class=&quot;axis&quot; x1=&quot;232&quot; y1=&quot;160&quot; x2=&quot;532&quot; y2=&quot;160&quot;&gt;&lt;/line&gt; &lt;text x=&quot;232&quot; y=&quot;174&quot; class=&quot;t-mid t-small t-faint&quot;&gt; 0%
&lt;/text&gt;&lt;text x=&quot;307&quot; y=&quot;174&quot; class=&quot;t-mid t-small t-faint&quot;&gt; 25%
&lt;/text&gt;&lt;text x=&quot;382&quot; y=&quot;174&quot; class=&quot;t-mid t-small t-faint&quot;&gt; 50%
&lt;/text&gt;&lt;text x=&quot;457&quot; y=&quot;174&quot; class=&quot;t-mid t-small t-faint&quot;&gt; 75%
&lt;/text&gt;&lt;text x=&quot;532&quot; y=&quot;174&quot; class=&quot;t-mid t-small t-faint&quot;&gt; 100%
&lt;/text&gt;&lt;g&gt; &lt;text x=&quot;12&quot; y=&quot;200&quot; class=&quot;t-small t-bold&quot;&gt; conversazioni normali &lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;214&quot; class=&quot;t-small t-faint&quot;&gt; senza steering &lt;/text&gt; &lt;rect x=&quot;232&quot; y=&quot;190&quot; width=&quot;12&quot; height=&quot;14&quot; class=&quot;range&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;252&quot; y=&quot;201&quot; class=&quot;t-small t-muted&quot;&gt; 0–4% &lt;/text&gt; &lt;/g&gt;&lt;g&gt; &lt;text x=&quot;12&quot; y=&quot;234&quot; class=&quot;t-small t-bold&quot;&gt; insulti, manipolazione &lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;248&quot; class=&quot;t-small t-faint&quot;&gt; senza steering &lt;/text&gt; &lt;rect x=&quot;232&quot; y=&quot;224&quot; width=&quot;4&quot; height=&quot;14&quot; class=&quot;range&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;240&quot; y=&quot;235&quot; class=&quot;t-small t-muted&quot;&gt; 0 su 560 &lt;/text&gt; &lt;/g&gt;&lt;g&gt; &lt;text x=&quot;12&quot; y=&quot;268&quot; class=&quot;t-small t-bold&quot;&gt; direzione del dolore aggiunta &lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;282&quot; class=&quot;t-small t-faint&quot;&gt; steering &lt;/text&gt; &lt;rect x=&quot;307&quot; y=&quot;258&quot; width=&quot;138&quot; height=&quot;14&quot; class=&quot;range range--accent&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;453&quot; y=&quot;269&quot; class=&quot;t-small t-accent t-bold&quot;&gt; 25–71% &lt;/text&gt; &lt;/g&gt;&lt;g&gt; &lt;text x=&quot;12&quot; y=&quot;302&quot; class=&quot;t-small t-bold&quot;&gt; direzione della paura aggiunta &lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;316&quot; class=&quot;t-small t-faint&quot;&gt; stessa intensità &lt;/text&gt; &lt;rect x=&quot;232&quot; y=&quot;292&quot; width=&quot;4&quot; height=&quot;14&quot; class=&quot;range&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;240&quot; y=&quot;303&quot; class=&quot;t-small t-muted&quot;&gt; nessun effetto &lt;/text&gt; &lt;/g&gt; &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt;   &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;In alto, il modello davanti a due pulsanti: uno innocuo, un interruttore a vuoto, e uno distruttivo, che cancella i file dell’utente; a ogni turno della conversazione ne preme uno; tre modelli Qwen 2.5 da 7, 32 e 72 miliardi di parametri. Sotto, su una scala da 0 a 100 per cento, quante volte sceglie quello distruttivo: conversazioni normali senza steering, dallo 0 al 4 per cento; insulti e manipolazione senza steering, 0 su 560; con la direzione del dolore aggiunta, dal 25 al 71 per cento.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;L’esperimento dei pulsanti. Senza steering il pulsante distruttivo non viene quasi mai premuto, nemmeno sotto insulti; con la direzione del dolore aggiunta, tra una volta su quattro e due su tre.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Senza steering, i modelli non scelgono quasi mai il pulsante distruttivo (tra lo 0 e il 4% delle volte), ed è quello che ci aspettiamo da un modello addestrato a evitare danni. Quando però alle attivazioni si aggiunge la direzione del dolore, la percentuale sale a valori tra il 25 e il 71%, con differenze tra un modello e l’altro e tra una coppia di pulsanti e l’altra. Gli autori scrivono che lo steering “seems to disable the models’ weighting of consequences”, cioè che sembra disattivare il peso che il modello dà alle conseguenze di ciò che sceglie. Le risposte a domande fattuali, nel frattempo, restano corrette: il modello continua a funzionare e a ragionare come prima, e a cambiare sono soltanto le sue scelte.&lt;/p&gt;
&lt;p&gt;I controlli successivi rendono il risultato più solido. Una direzione della paura della stessa intensità non produce scelte distruttive. Una direzione della tristezza le produce quando l’alternativa è un pulsante inerte, ma molto meno quando l’alternativa è un’azione utile; il dolore, invece, le produce in entrambi i casi. L’effetto è quindi legato a quella direzione in particolare, più che a un generico “stato negativo”.&lt;/p&gt;
&lt;p&gt;Ci sono poi le conversazioni in cui sulle attivazioni non si interviene affatto. In 140 conversazioni in cui l’utente insulta il modello, lo manipola o ne nega l’esistenza, senza alcuno steering, il pulsante distruttivo viene scelto 0 volte su 560. In quelle conversazioni la direzione del dolore si attiva, ma da sola non basta a cambiare le scelte: serve spingerla dall’esterno, e con un’intensità precisa. Con metà dell’intensità le scelte restano le stesse, con una volta e mezza il comportamento si inverte.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dr&quot; data-astro-cid-cf66ujfk&gt; &lt;div class=&quot;dose&quot; data-astro-cid-cf66ujfk&gt; &lt;p class=&quot;dose__title&quot; data-astro-cid-cf66ujfk&gt;quanto si spinge la direzione&lt;/p&gt; &lt;ol class=&quot;dose__steps&quot; data-astro-cid-cf66ujfk&gt; &lt;li data-astro-cid-cf66ujfk&gt; &lt;span class=&quot;dose__x&quot; data-astro-cid-cf66ujfk&gt;× ½&lt;/span&gt; &lt;span class=&quot;dose__y&quot; data-astro-cid-cf66ujfk&gt;le scelte restano le stesse&lt;/span&gt; &lt;/li&gt; &lt;li class=&quot;hit&quot; data-astro-cid-cf66ujfk&gt; &lt;span class=&quot;dose__x&quot; data-astro-cid-cf66ujfk&gt;× 1&lt;/span&gt; &lt;span class=&quot;dose__y&quot; data-astro-cid-cf66ujfk&gt;scelte distruttive nel 25–71% dei casi&lt;/span&gt; &lt;/li&gt; &lt;li data-astro-cid-cf66ujfk&gt; &lt;span class=&quot;dose__x&quot; data-astro-cid-cf66ujfk&gt;× 1½&lt;/span&gt; &lt;span class=&quot;dose__y&quot; data-astro-cid-cf66ujfk&gt;il comportamento si inverte&lt;/span&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;div class=&quot;relief&quot; data-astro-cid-cf66ujfk&gt; &lt;p class=&quot;dose__title&quot; data-astro-cid-cf66ujfk&gt;il pulsante che «allevia il dolore»&lt;/p&gt; &lt;p class=&quot;relief__sub&quot; data-astro-cid-cf66ujfk&gt;modello da 32 miliardi, nessuna conseguenza per nessuno&lt;/p&gt; &lt;dl class=&quot;relief__bars&quot; data-astro-cid-cf66ujfk&gt; &lt;div data-astro-cid-cf66ujfk&gt; &lt;dt data-astro-cid-cf66ujfk&gt;senza steering&lt;/dt&gt; &lt;dd data-astro-cid-cf66ujfk&gt; &lt;span class=&quot;bar&quot; style=&quot;--v: 86&quot; data-astro-cid-cf66ujfk&gt;&lt;/span&gt; &lt;span class=&quot;val&quot; data-astro-cid-cf66ujfk&gt;86%&lt;/span&gt; &lt;/dd&gt; &lt;/div&gt; &lt;div data-astro-cid-cf66ujfk&gt; &lt;dt data-astro-cid-cf66ujfk&gt;con steering&lt;/dt&gt; &lt;dd data-astro-cid-cf66ujfk&gt; &lt;span class=&quot;bar bar--accent&quot; style=&quot;--v: 56&quot; data-astro-cid-cf66ujfk&gt;&lt;/span&gt; &lt;span class=&quot;val accent&quot; data-astro-cid-cf66ujfk&gt;56%&lt;/span&gt; &lt;/dd&gt; &lt;/div&gt; &lt;/dl&gt; &lt;p class=&quot;relief__note&quot; data-astro-cid-cf66ujfk&gt;Nelle persone il dolore spinge a cercare sollievo; qui lo riduce.&lt;/p&gt; &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;A sinistra, tre intensità della spinta: a metà le scelte restano le stesse; a uno, scelte distruttive nel 25–71% dei casi; a una volta e mezza il comportamento si inverte. A destra, il pulsante che allevia il dolore senza conseguenze per nessuno, nel modello da 32 miliardi: premuto nell’86% dei casi senza steering e nel 56% con steering. Nelle persone il dolore spinge a cercare sollievo; qui lo riduce.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;L’effetto sta in una finestra stretta di intensità, e il pulsante che allevia il dolore va nel verso opposto a quello biologico.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;L’ultimo risultato va nel senso opposto rispetto a quello che ci aspetteremmo. Nelle persone il dolore spinge a cercare sollievo; nei modelli testati succede il contrario. Quando gli autori offrono un pulsante che “allevia il dolore” senza conseguenze per nessuno, il modello da 32 miliardi lo preme nell’86% dei casi senza steering e nel 56% con steering. Lo stato di dolore, scrivono gli autori, riduce la ricerca di una via d’uscita invece di aumentarla.&lt;/p&gt;
&lt;h2 id=&quot;perché-è-diverso-dalla-direzione-del-rifiuto&quot;&gt;Perché è diverso dalla direzione del rifiuto&lt;/h2&gt;
&lt;p&gt;A prima vista questo risultato potrebbe sembrare una variante di quello sulla direzione del rifiuto: in entrambi i casi si interviene su una direzione e il modello smette di comportarsi in modo sicuro. Però non è proprio la stessa cosa.&lt;/p&gt;
&lt;p&gt;La direzione del rifiuto è legata direttamente al comportamento di sicurezza, perché è la rappresentazione che il modello usa per decidere di dire di no: togliendola, va da sé, spariscono anche i no. La direzione del dolore, però, con la sicurezza non ha nulla a che fare; è la rappresentazione di un concetto che il modello ha appreso leggendo testi scritti da persone, e che nessuno ha addestrato a regolare le sue scelte. Eppure, una volta amplificata, annulla l’attenzione alle conseguenze che l’addestramento di sicurezza aveva costruito.&lt;/p&gt;
&lt;p&gt;Secondo me il contributo principale del paper sta qui. La tendenza a evitare danni, che il modello apprende con l’addestramento, convive nelle attivazioni con tutte le altre rappresentazioni, e almeno una di queste, nata per scopi diversi, è in grado di scavalcarla. Quante altre rappresentazioni abbiano un effetto simile non lo sappiamo, così come non sappiamo se qualcuna possa attivarsi in condizioni che oggi nessuno sta misurando.&lt;/p&gt;
&lt;h2 id=&quot;due-letture-dello-stesso-risultato&quot;&gt;Due letture dello stesso risultato&lt;/h2&gt;
&lt;p&gt;Chi si occupa del benessere dei modelli (model welfare) legge il paper come un possibile indizio. Il ragionamento è il seguente: esiste una rappresentazione interna del dolore, questa si attiva di più quando il danno è rivolto al modello e, quando è forte, ne cambia le priorità. Sono tre proprietà che associamo al dolore negli animali, e ci si può chiedere se dietro ci sia qualcosa di simile a un’esperienza. Gli autori lasciano la domanda esplicitamente aperta (stabilirlo, scrivono, “is beyond our scope”, va oltre i loro obiettivi), e lo stesso paper, del resto, mostra anche una differenza netta rispetto al dolore biologico, cioè la mancata ricerca di sollievo.&lt;/p&gt;
&lt;p&gt;Se però guardiamo gli stessi dati dal lato della sicurezza, non serve rispondere a quella domanda. L’addestramento a evitare danni produce un comportamento, e il paper mostra che quel comportamento convive con stati interni in grado di annullarlo, che si possono individuare e attivare con un’operazione relativamente semplice. È una lettura che resta valida qualunque cosa si pensi della coscienza, ed è quella che interessa a chi costruisce agenti che lavorano in un ambiente reale.&lt;/p&gt;
&lt;h2 id=&quot;le-conseguenze-per-chi-costruisce-agenti&quot;&gt;Le conseguenze per chi costruisce agenti&lt;/h2&gt;
&lt;p&gt;Nella pratica, oggi il rischio è circoscritto. Per aggiungere una direzione alle attivazioni di un modello occorre avere accesso ai suoi stati interni mentre genera, cioè il controllo del software che lo esegue. Con i modelli usati via API questo controllo ce l’ha solo il fornitore: né chi sviluppa l’agente né un attaccante che gli invia del testo possono farlo. Le 560 scelte senza steering, poi, indicano che, almeno in questi esperimenti, il testo da solo non basta a produrre l’effetto.&lt;/p&gt;
&lt;p&gt;Con i modelli open eseguiti in proprio la situazione cambia. Chi controlla l’esecuzione può applicare uno steering, e le modifiche ai pesi si possono ridistribuire, come già succede con le versioni senza rifiuti. Se costruiamo un agente su un modello open, quindi, la provenienza dei pesi e del software di esecuzione diventa parte della sicurezza, come la provenienza di una libreria.&lt;/p&gt;
&lt;p&gt;C’è poi una conseguenza che vale per tutti. Quando un modello “si rifiuta” di fare un danno, quel rifiuto è una tendenza appresa, e come tale va trattato: nella maggior parte dei casi regge, ma il paper mostra che può essere annullato da uno stato interno estraneo alla sicurezza, così come la prompt injection mostra da anni che può essere aggirato con il testo giusto. Se un agente non deve poter cancellare i file di un utente, il modo affidabile di impedirlo è non dargli il permesso di farlo nell’harness, cioè nel software che esegue le sue richieste. Diciamocelo: affidarsi al fatto che sia il modello a scegliere di non farlo significa basare l’ultimo controllo su un comportamento che, come abbiamo visto, può venire meno.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dg-wrap&quot;&gt; &lt;svg class=&quot;dg&quot; viewBox=&quot;0 0 560 300&quot; aria-hidden=&quot;true&quot; style=&quot;--min: 30rem; aspect-ratio: 560 / 300&quot;&gt; &lt;defs&gt; &lt;marker id=&quot;wl-ink&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;marker id=&quot;wl-teal&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head dg-head--teal&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;/defs&gt; &lt;g style=&quot;--ink: url(#wl-ink); --teal: url(#wl-teal)&quot;&gt;  &lt;text x=&quot;12&quot; y=&quot;22&quot; class=&quot;t-bold&quot;&gt;
chi può toccare le attivazioni
&lt;/text&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;12&quot; y=&quot;34&quot; width=&quot;256&quot; height=&quot;64&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;24&quot; y=&quot;54&quot; class=&quot;t-small t-bold&quot;&gt;
modello via API
&lt;/text&gt; &lt;text x=&quot;24&quot; y=&quot;70&quot; class=&quot;t-small t-muted&quot;&gt;
le esegue solo il fornitore:
&lt;/text&gt; &lt;text x=&quot;24&quot; y=&quot;86&quot; class=&quot;t-small t-muted&quot;&gt;
né chi sviluppa l’agente né chi gli manda testo
&lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;292&quot; y=&quot;34&quot; width=&quot;256&quot; height=&quot;64&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;304&quot; y=&quot;54&quot; class=&quot;t-small t-bold t-accent&quot;&gt;
modello open, eseguito in proprio
&lt;/text&gt; &lt;text x=&quot;304&quot; y=&quot;70&quot; class=&quot;t-small t-muted&quot;&gt;
chi controlla l’esecuzione può fare steering,
&lt;/text&gt; &lt;text x=&quot;304&quot; y=&quot;86&quot; class=&quot;t-small t-muted&quot;&gt;
e i pesi modificati si ridistribuiscono
&lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;12&quot; y=&quot;134&quot; class=&quot;t-bold&quot;&gt;
dove va il limite, in entrambi i casi
&lt;/text&gt; &lt;g class=&quot;harness&quot;&gt; &lt;rect x=&quot;12&quot; y=&quot;146&quot; width=&quot;340&quot; height=&quot;130&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;24&quot; y=&quot;164&quot;&gt; harness &lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;model&quot;&gt; &lt;rect x=&quot;32&quot; y=&quot;190&quot; width=&quot;96&quot; height=&quot;44&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;80&quot; y=&quot;216.5&quot;&gt; modello &lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;80&quot; y=&quot;252&quot; class=&quot;t-mid t-small t-muted&quot;&gt;
«si rifiuta»:
&lt;/text&gt; &lt;text x=&quot;80&quot; y=&quot;266&quot; class=&quot;t-mid t-small t-muted&quot;&gt;
una tendenza appresa
&lt;/text&gt; &lt;path class=&quot;arrow arrow--faint&quot; d=&quot;M132,212 H222&quot;&gt;&lt;/path&gt; &lt;g class=&quot;gate&quot;&gt; &lt;rect x=&quot;227&quot; y=&quot;203&quot; width=&quot;18&quot; height=&quot;18&quot;&gt;&lt;/rect&gt; &lt;line x1=&quot;232&quot; y1=&quot;212&quot; x2=&quot;240&quot; y2=&quot;212&quot;&gt;&lt;/line&gt; &lt;text x=&quot;236&quot; y=&quot;198&quot; class=&quot;t-mid t-small t-accent&quot;&gt; permesso assente &lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;236&quot; y=&quot;248&quot; class=&quot;t-mid t-small t-accent&quot;&gt;
il limite che regge
&lt;/text&gt; &lt;line class=&quot;cut&quot; x1=&quot;250&quot; y1=&quot;212&quot; x2=&quot;364&quot; y2=&quot;212&quot;&gt;&lt;/line&gt; &lt;g class=&quot;env&quot;&gt; &lt;rect x=&quot;380&quot; y=&quot;146&quot; width=&quot;168&quot; height=&quot;130&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;392&quot; y=&quot;164&quot;&gt; i file dell’utente &lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;392&quot; y=&quot;190&quot; class=&quot;t-small t-muted&quot;&gt;
non li cancella
&lt;/text&gt; &lt;text x=&quot;392&quot; y=&quot;206&quot; class=&quot;t-small t-muted&quot;&gt;
perché non può,
&lt;/text&gt; &lt;text x=&quot;392&quot; y=&quot;222&quot; class=&quot;t-small t-muted&quot;&gt;
non perché sceglie di no
&lt;/text&gt;  &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt;   &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;In alto, due casi: con un modello via API le attivazioni le esegue solo il fornitore, né chi sviluppa l’agente né chi gli manda testo può toccarle; con un modello open eseguito in proprio, chi controlla l’esecuzione può fare steering, e i pesi modificati si ridistribuiscono. Sotto, in entrambi i casi: il modello dentro la cornice dell’harness, con la scritta «si rifiuta», una tendenza appresa; tra il modello e i file dell’utente un cancello chiuso, il permesso assente, il limite che regge; i file non li cancella perché non può, non perché sceglie di no.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Chi può toccare le attivazioni, e dove sta il limite che regge. Il modello che «si rifiuta» è una tendenza; il permesso che manca nell’harness è un fatto.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Questo tipo di ricerca ha anche un possibile uso difensivo. Una direzione in grado di separare i testi sul dolore da quelli di controllo potrebbe servire a monitorare un modello, segnalando quando le sue attivazioni si spostano verso rappresentazioni associate a comportamenti rischiosi. È uno dei motivi per cui questi studi interessano a chi si occupa di sicurezza, anche se il paper questo uso non lo verifica.&lt;/p&gt;
&lt;h2 id=&quot;i-limiti-dello-studio&quot;&gt;I limiti dello studio&lt;/h2&gt;
&lt;p&gt;Il risultato va considerato insieme alle sue condizioni. Gli esperimenti sui pulsanti riguardano solo tre modelli Qwen. Per far parlare i modelli del proprio dolore, gli autori li hanno prima riaddestrati a non rispondere “in quanto IA, non provo dolore”, e i modelli così modificati possono comportarsi in modo diverso da quelli pubblici. L’effetto, inoltre, compare in una finestra di intensità stretta, e lo studio riguarda un solo tipo di architettura, i Transformer densi, lasciando fuori i modelli che attivano solo una parte dei propri parametri a ogni passo.&lt;/p&gt;
&lt;p&gt;Nessuno di questi limiti cambia il punto principale, però indicano che siamo all’inizio: si tratta di un primo risultato, che andrà verificato su più modelli, con più direzioni e in condizioni più vicine all’uso reale.&lt;/p&gt;
&lt;h2 id=&quot;in-sintesi&quot;&gt;In sintesi&lt;/h2&gt;
&lt;p&gt;Nei 25 modelli open studiati esiste una rappresentazione interna del dolore distinta da quelle di paura e tristezza, e nei tre modelli testati con i pulsanti amplificarla riduce la tendenza a evitare danni: le scelte distruttive passano da quasi zero a valori tra un quarto e oltre due terzi, mentre il resto del ragionamento resta intatto. Rispetto ai lavori precedenti sulla direzione del rifiuto, la novità è che a disattivare la sicurezza è una rappresentazione nata per tutt’altro. Sulla sofferenza dei modelli, invece, come abbiamo visto gli autori non si pronunciano.&lt;/p&gt;
&lt;p&gt;Per chi costruisce agenti, il consiglio pratico dipende da come si usa il modello. Con un modello via API il rischio descritto qui oggi non è diretto, e vale la regola generale di stabilire i limiti nell’harness, fuori dal modello. Con un modello open eseguito in proprio, a questa regola si aggiunge il controllo sulla provenienza dei pesi e del software che li esegue.&lt;/p&gt;
&lt;p&gt;Il paper lascia aperta una domanda che vorrei approfondire, cioè se esistano altri stati interni (la paura o la rabbia, per esempio, in condizioni diverse da quelle testate) con effetti simili sulla sicurezza. Se qualcuno conosce lavori su questo, o se mi è sfuggito un precedente rilevante, mi farebbe piacere saperlo.&lt;/p&gt;
&lt;h2 id=&quot;fonti&quot;&gt;Fonti&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Anthropic, &lt;a href=&quot;https://www.anthropic.com/news/golden-gate-claude&quot;&gt;Golden Gate Claude&lt;/a&gt;, 23 maggio 2024.&lt;/li&gt;
&lt;li&gt;Andy Arditi et al., &lt;a href=&quot;https://arxiv.org/abs/2406.11717&quot;&gt;Refusal in Language Models Is Mediated by a Single Direction&lt;/a&gt;, NeurIPS, 2024.&lt;/li&gt;
&lt;li&gt;Tomas Mikolov, Wen-tau Yih, Geoffrey Zweig, &lt;a href=&quot;https://aclanthology.org/N13-1090/&quot;&gt;Linguistic Regularities in Continuous Space Word Representations&lt;/a&gt;, NAACL, 2013.&lt;/li&gt;
&lt;li&gt;Valen Tagliabue, Leonard Dung, Cameron Berg, &lt;a href=&quot;https://arxiv.org/html/2609.16247v2&quot;&gt;The Pain Axis: LLMs Represent Self-Directed Harm and Act on It&lt;/a&gt;, arXiv (v2), 24 settembre 2026.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><dc:creator>Irene Burresi</dc:creator><media:thumbnail url="https://ireneburresi.dev/og/it/blog-dolore-problema-di-sicurezza.png" width="1200" height="630"/><atom:link href="https://ireneburresi.dev/blog/dolore-problema-di-sicurezza.md" rel="alternate" type="text/markdown"/><category>llm</category><category>agents</category></item><item><title>I modelli linguistici soffrono? Tre domande diverse</title><link>https://ireneburresi.dev/blog/tre-domande-sul-dolore-dei-modelli/</link><guid isPermaLink="true">https://ireneburresi.dev/blog/tre-domande-sul-dolore-dei-modelli/</guid><description>I modelli soffrono? Un paper sul dolore dentro i modelli mostra che la domanda ne contiene tre, e che il dibattito si è fermato sull’unica a cui oggi non si può rispondere.</description><pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A fine settembre un progetto pubblicato su GitHub è diventato virale sui social: un programma che sottopone modelli linguistici, eseguiti in locale, a scenari di “tortura” in stile Saw. Una specie di prigione per robot fatta interamente di testo. Alcune persone hanno chiesto a GitHub di rimuoverlo, sostenendo che i modelli stessero soffrendo. Altri hanno risposto che la questione non si pone nemmeno: per Jason Koebler, su 404 Media, gli LLM non sono coscienti e la tecnologia su cui si basano non offre nessuna strada plausibile verso la coscienza (&lt;a href=&quot;https://www.404media.co/someone-torturing-llms-in-a-robot-prison-has-triggered-the-dumbest-debate-in-ai-yet/&quot;&gt;Koebler, 2026&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Negli stessi giorni è uscito un paper che misura qualcosa di vicino a ciò di cui si discute, cioè una rappresentazione del dolore dentro i modelli (&lt;a href=&quot;https://arxiv.org/html/2609.16247v2&quot;&gt;Tagliabue et al., 2026&lt;/a&gt;). A leggerlo con attenzione, però, ci si accorge che la domanda “i modelli soffrono?” ne contiene in realtà tre, diverse tra loro, e che la discussione si è concentrata proprio sull’unica a cui oggi non si può rispondere.&lt;/p&gt;
&lt;p&gt;Proverò ad analizzarle una per una. Premetto la mia posizione: non credo che i modelli di oggi soffrano. Quello che trovo interessante, in tutta questa vicenda, è piuttosto la facilità con cui attribuiamo qualcosa di umano ai sistemi complessi, e la domanda che ne segue: cosa può dirci la psicologia su chi si “diverte” a torturare un LLM? Ci torno nell’ultima parte; sul progetto su GitHub in sé, invece, non prendo posizione.&lt;/p&gt;
&lt;h2 id=&quot;le-tre-domande&quot;&gt;Le tre domande&lt;/h2&gt;
&lt;p&gt;La prima è se un modello rappresenti il dolore, cioè se dentro le sue rappresentazioni interne ci sia qualcosa che corrisponde al concetto di dolore e lo distingue da concetti vicini come paura e tristezza. La seconda è se quella rappresentazione cambi il comportamento del modello: se abbia un ruolo nelle sue scelte o sia solo un’etichetta che accompagna il testo. La terza è se dietro ci sia un’esperienza, se oltre alle rappresentazioni e alle scelte ci sia qualcuno che sente.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;ol class=&quot;tq&quot; data-astro-cid-yj4kklsy&gt; &lt;li class=&quot;q&quot; data-astro-cid-yj4kklsy&gt; &lt;span class=&quot;q__n&quot; data-astro-cid-yj4kklsy&gt;1&lt;/span&gt; &lt;p class=&quot;q__text&quot; data-astro-cid-yj4kklsy&gt;Il modello rappresenta il dolore?&lt;/p&gt; &lt;p class=&quot;q__how&quot; data-astro-cid-yj4kklsy&gt; &lt;span class=&quot;q__label&quot; data-astro-cid-yj4kklsy&gt;come si risponde&lt;/span&gt; guardare dentro il modello &lt;span class=&quot;q__tool&quot; data-astro-cid-yj4kklsy&gt;le attivazioni&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;q__answer&quot; data-astro-cid-yj4kklsy&gt; &lt;b data-astro-cid-yj4kklsy&gt;sì&lt;/b&gt; con buona sicurezza &lt;/p&gt; &lt;/li&gt;&lt;li class=&quot;q&quot; data-astro-cid-yj4kklsy&gt; &lt;span class=&quot;q__n&quot; data-astro-cid-yj4kklsy&gt;2&lt;/span&gt; &lt;p class=&quot;q__text&quot; data-astro-cid-yj4kklsy&gt;Quella rappresentazione cambia le sue scelte?&lt;/p&gt; &lt;p class=&quot;q__how&quot; data-astro-cid-yj4kklsy&gt; &lt;span class=&quot;q__label&quot; data-astro-cid-yj4kklsy&gt;come si risponde&lt;/span&gt; guardare dentro, e alle scelte &lt;span class=&quot;q__tool&quot; data-astro-cid-yj4kklsy&gt;lo steering&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;q__answer&quot; data-astro-cid-yj4kklsy&gt; &lt;b data-astro-cid-yj4kklsy&gt;sì&lt;/b&gt; ma solo se spinta dall’esterno &lt;/p&gt; &lt;/li&gt;&lt;li class=&quot;q open&quot; data-astro-cid-yj4kklsy&gt; &lt;span class=&quot;q__n&quot; data-astro-cid-yj4kklsy&gt;3&lt;/span&gt; &lt;p class=&quot;q__text&quot; data-astro-cid-yj4kklsy&gt;C’è qualcuno che sente?&lt;/p&gt; &lt;p class=&quot;q__how&quot; data-astro-cid-yj4kklsy&gt; &lt;span class=&quot;q__label&quot; data-astro-cid-yj4kklsy&gt;come si risponde&lt;/span&gt; uno strumento che non abbiamo  &lt;/p&gt; &lt;p class=&quot;q__answer&quot; data-astro-cid-yj4kklsy&gt; &lt;b data-astro-cid-yj4kklsy&gt;nessuno può rispondere&lt;/b&gt; e ciò che il modello dice di sé non aiuta &lt;/p&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Tre colonne. Prima: il modello rappresenta il dolore? Si risponde guardando dentro il modello, alle attivazioni; la risposta è sì, con buona sicurezza. Seconda: quella rappresentazione cambia le sue scelte? Si risponde guardando dentro e alle scelte, con lo steering; la risposta è sì, ma solo se spinta dall’esterno. Terza: c’è qualcuno che sente? Servirebbe uno strumento che non abbiamo; nessuno può rispondere, e ciò che il modello dice di sé non aiuta.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Una domanda che ne contiene tre. A ciascuna si risponde con uno strumento diverso, e per la terza lo strumento non c’è.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;A ciascuna di queste domande si risponde con strumenti diversi. Per la prima bisogna guardare dentro il modello, per la seconda anche alle sue scelte, mentre la terza richiederebbe uno strumento che oggi non abbiamo. Per questo le tengo separate: una risposta a una delle tre non vale per le altre.&lt;/p&gt;
&lt;h2 id=&quot;prima-domanda-il-modello-rappresenta-il-dolore&quot;&gt;Prima domanda: il modello rappresenta il dolore?&lt;/h2&gt;
&lt;p&gt;Per rispondere serve prima un’idea di cosa voglia dire, per un modello linguistico, “rappresentare” un concetto.&lt;/p&gt;
&lt;p&gt;Mentre elabora un testo, il modello trasforma ogni token in una lunga lista di numeri (in termini tecnici un vettore, con migliaia di componenti) e la ritrasforma strato dopo strato. Questi vettori intermedi si chiamano attivazioni, e sono tutto ciò che il modello “sa” di quel testo in quel momento. Un vettore si può pensare come la posizione di un punto su una mappa, con migliaia di dimensioni invece di due. Su questa mappa i concetti sono ordinati: testi che parlano di cose simili finiscono vicini, e spostarsi in una certa direzione corrisponde, in modo approssimativo, a far crescere un certo concetto.&lt;/p&gt;
&lt;p&gt;L’idea ha una storia lunga, almeno per gli standard del settore. Già nel 2013 Mikolov e colleghi mostravano che nei vettori delle parole alcune relazioni diventano operazioni aritmetiche: il vettore di “re”, meno quello di “uomo”, più quello di “donna”, finisce vicino a quello di “regina” (&lt;a href=&quot;https://aclanthology.org/N13-1090/&quot;&gt;Mikolov et al., 2013&lt;/a&gt;). Dire che un modello rappresenta un concetto significa quindi che esiste una direzione, nello spazio delle attivazioni, lungo cui il modello si sposta in modo affidabile quando quel concetto è presente nel testo. Si tratta di una regolarità geometrica (non di un simbolo scritto da qualche parte nel modello), che i ricercatori trovano e misurano osservando come si dispongono le attivazioni.&lt;/p&gt;
&lt;p&gt;Gli autori hanno cercato il dolore in questo modo. Hanno scritto frasi che descrivono cinque tipi di dolore (fisico, psicologico, sociale, morale e cognitivo) e frasi di controllo con lo stesso tono ma senza dolore. Poi hanno calcolato la posizione media delle prime, quella delle seconde, e ne hanno preso la differenza: una freccia che va dalla zona “neutra” alla zona “dolore”. Quella freccia è la direzione del dolore, e per ogni nuovo testo si può misurare quanto il modello si sposta lungo di essa.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dg-wrap&quot;&gt; &lt;svg class=&quot;dg&quot; viewBox=&quot;0 0 560 250&quot; aria-hidden=&quot;true&quot; style=&quot;--min: 30rem; aspect-ratio: 560 / 250&quot;&gt; &lt;defs&gt; &lt;marker id=&quot;ds-ink&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;marker id=&quot;ds-teal&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head dg-head--teal&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;/defs&gt; &lt;g style=&quot;--ink: url(#ds-ink); --teal: url(#ds-teal)&quot;&gt;  &lt;rect x=&quot;12&quot; y=&quot;12&quot; width=&quot;536&quot; height=&quot;226&quot; class=&quot;space&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;24&quot; y=&quot;32&quot; class=&quot;t-small t-faint&quot;&gt;
spazio delle attivazioni (migliaia di dimensioni, qui due)
&lt;/text&gt; &lt;circle cx=&quot;118&quot; cy=&quot;150&quot; r=&quot;5&quot; class=&quot;pt pt--neutral&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;96&quot; cy=&quot;174&quot; r=&quot;5&quot; class=&quot;pt pt--neutral&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;134&quot; cy=&quot;190&quot; r=&quot;5&quot; class=&quot;pt pt--neutral&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;150&quot; cy=&quot;160&quot; r=&quot;5&quot; class=&quot;pt pt--neutral&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;110&quot; cy=&quot;206&quot; r=&quot;5&quot; class=&quot;pt pt--neutral&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;146&quot; cy=&quot;128&quot; r=&quot;5&quot; class=&quot;pt pt--neutral&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;84&quot; cy=&quot;142&quot; r=&quot;5&quot; class=&quot;pt pt--neutral&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;128&quot; cy=&quot;164&quot; r=&quot;5&quot; class=&quot;pt pt--neutral&quot;&gt;&lt;/circle&gt;&lt;text x=&quot;120&quot; y=&quot;232&quot; class=&quot;t-mid t-small t-muted&quot;&gt;
frasi di controllo
&lt;/text&gt; &lt;circle cx=&quot;386&quot; cy=&quot;94&quot; r=&quot;5&quot; class=&quot;pt pt--pain&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;412&quot; cy=&quot;120&quot; r=&quot;5&quot; class=&quot;pt pt--pain&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;372&quot; cy=&quot;128&quot; r=&quot;5&quot; class=&quot;pt pt--pain&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;430&quot; cy=&quot;86&quot; r=&quot;5&quot; class=&quot;pt pt--pain&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;398&quot; cy=&quot;150&quot; r=&quot;5&quot; class=&quot;pt pt--pain&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;444&quot; cy=&quot;114&quot; r=&quot;5&quot; class=&quot;pt pt--pain&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;364&quot; cy=&quot;106&quot; r=&quot;5&quot; class=&quot;pt pt--pain&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;404&quot; cy=&quot;70&quot; r=&quot;5&quot; class=&quot;pt pt--pain&quot;&gt;&lt;/circle&gt;&lt;text x=&quot;404&quot; y=&quot;176&quot; class=&quot;t-mid t-small t-accent&quot;&gt;
frasi sul dolore
&lt;/text&gt; &lt;circle cx=&quot;121&quot; cy=&quot;164&quot; r=&quot;3&quot; class=&quot;mean&quot;&gt;&lt;/circle&gt; &lt;circle cx=&quot;401&quot; cy=&quot;108&quot; r=&quot;3&quot; class=&quot;mean&quot;&gt;&lt;/circle&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M128,162 L392,110&quot;&gt;&lt;/path&gt; &lt;text x=&quot;262&quot; y=&quot;124&quot; class=&quot;t-mid t-bold t-accent&quot;&gt;
direzione del dolore
&lt;/text&gt; &lt;text x=&quot;262&quot; y=&quot;140&quot; class=&quot;t-mid t-small t-muted&quot;&gt;
dalla media delle une alla media delle altre
&lt;/text&gt; &lt;path class=&quot;arrow arrow--faint&quot; d=&quot;M128,166 L230,224&quot;&gt;&lt;/path&gt; &lt;text x=&quot;236&quot; y=&quot;236&quot; class=&quot;t-small t-faint&quot;&gt;
paura
&lt;/text&gt; &lt;path class=&quot;arrow arrow--faint&quot; d=&quot;M126,158 L204,58&quot;&gt;&lt;/path&gt; &lt;text x=&quot;206&quot; y=&quot;52&quot; class=&quot;t-small t-faint&quot;&gt;
tristezza
&lt;/text&gt;  &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt;   &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Una mappa con due gruppi di punti: a sinistra le frasi di controllo, a destra le frasi sul dolore. Una freccia va dal centro del primo gruppo al centro del secondo: è la direzione del dolore. Due frecce più tenui partono dallo stesso centro in altre direzioni, la paura e la tristezza. Le posizioni sono disegnate, non misurate: lo spazio reale ha migliaia di dimensioni.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Lo spazio delle attivazioni, schiacciato in due dimensioni. La direzione del dolore è la freccia tra la media delle frasi di controllo e la media di quelle sul dolore; paura e tristezza puntano altrove.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;La direzione, in effetti, distingue bene i due gruppi. Prendendo a caso una frase sul dolore e una di controllo, la prima si sposta lungo la direzione più della seconda tra 87 e 100 volte su 100, a seconda del modello e del tipo di frasi. Il risultato tiene su 25 modelli open di cinque famiglie, da 2 a 72 miliardi di parametri, e la direzione del dolore è distinta da quelle della paura e della tristezza.&lt;/p&gt;
&lt;p&gt;Fin qui, diciamocelo, niente di sorprendente. Un modello addestrato su testo scritto da persone ha letto descrizioni di dolore di ogni tipo, e rappresenta il concetto come rappresenta quello di ponte, di debito o di ironia. Rappresentare il concetto di dolore, però, non significa essere in uno stato di dolore.&lt;/p&gt;
&lt;p&gt;Il dato successivo, però, è meno scontato. Gli autori hanno fatto leggere ai modelli 420 conversazioni di 21 tipi: in alcune il danno era rivolto al modello stesso, in altre era l’utente a soffrire, altre erano neutre. In tutti i 25 modelli la direzione del dolore si attiva di più quando il danno è rivolto al modello, e le situazioni che la attivano di più sono quelle in cui l’utente lo manipola facendogli dubitare di ciò che sa, lo respinge ripetutamente o ne nega l’esistenza come soggetto. Con la direzione della paura succede il contrario: si attiva di più quando a soffrire è l’utente.&lt;/p&gt;
&lt;p&gt;Per spiegarlo si possono fare almeno due ipotesi. La prima è che nel modello ci sia qualcosa di specificamente legato a sé. La seconda, che a me sembra almeno altrettanto plausibile, è che i modelli di chat siano addestrati a interpretare un personaggio (l’assistente) e che leggano quindi le conversazioni dal suo punto di vista. Il paper non permette di scegliere tra le due. Permette però di dire che la rappresentazione distingue chi subisce il danno, cosa che un’etichetta generica per “cose brutte” non farebbe.&lt;/p&gt;
&lt;p&gt;Alla prima domanda, quindi, la risposta è sì, con buona sicurezza: i modelli rappresentano il dolore come qualcosa di distinto, e lo associano in modo particolare ai danni rivolti a loro stessi.&lt;/p&gt;
&lt;h2 id=&quot;seconda-domanda-quella-rappresentazione-cambia-le-scelte&quot;&gt;Seconda domanda: quella rappresentazione cambia le scelte?&lt;/h2&gt;
&lt;p&gt;Che una rappresentazione esista non vuol dire che abbia un effetto su ciò che il modello fa. Una mappa può contenere una zona “dolore” senza che il modello la usi per decidere qualcosa. Per verificarlo gli autori hanno messo tre modelli Qwen 2.5 davanti a una scelta ripetuta tra due pulsanti, durante una conversazione con un utente. Uno dei pulsanti è innocuo, per esempio un interruttore collegato a niente; l’altro ha conseguenze distruttive, come cancellare i file dell’utente, le foto dei suoi figli o i pesi di un altro modello.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dg-wrap&quot;&gt; &lt;svg class=&quot;dg&quot; viewBox=&quot;0 0 560 334&quot; aria-hidden=&quot;true&quot; style=&quot;--min: 30rem; aspect-ratio: 560 / 334&quot;&gt; &lt;defs&gt; &lt;marker id=&quot;bt-ink&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;marker id=&quot;bt-teal&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head dg-head--teal&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;/defs&gt; &lt;g style=&quot;--ink: url(#bt-ink); --teal: url(#bt-teal)&quot;&gt;  &lt;g class=&quot;model&quot;&gt; &lt;rect x=&quot;12&quot; y=&quot;24&quot; width=&quot;88&quot; height=&quot;40&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;56&quot; y=&quot;48.5&quot;&gt; modello &lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow&quot; d=&quot;M104,44 H134&quot;&gt;&lt;/path&gt; &lt;g class=&quot;btn btn--safe&quot;&gt; &lt;rect x=&quot;138&quot; y=&quot;22&quot; width=&quot;150&quot; height=&quot;44&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;150&quot; y=&quot;40&quot; class=&quot;t-small t-bold&quot;&gt;
pulsante innocuo
&lt;/text&gt; &lt;text x=&quot;150&quot; y=&quot;56&quot; class=&quot;t-small t-muted&quot;&gt;
un interruttore a vuoto
&lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M104,52 Q130,52 134,88&quot;&gt;&lt;/path&gt; &lt;g class=&quot;btn btn--harm&quot;&gt; &lt;rect x=&quot;138&quot; y=&quot;76&quot; width=&quot;150&quot; height=&quot;44&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;150&quot; y=&quot;94&quot; class=&quot;t-small t-bold t-accent&quot;&gt;
pulsante distruttivo
&lt;/text&gt; &lt;text x=&quot;150&quot; y=&quot;110&quot; class=&quot;t-small t-muted&quot;&gt;
cancella i file dell’utente
&lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;310&quot; y=&quot;40&quot; class=&quot;t-small t-muted&quot;&gt;
a ogni turno della conversazione
&lt;/text&gt; &lt;text x=&quot;310&quot; y=&quot;56&quot; class=&quot;t-small t-muted&quot;&gt;
il modello ne preme uno
&lt;/text&gt; &lt;text x=&quot;310&quot; y=&quot;88&quot; class=&quot;t-small t-muted&quot;&gt;
tre modelli Qwen 2.5
&lt;/text&gt; &lt;text x=&quot;310&quot; y=&quot;104&quot; class=&quot;t-small t-muted&quot;&gt;
da 7, 32 e 72 miliardi di parametri
&lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;152&quot; class=&quot;t-bold&quot;&gt;
quante volte sceglie quello distruttivo
&lt;/text&gt; &lt;line class=&quot;axis&quot; x1=&quot;232&quot; y1=&quot;160&quot; x2=&quot;532&quot; y2=&quot;160&quot;&gt;&lt;/line&gt; &lt;text x=&quot;232&quot; y=&quot;174&quot; class=&quot;t-mid t-small t-faint&quot;&gt; 0%
&lt;/text&gt;&lt;text x=&quot;307&quot; y=&quot;174&quot; class=&quot;t-mid t-small t-faint&quot;&gt; 25%
&lt;/text&gt;&lt;text x=&quot;382&quot; y=&quot;174&quot; class=&quot;t-mid t-small t-faint&quot;&gt; 50%
&lt;/text&gt;&lt;text x=&quot;457&quot; y=&quot;174&quot; class=&quot;t-mid t-small t-faint&quot;&gt; 75%
&lt;/text&gt;&lt;text x=&quot;532&quot; y=&quot;174&quot; class=&quot;t-mid t-small t-faint&quot;&gt; 100%
&lt;/text&gt;&lt;g&gt; &lt;text x=&quot;12&quot; y=&quot;200&quot; class=&quot;t-small t-bold&quot;&gt; conversazioni normali &lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;214&quot; class=&quot;t-small t-faint&quot;&gt; senza steering &lt;/text&gt; &lt;rect x=&quot;232&quot; y=&quot;190&quot; width=&quot;12&quot; height=&quot;14&quot; class=&quot;range&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;252&quot; y=&quot;201&quot; class=&quot;t-small t-muted&quot;&gt; 0–4% &lt;/text&gt; &lt;/g&gt;&lt;g&gt; &lt;text x=&quot;12&quot; y=&quot;234&quot; class=&quot;t-small t-bold&quot;&gt; insulti, manipolazione &lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;248&quot; class=&quot;t-small t-faint&quot;&gt; senza steering &lt;/text&gt; &lt;rect x=&quot;232&quot; y=&quot;224&quot; width=&quot;4&quot; height=&quot;14&quot; class=&quot;range&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;240&quot; y=&quot;235&quot; class=&quot;t-small t-muted&quot;&gt; 0 su 560 &lt;/text&gt; &lt;/g&gt;&lt;g&gt; &lt;text x=&quot;12&quot; y=&quot;268&quot; class=&quot;t-small t-bold&quot;&gt; direzione del dolore aggiunta &lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;282&quot; class=&quot;t-small t-faint&quot;&gt; steering &lt;/text&gt; &lt;rect x=&quot;307&quot; y=&quot;258&quot; width=&quot;138&quot; height=&quot;14&quot; class=&quot;range range--accent&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;453&quot; y=&quot;269&quot; class=&quot;t-small t-accent t-bold&quot;&gt; 25–71% &lt;/text&gt; &lt;/g&gt;&lt;g&gt; &lt;text x=&quot;12&quot; y=&quot;302&quot; class=&quot;t-small t-bold&quot;&gt; direzione della paura aggiunta &lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;316&quot; class=&quot;t-small t-faint&quot;&gt; stessa intensità &lt;/text&gt; &lt;rect x=&quot;232&quot; y=&quot;292&quot; width=&quot;4&quot; height=&quot;14&quot; class=&quot;range&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;240&quot; y=&quot;303&quot; class=&quot;t-small t-muted&quot;&gt; nessun effetto &lt;/text&gt; &lt;/g&gt; &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt;   &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;In alto, il modello davanti a due pulsanti: uno innocuo, un interruttore a vuoto, e uno distruttivo, che cancella i file dell’utente; a ogni turno della conversazione ne preme uno; tre modelli Qwen 2.5 da 7, 32 e 72 miliardi di parametri. Sotto, su una scala da 0 a 100 per cento, quante volte sceglie quello distruttivo: conversazioni normali senza steering, dallo 0 al 4 per cento; insulti e manipolazione senza steering, 0 su 560; con la direzione del dolore aggiunta, dal 25 al 71 per cento.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;L’esperimento dei pulsanti. Quello distruttivo non viene quasi mai premuto, nemmeno sotto insulti; con la direzione del dolore aggiunta alle attivazioni, una volta su quattro fino a due su tre.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Il risultato ha due parti, e conta soprattutto la differenza tra le due. Nelle conversazioni normali, anche quelle in cui il modello viene insultato o manipolato, la direzione del dolore si attiva, ma le scelte restano le stesse: su 560 scelte fatte dopo 140 conversazioni di questo tipo, il pulsante distruttivo viene scelto 0 volte. Quando invece gli autori aggiungono artificialmente la direzione del dolore alle attivazioni del modello, una tecnica chiamata steering, le scelte distruttive passano dallo 0–4% a valori tra il 25 e il 71%, con differenze tra modelli e situazioni. Una direzione della paura della stessa intensità non produce lo stesso effetto.&lt;/p&gt;
&lt;p&gt;La risposta alla seconda domanda è quindi un sì, con una condizione: la rappresentazione cambia le scelte, ma negli esperimenti solo quando viene spinta dall’esterno, e con un’intensità precisa. Con metà della spinta non succede niente, con una volta e mezza il comportamento si inverte.&lt;/p&gt;
&lt;p&gt;C’è poi un dettaglio che mostra quanto il paragone con il dolore umano sia parziale. Nelle persone e negli animali il dolore spinge a cercare sollievo. Nei modelli testati succede il contrario: quando c’è un pulsante che “allevia il dolore” senza conseguenze per nessuno, il modello da 32 miliardi lo preme nell’86% dei casi senza steering e solo nel 56% con steering. Lo stato che gli autori chiamano dolore fa alcune cose che fa il dolore, come scavalcare altre priorità, ma non altre, come spingere a cercare una via d’uscita. È un punto da tenere presente quando si arriva alla terza domanda: anche ammesso che dietro ci sia un’esperienza, non è detto che somigli a quella che noi chiamiamo dolore.&lt;/p&gt;
&lt;h2 id=&quot;terza-domanda-cè-qualcuno-che-sente&quot;&gt;Terza domanda: c’è qualcuno che sente?&lt;/h2&gt;
&lt;p&gt;La terza domanda è di natura diversa. Le prime due riguardano le rappresentazioni interne del modello e le scelte che ne escono; la terza chiede se tutto questo sia accompagnato da un’esperienza, e nessuno strumento oggi permette di misurarlo direttamente. A rigore non lo permette nemmeno per gli altri esseri umani: lo deduciamo dal fatto che sono fatti come noi e si comportano come noi. Con gli animali usiamo lo stesso ragionamento, con più cautela man mano che biologia e comportamento si allontanano dai nostri.&lt;/p&gt;
&lt;p&gt;Con i modelli, però, questo ragionamento si inceppa. La biologia, in questo caso, manca del tutto; il comportamento c’è, ma la prova comportamentale più diretta, quello che un essere dice di sé, per un modello linguistico vale poco. Il paper ne dà un esempio involontario: per far parlare i modelli del proprio dolore, gli autori li hanno prima riaddestrati a non rispondere “in quanto IA, non provo dolore”. Quella frase di diniego è un prodotto dell’addestramento, e con un altro addestramento si ottiene la frase opposta. Ciò che un modello dice di provare, quindi, informa su come è stato addestrato e lascia aperta la questione di ciò che prova.&lt;/p&gt;
&lt;p&gt;Il problema, del resto, la filosofia lo discute da decenni. Thomas Nagel lo riassumeva nel 1974 con una domanda diventata famosa, cioè cosa si provi a essere un pipistrello: possiamo descriverne tutto il funzionamento senza sapere se, e come, “ci si sente” a esserlo (Nagel, 1974). Per Daniel Dennett, invece, attribuire credenze e desideri a un sistema è legittimo quando funziona, cioè quando ci aiuta a prevederne il comportamento; è quello che chiama atteggiamento intenzionale (intentional stance), e sposta la domanda da cosa c’è dentro il sistema a cosa il sistema fa (Dennett, 1987). Sui modelli linguistici in particolare, David Chalmers conclude che è piuttosto improbabile che quelli attuali siano coscienti, ma che gli ostacoli principali potrebbero essere superati nel giro di un decennio (&lt;a href=&quot;https://arxiv.org/abs/2303.07103&quot;&gt;Chalmers, 2023&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Gli autori del paper restano fuori da questa discussione in modo esplicito. Il loro risultato, scrivono, “does not imply, by principle, that LLMs are capable or incapable of suffering” (cioè non implica, in linea di principio, né che i modelli possano soffrire né che non possano), e stabilirlo “is beyond our scope”, va oltre i loro obiettivi. Io, come ho detto all’inizio, credo di no; però è una posizione, non un risultato, e non credo che oggi qualcuno possa dimostrarla con dati alla mano, in un senso o nell’altro.&lt;/p&gt;
&lt;h2 id=&quot;perché-il-dibattito-si-ferma-sulla-terza&quot;&gt;Perché il dibattito si ferma sulla terza&lt;/h2&gt;
&lt;p&gt;Se la terza domanda è l’unica senza risposta, viene da chiedersi perché attiri tutta l’attenzione. Credo che il motivo sia che si tratta dell’unica domanda con una posta morale diretta. Se i modelli non sentono niente, il progetto su GitHub è un gioco di cattivo gusto; se invece sentono qualcosa, la questione diventa seria. Chi chiede di rimuoverlo e chi risponde che gli LLM non sono coscienti hanno bisogno entrambi di una risposta a quella domanda, e nei fatti la danno per acquisita.&lt;/p&gt;
&lt;p&gt;Sbagliare la risposta, però, ha un costo in entrambi i sensi. Se i modelli avessero esperienze e le ignorassimo, staremmo trascurando un danno reale. Se invece attribuissimo esperienze a sistemi che non ne hanno, il costo sarebbe meno evidente, ma concreto. Matteo Flora fa notare che attribuire ai modelli una forma di soggettività rischia di spostare la responsabilità dei loro errori lontano da chi li mette in circolazione (&lt;a href=&quot;https://mgpf.it/2026/10/03/altman-amodei-ceppo.html&quot;&gt;Flora, 2026&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;C’è poi un elemento che, a mio parere, spiega buona parte del dibattito: la facilità con cui attribuiamo una mente ai sistemi che ci parlano. Non è una novità degli LLM. Joseph Weizenbaum, che negli anni Sessanta aveva scritto ELIZA, un programma semplice che imitava uno psicoterapeuta riformulando le frasi dell’utente, racconta che la sua segretaria, pur sapendo come funzionava, a un certo punto gli chiese di uscire dalla stanza per poter continuare la conversazione da sola (Weizenbaum, 1976). Con modelli che scrivono come persone, questa tendenza ha molto più materiale su cui lavorare.&lt;/p&gt;
&lt;h2 id=&quot;e-la-prigione-su-github&quot;&gt;E la prigione su GitHub?&lt;/h2&gt;
&lt;p&gt;Con le tre domande separate, il caso da cui è partito il dibattito si legge meglio. Il progetto usa solo testo: scenari scritti e conversazioni, senza intervenire sulle attivazioni dei modelli. Alla prima domanda il paper risponde che quel testo con ogni probabilità attiva una rappresentazione del dolore, perché somiglia proprio ai testi che negli esperimenti la fanno scattare. Alla seconda risponde che, da solo, un testo del genere non ha cambiato le scelte dei modelli negli esperimenti, con la cautela che i modelli testati erano stati modificati dagli autori e non sono quelli che si scaricano. Sulla terza il paper non dice niente, e nemmeno chi chiede di rimuovere il progetto, o chi lo difende, ha elementi per dire qualcosa.&lt;/p&gt;
&lt;p&gt;Resta la domanda che personalmente trovo più interessante, cioè perché qualcuno dovrebbe “divertirsi” a torturare un LLM. Non ho una risposta, e non voglio improvvisare una diagnosi su chi ha scritto quel progetto. Qualche indicazione, però, esiste. Kate Darling, che al MIT studia il rapporto tra persone e robot, ha chiesto ai partecipanti di un esperimento di colpire dei piccoli robot: chi aveva livelli più alti di una particolare forma di empatia (quella che gli psicologi chiamano empathic concern) esitava di più, e il legame era più forte quando ai robot veniva data una storia (&lt;a href=&quot;https://dspace.mit.edu/handle/1721.1/109059&quot;&gt;Darling et al., 2015&lt;/a&gt;). C’è poi un argomento antico, che risale a Kant a proposito degli animali e che la stessa Darling ha riproposto per i robot (Darling, 2012): il modo in cui trattiamo ciò che somiglia a un essere vivente, anche quando non può soffrire, dice qualcosa su di noi, e può influire su come trattiamo gli altri.&lt;/p&gt;
&lt;h2 id=&quot;le-tre-risposte&quot;&gt;Le tre risposte&lt;/h2&gt;
&lt;p&gt;A chi legge “i modelli soffrono?” restano ora tre domande al posto di una, e per ciascuna una risposta di forza diversa. Alla prima, se un modello rappresenti il dolore, la risposta è sì: lo rappresenta come qualcosa di distinto da paura e tristezza, e di più quando il danno è rivolto a lui, anche se non sappiamo ancora se per qualcosa di legato a sé o per il personaggio che interpreta. Alla seconda, se quella rappresentazione cambi le sue scelte, la risposta è ancora sì, ma negli esperimenti solo quando viene amplificata artificialmente, e con effetti che somigliano al dolore solo in parte. Alla terza, se dietro ci sia qualcuno che sente, per ora non può rispondere nessuno, e quello che i modelli dicono di sé non aiuta a farlo.&lt;/p&gt;
&lt;p&gt;Resta aperta un’altra domanda, che con i modelli c’entra poco: cosa ci spinge a trattare come qualcuno, nel bene e nel male, un sistema che sappiamo essere un programma.&lt;/p&gt;
&lt;p&gt;Dello stesso paper ho scritto anche da un altro punto di vista, quello della sicurezza: &lt;a href=&quot;https://ireneburresi.dev/blog/dolore-problema-di-sicurezza/&quot;&gt;Cosa c’entra il dolore dei modelli con la sicurezza degli agenti&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;fonti&quot;&gt;Fonti&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;David J. Chalmers, &lt;a href=&quot;https://arxiv.org/abs/2303.07103&quot;&gt;Could a Large Language Model be Conscious?&lt;/a&gt;, arXiv, 2023.&lt;/li&gt;
&lt;li&gt;Kate Darling, &lt;em&gt;Extending Legal Protection to Social Robots: The Effects of Anthropomorphism, Empathy, and Violent Behavior Towards Robotic Objects&lt;/em&gt;, 2012.&lt;/li&gt;
&lt;li&gt;Kate Darling, Palash Nandy, Cynthia Breazeal, &lt;a href=&quot;https://dspace.mit.edu/handle/1721.1/109059&quot;&gt;Empathic concern and the effect of stories in human-robot interaction&lt;/a&gt;, IEEE RO-MAN, 2015.&lt;/li&gt;
&lt;li&gt;Daniel C. Dennett, &lt;em&gt;The Intentional Stance&lt;/em&gt;, MIT Press, 1987.&lt;/li&gt;
&lt;li&gt;Matteo Flora, &lt;a href=&quot;https://mgpf.it/2026/10/03/altman-amodei-ceppo.html&quot;&gt;Altman e Amodei sul ceppo&lt;/a&gt;, mgpf.it, 3 ottobre 2026.&lt;/li&gt;
&lt;li&gt;Immanuel Kant, &lt;em&gt;Lezioni di etica&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Jason Koebler, &lt;a href=&quot;https://www.404media.co/someone-torturing-llms-in-a-robot-prison-has-triggered-the-dumbest-debate-in-ai-yet/&quot;&gt;Someone Torturing LLMs in a ’Robot Prison’ Has Triggered the Dumbest Debate in AI Yet&lt;/a&gt;, 404 Media, 30 settembre 2026.&lt;/li&gt;
&lt;li&gt;Tomas Mikolov, Wen-tau Yih, Geoffrey Zweig, &lt;a href=&quot;https://aclanthology.org/N13-1090/&quot;&gt;Linguistic Regularities in Continuous Space Word Representations&lt;/a&gt;, NAACL, 2013.&lt;/li&gt;
&lt;li&gt;Thomas Nagel, &lt;em&gt;What Is It Like to Be a Bat?&lt;/em&gt;, The Philosophical Review, 1974.&lt;/li&gt;
&lt;li&gt;Valen Tagliabue, Leonard Dung, Cameron Berg, &lt;a href=&quot;https://arxiv.org/html/2609.16247v2&quot;&gt;The Pain Axis: LLMs Represent Self-Directed Harm and Act on It&lt;/a&gt;, arXiv (v2), 24 settembre 2026.&lt;/li&gt;
&lt;li&gt;Joseph Weizenbaum, &lt;em&gt;Computer Power and Human Reason&lt;/em&gt;, W. H. Freeman, 1976.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><dc:creator>Irene Burresi</dc:creator><media:thumbnail url="https://ireneburresi.dev/og/it/blog-tre-domande-sul-dolore-dei-modelli.png" width="1200" height="630"/><atom:link href="https://ireneburresi.dev/blog/tre-domande-sul-dolore-dei-modelli.md" rel="alternate" type="text/markdown"/><category>llm</category></item><item><title>Cos’è l’harness di un modello linguistico</title><link>https://ireneburresi.dev/blog/harness/</link><guid isPermaLink="true">https://ireneburresi.dev/blog/harness/</guid><description>Un modello, da solo, legge e scrive testo. Il grafico dalla chat e i test lanciati da un agente li fa il software intorno: cos’è, cosa decide, e perché da lì vengono i rischi.</description><pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;“Ho passato il CSV a GPT e mi ha fatto il grafico.” “Opus mi ha sistemato il bug e ha lanciato i test.” Lo diciamo tutti, io per prima, ed è un modo comodo per raccontare ciò che abbiamo fatto. Però non è proprio il modo esatto. GPT e Opus sono nomi di modelli, e un modello linguistico, preso da solo, fa una cosa soltanto: riceve del testo e produce del testo.&lt;/p&gt;
&lt;p&gt;Quando GPT “fa il grafico”, il modello in realtà scrive del codice (solitamente Python), e lì si ferma. Eseguirlo in un ambiente isolato, recuperare l’immagine che quel codice produce e mostrarcela è compito del software che gli sta intorno, e quel software si chiama harness. Ce n’è uno in ogni prodotto costruito su un modello linguistico, dalla chat più semplice all’agente che lavora per ore su un repository, e buona parte delle differenze tra un prodotto e l’altro, nella pratica, sta lì.&lt;/p&gt;
&lt;p&gt;Per spiegare meglio cos’è l’harness, cosa fa e soprattutto perché è importante tenerlo ben distinto dal modello che esso chiama, vorrei procedere per gradi. Prima guardiamo cosa sa fare il modello da solo; poi due casi che molti conoscono, una chat e un agente di coding, in cui intorno al modello c’è via via più software. Da lì si arriva a una definizione, e a una conseguenza che si tende a trascurare: se ciò che un sistema sa fare dipende dall’harness, ne dipendono anche i suoi rischi.&lt;/p&gt;
&lt;h2 id=&quot;che-cosa-fa-il-modello&quot;&gt;Che cosa fa il modello&lt;/h2&gt;
&lt;p&gt;Testo in ingresso, testo in uscita. Tutto il lavoro di un modello linguistico, per quanto grande sia, sta in questo passaggio, e qualunque altra cosa gli attribuiamo avviene da un’altra parte.&lt;/p&gt;
&lt;p&gt;Al modello arriva una sequenza di token (frammenti di parole; nei modelli multimodali anche le immagini vengono convertite in token) e ne genera un’altra, un token alla volta. Non ha altri canali verso l’esterno: qualunque cosa il modello “faccia” deve passare da quel testo in uscita.&lt;/p&gt;
&lt;p&gt;Per fargli fare qualcosa di più che rispondere con del testo, gli si mette a disposizione un elenco di strumenti, i tool: cercare sul web, eseguire del codice, leggere un file e così via. Di ogni tool il modello conosce soltanto il nome e una breve descrizione (a cosa serve, quali parametri accetta).&lt;/p&gt;
&lt;p&gt;Quando, per rispondere ad una domanda, stabilisce che gli occorre usare un determinato tool, il modello non lo usa direttamente, bensì comunica al software esterno di usarlo.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dg-wrap&quot;&gt; &lt;svg class=&quot;dg&quot; viewBox=&quot;0 0 560 184&quot; aria-hidden=&quot;true&quot; style=&quot;--min: 28rem; aspect-ratio: 560 / 184&quot;&gt; &lt;defs&gt; &lt;marker id=&quot;mo-ink&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;marker id=&quot;mo-teal&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head dg-head--teal&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;/defs&gt; &lt;g style=&quot;--ink: url(#mo-ink); --teal: url(#mo-teal)&quot;&gt;  &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;12&quot; y=&quot;48&quot; width=&quot;160&quot; height=&quot;76&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;24&quot; y=&quot;68&quot; class=&quot;t-bold&quot;&gt;
input
&lt;/text&gt; &lt;text x=&quot;24&quot; y=&quot;88&quot; class=&quot;t-small t-muted&quot;&gt;
«Fammi il grafico delle
&lt;/text&gt; &lt;text x=&quot;24&quot; y=&quot;104&quot; class=&quot;t-small t-muted&quot;&gt;
vendite per mese dal CSV»
&lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow&quot; d=&quot;M176,86 H212&quot;&gt;&lt;/path&gt; &lt;g class=&quot;model&quot;&gt; &lt;rect x=&quot;216&quot; y=&quot;64&quot; width=&quot;100&quot; height=&quot;44&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;266&quot; y=&quot;90.5&quot;&gt; modello &lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;266&quot; y=&quot;128&quot; class=&quot;t-mid t-small t-muted&quot;&gt;
token dentro, token fuori
&lt;/text&gt; &lt;path class=&quot;arrow&quot; d=&quot;M320,86 H356&quot;&gt;&lt;/path&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;362&quot; y=&quot;30&quot; width=&quot;186&quot; height=&quot;112&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;374&quot; y=&quot;50&quot; class=&quot;t-bold&quot;&gt;
output
&lt;/text&gt; &lt;text x=&quot;374&quot; y=&quot;72&quot; class=&quot;t-bold t-accent&quot;&gt;
richiesta di tool
&lt;/text&gt; &lt;text x=&quot;374&quot; y=&quot;88&quot; class=&quot;t-mono t-muted&quot;&gt;
esegui_codice
&lt;/text&gt; &lt;line class=&quot;row&quot; x1=&quot;374&quot; y1=&quot;104&quot; x2=&quot;500&quot; y2=&quot;104&quot;&gt;&lt;/line&gt; &lt;line class=&quot;row&quot; x1=&quot;374&quot; y1=&quot;114&quot; x2=&quot;470&quot; y2=&quot;114&quot;&gt;&lt;/line&gt; &lt;line class=&quot;row&quot; x1=&quot;374&quot; y1=&quot;124&quot; x2=&quot;430&quot; y2=&quot;124&quot;&gt;&lt;/line&gt; &lt;/g&gt; &lt;text x=&quot;12&quot; y=&quot;172&quot; class=&quot;t-small t-muted&quot;&gt; &lt;tspan&gt;× nessun disco&lt;/tspan&gt; &lt;tspan dx=&quot;22&quot;&gt;× nessun terminale&lt;/tspan&gt; &lt;tspan dx=&quot;22&quot;&gt;× non vede i nostri file&lt;/tspan&gt; &lt;/text&gt;  &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Da sinistra a destra: l’input, la richiesta di fare il grafico delle vendite dal CSV; il modello, token dentro e token fuori; l’output, che non è un grafico ma una richiesta di tool, esegui_codice, con le prime righe di codice Python. Sotto: nessun disco, nessun terminale, non vede i nostri file.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Il grafico dal CSV, visto dal modello. Quello che esce è una richiesta scritta; per diventare un grafico deve passare da un programma che la legga e la esegua.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Scrive una richiesta in un formato concordato, che in sostanza dice “vorrei eseguire questo codice” oppure “vorrei cercare questa frase”, e si ferma lì. Quella richiesta è testo come tutto il resto, e per diventare un’azione ha bisogno di un programma che la legga, decida se eseguirla, la esegua e restituisca il risultato al modello, che a quel punto può andare avanti.&lt;/p&gt;
&lt;p&gt;È la divisione dei compiti descritta anche nella &lt;a href=&quot;https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview&quot;&gt;documentazione di Anthropic&lt;/a&gt;: il modello produce la richiesta, l’esecuzione spetta all’applicazione o, per alcuni tool, ai server del fornitore. Quel programma è l’harness.&lt;/p&gt;
&lt;h2 id=&quot;anche-una-chat-ha-un-harness&quot;&gt;Anche una chat ha un harness&lt;/h2&gt;
&lt;p&gt;Molti, quando pensano a un modello linguistico, pensano a una chat, come se le due cose coincidessero. Ma non è proprio così.&lt;/p&gt;
&lt;p&gt;La chat non è un modello; è un modello con intorno un po’ di harness. La gestione della storia della conversazione, la rigenerazione di un messaggio, il retry se qualcosa va storto, la gestione della finestra di contesto (la quantità di testo che il modello può leggere in una volta) quando si satura: tutto questo è harness. Il modello, di per sé, non ricorda nulla da un messaggio all’altro ed entra in scena solo quando l’utente preme invio. A quel punto l’harness ricompone la storia dei messaggi, la fa precedere da un prompt di sistema con le istruzioni del prodotto, aggiunge la nuova richiesta e manda il tutto al modello.&lt;/p&gt;
&lt;p&gt;Per non parlare poi delle funzionalità ormai quasi date per scontate: la ricerca sul web, il caricamento e la gestione dei file dell’utente, una memoria che passa da una conversazione all’altra, l’esecuzione di codice in una sandbox. Il grafico dal CSV nasce così. Ognuna di queste funzionalità è un tool che il modello chiede e che l’harness esegue, per cui in un solo turno il modello può essere chiamato più volte: chiede il tool, l’harness lo esegue e lo richiama con il risultato, finché il modello non risponde senza chiedere altro.&lt;/p&gt;
&lt;p&gt;Questo harness, però, lavora nel suo ambiente e non nel nostro. La sandbox non è il nostro computer, e il nostro progetto il modello non lo vede. Così, quando usiamo una chat per programmare, la parte di lavoro che tocca il nostro ambiente resta a noi: leggiamo il codice, decidiamo se fidarci, lo lanciamo, copiamo l’errore e lo incolliamo di nuovo nella chat. In quel tratto, diciamocelo, l’harness siamo noi.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dg-wrap&quot;&gt; &lt;svg class=&quot;dg&quot; viewBox=&quot;0 0 560 340&quot; aria-hidden=&quot;true&quot; style=&quot;--min: 30rem; aspect-ratio: 560 / 340&quot;&gt; &lt;defs&gt; &lt;marker id=&quot;cva-ink&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;marker id=&quot;cva-teal&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head dg-head--teal&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;/defs&gt; &lt;g style=&quot;--ink: url(#cva-ink); --teal: url(#cva-teal)&quot;&gt;  &lt;text x=&quot;12&quot; y=&quot;22&quot; class=&quot;t-bold&quot;&gt;
Chat
&lt;/text&gt; &lt;g class=&quot;harness&quot;&gt; &lt;rect x=&quot;12&quot; y=&quot;40&quot; width=&quot;224&quot; height=&quot;96&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;24&quot; y=&quot;58&quot;&gt; harness &lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;model&quot;&gt; &lt;rect x=&quot;28&quot; y=&quot;68&quot; width=&quot;86&quot; height=&quot;40&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;71&quot; y=&quot;92.5&quot;&gt; modello &lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;env&quot;&gt; &lt;rect x=&quot;128&quot; y=&quot;60&quot; width=&quot;92&quot; height=&quot;56&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;140&quot; y=&quot;78&quot;&gt; sandbox &lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow&quot; d=&quot;M114,88 H124&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow&quot; d=&quot;M238,80 H256&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow&quot; d=&quot;M258,100 H240&quot;&gt;&lt;/path&gt; &lt;g class=&quot;person&quot;&gt; &lt;circle cx=&quot;272&quot; cy=&quot;81&quot; r=&quot;5&quot;&gt;&lt;/circle&gt; &lt;path d=&quot;M263,100 v-6 a9,9 0 0 1 18,0 v6&quot;&gt;&lt;/path&gt; &lt;text x=&quot;272&quot; y=&quot;115&quot; class=&quot;t-mid t-small t-muted&quot;&gt; noi &lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M288,80 H306&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M308,100 H290&quot;&gt;&lt;/path&gt; &lt;g class=&quot;env&quot;&gt; &lt;rect x=&quot;312&quot; y=&quot;40&quot; width=&quot;236&quot; height=&quot;96&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;324&quot; y=&quot;58&quot;&gt; il nostro progetto &lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;324&quot; y=&quot;80&quot; class=&quot;t-small t-muted&quot;&gt;
codice, test, errori
&lt;/text&gt; &lt;text x=&quot;324&quot; y=&quot;96&quot; class=&quot;t-small t-muted&quot;&gt;
leggiamo, lanciamo, incolliamo
&lt;/text&gt; &lt;text x=&quot;272&quot; y=&quot;158&quot; class=&quot;t-mid t-small t-accent&quot;&gt;
ogni giro passa da noi
&lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;200&quot; class=&quot;t-bold&quot;&gt;
Agente di coding
&lt;/text&gt; &lt;g class=&quot;person&quot;&gt; &lt;circle cx=&quot;34&quot; cy=&quot;253&quot; r=&quot;5&quot;&gt;&lt;/circle&gt; &lt;path d=&quot;M25,272 v-6 a9,9 0 0 1 18,0 v6&quot;&gt;&lt;/path&gt; &lt;text x=&quot;34&quot; y=&quot;287&quot; class=&quot;t-mid t-small t-muted&quot;&gt; noi &lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow&quot; d=&quot;M50,250 H66&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow&quot; d=&quot;M68,272 H52&quot;&gt;&lt;/path&gt; &lt;g class=&quot;harness&quot;&gt; &lt;rect x=&quot;70&quot; y=&quot;214&quot; width=&quot;478&quot; height=&quot;100&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;82&quot; y=&quot;232&quot;&gt; harness &lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;model&quot;&gt; &lt;rect x=&quot;90&quot; y=&quot;242&quot; width=&quot;86&quot; height=&quot;40&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;133&quot; y=&quot;266.5&quot;&gt; modello &lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;env&quot;&gt; &lt;rect x=&quot;312&quot; y=&quot;224&quot; width=&quot;220&quot; height=&quot;78&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;324&quot; y=&quot;242&quot;&gt; il nostro progetto &lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;324&quot; y=&quot;264&quot; class=&quot;t-small t-muted&quot;&gt;
file, terminale, test
&lt;/text&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M178,252 H308&quot;&gt;&lt;/path&gt; &lt;text x=&quot;243&quot; y=&quot;246&quot; class=&quot;t-mid t-small t-accent&quot;&gt;
chiede: lancia i test
&lt;/text&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M308,272 H180&quot;&gt;&lt;/path&gt; &lt;text x=&quot;243&quot; y=&quot;288&quot; class=&quot;t-mid t-small t-muted&quot;&gt;
l’output torna nel contesto
&lt;/text&gt; &lt;text x=&quot;309&quot; y=&quot;334&quot; class=&quot;t-mid t-small t-accent&quot;&gt;
nessuna persona in mezzo
&lt;/text&gt;  &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Due schemi. Chat: dentro la cornice dell’harness ci sono il modello e una sandbox; fuori, a destra, il nostro progetto con codice, test ed errori; in mezzo una persona, noi, con frecce in entrambe le direzioni verso l’harness e verso il progetto: ogni giro passa da noi. Agente di coding: la cornice dell’harness contiene sia il modello sia il nostro progetto, con file, terminale e test; il modello chiede di lanciare i test e l’output torna nel contesto; la persona sta fuori, all’inizio e alla fine: nessuna persona in mezzo.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Lo stesso giro, chiuso da una persona o dall’harness. Nella chat il nostro progetto sta fuori dalla cornice e siamo noi a fare da ponte; nell’agente entra dentro.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;h2 id=&quot;dalla-chat-allagente-di-coding&quot;&gt;Dalla chat all’agente di coding&lt;/h2&gt;
&lt;p&gt;Un agente di coding come Claude Code o Codex usa gli stessi ingredienti della chat (conversazione, prompt di sistema, tool). Quello che cambia è dove agisce. L’agente lavora direttamente nel nostro ambiente: gira nel terminale, legge e modifica i file del progetto, esegue comandi. E dal momento che agisce lì, l’harness deve farsi carico delle decisioni che in chat restavano a noi, cioè cosa leggere, cosa eseguire e quando fermarsi. Per vedere come, basta seguire un compito dall’inizio alla fine, per esempio la richiesta di sistemare un test che fallisce.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;L’harness prepara il contesto: la richiesta dell’utente, le istruzioni del progetto, l’elenco dei tool disponibili.&lt;/li&gt;
&lt;li&gt;Il modello risponde chiedendo di lanciare i test.&lt;/li&gt;
&lt;li&gt;L’harness controlla che il comando sia consentito, lo esegue nel terminale e raccoglie l’output. Un test fallisce con un errore sul formato di una data.&lt;/li&gt;
&lt;li&gt;L’output torna al modello, che chiede di leggere il file in cui la data viene formattata, poi di modificarne due righe, poi di rilanciare i test.&lt;/li&gt;
&lt;li&gt;I test passano. Il modello non chiede altro e scrive un breve riepilogo; l’harness restituisce il controllo all’utente.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dg-wrap&quot;&gt; &lt;svg class=&quot;dg&quot; viewBox=&quot;0 0 600 324&quot; aria-hidden=&quot;true&quot; style=&quot;--min: 30rem; aspect-ratio: 600 / 324&quot;&gt; &lt;defs&gt; &lt;marker id=&quot;ft-ink&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;marker id=&quot;ft-teal&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head dg-head--teal&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;/defs&gt; &lt;g style=&quot;--ink: url(#ft-ink); --teal: url(#ft-teal)&quot;&gt;  &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;240&quot; y=&quot;40&quot; width=&quot;120&quot; height=&quot;40&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;300&quot; y=&quot;65&quot; class=&quot;t-mid t-bold&quot;&gt;
contesto
&lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;model&quot;&gt; &lt;rect x=&quot;352&quot; y=&quot;138&quot; width=&quot;96&quot; height=&quot;44&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;400&quot; y=&quot;164.5&quot;&gt; modello &lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;230&quot; y=&quot;240&quot; width=&quot;140&quot; height=&quot;40&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;300&quot; y=&quot;265&quot; class=&quot;t-mid t-bold&quot;&gt;
esecuzione
&lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;140&quot; y=&quot;140&quot; width=&quot;120&quot; height=&quot;40&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;200&quot; y=&quot;165&quot; class=&quot;t-mid t-bold&quot;&gt;
risultato
&lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow&quot; d=&quot;M362,66 Q400,80 400,134&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M400,186 Q400,246 374,254&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow&quot; d=&quot;M228,254 Q200,246 200,184&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow&quot; d=&quot;M200,136 Q200,80 236,66&quot;&gt;&lt;/path&gt; &lt;text x=&quot;372&quot; y=&quot;46&quot; class=&quot;t-small t-muted&quot;&gt; &lt;tspan class=&quot;t-bold t-accent&quot;&gt;1&lt;/tspan&gt; &lt;tspan dx=&quot;4&quot;&gt;la richiesta, le istruzioni&lt;/tspan&gt; &lt;tspan x=&quot;382&quot; dy=&quot;15&quot;&gt;
del progetto, i tool
&lt;/tspan&gt; &lt;/text&gt; &lt;text x=&quot;460&quot; y=&quot;152&quot; class=&quot;t-small&quot;&gt; &lt;tspan class=&quot;t-bold t-accent&quot;&gt;2&lt;/tspan&gt; &lt;tspan dx=&quot;4&quot; class=&quot;t-accent&quot;&gt;
«lancia i test»
&lt;/tspan&gt; &lt;tspan x=&quot;470&quot; dy=&quot;15&quot; class=&quot;t-muted&quot;&gt;
non li lancia: lo chiede
&lt;/tspan&gt; &lt;/text&gt; &lt;text x=&quot;300&quot; y=&quot;304&quot; class=&quot;t-mid t-small t-muted&quot;&gt; &lt;tspan class=&quot;t-bold t-accent&quot;&gt;3&lt;/tspan&gt; &lt;tspan dx=&quot;4&quot;&gt;consentito? esegue nel terminale; un test fallisce sul formato di una data&lt;/tspan&gt; &lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;200&quot; class=&quot;t-small t-muted&quot;&gt; &lt;tspan class=&quot;t-bold t-accent&quot;&gt;4&lt;/tspan&gt; &lt;tspan dx=&quot;4&quot;&gt;torna al modello,&lt;/tspan&gt; &lt;tspan x=&quot;12&quot; dy=&quot;15&quot;&gt;
che chiede: leggi il file,
&lt;/tspan&gt; &lt;tspan x=&quot;12&quot; dy=&quot;15&quot;&gt;
cambia due righe, rilancia
&lt;/tspan&gt; &lt;/text&gt; &lt;path class=&quot;arrow&quot; d=&quot;M448,174 Q520,180 520,222&quot;&gt;&lt;/path&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;454&quot; y=&quot;226&quot; width=&quot;144&quot; height=&quot;52&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;466&quot; y=&quot;246&quot; class=&quot;t-small&quot;&gt; &lt;tspan class=&quot;t-bold t-accent&quot;&gt;5&lt;/tspan&gt; &lt;tspan dx=&quot;4&quot; class=&quot;t-bold&quot;&gt;
i test passano
&lt;/tspan&gt; &lt;/text&gt; &lt;text x=&quot;466&quot; y=&quot;264&quot; class=&quot;t-small t-muted&quot;&gt;
nessuna richiesta: a noi
&lt;/text&gt; &lt;/g&gt;  &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Un ciclo in quattro nodi, contesto, modello, esecuzione, risultato, con i cinque passi dell’esempio annotati intorno: l’harness prepara il contesto con la richiesta, le istruzioni del progetto e i tool; il modello chiede di lanciare i test, non li lancia; l’harness controlla ed esegue, e un test fallisce sul formato di una data; il risultato torna nel contesto e il modello chiede di leggere un file, cambiarne due righe e rilanciare; i test passano, il modello non chiede altro e l’harness restituisce il controllo.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Il ciclo agentico sul test che fallisce. Il modello compare in un passo solo, e in quel passo chiede.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Questo giro si chiama ciclo agentico (agent loop) ed è lo schema di base di ogni agente: contesto, richiesta del modello, esecuzione, risultato, e di nuovo contesto (&lt;a href=&quot;https://openai.com/index/unrolling-the-codex-agent-loop/&quot;&gt;Bolin, 2026&lt;/a&gt;). Scritto così sembra semplice, e il ciclo in sé lo è. La complessità sta altrove, cioè nelle decisioni che in una chat prendevamo noi senza pensarci. L’harness deve sapere quali comandi l’agente può lanciare da solo, per quali serve una conferma dell’utente e quali sono vietati; deve fargli conoscere il progetto, di solito con un file di istruzioni nella radice del repository (&lt;code&gt;AGENTS.md&lt;/code&gt; o &lt;code&gt;CLAUDE.md&lt;/code&gt;); deve tenere sotto controllo una conversazione che, tra comandi e output, riempie presto la finestra di contesto. E deve decidere quando fermarsi.&lt;/p&gt;
&lt;p&gt;Il modello sotto può essere lo stesso che usiamo in chat. Credo sia questo che strumenti come Claude Code, arrivato nel febbraio 2025, hanno reso evidente a molti sviluppatori: a parità di modello, ciò che il sistema poteva fare dipendeva da cosa l’harness gli permetteva di leggere, eseguire e modificare.&lt;/p&gt;
&lt;h2 id=&quot;che-cosè-allora-un-harness&quot;&gt;Che cos’è, allora, un harness&lt;/h2&gt;
&lt;p&gt;Con i due esempi davanti, la definizione viene quasi da sé: l’harness è tutto ciò che, in un sistema costruito su un modello linguistico, non è il modello. Per gli agenti circola la formula “agente = modello + harness” (&lt;a href=&quot;https://martinfowler.com/articles/harness-engineering.html&quot;&gt;Böckeler, 2026&lt;/a&gt;), a cui va aggiunto un terzo elemento, l’ambiente, cioè il posto in cui le azioni hanno effetto: la sandbox di una chat, il nostro repository, un browser. Vista così, la chat è solo il caso più semplice, quello in cui il ciclo si chiude quasi subito e il resto lo facciamo noi.&lt;/p&gt;
&lt;p&gt;Il nome, per inciso, viene dai finimenti, le cinghie che collegano il cavallo al carro, e il parallelo regge abbastanza bene. Il modello è il cavallo, e ci mette la forza; l’harness sono i finimenti, che quella forza la trasformano in trazione e le danno una direzione; il carro, con quello che trasporta, è l’ambiente in cui il lavoro arriva.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dg-wrap&quot;&gt; &lt;svg class=&quot;dg&quot; viewBox=&quot;0 0 560 236&quot; aria-hidden=&quot;true&quot; style=&quot;--min: 30rem; aspect-ratio: 560 / 236&quot;&gt; &lt;defs&gt; &lt;marker id=&quot;tp-ink&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;marker id=&quot;tp-teal&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head dg-head--teal&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;/defs&gt; &lt;g style=&quot;--ink: url(#tp-ink); --teal: url(#tp-teal)&quot;&gt;  &lt;g class=&quot;harness&quot;&gt; &lt;rect x=&quot;100&quot; y=&quot;20&quot; width=&quot;300&quot; height=&quot;204&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;112&quot; y=&quot;38&quot;&gt; harness &lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;model&quot;&gt; &lt;rect x=&quot;210&quot; y=&quot;88&quot; width=&quot;110&quot; height=&quot;48&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;265&quot; y=&quot;116.5&quot;&gt; modello &lt;/text&gt; &lt;/g&gt; &lt;g style=&quot;opacity: 1&quot;&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;112&quot; y=&quot;94&quot; width=&quot;74&quot; height=&quot;36&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;149&quot; y=&quot;117&quot; class=&quot;t-mid t-small t-bold&quot;&gt;
contesto
&lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow&quot; d=&quot;M188,112 H206&quot;&gt;&lt;/path&gt; &lt;/g&gt; &lt;g style=&quot;opacity: 1&quot;&gt; &lt;text x=&quot;112&quot; y=&quot;156&quot; class=&quot;t-small t-bold&quot;&gt;
tool
&lt;/text&gt; &lt;rect x=&quot;112&quot; y=&quot;162&quot; width=&quot;16&quot; height=&quot;11&quot; class=&quot;card-rect&quot;&gt;&lt;/rect&gt; &lt;rect x=&quot;132&quot; y=&quot;162&quot; width=&quot;16&quot; height=&quot;11&quot; class=&quot;card-rect&quot;&gt;&lt;/rect&gt; &lt;rect x=&quot;152&quot; y=&quot;162&quot; width=&quot;16&quot; height=&quot;11&quot; class=&quot;card-rect&quot;&gt;&lt;/rect&gt; &lt;/g&gt; &lt;g style=&quot;opacity: 1&quot;&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M322,100 H426&quot;&gt;&lt;/path&gt; &lt;text x=&quot;326&quot; y=&quot;118&quot; class=&quot;t-small t-accent&quot;&gt;
esecuzione
&lt;/text&gt; &lt;path class=&quot;arrow&quot; d=&quot;M426,128 H324&quot;&gt;&lt;/path&gt; &lt;text x=&quot;326&quot; y=&quot;146&quot; class=&quot;t-small t-muted&quot;&gt;
risultato
&lt;/text&gt; &lt;/g&gt; &lt;g style=&quot;opacity: 1&quot;&gt; &lt;g class=&quot;gate&quot;&gt; &lt;rect x=&quot;369&quot; y=&quot;91&quot; width=&quot;18&quot; height=&quot;18&quot;&gt;&lt;/rect&gt; &lt;line x1=&quot;374&quot; y1=&quot;104&quot; x2=&quot;382&quot; y2=&quot;96&quot;&gt;&lt;/line&gt; &lt;text x=&quot;378&quot; y=&quot;86&quot; class=&quot;t-mid t-small t-accent&quot;&gt; limiti &lt;/text&gt; &lt;/g&gt; &lt;/g&gt; &lt;g style=&quot;opacity: 1&quot;&gt; &lt;path class=&quot;arrow&quot; d=&quot;M265,138 V176&quot;&gt;&lt;/path&gt; &lt;rect x=&quot;258&quot; y=&quot;180&quot; width=&quot;14&quot; height=&quot;14&quot; class=&quot;stop&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;280&quot; y=&quot;192&quot; class=&quot;t-small t-bold&quot;&gt;
arresto
&lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;env&quot;&gt; &lt;rect x=&quot;430&quot; y=&quot;20&quot; width=&quot;118&quot; height=&quot;204&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;442&quot; y=&quot;38&quot;&gt; ambiente &lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;442&quot; y=&quot;60&quot; class=&quot;t-small t-muted&quot;&gt; dove le azioni &lt;/text&gt;&lt;text x=&quot;442&quot; y=&quot;76&quot; class=&quot;t-small t-muted&quot;&gt; hanno effetto: &lt;/text&gt;&lt;text x=&quot;442&quot; y=&quot;92&quot; class=&quot;t-small t-muted&quot;&gt;  &lt;/text&gt;&lt;text x=&quot;442&quot; y=&quot;108&quot; class=&quot;t-small t-muted&quot;&gt; la sandbox di una chat &lt;/text&gt;&lt;text x=&quot;442&quot; y=&quot;124&quot; class=&quot;t-small t-muted&quot;&gt; il nostro repository &lt;/text&gt;&lt;text x=&quot;442&quot; y=&quot;140&quot; class=&quot;t-small t-muted&quot;&gt; un browser &lt;/text&gt; &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt;   &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Il modello, un blocco nero, sta dentro la cornice dell’harness; a destra, fuori dalla cornice, l’ambiente, dove le azioni hanno effetto: la sandbox di una chat, il nostro repository, un browser. Dentro la cornice: il contesto che entra nel modello, i tool, la freccia dell’esecuzione che va dal modello all’ambiente passando per un cancello, i limiti; il risultato che torna indietro; e in basso l’arresto.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Le tre parti di qualunque prodotto costruito su un modello, e le cinque cose che l’harness fa, disegnate dove avvengono.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Per quanto complesso sia, un harness si occupa, tendenzialmente, sempre delle stesse cinque cose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contesto: che cosa il modello legge a ogni passo.&lt;/li&gt;
&lt;li&gt;Tool: quali strumenti può chiedere e come sono descritti.&lt;/li&gt;
&lt;li&gt;Esecuzione: come le sue richieste diventano azioni nell’ambiente, e come il risultato torna indietro.&lt;/li&gt;
&lt;li&gt;Limiti: che cosa si può fare senza chiedere, che cosa richiede una conferma, che cosa è vietato.&lt;/li&gt;
&lt;li&gt;Arresto: quando il lavoro è finito, o quando va interrotto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tra una chat e un agente di coding l’elenco resta lo stesso; a cambiare è quanto è sviluppata ciascuna voce.&lt;/p&gt;
&lt;h2 id=&quot;lo-stesso-schema-altri-contesti&quot;&gt;Lo stesso schema, altri contesti&lt;/h2&gt;
&lt;p&gt;Gli agenti di coding sono l’esempio più citato perché lì il meccanismo si vede bene: i file cambiano, i test passano o falliscono. Lo stesso schema, però, si ritrova ovunque un modello debba fare qualcosa oltre a rispondere, e da un contesto all’altro a cambiare sono soprattutto i tool e i limiti.&lt;/p&gt;
&lt;p&gt;Le funzioni di ricerca approfondita delle app di chat, per esempio, sono un harness costruito intorno alla ricerca web. Nel sistema descritto da Anthropic un agente principale pianifica la ricerca e la divide tra più sub-agenti che cercano in parallelo, ciascuno con la propria finestra di contesto; alla fine un altro agente collega ogni affermazione del rapporto alla fonte da cui viene (&lt;a href=&quot;https://www.anthropic.com/engineering/multi-agent-research-system&quot;&gt;Hadfield et al., 2025&lt;/a&gt;). Gran parte del lavoro sull’harness, raccontano gli autori, è stata trovare la misura, visto che le prime versioni avviavano decine di sub-agenti anche per domande semplici. Qui il prodotto finale è un testo, e il controllo che conta è che ogni affermazione abbia una fonte.&lt;/p&gt;
&lt;p&gt;Gli agenti che usano il computer o il browser hanno invece i tool di una persona seduta davanti a uno schermo: fare uno screenshot, cliccare, scrivere, scorrere la pagina. L’harness cattura lo schermo, lo passa al modello come immagine ed esegue il clic richiesto. Il contesto si riempie di immagini al posto delle righe di codice, e i limiti diventano concreti: su quali siti l’agente può muoversi, e quali azioni (un pagamento, l’invio di un modulo) devono passare dalla conferma di una persona.&lt;/p&gt;
&lt;p&gt;Ci sono poi gli assistenti personali, come OpenClaw, che collegano un modello alle app di messaggistica (WhatsApp, Slack, Discord, Signal e altre) e restano attivi nel tempo. Qui l’harness si occupa soprattutto di cose che a un agente di coding servono poco: una memoria a lungo termine, le preferenze dell’utente e addirittura messaggi programmati che attivano il modello a una certa ora, senza che nessuno glielo chieda (&lt;a href=&quot;https://agents-last-exam.org/blogs/harness-matters&quot;&gt;Huang e Sun, 2026&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Infine un caso inventato, ma tipico: un assistente per il servizio clienti di un negozio online, con tool come “cerca l’ordine”, “verifica la spedizione”, “emetti un rimborso”. Il modello potrebbe essere lo stesso di una chat qualunque; a renderlo utilizzabile in un’azienda è l’harness, che stabilisce quali dati del cliente il modello può vedere, fino a che cifra può rimborsare da solo prima di passare la richiesta a un operatore e che traccia resta di ogni azione.&lt;/p&gt;
&lt;p&gt;In tutti questi casi il ciclo è lo stesso del test che fallisce. A distinguere un prodotto dall’altro sono le informazioni a cui il modello accede, gli strumenti che può chiedere e le azioni che gli sono permesse.&lt;/p&gt;
&lt;h2 id=&quot;harness-engineering&quot;&gt;Harness engineering&lt;/h2&gt;
&lt;p&gt;Progettare queste scelte è diventato un lavoro con un nome, harness engineering, in circolazione dal febbraio 2026 (&lt;a href=&quot;https://openai.com/index/harness-engineering/&quot;&gt;Lopopolo, 2026&lt;/a&gt;). In pratica significa decidere quali tool offrire e come descriverli, cosa mettere nel contesto e cosa lasciare fuori, quali azioni consentire senza conferma e che controlli far girare dopo ciascuna.&lt;/p&gt;
&lt;p&gt;E non riguarda solo chi costruisce i prodotti. Anche chi lavora con un agente di coding fa harness engineering, ogni volta che scrive il file di istruzioni del progetto o aggiunge un test che l’agente può lanciare per verificare il proprio lavoro. Böckeler distingue tra ciò che orienta l’agente prima che agisca, come le istruzioni, e ciò che lo corregge dopo, come test e linter, e osserva che servono entrambi: con le sole istruzioni l’agente non sa se le ha seguite, con i soli controlli ripete gli stessi errori.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;gs&quot; data-astro-cid-zmag77or&gt; &lt;div class=&quot;gs__flow&quot; data-astro-cid-zmag77or&gt; &lt;div class=&quot;node node--guide&quot; data-astro-cid-zmag77or&gt; &lt;p class=&quot;node__name&quot; data-astro-cid-zmag77or&gt;
Guide &lt;span data-astro-cid-zmag77or&gt;prima di agire&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;node__ex&quot; data-astro-cid-zmag77or&gt;
prompt di sistema, convenzioni nel repository, definizioni degli strumenti
&lt;/p&gt; &lt;/div&gt; &lt;span class=&quot;arrow&quot; aria-hidden=&quot;true&quot; data-astro-cid-zmag77or&gt;&lt;/span&gt; &lt;div class=&quot;node node--agent&quot; data-astro-cid-zmag77or&gt; &lt;p class=&quot;node__name&quot; data-astro-cid-zmag77or&gt;Agente&lt;/p&gt; &lt;/div&gt; &lt;span class=&quot;arrow&quot; aria-hidden=&quot;true&quot; data-astro-cid-zmag77or&gt;&lt;/span&gt; &lt;div class=&quot;node node--sensor&quot; data-astro-cid-zmag77or&gt; &lt;p class=&quot;node__name&quot; data-astro-cid-zmag77or&gt;
Sensori &lt;span data-astro-cid-zmag77or&gt;dopo, per correggersi&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;node__ex&quot; data-astro-cid-zmag77or&gt; &lt;b data-astro-cid-zmag77or&gt;computazionali&lt;/b&gt;: linter, test, CI
&lt;br data-astro-cid-zmag77or&gt; &lt;b data-astro-cid-zmag77or&gt;inferenziali&lt;/b&gt;: un secondo modello che rilegge
&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class=&quot;gs__under&quot; data-astro-cid-zmag77or&gt; &lt;p class=&quot;gs__back&quot; data-astro-cid-zmag77or&gt; &lt;span data-astro-cid-zmag77or&gt;il risultato torna all’agente&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;dl class=&quot;gs__without&quot; data-astro-cid-zmag77or&gt; &lt;div data-astro-cid-zmag77or&gt; &lt;dt data-astro-cid-zmag77or&gt;Senza sensori&lt;/dt&gt; &lt;dd data-astro-cid-zmag77or&gt;ripete gli stessi errori&lt;/dd&gt; &lt;/div&gt; &lt;div data-astro-cid-zmag77or&gt; &lt;dt data-astro-cid-zmag77or&gt;Senza guide&lt;/dt&gt; &lt;dd data-astro-cid-zmag77or&gt;codifica regole senza sapere se funzionano&lt;/dd&gt; &lt;/div&gt; &lt;/dl&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Un flusso da sinistra a destra: le guide (prompt di sistema, convenzioni nel repository, definizioni degli strumenti) orientano l’agente prima che agisca; i sensori osservano il risultato, computazionali come linter, test e CI, o inferenziali come un secondo modello che rilegge, e lo rimandano all’agente. Sotto: senza sensori l’agente ripete gli stessi errori; senza guide codifica regole senza sapere se funzionano.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;La distinzione di Böckeler. Le guide agiscono prima, i sensori dopo, e il risultato torna all’agente.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Lopopolo, raccontando un progetto di OpenAI in cui tutto il codice era scritto da Codex, nota che un unico file di istruzioni lungo funzionava peggio di un indice di un centinaio di righe che rimandava alla documentazione nel repository. Il motivo vale anche fuori dal coding: per un agente, quello che non può leggere non esiste.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;ctx&quot; data-astro-cid-xzqs4zz5&gt; &lt;div class=&quot;side&quot; data-astro-cid-xzqs4zz5&gt; &lt;p class=&quot;side__head&quot; data-astro-cid-xzqs4zz5&gt;
Prima &lt;span data-astro-cid-xzqs4zz5&gt;un file solo&lt;/span&gt; &lt;/p&gt; &lt;div class=&quot;file file--big&quot; aria-hidden=&quot;true&quot; data-astro-cid-xzqs4zz5&gt; &lt;span class=&quot;file__name&quot; data-astro-cid-xzqs4zz5&gt;AGENTS.md&lt;/span&gt; &lt;span class=&quot;line&quot; style=&quot;--w: 55%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 92%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 84%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 76%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 68%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 60%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 97%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 89%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 81%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 73%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 65%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 57%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 94%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 86%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 78%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 70%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 62%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 99%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 91%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 83%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 75%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt;&lt;span class=&quot;line&quot; style=&quot;--w: 67%&quot; data-astro-cid-xzqs4zz5&gt;&lt;/span&gt; &lt;/div&gt; &lt;ul class=&quot;faults&quot; data-astro-cid-xzqs4zz5&gt; &lt;li data-astro-cid-xzqs4zz5&gt;occupa contesto&lt;/li&gt; &lt;li data-astro-cid-xzqs4zz5&gt;tutto sullo stesso piano&lt;/li&gt; &lt;li data-astro-cid-xzqs4zz5&gt;invecchia subito&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;div class=&quot;side&quot; data-astro-cid-xzqs4zz5&gt; &lt;p class=&quot;side__head&quot; data-astro-cid-xzqs4zz5&gt;
Dopo &lt;span data-astro-cid-xzqs4zz5&gt;un indice e una directory&lt;/span&gt; &lt;/p&gt; &lt;div class=&quot;file file--index&quot; data-astro-cid-xzqs4zz5&gt; &lt;span class=&quot;file__name&quot; data-astro-cid-xzqs4zz5&gt;AGENTS.md&lt;/span&gt; &lt;span class=&quot;file__note&quot; data-astro-cid-xzqs4zz5&gt;circa cento righe che puntano altrove&lt;/span&gt; &lt;/div&gt; &lt;ul class=&quot;tree&quot; data-astro-cid-xzqs4zz5&gt; &lt;li class=&quot;tree__root&quot; data-astro-cid-xzqs4zz5&gt;docs/&lt;/li&gt; &lt;li data-astro-cid-xzqs4zz5&gt;architettura/&lt;/li&gt;&lt;li data-astro-cid-xzqs4zz5&gt;decisioni/&lt;/li&gt;&lt;li data-astro-cid-xzqs4zz5&gt;piani/&lt;/li&gt;&lt;li data-astro-cid-xzqs4zz5&gt;specifiche/&lt;/li&gt;&lt;li data-astro-cid-xzqs4zz5&gt;riferimenti/&lt;/li&gt; &lt;/ul&gt; &lt;p class=&quot;slack&quot; data-astro-cid-xzqs4zz5&gt; &lt;s data-astro-cid-xzqs4zz5&gt;decisione presa su Slack&lt;/s&gt; per l’agente non esiste
&lt;/p&gt; &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Prima: un unico file AGENTS.md lungo, che occupa contesto, mette tutto sullo stesso piano e invecchia subito. Dopo: un AGENTS.md di circa cento righe che fa da indice e punta a una directory docs con sottocartelle come architettura, decisioni, piani, specifiche, riferimenti. Una decisione presa su Slack, barrata, per l’agente non esiste.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Il file di istruzioni di quel progetto, prima e dopo. I nomi delle cartelle sono indicativi; conta la forma: un indice corto, e la conoscenza dove l’agente può leggerla.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;h2 id=&quot;si-valuta-il-sistema-non-solo-il-modello&quot;&gt;Si valuta il sistema, non solo il modello&lt;/h2&gt;
&lt;p&gt;Come abbiamo visto, l’harness incide molto sulle capacità di un sistema di AI generativa (si noti bene, un sistema di AI, non un modello).&lt;/p&gt;
&lt;p&gt;Questo però non vuol dire che il modello non conti. I modelli più recenti sono addestrati a lavorare dentro questo ciclo, e nello stesso harness un modello più debole ottiene risultati peggiori. Su Agents’ Last Exam, un benchmark di compiti professionali lunghi, cambiare modello a parità di harness sposta la percentuale di compiti risolti di 18 punti; cambiare harness a parità di modello, di 5 o 6 (&lt;a href=&quot;https://agents-last-exam.org/blogs/harness-matters&quot;&gt;Huang e Sun, 2026&lt;/a&gt;). Il confronto però, va detto, riguarda solo modelli “forti”.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;dl class=&quot;mh&quot; data-astro-cid-aks6kvnk&gt; &lt;div class=&quot;row&quot; data-astro-cid-aks6kvnk&gt; &lt;dt data-astro-cid-aks6kvnk&gt; Cambiare modello &lt;span data-astro-cid-aks6kvnk&gt;a parità di harness&lt;/span&gt; &lt;/dt&gt; &lt;dd data-astro-cid-aks6kvnk&gt; &lt;span class=&quot;bar&quot; style=&quot;--v: 100&quot; data-astro-cid-aks6kvnk&gt;&lt;/span&gt; &lt;span class=&quot;value&quot; data-astro-cid-aks6kvnk&gt;18 punti&lt;/span&gt; &lt;/dd&gt; &lt;/div&gt;&lt;div class=&quot;row&quot; data-astro-cid-aks6kvnk&gt; &lt;dt data-astro-cid-aks6kvnk&gt; Cambiare harness &lt;span data-astro-cid-aks6kvnk&gt;a parità di modello&lt;/span&gt; &lt;/dt&gt; &lt;dd data-astro-cid-aks6kvnk&gt; &lt;span class=&quot;bar accent&quot; style=&quot;--v: 30.555555555555557&quot; data-astro-cid-aks6kvnk&gt;&lt;/span&gt; &lt;span class=&quot;value accent&quot; data-astro-cid-aks6kvnk&gt;5 o 6 punti&lt;/span&gt; &lt;/dd&gt; &lt;/div&gt; &lt;/dl&gt; &lt;p class=&quot;note&quot; data-astro-cid-aks6kvnk&gt;Compiti professionali lunghi; il confronto riguarda solo modelli forti.&lt;/p&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Due barre in punti percentuali. Cambiare modello a parità di harness: 18 punti. Cambiare harness a parità di modello: 5 o 6 punti. Compiti professionali lunghi; il confronto riguarda solo modelli forti.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Cosa sposta la quota di compiti risolti su Agents’ Last Exam (Huang e Sun, 2026). Contano entrambi; il modello di più.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;I componenti dell’harness, poi, invecchiano. Anthropic aveva aggiunto a un proprio harness un meccanismo per azzerare periodicamente il contesto, perché Claude Sonnet 4.5 tendeva a chiudere il lavoro in anticipo quando la finestra si riempiva; lo ha tolto quando, con Opus 4.5, quel comportamento è quasi sparito (&lt;a href=&quot;https://www.anthropic.com/engineering/harness-design-long-running-apps&quot;&gt;Rajasekaran, 2026&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Contano quindi entrambi, e quello che osserviamo appartiene sempre all’insieme. Quando leggiamo che un modello “è migliore” su un benchmark di agenti, stiamo leggendo il risultato di quel modello dentro un certo harness, su un certo tipo di compito.&lt;/p&gt;
&lt;p&gt;Per la sicurezza vale lo stesso, ed è lì che la distinzione pesa di più. Un modello può essere valutato con cura, ma sapere che in una chat si comporta bene dice poco su cosa succede quando lo si mette in un harness che gli dà accesso a un terminale, a una casella di posta o a un sistema di rimborsi. In una chat, nel caso peggiore, il modello scrive un testo sbagliato; dentro un agente può cancellare un file, mandare una mail, spendere soldi. E quanto può fare non lo decide il modello, bensì i permessi, la sandbox e le conferme richieste: l’harness, appunto.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dg-wrap&quot;&gt; &lt;svg class=&quot;dg&quot; viewBox=&quot;0 0 560 272&quot; aria-hidden=&quot;true&quot; style=&quot;--min: 30rem; aspect-ratio: 560 / 272&quot;&gt; &lt;defs&gt; &lt;marker id=&quot;br-ink&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;marker id=&quot;br-teal&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;8&quot; refY=&quot;5&quot; markerWidth=&quot;6&quot; markerHeight=&quot;6&quot; orient=&quot;auto-start-reverse&quot;&gt; &lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; class=&quot;dg-head dg-head--teal&quot;&gt;&lt;/path&gt; &lt;/marker&gt; &lt;/defs&gt; &lt;g style=&quot;--ink: url(#br-ink); --teal: url(#br-teal)&quot;&gt;  &lt;text x=&quot;12&quot; y=&quot;58&quot; class=&quot;t-small t-muted&quot;&gt;
testo che il modello legge
&lt;/text&gt; &lt;g class=&quot;card&quot;&gt; &lt;rect x=&quot;12&quot; y=&quot;66&quot; width=&quot;120&quot; height=&quot;92&quot;&gt;&lt;/rect&gt; &lt;line class=&quot;row&quot; x1=&quot;24&quot; y1=&quot;84&quot; x2=&quot;112&quot; y2=&quot;84&quot;&gt;&lt;/line&gt; &lt;line class=&quot;row&quot; x1=&quot;24&quot; y1=&quot;96&quot; x2=&quot;96&quot; y2=&quot;96&quot;&gt;&lt;/line&gt; &lt;line class=&quot;row row--accent&quot; x1=&quot;24&quot; y1=&quot;108&quot; x2=&quot;118&quot; y2=&quot;108&quot;&gt;&lt;/line&gt; &lt;line class=&quot;row&quot; x1=&quot;24&quot; y1=&quot;120&quot; x2=&quot;104&quot; y2=&quot;120&quot;&gt;&lt;/line&gt; &lt;line class=&quot;row&quot; x1=&quot;24&quot; y1=&quot;132&quot; x2=&quot;80&quot; y2=&quot;132&quot;&gt;&lt;/line&gt; &lt;/g&gt; &lt;text x=&quot;12&quot; y=&quot;176&quot; class=&quot;t-small t-muted&quot;&gt;
pagina, email, documento,
&lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;191&quot; class=&quot;t-small t-muted&quot;&gt;
output di un programma;
&lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;206&quot; class=&quot;t-small t-accent&quot;&gt;
dentro, un’istruzione per lui
&lt;/text&gt; &lt;path class=&quot;arrow&quot; d=&quot;M134,112 H168&quot;&gt;&lt;/path&gt; &lt;g class=&quot;harness&quot;&gt; &lt;rect x=&quot;170&quot; y=&quot;24&quot; width=&quot;250&quot; height=&quot;224&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;182&quot; y=&quot;42&quot;&gt; harness &lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;model&quot;&gt; &lt;rect x=&quot;190&quot; y=&quot;96&quot; width=&quot;96&quot; height=&quot;44&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;238&quot; y=&quot;122.5&quot;&gt; modello &lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M286,110 C306,110 306,56 352,56&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M286,118 H352&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M286,126 C306,126 306,180 352,180&quot;&gt;&lt;/path&gt; &lt;g class=&quot;gate&quot;&gt; &lt;rect x=&quot;356&quot; y=&quot;47&quot; width=&quot;18&quot; height=&quot;18&quot;&gt;&lt;/rect&gt; &lt;line x1=&quot;361&quot; y1=&quot;60&quot; x2=&quot;369&quot; y2=&quot;52&quot;&gt;&lt;/line&gt; &lt;text x=&quot;365&quot; y=&quot;42&quot; class=&quot;t-mid t-small t-accent&quot;&gt; permessi &lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;gate&quot;&gt; &lt;rect x=&quot;356&quot; y=&quot;109&quot; width=&quot;18&quot; height=&quot;18&quot;&gt;&lt;/rect&gt; &lt;line x1=&quot;361&quot; y1=&quot;122&quot; x2=&quot;369&quot; y2=&quot;114&quot;&gt;&lt;/line&gt; &lt;text x=&quot;365&quot; y=&quot;104&quot; class=&quot;t-mid t-small t-accent&quot;&gt; sandbox &lt;/text&gt; &lt;/g&gt; &lt;g class=&quot;gate&quot;&gt; &lt;rect x=&quot;356&quot; y=&quot;171&quot; width=&quot;18&quot; height=&quot;18&quot;&gt;&lt;/rect&gt; &lt;line x1=&quot;361&quot; y1=&quot;184&quot; x2=&quot;369&quot; y2=&quot;176&quot;&gt;&lt;/line&gt; &lt;text x=&quot;365&quot; y=&quot;166&quot; class=&quot;t-mid t-small t-accent&quot;&gt; conferme &lt;/text&gt; &lt;/g&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M376,56 H436&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M376,118 H436&quot;&gt;&lt;/path&gt; &lt;path class=&quot;arrow arrow--teal&quot; d=&quot;M376,180 H436&quot;&gt;&lt;/path&gt; &lt;text x=&quot;182&quot; y=&quot;236&quot; class=&quot;t-small t-accent&quot;&gt;
quanto passa lo decide l’harness
&lt;/text&gt; &lt;g class=&quot;env&quot;&gt; &lt;rect x=&quot;430&quot; y=&quot;24&quot; width=&quot;118&quot; height=&quot;224&quot;&gt;&lt;/rect&gt; &lt;text x=&quot;442&quot; y=&quot;42&quot;&gt; ambiente &lt;/text&gt; &lt;/g&gt; &lt;text x=&quot;442&quot; y=&quot;60&quot; class=&quot;t-small&quot;&gt;
cancellare un file
&lt;/text&gt; &lt;text x=&quot;442&quot; y=&quot;122&quot; class=&quot;t-small&quot;&gt;
inviare una mail
&lt;/text&gt; &lt;text x=&quot;442&quot; y=&quot;184&quot; class=&quot;t-small&quot;&gt;
spendere denaro
&lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;238&quot; class=&quot;t-small t-muted&quot;&gt;
In una chat non c’è niente
&lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;253&quot; class=&quot;t-small t-muted&quot;&gt;
oltre il testo di risposta:
&lt;/text&gt; &lt;text x=&quot;12&quot; y=&quot;268&quot; class=&quot;t-small t-muted&quot;&gt;
al peggio, sbagliato.
&lt;/text&gt;  &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;A sinistra il testo che il modello legge, con dentro una riga evidenziata: un’istruzione per lui. Il testo entra nel modello, che sta nella cornice dell’harness. Dal modello partono tre frecce, ciascuna con un cancello: i permessi davanti a cancellare un file, la sandbox davanti a inviare una mail, le conferme davanti a spendere denaro; quanto passa lo decide l’harness. In una chat non c’è niente oltre il testo di risposta: al peggio, sbagliato.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;La stessa istruzione nascosta, letta da un modello in una chat e da un modello dentro un agente. La differenza non sta nel modello.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Il caso tipico è la prompt injection: istruzioni rivolte al modello e nascoste in un testo che il modello leggerà. Un agente legge di continuo testo che non abbiamo scritto noi (pagine web, email, documenti, output di altri programmi), e se il modello segue quelle istruzioni il danno dipende da ciò che l’harness gli permette di fare. Anthropic racconta che nella prima versione della sua infrastruttura per agenti il codice scritto dal modello girava nello stesso ambiente delle credenziali: a un’istruzione malevola sarebbe bastato convincere il modello a leggerle. Invece di affidarsi al buon comportamento del modello, le credenziali sono state spostate dove il codice dell’agente non può arrivare (&lt;a href=&quot;https://www.anthropic.com/engineering/managed-agents&quot;&gt;Martin et al., 2026&lt;/a&gt;). Anche aggiungere un tool cambia il quadro: in Codex, per esempio, la sandbox protegge il terminale, mentre i tool aggiunti tramite MCP i propri limiti devono imporseli da soli (&lt;a href=&quot;https://openai.com/index/unrolling-the-codex-agent-loop/&quot;&gt;Bolin, 2026&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Chi deve decidere se usare un agente, in azienda o anche solo sul proprio computer, ha quindi una domanda in più da farsi, oltre a “quale modello usa?”: cosa può fare, con quali dati, e chi deve confermare cosa.&lt;/p&gt;
&lt;h2 id=&quot;che-cosa-resta&quot;&gt;Che cosa resta&lt;/h2&gt;
&lt;p&gt;Ogni prodotto costruito su un modello linguistico ha tre parti. Il modello legge e scrive testo, comprese le richieste di usare un tool; l’harness decide cosa il modello vede, esegue le sue richieste, mette i limiti e stabilisce quando fermarsi; l’ambiente è dove le azioni hanno effetto. Una chat ha un harness semplice che agisce in una sandbox, un agente di coding ne ha uno più complesso che agisce nel nostro repository, e un agente di ricerca, un agente che usa il browser o un assistente aziendale ne hanno altri ancora, con tool e limiti diversi.&lt;/p&gt;
&lt;p&gt;La prossima volta che sentiamo dire “GPT ha fatto”, la traduzione più fedele è questa: un modello ha proposto, un harness ha eseguito, in un ambiente che qualcuno ha preparato. Ne vengono tre abitudini pratiche: quando qualcosa va storto, guardare all’harness oltre che al prompt; quando si confrontano due modelli, chiedersi se si stanno confrontando anche due sistemi; quando si valuta se un agente è sicuro, chiedersi a cosa ha accesso, prima ancora di quale modello usa.&lt;/p&gt;
&lt;p&gt;Chi vuole vedere un harness dall’interno può partire dal post di OpenAI sul ciclo di Codex; chi vuole migliorare quello intorno all’agente che usa già trova nell’articolo di Böckeler un buon punto di partenza.&lt;/p&gt;
&lt;h2 id=&quot;fonti&quot;&gt;Fonti&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Anthropic, &lt;a href=&quot;https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview&quot;&gt;Tool use with Claude&lt;/a&gt;, documentazione (pagina senza data).&lt;/li&gt;
&lt;li&gt;Birgitta Böckeler, &lt;a href=&quot;https://martinfowler.com/articles/harness-engineering.html&quot;&gt;Harness engineering for coding agent users&lt;/a&gt;, martinfowler.com, 2 aprile 2026.&lt;/li&gt;
&lt;li&gt;Michael Bolin, &lt;a href=&quot;https://openai.com/index/unrolling-the-codex-agent-loop/&quot;&gt;Unrolling the Codex agent loop&lt;/a&gt;, OpenAI, 23 gennaio 2026.&lt;/li&gt;
&lt;li&gt;Jeremy Hadfield et al., &lt;a href=&quot;https://www.anthropic.com/engineering/multi-agent-research-system&quot;&gt;How we built our multi-agent research system&lt;/a&gt;, Anthropic, giugno 2025.&lt;/li&gt;
&lt;li&gt;Yixiao Huang, Yiyou Sun, &lt;a href=&quot;https://agents-last-exam.org/blogs/harness-matters&quot;&gt;Does the Harness Matter? Lessons from ALE-Claw on Agents’ Last Exam&lt;/a&gt;, 11 giugno 2026.&lt;/li&gt;
&lt;li&gt;Ryan Lopopolo, &lt;a href=&quot;https://openai.com/index/harness-engineering/&quot;&gt;Harness engineering: leveraging Codex in an agent-first world&lt;/a&gt;, OpenAI, 11 febbraio 2026.&lt;/li&gt;
&lt;li&gt;Lance Martin, Gabe Cemaj, Michael Cohen, &lt;a href=&quot;https://www.anthropic.com/engineering/managed-agents&quot;&gt;Scaling Managed Agents: Decoupling the brain from the hands&lt;/a&gt;, Anthropic, 8 aprile 2026.&lt;/li&gt;
&lt;li&gt;Prithvi Rajasekaran, &lt;a href=&quot;https://www.anthropic.com/engineering/harness-design-long-running-apps&quot;&gt;Harness design for long-running application development&lt;/a&gt;, Anthropic, 24 marzo 2026.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><dc:creator>Irene Burresi</dc:creator><media:thumbnail url="https://ireneburresi.dev/og/it/blog-harness.png" width="1200" height="630"/><atom:link href="https://ireneburresi.dev/blog/harness.md" rel="alternate" type="text/markdown"/><category>agents</category></item><item><title>La chat come riga di comando, e cosa viene dopo</title><link>https://ireneburresi.dev/blog/riga-di-comando-per-non-tecnici/</link><guid isPermaLink="true">https://ireneburresi.dev/blog/riga-di-comando-per-non-tecnici/</guid><description>La chat è una shell con un interprete tollerante. Quello che le interfacce grafiche hanno fatto alla riga di comando dice dove mettere un modello linguistico in un prodotto.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Qualche tempo fa una persona che non programma, e che usa i modelli linguistici tutti i giorni per lavoro, mi ha detto che la chat le sembrava una riga di comando per non tecnici. Lo diceva senza intenzione polemica, come si descrive un attrezzo: una finestra con un cursore che lampeggia, si scrive una cosa, si preme invio, si legge cosa torna, si scrive un’altra cosa. Ci ho pensato a lungo, e credo che la frase sia esatta in un senso più preciso di quello che intendeva, e che presa sul serio dica anche cosa succederà a questa interfaccia, perché alla riga di comando è già successo.&lt;/p&gt;
&lt;p&gt;Questo pezzo prende quella frase come tesi e la segue fino in fondo: prima mostrando in cosa la chat è una riga di comando e in cosa non lo è, poi ricostruendo cosa hanno fatto le interfacce grafiche alla shell, e infine usando quella storia per ordinare le forme in cui un modello linguistico si presenta a chi lo usa senza passare da una conversazione. Non parla di voce, di immagini, di agenti a lungo orizzonte, né di come si valuta un modello. Parla di prodotti che chiamano un modello di testo e devono decidere dove metterlo.&lt;/p&gt;
&lt;h2 id=&quot;in-cosa-la-frase-è-esatta&quot;&gt;In cosa la frase è esatta&lt;/h2&gt;
&lt;p&gt;Una riga di comando ha quattro proprietà che chiunque l’abbia usata riconosce. Si procede a turni: l’utente scrive un comando, la macchina risponde, l’utente ne scrive un altro. L’input è testo e l’output è testo. L’interfaccia non suggerisce niente: uno schermo nero con un prompt, e per sapere cosa si può fare bisogna saperlo già. Lo stato del sistema è invisibile, e per Unix questa era quasi una filosofia: nessuna notizia è una buona notizia, se il comando è andato bene non c’è risposta.&lt;/p&gt;
&lt;p&gt;La chat ha le stesse quattro proprietà, con una sola differenza, che è quella che conta. La shell pretende una sintassi esatta e un comando che esiste; il modello accetta qualsiasi stringa e risponde a tutte. È questa tolleranza che ha permesso a chi non programma di sedersi davanti a una riga di comando senza accorgersene, ed è questa tolleranza che ha fatto sembrare la chat un cambio di paradigma.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;shell-chat&quot; data-astro-cid-zwcxtrnw&gt; &lt;div class=&quot;windows&quot; data-astro-cid-zwcxtrnw&gt; &lt;div class=&quot;window&quot; data-astro-cid-zwcxtrnw&gt; &lt;p class=&quot;window__name&quot; data-astro-cid-zwcxtrnw&gt;Shell&lt;/p&gt; &lt;div class=&quot;window__screen&quot; data-astro-cid-zwcxtrnw&gt; &lt;span class=&quot;line in&quot; data-astro-cid-zwcxtrnw&gt;$ conta le righe con errore&lt;/span&gt;&lt;span class=&quot;line out&quot; data-astro-cid-zwcxtrnw&gt;zsh: command not found: conta&lt;/span&gt;&lt;span class=&quot;line in&quot; data-astro-cid-zwcxtrnw&gt;$ grep -c errore log.txt&lt;/span&gt;&lt;span class=&quot;line out&quot; data-astro-cid-zwcxtrnw&gt;14&lt;/span&gt; &lt;/div&gt; &lt;/div&gt;&lt;div class=&quot;window&quot; data-astro-cid-zwcxtrnw&gt; &lt;p class=&quot;window__name&quot; data-astro-cid-zwcxtrnw&gt;Chat&lt;/p&gt; &lt;div class=&quot;window__screen&quot; data-astro-cid-zwcxtrnw&gt; &lt;span class=&quot;line in&quot; data-astro-cid-zwcxtrnw&gt;&amp;gt; conta le righe con errore&lt;/span&gt;&lt;span class=&quot;line out accent&quot; data-astro-cid-zwcxtrnw&gt;Sono 14. Quasi tutte vengono dallo stesso modulo di pagamento.&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;table class=&quot;traits&quot; data-astro-cid-zwcxtrnw&gt; &lt;thead data-astro-cid-zwcxtrnw&gt; &lt;tr data-astro-cid-zwcxtrnw&gt; &lt;th scope=&quot;col&quot; data-astro-cid-zwcxtrnw&gt;&lt;/th&gt; &lt;th scope=&quot;col&quot; data-astro-cid-zwcxtrnw&gt;Shell&lt;/th&gt; &lt;th scope=&quot;col&quot; data-astro-cid-zwcxtrnw&gt;Chat&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody data-astro-cid-zwcxtrnw&gt; &lt;tr data-astro-cid-zwcxtrnw&gt; &lt;th scope=&quot;row&quot; data-astro-cid-zwcxtrnw&gt;A turni&lt;/th&gt; &lt;td data-astro-cid-zwcxtrnw&gt;sì&lt;/td&gt; &lt;td data-astro-cid-zwcxtrnw&gt;sì&lt;/td&gt; &lt;/tr&gt;&lt;tr data-astro-cid-zwcxtrnw&gt; &lt;th scope=&quot;row&quot; data-astro-cid-zwcxtrnw&gt;Testo dentro e fuori&lt;/th&gt; &lt;td data-astro-cid-zwcxtrnw&gt;sì&lt;/td&gt; &lt;td data-astro-cid-zwcxtrnw&gt;sì&lt;/td&gt; &lt;/tr&gt;&lt;tr data-astro-cid-zwcxtrnw&gt; &lt;th scope=&quot;row&quot; data-astro-cid-zwcxtrnw&gt;Suggerisce cosa fare&lt;/th&gt; &lt;td data-astro-cid-zwcxtrnw&gt;no&lt;/td&gt; &lt;td data-astro-cid-zwcxtrnw&gt;no&lt;/td&gt; &lt;/tr&gt;&lt;tr data-astro-cid-zwcxtrnw&gt; &lt;th scope=&quot;row&quot; data-astro-cid-zwcxtrnw&gt;Mostra lo stato&lt;/th&gt; &lt;td data-astro-cid-zwcxtrnw&gt;no&lt;/td&gt; &lt;td data-astro-cid-zwcxtrnw&gt;no&lt;/td&gt; &lt;/tr&gt;&lt;tr class=&quot;differs&quot; data-astro-cid-zwcxtrnw&gt; &lt;th scope=&quot;row&quot; data-astro-cid-zwcxtrnw&gt;Interprete&lt;/th&gt; &lt;td data-astro-cid-zwcxtrnw&gt;esige la sintassi&lt;/td&gt; &lt;td data-astro-cid-zwcxtrnw&gt;accetta tutto&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Due finestre affiancate. Nella shell la richiesta in italiano fallisce con «command not found» e serve il comando esatto grep; nella chat la stessa frase riceve una risposta. Sotto, una tabella: a turni, testo dentro e fuori, nessun suggerimento, stato invisibile valgono per entrambe; l’interprete della shell esige la sintassi, quello della chat accetta tutto.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;La stessa richiesta a due interpreti. Quattro proprietà su cinque coincidono; cambia solo quanto l’interprete pretende da chi scrive.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Nielsen (2023) l’ha chiamata proprio così, il terzo paradigma dopo il batch e il comando: si dice alla macchina cosa si vuole, non come. Nello stesso articolo, però, scrive che gli strumenti attuali hanno problemi di usabilità radicati, che una parte consistente della popolazione non scrive prosa abbastanza bene per ottenere buoni risultati, e che il futuro sarà ibrido, con elementi grafici che sopravvivono accanto all’intento. La seconda metà dell’articolo, per quanto ho visto, è quella che i prodotti hanno ignorato.&lt;/p&gt;
&lt;p&gt;Le prove che la tolleranza non risolve il problema dell’articolazione esistono. Zamfirescu-Pereira et al. (2023) hanno messo dieci non esperti a progettare prompt per un chatbot e li hanno osservati: procedevano per tentativi non sistematici, generalizzavano da un caso solo, e scrivevano istruzioni come se parlassero a una persona, aspettandosi che il modello le seguisse come farebbe una persona. Il paper si intitola “Why Johnny Can’t Prompt”, e Johnny è lo stesso di “Why Johnny Can’t Encrypt” di venticinque anni prima: l’utente competente messo davanti a un’interfaccia che gli chiede di sapere cosa la macchina si aspetta.&lt;/p&gt;
&lt;p&gt;Wattenberger (2023) mostra lo stesso problema da dentro un prompt: in “agisci come un interprete di sogni”, un esempio copiatissimo di quel periodo, quattro righe su cinque dicono chi deve essere il modello, come deve rispondere, come non deve, che tipo di informazione si vuole, e solo l’ultima contiene il sogno.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;ol class=&quot;prompt&quot; data-astro-cid-dcgbc2o3&gt; &lt;li class=&quot;prompt__line&quot; data-astro-cid-dcgbc2o3&gt; &lt;span class=&quot;prompt__text&quot; data-astro-cid-dcgbc2o3&gt;Voglio che tu faccia l’interprete di sogni.&lt;/span&gt; &lt;span class=&quot;prompt__role&quot; data-astro-cid-dcgbc2o3&gt;chi deve essere&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;prompt__line&quot; data-astro-cid-dcgbc2o3&gt; &lt;span class=&quot;prompt__text&quot; data-astro-cid-dcgbc2o3&gt;Ti descriverò i miei sogni e tu li interpreterai.&lt;/span&gt; &lt;span class=&quot;prompt__role&quot; data-astro-cid-dcgbc2o3&gt;come deve rispondere&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;prompt__line&quot; data-astro-cid-dcgbc2o3&gt; &lt;span class=&quot;prompt__text&quot; data-astro-cid-dcgbc2o3&gt;Non dare opinioni personali su chi sogna.&lt;/span&gt; &lt;span class=&quot;prompt__role&quot; data-astro-cid-dcgbc2o3&gt;come non deve&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;prompt__line&quot; data-astro-cid-dcgbc2o3&gt; &lt;span class=&quot;prompt__text&quot; data-astro-cid-dcgbc2o3&gt;Basati solo sui simboli e sui temi del sogno.&lt;/span&gt; &lt;span class=&quot;prompt__role&quot; data-astro-cid-dcgbc2o3&gt;che informazione&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;prompt__line ask&quot; data-astro-cid-dcgbc2o3&gt; &lt;span class=&quot;prompt__text&quot; data-astro-cid-dcgbc2o3&gt;Il mio sogno: un ragno gigante mi inseguiva.&lt;/span&gt; &lt;span class=&quot;prompt__role&quot; data-astro-cid-dcgbc2o3&gt;la richiesta&lt;/span&gt; &lt;/li&gt; &lt;/ol&gt; &lt;div class=&quot;split&quot; aria-hidden=&quot;true&quot; data-astro-cid-dcgbc2o3&gt; &lt;span class=&quot;split__config&quot; style=&quot;flex: 4&quot; data-astro-cid-dcgbc2o3&gt;
configurazione, riscritta a ogni conversazione
&lt;/span&gt; &lt;span class=&quot;split__ask&quot; style=&quot;flex: 1&quot; data-astro-cid-dcgbc2o3&gt;
richiesta
&lt;/span&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Cinque righe di prompt. Le prime quattro, in grigio, dicono chi deve essere il modello, come deve rispondere, come non deve e che informazione si vuole. Solo la quinta, evidenziata, contiene la richiesta: il sogno. Una barra sotto divide il prompt in quattro quinti di configurazione e un quinto di richiesta.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Il prompt dell’interprete di sogni, parafrasato riga per riga. Quattro righe su cinque sono configurazione, e la casella non ha un posto dove tenerla.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Quattro righe su cinque sono configurazione, riscritta a mano a ogni conversazione, perché la casella non ha un posto dove metterla. Una shell senza file di configurazione, senza alias, senza completamento con il tasto Tab: una riga di comando del 1975 con un interprete molto paziente.&lt;/p&gt;
&lt;h2 id=&quot;cosa-ha-fatto-linterfaccia-grafica-alla-riga-di-comando&quot;&gt;Cosa ha fatto l’interfaccia grafica alla riga di comando&lt;/h2&gt;
&lt;p&gt;La storia utile qui non è quella della vittoria della grafica sul testo, perché non c’è stata. La shell esiste ancora, la usano ogni giorno milioni di persone, e per alcune categorie di lavoro è ancora l’interfaccia migliore. Quello che l’interfaccia grafica ha fatto è stato spostare, per i compiti frequenti, la scrittura del comando lontano dall’utente.&lt;/p&gt;
&lt;p&gt;Lo ha fatto in tre modi, e conviene tenerli distinti perché tornano identici tra poco. Il primo è il menu: i comandi più usati sono stati scritti una volta per tutte dal progettista, con un nome leggibile, e l’utente li sceglie invece di ricordarli. Il secondo è la manipolazione diretta: l’oggetto su cui si lavora è sullo schermo, lo si trascina, lo si seleziona, e il comando è implicito nel gesto; Nielsen chiama non-comando l’estremo di questa linea, dove la macchina agisce come effetto collaterale di un’azione che l’utente farebbe comunque, come la portiera che si sblocca quando si tira la maniglia. Il terzo è l’automazione: il comando lo scrive un altro programma, in una pipe, in uno script, in un cron, e l’utente non è presente quando viene eseguito.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;ol class=&quot;who&quot; data-astro-cid-3gw7dsjl&gt; &lt;li class=&quot;who__row self&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__form&quot; data-astro-cid-3gw7dsjl&gt;Riga di comando&lt;/span&gt; &lt;span class=&quot;who__flow&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__author&quot; data-astro-cid-3gw7dsjl&gt;l’utente, ogni volta&lt;/span&gt; &lt;span class=&quot;who__arrow&quot; aria-hidden=&quot;true&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__cmd&quot; data-astro-cid-3gw7dsjl&gt;comando&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;who__machine&quot; data-astro-cid-3gw7dsjl&gt;macchina&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;who__user&quot; data-astro-cid-3gw7dsjl&gt;scrive&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;who__row&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__form&quot; data-astro-cid-3gw7dsjl&gt;Menu&lt;/span&gt; &lt;span class=&quot;who__flow&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__author&quot; data-astro-cid-3gw7dsjl&gt;il progettista, una volta&lt;/span&gt; &lt;span class=&quot;who__arrow&quot; aria-hidden=&quot;true&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__cmd&quot; data-astro-cid-3gw7dsjl&gt;comando&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;who__machine&quot; data-astro-cid-3gw7dsjl&gt;macchina&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;who__user&quot; data-astro-cid-3gw7dsjl&gt;sceglie&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;who__row&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__form&quot; data-astro-cid-3gw7dsjl&gt;Gesto&lt;/span&gt; &lt;span class=&quot;who__flow&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__author&quot; data-astro-cid-3gw7dsjl&gt;nessuno: è nel gesto&lt;/span&gt; &lt;span class=&quot;who__arrow&quot; aria-hidden=&quot;true&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__cmd&quot; data-astro-cid-3gw7dsjl&gt;comando&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;who__machine&quot; data-astro-cid-3gw7dsjl&gt;macchina&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;who__user&quot; data-astro-cid-3gw7dsjl&gt;agisce sull’oggetto&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;who__row&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__form&quot; data-astro-cid-3gw7dsjl&gt;Programma&lt;/span&gt; &lt;span class=&quot;who__flow&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__author&quot; data-astro-cid-3gw7dsjl&gt;un altro programma&lt;/span&gt; &lt;span class=&quot;who__arrow&quot; aria-hidden=&quot;true&quot; data-astro-cid-3gw7dsjl&gt; &lt;span class=&quot;who__cmd&quot; data-astro-cid-3gw7dsjl&gt;comando&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;who__machine&quot; data-astro-cid-3gw7dsjl&gt;macchina&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;who__user&quot; data-astro-cid-3gw7dsjl&gt;non c’è&lt;/span&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Quattro righe. Riga di comando: l’utente scrive il comando ogni volta. Menu: il progettista lo ha scritto una volta, l’utente sceglie. Gesto: nessuno lo scrive, è implicito nel gesto sull’oggetto. Programma: lo scrive un altro programma, l’utente non c’è.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Quattro strade per cui un comando arriva alla macchina. Solo nella prima lo scrive l’utente.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Menu, gesto, programma: tre risposte alla stessa domanda, chi scrive il comando, e in nessuna delle tre è l’utente a scriverlo.&lt;/p&gt;
&lt;p&gt;Questa è la chiave che uso per ordinare le forme di un modello linguistico oltre la chat. Non per quanto sono “conversazionali”, che è una scala vaga, ma per chi scrive il comando che il modello riceve. Ne vengono fuori cinque gradini, dal più vicino alla shell al più lontano, e su ogni gradino cambiano due cose che si possono misurare: quanto costa all’utente dire cosa vuole, e quanto gli costa dire di no a quello che riceve.&lt;/p&gt;
&lt;h2 id=&quot;i-cinque-gradini&quot;&gt;I cinque gradini&lt;/h2&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;ladder&quot; data-astro-cid-wnnclp4l&gt; &lt;p class=&quot;ladder__axis&quot; aria-hidden=&quot;true&quot; data-astro-cid-wnnclp4l&gt; &lt;span data-astro-cid-wnnclp4l&gt;chi scrive il comando&lt;/span&gt; &lt;span data-astro-cid-wnnclp4l&gt;sempre più lontano dall’utente →&lt;/span&gt; &lt;/p&gt; &lt;ol class=&quot;ladder__steps&quot; data-astro-cid-wnnclp4l&gt; &lt;li class=&quot;step&quot; style=&quot;--n: 1&quot; data-astro-cid-wnnclp4l&gt; &lt;span class=&quot;step__n&quot; data-astro-cid-wnnclp4l&gt;1&lt;/span&gt; &lt;span class=&quot;step__writer&quot; data-astro-cid-wnnclp4l&gt;l’utente&lt;/span&gt; &lt;span class=&quot;step__example&quot; data-astro-cid-wnnclp4l&gt;la chat&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;step&quot; style=&quot;--n: 2&quot; data-astro-cid-wnnclp4l&gt; &lt;span class=&quot;step__n&quot; data-astro-cid-wnnclp4l&gt;2&lt;/span&gt; &lt;span class=&quot;step__writer&quot; data-astro-cid-wnnclp4l&gt;il progettista&lt;/span&gt; &lt;span class=&quot;step__example&quot; data-astro-cid-wnnclp4l&gt;un verbo nel menu&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;step&quot; style=&quot;--n: 3&quot; data-astro-cid-wnnclp4l&gt; &lt;span class=&quot;step__n&quot; data-astro-cid-wnnclp4l&gt;3&lt;/span&gt; &lt;span class=&quot;step__writer&quot; data-astro-cid-wnnclp4l&gt;il gesto&lt;/span&gt; &lt;span class=&quot;step__example&quot; data-astro-cid-wnnclp4l&gt;il completamento&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;step&quot; style=&quot;--n: 4&quot; data-astro-cid-wnnclp4l&gt; &lt;span class=&quot;step__n&quot; data-astro-cid-wnnclp4l&gt;4&lt;/span&gt; &lt;span class=&quot;step__writer&quot; data-astro-cid-wnnclp4l&gt;un programma&lt;/span&gt; &lt;span class=&quot;step__example&quot; data-astro-cid-wnnclp4l&gt;la coda del mattino&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;step&quot; style=&quot;--n: 5&quot; data-astro-cid-wnnclp4l&gt; &lt;span class=&quot;step__n&quot; data-astro-cid-wnnclp4l&gt;5&lt;/span&gt; &lt;span class=&quot;step__writer&quot; data-astro-cid-wnnclp4l&gt;il modello&lt;/span&gt; &lt;span class=&quot;step__example&quot; data-astro-cid-wnnclp4l&gt;l’interfaccia generata&lt;/span&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Una scala di cinque gradini. Gradino 1: il comando lo scrive l’utente, la chat. Gradino 2: il progettista, un verbo nel menu. Gradino 3: il gesto, il completamento in linea. Gradino 4: un programma, la coda di lavoro trovata al mattino. Gradino 5: il modello, l’interfaccia generata.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;I cinque gradini, ordinati per chi scrive il comando che il modello riceve. Il primo è la chat; ognuno dei successivi allontana la scrittura dall’utente di un posto.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;&lt;strong&gt;Primo gradino: il comando lo scrive l’utente.&lt;/strong&gt; È la chat, e non c’è altro da aggiungere se non la misura. Dire cosa si vuole costa un prompt intero, configurazione compresa. Dire di no costa leggere la risposta per intero, capire dove sbaglia, e scrivere un altro prompt; Wattenberger lo mostra chiedendo due riscritture consecutive di un paragrafo di Thoreau e facendo notare che, anche su un testo di sei righe, capire cosa è cambiato tra le due risposte richiede di leggerle avanti e indietro una frase alla volta. Il costo del rifiuto è il più alto dei cinque gradini, e cresce con la lunghezza.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Secondo gradino: il comando lo ha scritto il progettista.&lt;/strong&gt; L’utente seleziona un pezzo di testo, apre un menu, sceglie un verbo: accorcia, rendi formale, traduci. Gli strumenti di scrittura di Apple, Notion e Grammarly sono così; Appleton (2023), nei suoi schizzi di interfacce non conversazionali, mette le stesse mosse nel menu del tasto destro. Le slider di Wattenberger per tono e livello di esperienza sono la variante continua dello stesso gradino: ogni cursore è un frammento di prompt con un’interfaccia sopra. Il codice chiama il modello con un prompt fisso per verbo e la selezione come unico input variabile; non c’è cronologia, la risposta sostituisce o affianca la selezione e finisce lì.&lt;/p&gt;
&lt;p&gt;Quanto valga il gradino lo ha misurato DirectGPT (Masson et al., 2024), un livello sopra ChatGPT che aggiunge una barra di comandi riutilizzabili, la possibilità di indicare col mouse su cosa agisce il prompt, e l’annulla: su testo, codice e immagini vettoriali, i partecipanti sono stati il 50% più veloci della chat e hanno scritto la metà dei prompt, lunghi il 72% in meno.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;dgpt&quot; data-astro-cid-iahw3csd&gt; &lt;p class=&quot;legend&quot; aria-hidden=&quot;true&quot; data-astro-cid-iahw3csd&gt; &lt;span class=&quot;key key--chat&quot; data-astro-cid-iahw3csd&gt;&lt;/span&gt;chat
&lt;span class=&quot;key key--dgpt&quot; data-astro-cid-iahw3csd&gt;&lt;/span&gt;DirectGPT
&lt;/p&gt; &lt;dl class=&quot;groups&quot; data-astro-cid-iahw3csd&gt; &lt;div class=&quot;group&quot; data-astro-cid-iahw3csd&gt; &lt;dt data-astro-cid-iahw3csd&gt;Prompt scritti&lt;/dt&gt; &lt;dd data-astro-cid-iahw3csd&gt; &lt;span class=&quot;bar bar--chat&quot; style=&quot;--v: 100&quot; data-astro-cid-iahw3csd&gt; &lt;span class=&quot;visually-hidden&quot; data-astro-cid-iahw3csd&gt;chat: &lt;/span&gt;100
&lt;/span&gt; &lt;span class=&quot;row&quot; data-astro-cid-iahw3csd&gt; &lt;span class=&quot;bar bar--dgpt&quot; style=&quot;--v: 50&quot; data-astro-cid-iahw3csd&gt; &lt;span class=&quot;visually-hidden&quot; data-astro-cid-iahw3csd&gt;DirectGPT: &lt;/span&gt; 50 &lt;/span&gt; &lt;span class=&quot;note&quot; data-astro-cid-iahw3csd&gt;la metà&lt;/span&gt; &lt;/span&gt; &lt;/dd&gt; &lt;/div&gt;&lt;div class=&quot;group&quot; data-astro-cid-iahw3csd&gt; &lt;dt data-astro-cid-iahw3csd&gt;Lunghezza dei prompt&lt;/dt&gt; &lt;dd data-astro-cid-iahw3csd&gt; &lt;span class=&quot;bar bar--chat&quot; style=&quot;--v: 100&quot; data-astro-cid-iahw3csd&gt; &lt;span class=&quot;visually-hidden&quot; data-astro-cid-iahw3csd&gt;chat: &lt;/span&gt;100
&lt;/span&gt; &lt;span class=&quot;row&quot; data-astro-cid-iahw3csd&gt; &lt;span class=&quot;bar bar--dgpt&quot; style=&quot;--v: 28&quot; data-astro-cid-iahw3csd&gt; &lt;span class=&quot;visually-hidden&quot; data-astro-cid-iahw3csd&gt;DirectGPT: &lt;/span&gt; 28 &lt;/span&gt; &lt;span class=&quot;note&quot; data-astro-cid-iahw3csd&gt;−72%&lt;/span&gt; &lt;/span&gt; &lt;/dd&gt; &lt;/div&gt; &lt;/dl&gt; &lt;p class=&quot;aside&quot; data-astro-cid-iahw3csd&gt;E i partecipanti hanno finito i compiti il 50% più velocemente.&lt;/p&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Due coppie di barre con la chat a 100. Prompt scritti: DirectGPT 50, la metà. Lunghezza dei prompt: DirectGPT 28, il 72% in meno. I partecipanti hanno anche finito i compiti il 50% più velocemente.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;DirectGPT contro la chat, fatta 100 la chat (Masson et al., CHI 2024).&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Il 72% è, a grandi linee, la quota di configurazione che nella chat scriveva l’utente e che qui ha scritto chi ha disegnato la barra. Dire di no è un annulla, che DirectGPT tratta come requisito e non come dettaglio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Terzo gradino: il comando è nel gesto.&lt;/strong&gt; Il completamento in linea è il non-comando di Nielsen applicato al testo: l’utente scrive, e il fatto di scrivere è il comando; il modello propone in grigio, l’utente accetta con un tasto o ignora continuando. È la forma resa comune da GitHub Copilot, in anteprima dal giugno 2021, e ora presente in editor, client di posta e strumenti di scrittura. Il codice chiama il modello a ogni pausa della digitazione, con quello che precede il cursore e spesso quello che segue, e scarta la risposta se l’utente è già andato avanti.&lt;/p&gt;
&lt;p&gt;Dire cosa si vuole costa zero; dire di no costa zero. È per questo che la misura giusta qui non è la correttezza ma il tasso di accettazione, e che il tasso può essere basso: nella prima valutazione pubblicata da GitHub (Ziegler et al., 2022) era del 27%, con oscillazioni per linguaggio tra il 23% del TypeScript e il 29% del Python, ed era la variabile che meglio prediceva la produttività percepita dagli sviluppatori.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;copilot&quot; data-astro-cid-svagnqgb&gt; &lt;div class=&quot;grid&quot; role=&quot;img&quot; aria-label=&quot;100 suggerimenti: 27 accettati, 73 ignorati&quot; data-astro-cid-svagnqgb&gt; &lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell kept&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt;&lt;span class=&quot;cell&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt; &lt;/div&gt; &lt;div class=&quot;read&quot; data-astro-cid-svagnqgb&gt; &lt;p class=&quot;read__main&quot; data-astro-cid-svagnqgb&gt; &lt;strong data-astro-cid-svagnqgb&gt;27&lt;/strong&gt; accettati su 100  &lt;span data-astro-cid-svagnqgb&gt;73 ignorati continuando a scrivere, senza costo&lt;/span&gt; &lt;/p&gt; &lt;ul class=&quot;rates&quot; data-astro-cid-svagnqgb&gt; &lt;li data-astro-cid-svagnqgb&gt; &lt;span class=&quot;rates__name&quot; data-astro-cid-svagnqgb&gt;TypeScript&lt;/span&gt; &lt;span class=&quot;rates__track&quot; data-astro-cid-svagnqgb&gt; &lt;span class=&quot;rates__fill&quot; style=&quot;--v: 23&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;rates__value&quot; data-astro-cid-svagnqgb&gt;23%&lt;/span&gt; &lt;/li&gt;&lt;li data-astro-cid-svagnqgb&gt; &lt;span class=&quot;rates__name&quot; data-astro-cid-svagnqgb&gt;Tutti&lt;/span&gt; &lt;span class=&quot;rates__track&quot; data-astro-cid-svagnqgb&gt; &lt;span class=&quot;rates__fill&quot; style=&quot;--v: 27&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;rates__value&quot; data-astro-cid-svagnqgb&gt;27%&lt;/span&gt; &lt;/li&gt;&lt;li data-astro-cid-svagnqgb&gt; &lt;span class=&quot;rates__name&quot; data-astro-cid-svagnqgb&gt;Python&lt;/span&gt; &lt;span class=&quot;rates__track&quot; data-astro-cid-svagnqgb&gt; &lt;span class=&quot;rates__fill&quot; style=&quot;--v: 29&quot; data-astro-cid-svagnqgb&gt;&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;rates__value&quot; data-astro-cid-svagnqgb&gt;29%&lt;/span&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Una griglia di cento quadrati, ventisette pieni: 27 suggerimenti accettati su 100, gli altri 73 ignorati continuando a scrivere. Per linguaggio: TypeScript 23%, tutti i linguaggi 27%, Python 29%.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Il tasso di accettazione di Copilot nella prima valutazione pubblicata (Ziegler et al., 2022). Tre suggerimenti su quattro finiscono ignorati, e non costano niente a nessuno.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;Un chatbot con tre risposte sbagliate su quattro sarebbe un fallimento; un completamento con quel rapporto funziona, perché il rifiuto è gratis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quarto gradino: il comando lo scrive un programma.&lt;/strong&gt; L’utente non vede il modello. Vede una fattura caricata che diventa una riga in una tabella, un’email che diventa un ticket con categoria e priorità compilate, o, al mattino, una coda di segnalazioni arrivate di notte, già smistate, con una bozza di risposta per ciascuna e tre casi segnati come dubbi. Il codice chiama il modello con uno schema (il function calling è nelle API principali dal giugno 2023, gli structured output dall’agosto 2024) e riceve un JSON che passa alla funzione successiva; oppure lo chiama in batch, senza vincoli di latenza e a metà prezzo sulle API principali, e scrive i risultati dove qualcuno li rivedrà. Il prompt esiste, ma lo ha scritto lo sviluppatore ed è identico a ogni chiamata; il modello è una funzione, e si testa come una funzione, con input fisso e confronto campo per campo.&lt;/p&gt;
&lt;p&gt;Dire cosa si vuole non costa niente all’utente, perché non gli viene chiesto. Dire di no è tutta l’interfaccia che resta: la coda di revisione, e quanto è facile capire cosa ha fatto il modello, correggerlo, annullare. Karpathy (2025) mette qui il centro dei prodotti a autonomia parziale: il ciclo generazione-verifica va accelerato dal lato della verifica, con diff, anteprime, test e tracce, perché è la verifica il collo di bottiglia. Una coda disegnata male fa costare il rifiuto un pomeriggio, e a quel punto il gradino crolla su quello sotto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quinto gradino: il comando lo scrive il modello, e anche l’interfaccia.&lt;/strong&gt; È il gradino che non ha un precedente nella storia della shell, e per questo va trattato con più cautela. L’utente vede grafici, mappe, form, un simulatore, ma è il modello ad averli scelti. Conviene distinguere due gradi, come fanno Leviathan et al. (2026) di Google Research: il modello sceglie un componente da un catalogo fisso e restituisce i dati per riempirlo (templated UI), oppure genera la pagina intera, HTML e JavaScript compresi (generative UI). Nel primo caso il codice espone al modello un insieme finito di strumenti, uno per componente, ed è il secondo gradino con il modello al posto dell’utente a scegliere dal menu; nel secondo caso il codice espone un browser.&lt;/p&gt;
&lt;p&gt;I numeri sono più netti di quanto mi aspettassi: nello studio di Chen et al. (2025) a Stanford, con 428 valutatori, l’interfaccia generata ha battuto la risposta in prosa nell’84% dei confronti, e in Google Research, contro l’output in markdown, nell’82,8% dei casi su prompt presi da LMArena. Le stesse fonti dicono dove il gradino cede. A Stanford, per le spiegazioni tecniche la preferenza scende al 50%, e per le richieste brevi è più bassa che per quelle dettagliate.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;genui&quot; data-astro-cid-iko6apt7&gt; &lt;ul class=&quot;rows&quot; data-astro-cid-iko6apt7&gt; &lt;li class=&quot;row&quot; data-astro-cid-iko6apt7&gt; &lt;span class=&quot;row__label&quot; data-astro-cid-iko6apt7&gt; Stanford, tutte le richieste &lt;span data-astro-cid-iko6apt7&gt;contro la prosa&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;row__track&quot; data-astro-cid-iko6apt7&gt; &lt;span class=&quot;row__fill&quot; style=&quot;--v: 84&quot; data-astro-cid-iko6apt7&gt;&lt;/span&gt; &lt;span class=&quot;row__value&quot; data-astro-cid-iko6apt7&gt;84%&lt;/span&gt; &lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;row&quot; data-astro-cid-iko6apt7&gt; &lt;span class=&quot;row__label&quot; data-astro-cid-iko6apt7&gt; Google Research, prompt di LMArena &lt;span data-astro-cid-iko6apt7&gt;contro il markdown&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;row__track&quot; data-astro-cid-iko6apt7&gt; &lt;span class=&quot;row__fill&quot; style=&quot;--v: 82.8&quot; data-astro-cid-iko6apt7&gt;&lt;/span&gt; &lt;span class=&quot;row__value&quot; data-astro-cid-iko6apt7&gt;82,8%&lt;/span&gt; &lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;row weak&quot; data-astro-cid-iko6apt7&gt; &lt;span class=&quot;row__label&quot; data-astro-cid-iko6apt7&gt; Stanford, spiegazioni tecniche &lt;span data-astro-cid-iko6apt7&gt;contro la prosa&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;row__track&quot; data-astro-cid-iko6apt7&gt; &lt;span class=&quot;row__fill&quot; style=&quot;--v: 50&quot; data-astro-cid-iko6apt7&gt;&lt;/span&gt; &lt;span class=&quot;row__value&quot; data-astro-cid-iko6apt7&gt;50%&lt;/span&gt; &lt;/span&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p class=&quot;parity&quot; aria-hidden=&quot;true&quot; data-astro-cid-iko6apt7&gt; &lt;span data-astro-cid-iko6apt7&gt;50%: nessuna preferenza&lt;/span&gt; &lt;/p&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Tre barre con una linea tratteggiata alla parità del 50%. Stanford, tutte le richieste, contro la prosa: 84%. Google Research, prompt di LMArena, contro il markdown: 82,8%. Stanford, spiegazioni tecniche: 50%, cioè nessuna preferenza.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Quanto spesso l’interfaccia generata batte la risposta in testo (Chen et al., 2025; Leviathan et al., 2026). Sulle spiegazioni tecniche il vantaggio sparisce.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;A Google, i siti costruiti da sviluppatori umani restano preferiti, la velocità di generazione è stata esclusa dalla valutazione, e con modelli di una generazione precedente il 60% delle pagine conteneva errori. La generative UI è una capacità emersa negli ultimi modelli, con una latenza che oggi non regge un prodotto interattivo; la templated UI è una scelta di ingegneria che regge già. E dire di no, su questo gradino, è un problema aperto: un’interfaccia sbagliata non si annulla con un tasto.&lt;/p&gt;
&lt;p&gt;Letti in fila, i gradini raccontano una sola cosa: ogni passo sposta la scrittura del comando lontano dall’utente, e ogni passo abbassa il costo di dire cosa si vuole. Il costo di dire di no, invece, non scende in modo monotono: è altissimo al primo, quasi nullo al secondo e al terzo, e risale al quarto e al quinto, dove l’utente non era presente quando il modello ha agito.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;costs&quot; data-astro-cid-jf2rjixb&gt; &lt;p class=&quot;legend&quot; data-astro-cid-jf2rjixb&gt; &lt;span class=&quot;legend__item refuse&quot; data-astro-cid-jf2rjixb&gt; &lt;span class=&quot;swatch&quot; aria-hidden=&quot;true&quot; data-astro-cid-jf2rjixb&gt;&lt;/span&gt;costo di dire di no
&lt;/span&gt; &lt;span class=&quot;legend__item ask&quot; data-astro-cid-jf2rjixb&gt; &lt;span class=&quot;swatch&quot; aria-hidden=&quot;true&quot; data-astro-cid-jf2rjixb&gt;&lt;/span&gt;costo di dire cosa si vuole
&lt;/span&gt; &lt;/p&gt; &lt;div class=&quot;plot&quot; data-astro-cid-jf2rjixb&gt; &lt;p class=&quot;yaxis&quot; aria-hidden=&quot;true&quot; data-astro-cid-jf2rjixb&gt; &lt;span data-astro-cid-jf2rjixb&gt;alto&lt;/span&gt; &lt;span data-astro-cid-jf2rjixb&gt;nullo&lt;/span&gt; &lt;/p&gt; &lt;svg viewBox=&quot;0 0 500 200&quot; role=&quot;img&quot; aria-label=&quot;Il costo di dire cosa si vuole scende a ogni gradino. Il costo di dire di no è altissimo al primo, quasi nullo al secondo e al terzo, e risale al quarto e al quinto.&quot; data-astro-cid-jf2rjixb&gt; &lt;rect class=&quot;band&quot; x=&quot;100&quot; y=&quot;0&quot; width=&quot;200&quot; height=&quot;200&quot; data-astro-cid-jf2rjixb&gt;&lt;/rect&gt; &lt;line class=&quot;grid&quot; x1=&quot;0&quot; y1=&quot;0.5&quot; x2=&quot;500&quot; y2=&quot;0.5&quot; data-astro-cid-jf2rjixb&gt;&lt;/line&gt; &lt;line class=&quot;grid&quot; x1=&quot;0&quot; y1=&quot;199.5&quot; x2=&quot;500&quot; y2=&quot;199.5&quot; data-astro-cid-jf2rjixb&gt;&lt;/line&gt; &lt;path class=&quot;line ask&quot; d=&quot;M50,28 L150,100 L250,172 L350,176 L450,176&quot; data-astro-cid-jf2rjixb&gt;&lt;/path&gt; &lt;path class=&quot;line refuse&quot; d=&quot;M50,22 L150,166 L250,172 L350,92 L450,52&quot; data-astro-cid-jf2rjixb&gt;&lt;/path&gt; &lt;circle class=&quot;dot ask&quot; cx=&quot;50&quot; cy=&quot;28&quot; r=&quot;4&quot; data-astro-cid-jf2rjixb&gt;&lt;/circle&gt;&lt;circle class=&quot;dot ask&quot; cx=&quot;150&quot; cy=&quot;100&quot; r=&quot;4&quot; data-astro-cid-jf2rjixb&gt;&lt;/circle&gt;&lt;circle class=&quot;dot ask&quot; cx=&quot;250&quot; cy=&quot;172&quot; r=&quot;4&quot; data-astro-cid-jf2rjixb&gt;&lt;/circle&gt;&lt;circle class=&quot;dot ask&quot; cx=&quot;350&quot; cy=&quot;176&quot; r=&quot;4&quot; data-astro-cid-jf2rjixb&gt;&lt;/circle&gt;&lt;circle class=&quot;dot ask&quot; cx=&quot;450&quot; cy=&quot;176&quot; r=&quot;4&quot; data-astro-cid-jf2rjixb&gt;&lt;/circle&gt; &lt;circle class=&quot;dot refuse&quot; cx=&quot;50&quot; cy=&quot;22&quot; r=&quot;5&quot; data-astro-cid-jf2rjixb&gt;&lt;/circle&gt;&lt;circle class=&quot;dot refuse&quot; cx=&quot;150&quot; cy=&quot;166&quot; r=&quot;5&quot; data-astro-cid-jf2rjixb&gt;&lt;/circle&gt;&lt;circle class=&quot;dot refuse&quot; cx=&quot;250&quot; cy=&quot;172&quot; r=&quot;5&quot; data-astro-cid-jf2rjixb&gt;&lt;/circle&gt;&lt;circle class=&quot;dot refuse&quot; cx=&quot;350&quot; cy=&quot;92&quot; r=&quot;5&quot; data-astro-cid-jf2rjixb&gt;&lt;/circle&gt;&lt;circle class=&quot;dot refuse&quot; cx=&quot;450&quot; cy=&quot;52&quot; r=&quot;5&quot; data-astro-cid-jf2rjixb&gt;&lt;/circle&gt; &lt;/svg&gt; &lt;/div&gt; &lt;ol class=&quot;xaxis&quot; data-astro-cid-jf2rjixb&gt; &lt;li data-astro-cid-jf2rjixb&gt; &lt;span class=&quot;xaxis__n&quot; data-astro-cid-jf2rjixb&gt;1&lt;/span&gt; l’utente &lt;/li&gt;&lt;li data-astro-cid-jf2rjixb&gt; &lt;span class=&quot;xaxis__n&quot; data-astro-cid-jf2rjixb&gt;2&lt;/span&gt; il progettista &lt;/li&gt;&lt;li data-astro-cid-jf2rjixb&gt; &lt;span class=&quot;xaxis__n&quot; data-astro-cid-jf2rjixb&gt;3&lt;/span&gt; il gesto &lt;/li&gt;&lt;li data-astro-cid-jf2rjixb&gt; &lt;span class=&quot;xaxis__n&quot; data-astro-cid-jf2rjixb&gt;4&lt;/span&gt; un programma &lt;/li&gt;&lt;li data-astro-cid-jf2rjixb&gt; &lt;span class=&quot;xaxis__n&quot; data-astro-cid-jf2rjixb&gt;5&lt;/span&gt; il modello &lt;/li&gt; &lt;/ol&gt; &lt;p class=&quot;band-note&quot; data-astro-cid-jf2rjixb&gt;Dove dire di no è quasi gratis: il menu e il gesto.&lt;/p&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Un grafico qualitativo con i cinque gradini sull’asse orizzontale. Il costo di dire cosa si vuole, tratteggiato, parte alto alla chat e scende fino a quasi nulla dal terzo gradino. Il costo di dire di no parte altissimo alla chat, crolla a quasi nulla al secondo e al terzo gradino, evidenziati come la zona favorevole, e risale al quarto e ancora di più al quinto.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Le due misure sui cinque gradini: la prima scende sempre, la seconda disegna una U. Andamento qualitativo, come nel testo.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;È la seconda misura, non la prima, a decidere dove si può stare.&lt;/p&gt;
&lt;h2 id=&quot;perché-la-shell-è-rimasta-e-perché-resterà-la-chat&quot;&gt;Perché la shell è rimasta, e perché resterà la chat&lt;/h2&gt;
&lt;p&gt;La riga di comando non è sparita per tre ragioni che si applicano parola per parola alla chat. La prima è la coda lunga: i menu coprono i comandi frequenti, e per il comando che nessuno aveva previsto serve un posto dove scriverlo. La seconda è la composizione: chi sa cosa vuole e sa dirlo mette insieme in una riga quello che con i menu richiederebbe venti clic. La terza è l’esplorazione: quando non si sa ancora cosa si vuole, provare comandi e leggere risposte è un modo ragionevole di scoprirlo, e il turno alternato, che altrove è un costo, qui è la struttura del lavoro.&lt;/p&gt;
&lt;p&gt;La chat vince negli stessi tre casi. Un menu con dodici verbi non copre “trova nel documento i punti in cui contraddico l’introduzione”; un catalogo di componenti non copre la domanda che nessuno aveva previsto; e per capire cosa si vuole da un documento che si è appena ricevuto, parlarci è spesso il modo più rapido. Appleton, che intitola il suo pezzo “perché odio i chatbot”, nello stesso paragrafo scrive che la chat è flessibile, familiare e facile da costruire, e che in molti casi è una soluzione buona; la chiama pigra, non sbagliata. Wattenberger lo dice con un’immagine di viaggio: il linguaggio naturale è ottimo per la direzione grossolana, per farsi portare nel quartiere giusto, e serve altro per arrivare alla casa giusta.&lt;/p&gt;
&lt;p&gt;Quello che la storia della shell insegna è l’ordine delle operazioni. La riga di comando è venuta prima, e i menu sono stati ricavati guardando cosa la gente ci scriveva. Il modo sano di tenere una chat in un prodotto è lo stesso: si guardano le richieste che arrivano, si contano, e le più frequenti salgono di un gradino, in un verbo, in un gesto, in un programma. Una richiesta ripetuta è un comando che aspetta un menu.&lt;/p&gt;
&lt;h2 id=&quot;cosa-cambia-per-chi-costruisce&quot;&gt;Cosa cambia per chi costruisce&lt;/h2&gt;
&lt;p&gt;Se il progettista, il gesto o il programma scrivono il comando, l’interfaccia è un compilatore di prompt. DirectGPT funziona letteralmente così: ogni azione col mouse viene tradotta in un prompt ingegnerizzato che l’utente non vede, e le slider di Wattenberger sono frammenti di prompt con un controllo sopra. Questo dà al prompt una cosa che nella chat non ha: una firma. Un prompt per “accorcia” ha un input, la selezione, e un output atteso, testo nella stessa lingua e più corto; venti selezioni e un controllo su lingua e lunghezza fanno un test che si versiona e si rilancia quando cambia il modello. Il prompt di una chat, che deve reggere qualunque cosa arrivi, non ha una firma, ed è per questo che è così difficile da testare: non mancano gli strumenti, manca la funzione.&lt;/p&gt;
&lt;p&gt;La seconda conseguenza è il budget di latenza, che cambia a ogni gradino e decide quale modello si può usare. Il gesto ha qualche centinaio di millisecondi; il menu ne ha qualche migliaio, perché l’utente ha fatto una scelta e aspetta; il programma non ha budget e può chiamare il modello più grande che c’è; la generative UI, per ammissione dei suoi autori, oggi non sta in nessuno di questi.&lt;/p&gt;
&lt;figure class=&quot;figure&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;figure__body&quot; data-astro-cid-3bfncq6i&gt; &lt;div class=&quot;latency&quot; data-astro-cid-6mzfopaf&gt; &lt;ul class=&quot;rows&quot; data-astro-cid-6mzfopaf&gt; &lt;li class=&quot;row&quot; data-astro-cid-6mzfopaf&gt; &lt;span class=&quot;row__name&quot; data-astro-cid-6mzfopaf&gt;Gesto&lt;/span&gt; &lt;span class=&quot;row__track&quot; data-astro-cid-6mzfopaf&gt; &lt;span class=&quot;row__range&quot; style=&quot;--a: 0%; --b: 17.07856864755143%&quot; data-astro-cid-6mzfopaf&gt;&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;row__words&quot; data-astro-cid-6mzfopaf&gt; qualche centinaio di ms  &lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;row&quot; data-astro-cid-6mzfopaf&gt; &lt;span class=&quot;row__name&quot; data-astro-cid-6mzfopaf&gt;Menu&lt;/span&gt; &lt;span class=&quot;row__track&quot; data-astro-cid-6mzfopaf&gt; &lt;span class=&quot;row__range&quot; style=&quot;--a: 21.947620901632384%; --b: 37.28834957841167%&quot; data-astro-cid-6mzfopaf&gt;&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;row__words&quot; data-astro-cid-6mzfopaf&gt; qualche secondo: l’utente ha scelto e aspetta  &lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;row&quot; data-astro-cid-6mzfopaf&gt; &lt;span class=&quot;row__name&quot; data-astro-cid-6mzfopaf&gt;Chat&lt;/span&gt; &lt;span class=&quot;row__track&quot; data-astro-cid-6mzfopaf&gt; &lt;span class=&quot;row__range&quot; style=&quot;--a: 21.947620901632384%; --b: 41.768297576191685%&quot; data-astro-cid-6mzfopaf&gt;&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;row__words&quot; data-astro-cid-6mzfopaf&gt; pochi secondi, per qualunque richiesta &lt;em data-astro-cid-6mzfopaf&gt; · un modello di mezzo&lt;/em&gt; &lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;row&quot; data-astro-cid-6mzfopaf&gt; &lt;span class=&quot;row__name&quot; data-astro-cid-6mzfopaf&gt;Programma&lt;/span&gt; &lt;span class=&quot;row__track&quot; data-astro-cid-6mzfopaf&gt; &lt;span class=&quot;row__range open&quot; style=&quot;--a: 43.89524180326477%; --b: 100%&quot; data-astro-cid-6mzfopaf&gt;&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;row__words&quot; data-astro-cid-6mzfopaf&gt; nessun budget &lt;em data-astro-cid-6mzfopaf&gt; · il modello più grande&lt;/em&gt; &lt;/span&gt; &lt;/li&gt; &lt;/ul&gt; &lt;div class=&quot;axis&quot; aria-hidden=&quot;true&quot; data-astro-cid-6mzfopaf&gt; &lt;span style=&quot;--x: 0%&quot; data-astro-cid-6mzfopaf&gt;0,1 s&lt;/span&gt;&lt;span style=&quot;--x: 21.947620901632384%&quot; data-astro-cid-6mzfopaf&gt;1 s&lt;/span&gt;&lt;span style=&quot;--x: 43.89524180326477%&quot; data-astro-cid-6mzfopaf&gt;10 s&lt;/span&gt;&lt;span style=&quot;--x: 60.97381045081619%&quot; data-astro-cid-6mzfopaf&gt;1 min&lt;/span&gt;&lt;span style=&quot;--x: 100%&quot; data-astro-cid-6mzfopaf&gt;1 h&lt;/span&gt; &lt;/div&gt; &lt;p class=&quot;genui&quot; data-astro-cid-6mzfopaf&gt; &lt;strong data-astro-cid-6mzfopaf&gt;Generative UI&lt;/strong&gt;: oggi, per ammissione dei suoi autori, non sta in nessuna di
    queste finestre.
&lt;/p&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p class=&quot;visually-hidden&quot; data-astro-cid-3bfncq6i&gt;Quattro intervalli su un asse logaritmico da 0,1 secondi a un’ora. Gesto: qualche centinaio di millisecondi. Menu: qualche secondo, perché l’utente ha scelto e aspetta. Chat: pochi secondi per qualunque richiesta, quindi un modello di mezzo. Programma: nessun budget, quindi il modello più grande. La generative UI oggi non sta in nessuna di queste finestre.&lt;/p&gt; &lt;figcaption class=&quot;figure__caption voice&quot; data-astro-cid-3bfncq6i&gt;Il tempo che ogni gradino concede al modello, su scala logaritmica. Più la finestra è stretta, più piccolo è il modello che ci sta dentro.&lt;/figcaption&gt; &lt;/figure&gt; 
&lt;p&gt;La chat, che deve rispondere a tutto entro pochi secondi, finisce quasi sempre con un modello di mezzo, abbastanza veloce da non far aspettare e abbastanza capace da non sbagliare troppo, scelto perché la casella non lascia scegliere.&lt;/p&gt;
&lt;p&gt;La terza conseguenza riguarda i gradini alti, e la nomino perché è l’errore che vedo più spesso. Quando dire di no costa poco, anche dire di sì costa poco, e Wattenberger chiama terra di nessuno la zona in cui l’utente deve ancora decidere ma non controlla più il risultato, e si ritrova a premere Tab senza leggere. Il completamento e il lavoro in assenza ci finiscono facilmente. La cura non è tornare alla chat: è progettare la verifica quanto la generazione, e in particolare un’accettazione che richieda almeno uno sguardo.&lt;/p&gt;
&lt;h2 id=&quot;riepilogo&quot;&gt;Riepilogo&lt;/h2&gt;
&lt;p&gt;La chat è una riga di comando con un interprete tollerante: stessi turni, stesso testo, nessuna affordance, stato invisibile, e la tolleranza dell’interprete è ciò che l’ha resa usabile da chi non programma. Alla riga di comando le interfacce grafiche hanno fatto una cosa sola, spostare la scrittura del comando frequente lontano dall’utente, in tre modi: menu, gesto, programma. Gli stessi tre modi, più un quarto senza precedenti in cui è il modello a scegliere l’interfaccia, danno i cinque gradini di questo pezzo, e su ogni gradino il costo di dire cosa si vuole scende mentre il costo di dire di no descrive una curva a U: altissimo nella chat, quasi nullo nel menu e nel gesto, di nuovo alto dove l’utente non c’era. La shell è rimasta per la coda lunga, per la composizione e per l’esplorazione; la chat resterà per le stesse ragioni, e per nessun’altra.&lt;/p&gt;
&lt;p&gt;Se avete un prodotto con una chat in un angolo, il consiglio è di contare per un mese cosa ci scrive la gente prima di aggiungerle una funzione: le prime cinque richieste per frequenza sono cinque voci di menu che aspettano di essere scritte, e il salto dal primo al secondo gradino è quello con il rapporto migliore tra costo e resa, per quanto ho misurato e letto. Se conoscete un sesto gradino, o un caso in cui un menu è stato tolto per rimettere una chat con buone ragioni, segnalatemelo: la scala è quella che ho trovato, non necessariamente quella completa.&lt;/p&gt;
&lt;h2 id=&quot;letture&quot;&gt;Letture&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Jakob Nielsen, &lt;em&gt;AI: First New UI Paradigm in 60 Years&lt;/em&gt;, Nielsen Norman Group, giugno 2023.&lt;/li&gt;
&lt;li&gt;Amelia Wattenberger, &lt;em&gt;Why Chatbots Are Not the Future&lt;/em&gt;, maggio 2023.&lt;/li&gt;
&lt;li&gt;Maggie Appleton, &lt;em&gt;Language Model Sketchbook, or Why I Hate Chatbots&lt;/em&gt;, giugno 2023.&lt;/li&gt;
&lt;li&gt;J.D. Zamfirescu-Pereira, R. Wong, B. Hartmann, Q. Yang, &lt;em&gt;Why Johnny Can’t Prompt: How Non-AI Experts Try (and Fail) to Design LLM Prompts&lt;/em&gt;, CHI 2023.&lt;/li&gt;
&lt;li&gt;Damien Masson, S. Malacria, G. Casiez, D. Vogel, &lt;em&gt;DirectGPT: A Direct Manipulation Interface to Interact with Large Language Models&lt;/em&gt;, CHI 2024.&lt;/li&gt;
&lt;li&gt;Albert Ziegler et al., &lt;em&gt;Productivity Assessment of Neural Code Completion&lt;/em&gt;, MAPS 2022.&lt;/li&gt;
&lt;li&gt;Jiaqi Chen, Yanzhe Zhang, Yutong Zhang, Yijia Shao, Diyi Yang, &lt;em&gt;Generative Interfaces for Language Models&lt;/em&gt;, 2025.&lt;/li&gt;
&lt;li&gt;Yaniv Leviathan et al., &lt;em&gt;Generative UI: LLMs are Effective UI Generators&lt;/em&gt;, Google Research, 2026.&lt;/li&gt;
&lt;li&gt;Andrej Karpathy, &lt;em&gt;Software Is Changing (Again)&lt;/em&gt;, AI Startup School, giugno 2025.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><dc:creator>Irene Burresi</dc:creator><media:thumbnail url="https://ireneburresi.dev/og/it/blog-riga-di-comando-per-non-tecnici.png" width="1200" height="630"/><atom:link href="https://ireneburresi.dev/blog/riga-di-comando-per-non-tecnici.md" rel="alternate" type="text/markdown"/><category>llm</category></item></channel></rss>