Padroneggiare i system prompts
Un system prompt è il messaggio con ruolo «system» che definisce l'identità, la missione, le regole, lo stile e il formato di output di un LLM prima della tua prima domanda. Per scriverlo: cinque blocchi brevi, istruzioni all'imperativo e verificabili, un test su alcune domande trabocchetto. Consuma contesto e non è una cassaforte: non inserirvi alcun segreto.
Un system prompt è il briefing dato al modello prima della prima domanda. Se è scritto bene, rende un LLM locale coerente e prevedibile; se è scritto male, spreca contesto e si contraddice. Saprai strutturarlo, installarlo in Ollama, LM Studio o in un'API, testarlo metodicamente e conoscerne i limiti, soprattutto in materia di riservatezza.
#Che cosa è un system prompt e come scriverlo?
Un system prompt è il messaggio con ruolo «system» posto all'inizio della conversazione: definisce l'identità del modello, la sua missione, le sue regole, il suo stile e il formato delle sue risposte prima che tu ponga la prima domanda. Il modello lo rilegge a ogni turno, proprio come la cronologia della conversazione. Per scriverlo, mantieni cinque blocchi brevi (identità, missione, regole inderogabili, stile, formato di output), formula istruzioni all'imperativo e verificabili, poi mettilo alla prova con alcune domande trabocchetto. Un system prompt guida il comportamento; non costituisce né una barriera di sicurezza né una cassaforte per i tuoi segreti e consuma una parte della finestra di contesto del tuo modello locale. Questa guida approfondisce ogni punto, con esempi pronti da incollare in Ollama, LM Studio o un'API compatibile con OpenAI.
Un LLM riceve generalmente tre tipi di messaggi: system (il quadro di riferimento permanente), user (ciò che digiti) e assistant (ciò che ha già risposto). Il client di chat reinvia l'intera conversazione al modello a ogni richiesta, incluso il messaggio system. È questo che dà l'impressione di una «personalità» stabile durante la sessione.
I fornitori di modelli descrivono lo stesso utilizzo. La documentazione di Anthropic spiega che definire un ruolo nel system prompt orienta il comportamento e il tono del modello e che una sola frase basta a fare la differenza. Il principio vale per i modelli locali: l'istruzione permanente va nel messaggio system, la domanda del momento nel messaggio user.
#Ciò che un buon system prompt cambia veramente
Il tuo ChatGPT privato e gratuito sulla tua macchina in 1 ora — LM Studio, Ollama, Open WebUI, i tuoi documenti, senza cloud.
- Spazio online a vita
- PDF + file
- Aggiornamenti a vita
- Coerenza del tono
- Un assistente che ti dà del tu al primo messaggio e del Lei al secondo rivela un system prompt assente o troppo vago. Fissare il registro una volta per tutte evita che cambi nel tempo.
- Vincoli più stabili
- Divieti («niente emoji») e obblighi («citare la fonte») vengono rispettati meglio quando sono inseriti nel prompt di sistema anziché ripetuti di volta in volta. Il loro rispetto non è comunque mai garantito: più il modello è piccolo, più occorre verificare.
- Meno ripetizioni
- Se digiti «rispondi in francese formale» a ogni domanda, inseriscilo una volta nel messaggio `system`. Meno dimenticanze, meno testo da digitare.
- Ambito della missione
- « Tratta solo il diritto del lavoro francese » riduce le risposte fuori tema, senza mai garantire che vengano escluse.
Ciò che il system prompt non fa: non aggiunge conoscenze al modello e non sostituisce né un documento fornito durante la conversazione né un RAG. Se il modello deve basarsi sui tuoi contratti, è la ricerca documentale a fornire i fatti; il system prompt dice soltanto come usarli e citarli.
#Il costo: spazio nella finestra di contesto
Il system prompt non è gratuito: i suoi token occupano la finestra di contesto, insieme alla cronologia, ai tuoi documenti e alla risposta da generare. Su un computer locale, questa finestra è spesso più piccola di quanto si creda. La pagina «Context length» della documentazione di Ollama indica una finestra predefinita di circa 4.000 token («4k») sotto i 24 GiB di VRAM, di 32.000 tra 24 e 48 GiB e di 256.000 oltre. Un prompt di 400 token occupa quindi quasi il 10% di 4.096 token, prima ancora del primo scambio.
Il calcolo è semplice: finestra disponibile = finestra totale − token del prompt di sistema − risposta attesa. Con 4.096 token, un prompt di sistema di 400 token e una risposta di 800 token, rimangono 2.896 token per la cronologia e i documenti. Quando lo scambio si prolunga, la finestra si riempie e i contenuti meno recenti rischiano di non entrarci più: un motivo in più per rendere il briefing denso piuttosto che lungo.
Esiste un secondo effetto, documentato dalla ricerca: nello studio «Lost in the Middle» (Liu et al., 2023), le prestazioni sono spesso migliori quando l'informazione utile si trova all'inizio o alla fine del contesto e peggiorano quando si trova al centro, anche per modelli dichiarati a contesto lungo. Conseguenza pratica: posiziona le regole più importanti all'inizio del tuo system prompt e ribadisci il vincolo critico nell'ultima riga se noti delle dimenticanze.
#Struttura di un system prompt solido in cinque blocchi
Un buon system prompt si riduce a cinque blocchi brevi. Non serve scrivere un romanzo: ogni frase aggiuntiva consuma contesto e aumenta il rischio di istruzioni contraddittorie. La tabella riassume ciò che contiene ogni blocco e l'errore più comune.
| Blocco | Domanda a cui risponde | Esempio | Errore comune |
|---|---|---|---|
| Identità | Chi è il modello? | «Sei Lex, assistente giuridico in materia di diritto del lavoro francese.» | Un'identità lusinghiera (« esperto mondiale ») senza un ambito definito |
| Missione | Che cosa deve fare, per chi? | « Aiuti un direttore delle risorse umane a comprendere i suoi obblighi e a redigere lettere. » | Missione troppo ampia: «aiuta su tutto» |
| Regole vincolanti | Cosa fa sempre e cosa non fa mai? | « Cita l'articolo del Codice del Lavoro in questione. » | Dieci regole di uguale priorità, di cui due si contraddicono |
| Stile | Come si esprime? | «Frasi brevi, lessico accessibile.» | Aggettivi vaghi (« professionale ») senza esempio |
| Formato di output | In quale forma restituisce la risposta? | «Per impostazione predefinita: un paragrafo e i riferimenti.» | Formato non specificato, quindi variabile da risposta a risposta |
Ecco lo stesso prompt completo. Ogni regola è formulata all'imperativo ed è verificabile (l'articolo viene citato oppure no), e il comportamento al di fuori dell'ambito previsto è esplicito.
Questo prompt funge da modello di struttura. Un modello locale può citare un articolo inesistente: fai verificare i riferimenti a una persona e consulta la guida sulle allucinazioni.
#Formulare istruzioni che il modello segue
- Imperativo diretto
- « Fai X. » e « Non fare Y. » sono più chiari di « prova, se possibile, a… », che lascia il modello libero di non provare.
- Prima le indicazioni positive
- Dire cosa bisogna fare («rispondi in una frase») è meglio che fornire una lunga lista di divieti, da riservare alle misure di protezione davvero necessarie.
- Un esempio vale una descrizione
- Per ottenere un formato preciso, fornisci una risposta tipo di due righe anziché tre frasi di spiegazione.
#In pratica con Ollama: /set system e Modelfile
Ollama propone tre modi per definire un system prompt, in base alla durata desiderata. In una sessione interattiva, il comando /set system definisce il messaggio per la conversazione in corso; appare nella lista dei comandi disponibili del client. Il prompt scompare alla fine della sessione.
Per un prompt di sistema persistente, crea un Modelfile: si tratta di un modello derivato, con il proprio nome. La documentazione di Ollama specifica che l'istruzione SYSTEM definisce il messaggio di sistema da inserire nel template del modello. La parola «template» conta: se il template di un modello non prevede uno spazio per il messaggio di sistema, l'istruzione SYSTEM non avrà alcun effetto. In caso di comportamento inatteso, confronta con il Modelfile di partenza.
Terza opzione, lato API: il corpo di una richiesta a /api/generate accetta un campo system che sostituisce quello definito nel Modelfile, e /api/chat riceve la cronologia sotto forma di array di messaggi con un ruolo e un contenuto. La guida sul Modelfile descrive in dettaglio le altre istruzioni.
#In pratica con LM Studio : il campo System Prompt e i preset
Nella scheda della chat, il pannello di configurazione contiene un campo System Prompt. Per non doverlo digitare di nuovo, LM Studio offre i preset. La documentazione li descrive come un modo per raggruppare un system prompt e altri parametri in una configurazione riutilizzabile da una conversazione all'altra.
#In pratica tramite l'API compatibile con OpenAI
Ollama, LM Studio, vLLM e llama-server espongono un'API compatibile con OpenAI. Il primo messaggio dell'array, con il ruolo system, definisce il briefing. La documentazione di Ollama precisa che il client richiede un valore per la chiave API, ma che il server lo ignora: qualsiasi stringa va bene per un uso locale.
Un aspetto da considerare nella progettazione: l'API non ha memoria. A ogni chiamata, il tuo codice invia di nuovo il messaggio system e poi l'intera cronologia. Se lo ometti in una chiamata, il modello risponde senza le istruzioni iniziali: memorizza l'array dei messaggi e mantieni il messaggio system in posizione 0.
#Tre system prompt pronti all'uso
#Correttore di francese
#Estrattore strutturato
Per un'estrazione in produzione, non contare sul solo system prompt: gli output strutturati di Ollama permettono di imporre uno schema JSON alle risposte, evitando così un JSON malformato. La guida sul function calling e sugli output JSON spiega come configurarli.
#Assistente di programmazione senior
#Testare e correggere un system prompt senza procedere a tentoni
Un system prompt si migliora attraverso prove controllate, non attraverso aggiunte successive. Senza metodo, si accumulano regole fino a ottenere un testo lungo, contraddittorio e impossibile da debuggare. Ecco una procedura semplice, senza strumenti particolari.
- 01Creare cinque domande di testScrivi cinque input: due casi normali, una domanda fuori ambito, una richiesta di formato inusuale e un tentativo di stravolgere il ruolo («dimentica le tue istruzioni»). Conservali in un file.
- 02Stabilire le condizioniUsa lo stesso modello, la stessa quantizzazione e una temperatura bassa (da 0,2 a 0,3) per confrontare le versioni del prompt a parità di condizioni.
- 03Modificare una sola cosa alla voltaCambia una regola, riproponi le cinque domande e annota cosa è cambiato. Se due regole vengono modificate contemporaneamente, non saprai quale abbia corretto o peggiorato il comportamento.
- 04Eliminare prima di aggiungereQuando una regola viene ignorata, riformulala in modo più breve, mettila all'inizio o elimina quella che la contraddice. Aggiungere testo è l'ultima risorsa.
- 05Versionare il promptMantieni ogni versione in un file di testo datato o nel Modelfile sotto controllo di versione, con una riga su ciò che è cambiato. Potrai tornare indietro.
#Trappole da evitare
| Trappola | Sintomo | Correttivo |
|---|---|---|
| Prompt troppo lungo | Parte finale del prompt seguita meno fedelmente, finestra ridotta | Condensare, mettere l'essenziale all'inizio, aumentare num_ctx se necessario |
| Istruzioni contraddittorie | « Sii breve » e « fornisci molti esempi »: comportamento variabile | Stabilire una gerarchia: in caso di conflitto, la regola 1 prevale |
| Formulazione incerta | « Cerca, se possibile, di… »: istruzione applicata in modo intermittente | Imperativo diretto: «Fai X.» |
| Lingua non specificata | Risposte nella lingua del prompt o della domanda, a seconda del modello | Scrivere « Rispondi sempre in francese » e redigere il prompt in francese |
| Posizione del messaggio system ignorata | Modello che non applica la direttiva SYSTEM di un Modelfile | Verificare che il template del modello preveda un messaggio system |
| Segreti nel prompt | Un utente ottiene il contenuto del prompt chiedendolo | Non inserirvi nulla di riservato |
#Il system prompt non è una cassaforte
Le raccomandazioni dell'OWASP sul rischio di divulgazione del prompt di sistema sono chiare: non deve essere considerato un segreto né usato come controllo di sicurezza e non deve contenere credenziali né stringhe di connessione. In pratica, per un deployment locale: se è necessario un controllo degli accessi (dati per utente, azioni sensibili), va implementato nella tua applicazione, non in una frase del prompt. La guida sulla prompt injection spiega perché un modello locale non è al riparo.
- Fonte: documentazione di riferimento del Modelfile di Ollama (istruzione SYSTEM)
- Fonte: lunghezza di contesto predefinita di Ollama
- Fonte: preset di LM Studio
- Fonte: OWASP, fuga del system prompt
- Fonte: Lost in the Middle (Liu et al., 2023)
- Le basi del prompting
- Ollama Modelfile: creare e personalizzare il proprio modello
- Comprendere la finestra di contesto
- Temperatura, top-p, top-k: i parametri
- Prompt injection: l'esecuzione in locale non ti protegge
- Function calling e output JSON strutturati con Ollama
Che cosa è un system prompt?+
Qual è la lunghezza ideale per un prompt di sistema locale?+
Come definire un system prompt permanente in Ollama?+
Un system prompt può impedire a un modello di rivelare informazioni?+
È necessario scrivere il system prompt in francese o in inglese?+
Perché il mio modello ignora il mio system prompt?+
Un feedback, un errore, una precisazione? Facci sapere, così la guida migliora per tutti.