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.

Creazione del gruppo di risorse nel portale di Azure

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.

Finestra di creazione del progetto con le opzioni avanzate aperte

Addestrare il modello

4. Apri il fine-tuning

Nel menu a sinistra, sotto Improve, premi Fine-tune e poi Start fine-tuning.

Pagina Fine-tuning del progetto, ancora vuota

5. Scegli metodo, modello e tipo di addestramento

Campo Valore
Customization method Supervised
Model gpt-4.1-nano
Training type Developer

Premi Next.

Sezione Basic details con gpt-4.1-nano e addestramento Developer

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.

File caricati e anteprima con 50 e 10 righe

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.

Impostazioni facoltative con il nome del lavoro e i valori predefiniti

Il lavoro compare nell'elenco con stato Queued.

Il lavoro classifica-richieste in coda

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.

Dettagli del lavoro completato

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.

Grafici di perdita e accuratezza

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é.

I tre checkpoint del lavoro

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.

Pannello di distribuzione con il tipo Developer

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.

Risposta del modello addestrato: categoria fatturazione, priorità alta

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

Risposta del modello di base con quattro campi inventati

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

Finestra con endpoint e codice generato

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 login

Il 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 run
Il 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-nano

Su 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.

Le due risorse dentro il gruppo

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

Pannello di eliminazione con il nome riscritto

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-01

Schermate del 10 novembre 2026, regione Sweden Central.