Procedura per addestrare gpt-4.1-nano a classificare le richieste dei clienti in un JSON fisso, con categoria e priorità. Si parte da 60 esempi scritti a mano, si fa il fine-tuning dal portale di Microsoft Foundry, si confronta il risultato con il modello di base e lo si chiama da un'applicazione console .NET autenticata con Entra ID.
Occorre: un account Azure con una sottoscrizione attiva, un browser, .NET 10 e l'interfaccia a riga di comando di Azure sul computer. Durata: circa un'ora e mezza, quasi tutta di attesa: nella prova l'addestramento ha impiegato 52 minuti. Costo: si pagano i token di addestramento (nella prova 8.000) e i token delle chiamate. La distribuzione Developer e quella Global Standard non hanno un canone orario.
Il portale delle schermate è in inglese: i nomi dei comandi sono riportati come appaiono a schermo.
Preparare i dati
1. Crea i due file
Il fine-tuning supervisionato vuole file JSONL: una conversazione per riga, con il messaggio di sistema, la richiesta e la risposta attesa. Le categorie sono cinque (fatturazione, tecnico, spedizione, account, reso) e le priorità tre (alta, media, bassa). Il messaggio di sistema è lo stesso in tutte le righe e non elenca le categorie: il modello le deve imparare dagli esempi.
Salva queste 50 righe come training.jsonl:
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Mi avete addebitato due volte l'abbonamento di novembre, rivoglio subito i soldi."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Potete mandarmi la fattura di ottobre anche in PDF?"}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Nella fattura c'è la partita IVA sbagliata, devo presentarla al commercialista entro venerdì."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Vorrei sapere se è possibile pagare con bonifico invece che con la carta."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La carta è stata rifiutata e ora il servizio è sospeso, non possiamo lavorare."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Come cambio l'intestazione delle prossime fatture?"}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Mi è arrivato un addebito di 480 euro che non riconosco."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Lo sconto annuale promesso non compare in fattura."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Posso avere un riepilogo di tutti i pagamenti del 2026?"}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il rinnovo automatico è partito anche se l'avevo disdetto a settembre."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il gestionale non si apre più da stamattina, tutto l'ufficio è fermo."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "L'esportazione in Excel mette le date in formato americano."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il sito dà errore 500 quando i clienti provano a pagare."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Si può cambiare il colore dei grafici nella dashboard?"}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La sincronizzazione con il telefono è lenta, ma alla fine funziona."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Abbiamo perso tutti i dati del magazzino dopo l'aggiornamento di ieri sera."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La stampante di etichette non viene riconosciuta dal programma."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "C'è un modo per usare le scorciatoie da tastiera nell'editor?"}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Le email di conferma ordine non partono più da due giorni."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La ricerca non trova i clienti se scrivo il cognome con l'accento."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il pacco doveva arrivare lunedì e non è ancora arrivato, mi serve per un evento domani."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Posso cambiare l'indirizzo di consegna di un ordine già spedito?"}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Quanto costa la spedizione verso la Svizzera?"}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il corriere ha lasciato il pacco aperto e mancano due pezzi."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il numero di tracciamento non dà risultati sul sito del corriere."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Fate consegne il sabato?"}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Ho ricevuto il pacco di un altro cliente, con il suo nome e indirizzo."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La consegna è in ritardo di tre giorni, non è urgente ma vorrei sapere quando arriva."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Si può ritirare l'ordine in magazzino invece di farlo spedire?"}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il pacco risulta consegnato ma io non ho ricevuto niente."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Non riesco più ad accedere, dice che la password è sbagliata ma è quella di sempre."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Qualcuno ha cambiato la mail del mio account senza che lo sapessi."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Come aggiungo un collega al nostro account aziendale?"}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il codice di verifica via SMS non arriva e devo entrare per chiudere il mese."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Vorrei cambiare il nome utente."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Un ex dipendente ha ancora accesso, toglietelo subito."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Dove si attiva l'autenticazione a due fattori?"}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il mio account risulta bloccato dopo tre tentativi, quando si sblocca?"}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Vorrei cancellare definitivamente il mio account e i miei dati."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Si può avere l'interfaccia in inglese per un collega?"}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Le scarpe sono di una taglia sbagliata, come le restituisco?"}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il prodotto è arrivato rotto e mi serviva per un cliente domani mattina."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Entro quanti giorni posso fare il reso?"}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Ho mandato indietro il pacco tre settimane fa e il rimborso non è ancora arrivato."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il caricabatterie si surriscalda e ha fatto fumo, lo voglio restituire."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Posso cambiare il colore invece di avere il rimborso?"}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il modulo di reso sul sito non si apre."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il reso me l'avete rifiutato senza spiegazione."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Le spese di spedizione del reso sono a carico mio?"}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Mi avete mandato un prodotto diverso da quello ordinato, mi serve quello giusto entro giovedì."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"alta\"}"}]}E queste 10 come validation.jsonl, con richieste che non compaiono nell'addestramento:
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La fattura di settembre ha un importo diverso dal preventivo."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Accettate PayPal?"}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il server di produzione non risponde, i clienti non riescono a fare ordini."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il pulsante Salva a volte va premuto due volte."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il pacco è fermo in deposito da una settimana."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Spedite anche in Albania?"}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Ricevo mail di reimpostazione della password che non ho chiesto."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Come cambio la foto del profilo?"}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il tablet si spegne da solo dopo cinque minuti, voglio restituirlo."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il prodotto che ho ricevuto è scaduto ed è un alimento per neonati."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"alta\"}"}]}Il pulsante Scarica in alto a destra di ogni riquadro salva il file già pronto, in UTF-8.
Creare il progetto
2. Crea il gruppo di risorse
Su portal.azure.com, cerca Resource groups e premi + Create.
| Campo | Valore |
|---|---|
| Resource group name | rg-guide-ft-01 |
| Region | (Europe) Sweden Central |
Premi Review + create e poi Create.

