![]()
Fino a questo punto del corso, hai creato agenti che girano sul tuo laptop, all’interno di un notebook, guidati da az login e da una manciata di variabili d’ambiente. Questo è esattamente il modo giusto per imparare. Non è però il modo giusto per far funzionare un agente da cui migliaia di clienti dipendono alle 3 del mattino.
Questa lezione parla del divario tra “funziona sulla mia macchina” e “funziona, in modo affidabile e conveniente, in produzione.” Chiudiamo questo divario usando Microsoft Foundry e il Microsoft Foundry Agent Service, costruendo un vero agente per il supporto clienti dotato di strumenti, retrieval, memoria, valutazione e monitoraggio.
Questa lezione coprirà:
Dopo aver completato questa lezione, saprai come:
Questa lezione presume che tu abbia completato le lezioni precedenti e che ti senta a tuo agio con:
Avrai anche bisogno di:
az login).requirements.txt.Un agente prototipo e un agente di produzione condividono lo stesso ciclo principale — ragionare, chiamare strumenti, rispondere. Cambia tutto ciò che racchiude quel ciclo. Il modello rappresenta forse il 20% di un agente di produzione; l’altro 80% è lo scheletro operativo.
| Aspetto | Prototipo | Produzione |
|---|---|---|
| Hosting | Gira nel tuo notebook | Gira come servizio ospitato, versionato e distribuito |
| Identità | Il tuo token az login |
Identità gestita con RBAC limitato |
| Stato | In memoria, perso al riavvio | Esteriorizzato (thread store, servizio di memoria) |
| Guasti | Vedi il traceback | Ritenta, fallback, dead-letter, avvisi |
| Costo | “Sono pochi centesimi” | Tracciato per richiesta, instradato, memorizzato in cache, budgettato |
| Qualità | Valuti a occhio l’output | Valutato automaticamente prima di ogni rilascio |
| Fiducia | Approvi ogni azione | Policy + intervento umano per azioni a rischio |
Tieni a mente questa tabella. Ogni sezione sotto corrisponde a una di queste righe.
Esistono tre modelli che userai, spesso in combinazione.
L’oggetto agente vive all’interno del processo della tua applicazione. Il tuo codice chiama direttamente il provider modello; il ciclo di ragionamento gira nel tuo servizio. Questo è quanto fatto in ogni lezione precedente.
L’agente è registrato come risorsa in Microsoft Foundry. Foundry ospita il ciclo di ragionamento, conserva i thread, applica la sicurezza dei contenuti e RBAC, e rende l’agente visibile nel portale Foundry. La tua app diventa un client leggero che crea thread e legge le risposte.
Più agenti (e strumenti) sono composti in un grafo con flusso di controllo esplicito — passi sequenziali, diramazioni, nodi di approvazione umana, e checkpoint duraturi che possono mettere in pausa e riprendere. Questa è la capacità Workflows del Microsoft Agent Framework applicata su scala di distribuzione.
flowchart TB
subgraph P1[Ospitato dal Cliente]
A1[Processo della tua App] --> M1[Fornitore del Modello]
end
subgraph P2[Agente Ospitato]
A2[Cliente Leggero] --> F2[Servizio Agente Foundry]
F2 --> M2[Modello + Strumenti + Negozio dei Thread]
end
subgraph P3[Flusso di Lavoro dell'Agente]
A3[Orchestratore] --> S1[Agente di Triage]
S1 --> S2[Agente Risolutore]
S2 --> H[Nodo di Approvazione Umana]
H --> S3[Agente d'Azione]
end
Distribuire un agente non è un singolo push. È un ciclo, che assomiglia molto a un ciclo di rilascio software perché lo è.
flowchart LR
Create[Crea / Autore] --> Version[Versione]
Version --> Evaluate[Valuta offline]
Evaluate -->|supera il controllo| Deploy[Distribuisci ospitato]
Evaluate -->|non supera il controllo| Create
Deploy --> Observe[Osserva online]
Observe --> Improve[Raccogli i fallimenti]
Improve --> Create
Deploy --> Retire[Ritira la vecchia versione]
L’idea chiave, mutuata dalla Lezione 10: la valutazione offline è un cancello, non un ripensamento. Una nuova versione dell’agente non viene distribuita se non supera le soglie di valutazione. L’osservabilità online poi reimmette i guasti del mondo reale nel set di test offline. Questo è tutto il ciclo.
Scalare un agente è diverso dal scalare un’API web senza stato, perché ogni richiesta può innescare molteplici chiamate costose a modelli e strumenti. Quattro tecniche reggono la maggior parte del carico.
Gestione senza stato delle richieste. Non mantenere stato per utente in memoria del processo. Conserva i thread della conversazione nello store Foundry o in un servizio di memoria così che qualsiasi istanza possa gestire qualsiasi richiesta. Questo ti permette di scalare orizzontalmente — aggiungi istanze, niente sessioni sticky.
Instradamento del modello. Non ogni richiesta necessita del modello più capace (e più costoso). Instrada richieste semplici — classificazione d’intento, risposte brevi e fattuali — a un modello piccolo e veloce, e riserva il modello grande al vero ragionamento. Il Model Router di Foundry può farlo per te, oppure puoi implementare un classificatore leggero da solo. Costruirai la versione fai-da-te nel laboratorio.
Caching delle risposte. Molte domande di supporto sono quasi duplicati (“come resettare la password?”). Memorizza in cache le risposte alle domande comuni e servile senza chiamare affatto il modello. Anche un modesto tasso di hit sulla cache riduce significativamente costi e latenza.
Concorrenza e backpressure. I provider del modello hanno limiti di velocità. Limita la concorrenza, usa ritenti con backoff esponenziale, e fallisci in modo elegante (una risposta in coda tipo “ci stiamo lavorando” è meglio di un 500).
flowchart LR
Q[Query utente] --> C{Cache colpita?}
C -->|sì| R[Restituisci risposta memorizzata]
C -->|no| Router{Complessità?}
Router -->|semplice| SLM[Modello piccolo]
Router -->|complesso| LLM[Modello grande]
SLM --> Out[Risposta]
LLM --> Out
Out --> Store[Cache + traccia]
Non puoi gestire ciò che non vedi. Come descritto nella Lezione 10, il Microsoft Agent Framework emette tracce OpenTelemetry in modo nativo — ogni chiamata modello, invocazione di strumento, e passo di orchestrazione diventa uno span. In produzione, esporti quegli span in Microsoft Foundry (o in qualsiasi backend OTel-compatibile) così puoi:
from agent_framework.observability import get_tracer
tracer = get_tracer()
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("customer.tier", "enterprise")
span.set_attribute("routed.model", "gpt-5-nano")
# l'esecuzione dell'agente viene tracciata automaticamente all'interno di questo intervallo
Attributi come customer.tier e routed.model trasformano un muro di tracce in domande a cui si può rispondere (“i clienti enterprise vengono instradati troppo spesso al modello piccolo?”).
I costi degli agenti in produzione sono dominati dai token. Tre leve, in ordine di impatto:
I cancelli di valutazione e il controllo dei costi sono la stessa disciplina vista da due angolazioni: la valutazione determina il pavimento di qualità, l’instradamento e il caching ti tengono il più vicino possibile al costo di quel pavimento.
Governance. Gli Agenti Ospitati ereditano il RBAC di Foundry, la sicurezza dei contenuti e il logging di audit. Dai a ogni agente un’identità gestita con il privilegio minimo necessario — accesso in sola lettura alla base di conoscenza, accesso limitato all’API ticketing, nient’altro.
Umano nel ciclo. Alcune azioni sono troppo importanti per essere automatizzate integralmente — emettere un rimborso, eliminare un account, escalation al team legale. Il Microsoft Agent Framework supporta strumenti che richiedono approvazione: l’agente propone l’azione, l’esecuzione si mette in pausa, un umano approva o respinge, e il workflow riprende. Hai visto il primitivo nella Lezione 6; qui lo distribuisci.
MCP in produzione. MCP ti consente di far consumare strumenti esterni al tuo agente tramite un’interfaccia standard. In produzione, tratta ogni server MCP come un confine non attendibile: fissa la versione del server, eseguilo con un’identità limitata, convalida le sue uscite, e non esporre mai segreti. Un server MCP è una dipendenza, e le dipendenze vanno patchate, revisionate e limitate in velocità.
flowchart TB
subgraph Dev[Architettura di Sviluppo]
D1[Notebook] --> D2[Framework dell'Agente]
D2 --> D3[Fornitore di Modelli]
D2 --> D4[Strumenti locali]
end
subgraph Deploy[Architettura di Distribuzione]
E1[Pipeline CI] --> E2[Porta di valutazione]
E2 -->|passa| E3[Servizio Agente Foundry]
E3 --> E4[Agente ospitato versionato]
end
subgraph Run[Architettura di Runtime]
F1[App client] --> F2[Agente ospitato]
F2 --> F3[Router del Modello]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[Servizio di memoria]
F2 --> F6[Strumenti MCP]
F2 --> F7[OTel -> tracciamento Foundry]
F2 --> F8[Approvazione umana]
end
Questi tre diagrammi — sviluppo, distribuzione, runtime — sono lo stesso agente in tre fasi della sua vita. Il laboratorio seguente ti guida nella sua costruzione.
Apri code_samples/16-python-agent-framework.ipynb e seguilo dall’inizio alla fine. Assemblerai un agente di supporto clienti Contoso con ogni aspetto di produzione integrato:
Il notebook è organizzato in modo che ogni aspetto di produzione sia una sezione autonoma eseguibile. Il nucleo è il gestore delle richieste routing-plus-caching:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Servire dalla cache quando possibile.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Indirizzare in base alla complessità per controllare i costi.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Eseguire l'agente all'interno di uno span di tracciamento per l'osservabilità.
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("routed.model", model)
span.set_attribute("customer.id", customer_id)
response = await support_agent.run(query, model=model)
# 4. Memorizzare nella cache e restituire.
response_cache.set(normalize(query), response.text)
return response.text
Il cancello di valutazione che protegge un rilascio è così:
async def evaluation_gate(agent, test_cases, threshold: float = 0.8) -> bool:
passed = 0
for case in test_cases:
result = await agent.run(case["input"])
if score_response(result.text, case["expected"]) >= 0.8:
passed += 1
pass_rate = passed / len(test_cases)
print(f"Evaluation pass rate: {pass_rate:.0%} (gate: {threshold:.0%})")
return pass_rate >= threshold # deploya solo se il cancello passa
Leggi ogni riga — il notebook mantiene i primitivi volutamente piccoli così nulla è nascosto dietro una chiamata al framework.
Il cancello di valutazione sopra gira offline contro il tuo oggetto agente. Una volta che l’agente è distribuito come Hosted Agent, ti serve un controllo in più, ancora più economico: l’endpoint distribuito risponde davvero?
Distribuire “con successo” dimostra solo che il piano di controllo ha accettato la definizione — non dimostra che l’agente risponda. Una dipendenza mancante, un cattivo instradamento modello, o una connessione scaduta possono lasciare una distribuzione verde che non restituisce nulla. Un test smoke cattura questo problema in pochi secondi, a ogni distribuzione, senza il costo di una valutazione completa.
Questo repository include una pipeline di test smoke pronta all’uso costruita sull’azione GitHub AI Smoke Test:
tests/lesson-16-smoke-tests.json contiene prompt e asserzioni per l’agente supporto Contoso (risposte basate su policy, una ricerca ordini, mantenimento del topic e continuità multi-turno). I cataloghi per gli agenti delle altre lezioni convivono accanto — vedi tests/README.md..github/workflows/smoke-test.yml esegue il login con Azure OIDC e POSTa ogni prompt all’endpoint Responses dell’agente, fallendo il job a ogni asserzione negativa.- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
Eseguilo dalla scheda Actions una volta che il tuo agente è distribuito, fornendo il tuo endpoint del progetto Foundry e il nome dell’agente. L’identità federata necessita del ruolo Azure AI User nell’ambito del progetto Foundry. Pensa agli strati come a una piramide: i test di fumo (raggiungibile e risponde?) vengono eseguiti a ogni distribuzione, la valutazione offline (abbastanza buona per la distribuzione?) viene eseguita prima della promozione e la valutazione online (come si comporta sul campo?) viene eseguita continuamente.
Metti alla prova la tua comprensione prima di passare all’esercitazione.
1. All’incirca, quanto di un agente in produzione è “il modello”, e cos’è il resto?
2. Quando sceglieresti un Hosted Agent invece di un agente ospitato sul client?
3. Perché un agente scalabile deve essere senza stato nella propria memoria di processo?
4. Quale problema risolve il routing del modello e come si collega alla valutazione?
5. Cos’è una “evaluation gate” e dove si colloca nel ciclo di vita?
6. Perché un server MCP deve essere trattato come un confine non attendibile in produzione?
7. Quale singolo cambiamento ha di solito il maggiore impatto sul costo dell’agente in produzione, e perché?
8. Che ruolo giocano gli attributi di span come customer.tier e routed.model nell’osservabilità?
Prendi l’agente di supporto clienti dal laboratorio e rendilo resistente per uno scenario specifico: un agente di supporto per la fatturazione degli abbonamenti per una società SaaS.
La tua consegna dovrebbe:
get_subscription_status, get_invoice e issue_credit (i crediti superiori a 50 $ richiedono approvazione umana).Scrivi un breve paragrafo (in una cella markdown) che spieghi quale regola di routing del modello hai scelto e come la valuteresti con traffico reale. Non c’è una risposta giusta unica — verrai valutato sulla coerenza con cui i problemi di produzione sono collegati insieme.
In questa lezione hai portato un agente da prototipo a produzione con Microsoft Foundry:
La lezione successiva fa il percorso opposto: invece di scalare gli agenti nel cloud, li porterai giù su una singola macchina di sviluppo e li eseguirai interamente in locale.
Costruire agenti per l’uso del computer (CUA)
Disclaimer: Questo documento è stato tradotto utilizzando il servizio di traduzione AI Co-op Translator. Sebbene ci impegniamo per garantire la precisione, si prega di notare che le traduzioni automatizzate possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa deve essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un essere umano. Non siamo responsabili per eventuali malintesi o interpretazioni errate derivanti dall’uso di questa traduzione.