3. Crea il progetto
Su ai.azure.com premi Create project, apri Advanced options e compila i campi.
| Campo | Valore |
|---|---|
| Project name | proj-guide-ft-01 |
| Foundry resource | proj-guide-ft-01-resource |
| Region | Sweden Central |
| Resource group | rg-guide-ft-01 |
Lascia spento Set up recommended resources e premi Create.

Addestrare il modello
4. Apri il fine-tuning
Nel menu a sinistra, sotto Improve, premi Fine-tune e poi Start fine-tuning.

5. Scegli metodo, modello e tipo di addestramento
| Campo | Valore |
|---|---|
| Customization method | Supervised |
| Model | gpt-4.1-nano |
| Training type | Developer |
Premi Next.

L'addestramento Developer usa capacità libera: il lavoro può aspettare in coda o essere sospeso e poi riprendere da solo, e le pause non si pagano. Se serve una durata prevedibile, scegli Global.
6. Carica i file
Sotto Training data source premi Upload e scegli training.jsonl; sotto Validation data source (optional) fai lo stesso con validation.jsonl. A destra compare l'anteprima con il numero di righe: 50 e 10.

I file vanno caricati da qui: quelli caricati prima dalla sezione Data non compaiono nella tendina Select a dataset.
Premi Next.
7. Dai un nome e invia
In Display name scrivi classifica-richieste. Lascia i valori predefiniti di Batch size, Number of epochs e Learning rate multiplier, e spento Automatically deploy model after job completion. Premi Submit.

Il lavoro compare nell'elenco con stato Queued.

8. Attendi la fine
Nella prova il lavoro è passato da queste fasi:
| Ora | Fase |
|---|---|
| 20:38 | In coda, controllo dei file |
| 20:45 | Avviato |
| 21:00 | In attesa di GPU libere |
| 21:15 | Inizio dell'addestramento |
| 21:30 | Completato |
Lo stato si aggiorna da solo nell'elenco Fine-tuning.
Leggere il risultato
9. Guarda i dettagli
Premi il nome del lavoro. La scheda Details riporta durata, tipo di addestramento, token fatturati e i parametri scelti dal servizio: nella prova 3 epoche, batch di 1 e moltiplicatore 0,1.

10. Guarda le metriche
La scheda Monitor mostra la perdita e l'accuratezza sui token, per l'addestramento e per la validazione. Nella prova la perdita di addestramento parte da 1,97 al primo passo e arriva quasi a zero; sull'intero file di validazione l'accuratezza finale è 0,99.

11. Guarda i checkpoint
La scheda Checkpoints elenca il modello finale e due intermedi, ai passi 50 e 100. Ognuno si può distribuire come modello a sé.

Pubblicare e confrontare
12. Distribuisci il modello addestrato
Nella pagina del lavoro premi Deploy e compila il pannello.
| Campo | Valore |
|---|---|
| Deployment name | classifica-richieste |
| Deployment type | Developer |
Lascia i valori predefiniti degli altri campi e premi Deploy. Nella prova la distribuzione è stata pronta in 4 minuti.

La distribuzione Developer non ha canone orario e si paga a token, ma viene eliminata dopo 24 ore e non ha garanzie di disponibilità: serve per provare. Per l'uso continuativo si sceglie Global Standard o Standard, che hanno un canone orario.
13. Distribuisci il modello di base
Per fare la stessa domanda al modello non addestrato serve anche gpt-4.1-nano normale. Apri Discover, scheda Models, cerca gpt-4.1-nano, apri la scheda del modello e premi Deploy e poi Default settings.
14. Fai la stessa domanda ai due modelli
Apri Models, premi classifica-richieste e, nel playground, scrivi in Instructions lo stesso messaggio di sistema dei file:
Classifica la richiesta del cliente in JSON.Poi scrivi la richiesta in basso e premi Invio:
Il pagamento con carta va in errore e oggi scade l'abbonamento.Il modello addestrato risponde con i due campi e i valori degli esempi.

Ripeti con gpt-4.1-nano, stesse istruzioni e stessa richiesta. Il modello di base risponde in JSON, ma con campi e valori suoi.

Due cose rilevate nella prova:
- senza le istruzioni usate nei file, anche il modello addestrato risponde con consigli invece che con il JSON;
- il pulsante Compare models affianca i due modelli, ma le Instructions valgono solo per quello di sinistra: per un confronto alla pari servono i due playground separati.
Chiamare il modello da .NET
15. Prendi l'endpoint
Nel playground di classifica-richieste premi Continue in code, con Language su C# e Authentication method su Entra ID authentication.
| Campo | Valore |
|---|---|
| Project endpoint | https://proj-guide-ft-01-resource.services.ai.azure.com/openai/v1 |
| Deployment | classifica-richieste |

16. Crea ed esegui l'applicazione
dotnet new console -n ft-demo
cd ft-demo
dotnet add package Azure.Identity --version 1.21.0
dotnet add package OpenAI --version 2.14.0
az loginIl codice generato dal portale non compila con il pacchetto OpenAI 2.14.0; questa è la versione provata. Sostituisce Program.cs e manda al modello le istruzioni dei file e tre richieste che non compaiono negli esempi.
using Azure.Identity;
using OpenAI.Responses;
using System.ClientModel.Primitives;
#pragma warning disable OPENAI001
const string deploymentName = "classifica-richieste";
const string endpoint = "https://proj-guide-ft-01-resource.services.ai.azure.com/openai/v1";
BearerTokenPolicy tokenPolicy = new(
new DefaultAzureCredential(),
"https://ai.azure.com/.default");
ResponsesClient client = new(
tokenPolicy,
new ResponsesClientOptions { Endpoint = new Uri(endpoint) });
string[] richieste =
[
"Il pagamento con carta va in errore e oggi scade l'abbonamento.",
"Avete un numero di telefono per l'assistenza?",
"Il pacco è arrivato bagnato e la scatola è rotta, ma il contenuto sembra a posto.",
];
foreach (string richiesta in richieste)
{
CreateResponseOptions options = new(
deploymentName,
[ResponseItem.CreateUserMessageItem(richiesta)])
{
Instructions = "Classifica la richiesta del cliente in JSON.",
};
var response = await client.CreateResponseAsync(options);
Console.WriteLine($"{richiesta}\n -> {response.Value.GetOutputText()}\n");
}dotnet runIl pagamento con carta va in errore e oggi scade l'abbonamento.
-> {"categoria": "fatturazione", "priorità": "alta"}
Avete un numero di telefono per l'assistenza?
-> {"categoria": "assistenza", "priorità": "bassa"}
Il pacco è arrivato bagnato e la scatola è rotta, ma il contenuto sembra a posto.
-> {"categoria": "spedizione", "priorità": "alta"}La seconda richiesta non rientra nelle cinque categorie e il modello ne ha inventata una sesta, assistenza: con 50 esempi il modello impara il formato, non i confini. Anche i valori possono cambiare da un'esecuzione all'altra: in un'altra prova la terza richiesta è uscita con priorità media.
Eliminare le risorse
17. Elimina il gruppo di risorse
Prima elimina le due distribuzioni: finché ci sono, la risorsa Foundry non si cancella e il gruppo resta.
az cognitiveservices account deployment delete --resource-group rg-guide-ft-01 --name proj-guide-ft-01-resource --deployment-name classifica-richieste
az cognitiveservices account deployment delete --resource-group rg-guide-ft-01 --name proj-guide-ft-01-resource --deployment-name gpt-4.1-nanoSu portal.azure.com apri rg-guide-ft-01. Contiene due risorse: la risorsa Foundry e il progetto. Il modello addestrato, i file e le distribuzioni stanno dentro la risorsa Foundry.

Premi Delete resource group, riscrivi rg-guide-ft-01 e premi Delete, poi conferma nella finestra che compare.

Eliminato il gruppo, la risorsa Foundry resta in cancellazione soft e il suo nome non è riutilizzabile. Per liberarlo subito:
az cognitiveservices account purge --name proj-guide-ft-01-resource --location swedencentral --resource-group rg-guide-ft-01Schermate del 10 novembre 2026, regione Sweden Central.