![]()
Finora nel corso hai costruito agenti che funzionano sul tuo portatile, 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 è il modo giusto per eseguire un agente su cui migliaia di clienti fanno affidamento alle 3 del mattino.
Questa lezione riguarda il divario tra “funziona sulla mia macchina” e “funziona, in modo affidabile ed economicamente vantaggioso, in produzione.” Colmiamo questo divario usando Microsoft Foundry e il Microsoft Foundry Agent Service, costruendo un vero agente di supporto clienti che include strumenti, recupero, memoria, valutazione e monitoraggio.
Questa lezione coprirà:
Dopo aver completato questa lezione, saprai come:
Questa lezione presuppone che tu abbia completato le lezioni precedenti e ti senta a tuo agio con:
Avrai inoltre bisogno di:
az login).requirements.txt.Un agente prototipo e un agente di produzione condividono lo stesso ciclo centrale — ragionare, chiamare strumenti, rispondere. Quello che cambia è tutto ciò che avvolge quel ciclo. Il modello rappresenta forse il 20% di un agente di produzione; l’altro 80% è lo scheletro operativo.
| Aspetto | Prototipo | Produzione |
|---|---|---|
| Hosting | Funziona nel tuo notebook | Funziona 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) |
| Errore | Vedi il traceback | Ritenta, fallback, dead-letter, avvisi |
| Costo | “Sono pochi centesimi” | Tracciato per richiesta, instradato, memorizzato nella cache, con budget |
| Qualità | Controlli l’output a occhio | Valutato automaticamente prima di ogni rilascio |
| Fiducia | Approvi ogni azione | Politica + intervento umano per azioni rischiose |
Tieni a mente questa tabella. Ogni sezione qui sotto corrisponde a una di queste righe.
Esistono tre modelli che userai, spesso in combinazione.
L’oggetto agente risiede all’interno del processo della tua applicazione. Il tuo codice chiama direttamente il provider del modello; il ciclo di ragionamento gira nel tuo servizio. Questo è ciò che ogni lezione precedente ha fatto.
L’agente è registrato come risorsa in Microsoft Foundry. Foundry ospita il ciclo di ragionamento, memorizza i thread, impone 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 risposte.
Molti agenti (e strumenti) sono composti in un grafo con flusso di controllo esplicito — passaggi sequenziali, diramazioni, nodi di approvazione umana e checkpoint durevoli che possono mettere in pausa e riprendere. Questa è la funzionalità Workflows del Microsoft Agent Framework applicata alla scala della distribuzione.
flowchart TB
subgraph P1[Client-Hosted]
A1[Your App Process] --> M1[Model Provider]
end
subgraph P2[Hosted Agent]
A2[Thin Client] --> F2[Foundry Agent Service]
F2 --> M2[Model + Tools + Thread Store]
end
subgraph P3[Agent Workflow]
A3[Orchestrator] --> S1[Triage Agent]
S1 --> S2[Resolver Agent]
S2 --> H[Human Approval Node]
H --> S3[Action Agent]
end
Distribuire un agente non è un’operazione una tantum push. È un ciclo, e assomiglia molto a un ciclo di rilascio software perché è proprio questo.
flowchart LR
Create[Create / Author] --> Version[Version]
Version --> Evaluate[Evaluate offline]
Evaluate -->|passes gate| Deploy[Deploy hosted]
Evaluate -->|fails gate| Create
Deploy --> Observe[Observe online]
Observe --> Improve[Collect failures]
Improve --> Create
Deploy --> Retire[Retire old version]
L’idea chiave, derivata da Lezione 10: la valutazione offline è una porta, non un ripensamento. Una nuova versione dell’agente non viene distribuita se non supera le soglie di valutazione. L’osservabilità online poi reinserisce i guasti reali nel set di test offline. Questo è tutto il ciclo.
Scalare un agente è diverso dal scalare un’API web senza stato, perché ogni richiesta può attivare molteplici chiamate costose a modelli e strumenti. Quattro tecniche gestiscono la maggior parte del carico.
Gestione senza stato della richiesta. Non conservare stato per utente nella memoria del tuo processo. Conserva i thread della conversazione nel thread store di Foundry o in un servizio di memoria così ogni istanza può gestire qualsiasi richiesta. Questo ti permette di scalare orizzontalmente — aggiungi istanze, niente sessioni sticky.
Instradamento del modello. Non ogni richiesta necessita il modello più potente (e costoso). Instrada richieste semplici — classificazione dell’intento, risposte fattuali brevi — verso un modello piccolo e veloce, e riserva il modello grande per il vero ragionamento. Il Model Router di Foundry può fare questo per te, oppure puoi implementare un classificatore leggero da solo. Costruirai la versione fai-da-te nel laboratorio.
Caching della risposta. Molte domande di supporto sono quasi duplicati (“come resetto la password?”). Memorizza in cache le risposte alle domande comuni e servile senza chiamare affatto il modello. Anche un modesto tasso di hit in cache riduce significativamente costi e latenza.
Concorrenza e backpressure. I provider di modelli hanno limiti di velocità. Limita la concorrenza, usa ritentativi con backoff esponenziale e fallisci in modo elegante (una risposta in coda tipo “stiamo lavorando” è meglio di un 500).
flowchart LR
Q[User query] --> C{Cache hit?}
C -->|yes| R[Return cached answer]
C -->|no| Router{Complexity?}
Router -->|simple| SLM[Small model]
Router -->|complex| LLM[Large model]
SLM --> Out[Response]
LLM --> Out
Out --> Store[Cache + trace]
Non puoi gestire ciò che non puoi vedere. Come mostrato nella Lezione 10, Microsoft Agent Framework emette tracce OpenTelemetry nativamente — ogni chiamata modello, invocazione strumento e passaggio di orchestrazione diventa uno span. In produzione esporti quegli span a Microsoft Foundry (o a qualsiasi backend compatibile OTel) 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")
# agent execution is traced automatically inside this span
Attributi come customer.tier e routed.model trasformano una montagna di tracce in domande rispondibili (“i clienti enterprise vengono instradati troppo spesso verso il modello piccolo?”).
Il costo negli agenti di produzione è dominato dai token. Tre leve, in ordine di impatto:
Porte di valutazione e controllo dei costi sono la stessa disciplina vista da due angolazioni: la valutazione ti dice il pavimento qualitativo, l’instradamento e caching ti mantengono il più vicino possibile al costo di quel pavimento.
Governance. Gli Hosted Agents ereditano RBAC, sicurezza dei contenuti e audit logging di Foundry. Dai a ogni agente un’identità gestita con il minimo privilegio necessario — accesso in sola lettura alla knowledge base, accesso limitato all’API ticket, niente di più.
Intervento umano nel ciclo. Alcune azioni sono troppo importanti per essere automatizzate completamente — emettere un rimborso, cancellare un account, passare a un 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 rifiuta, e il workflow riprende. Hai visto il primitivo nella Lezione 6; qui lo distribuisci.
MCP in produzione. MCP permette al tuo agente di usare strumenti esterni tramite un’interfaccia standard. In produzione tratta ogni server MCP come un confine non affidabile: fissa la versione del server, eseguilo con un’identità limitata, convalida l’output e non esporre mai segreti. Un server MCP è una dipendenza, e le dipendenze vanno patchate, controllate e limitate.
flowchart TB
subgraph Dev[Development Architecture]
D1[Notebook] --> D2[Agent Framework]
D2 --> D3[Model Provider]
D2 --> D4[Local tools]
end
subgraph Deploy[Deployment Architecture]
E1[CI pipeline] --> E2[Evaluation gate]
E2 -->|pass| E3[Foundry Agent Service]
E3 --> E4[Versioned hosted agent]
end
subgraph Run[Runtime Architecture]
F1[Client app] --> F2[Hosted agent]
F2 --> F3[Model Router]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[Memory service]
F2 --> F6[MCP tools]
F2 --> F7[OTel -> Foundry tracing]
F2 --> F8[Human approval]
end
Quelli tre diagrammi — sviluppo, distribuzione, runtime — sono lo stesso agente in tre fasi della sua vita. Il laboratorio che segue ti guida nella sua costruzione.
Apri code_samples/16-python-agent-framework.ipynb e lavoraci dall’inizio alla fine. Assemblerai un agente di supporto clienti Contoso con ogni preoccupazione di produzione integrata:
Il notebook è organizzato in modo che ogni preoccupazione di produzione sia una sezione autonoma e eseguibile. Il cuore è il gestore delle richieste con instradamento e caching:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Serve from cache when we can.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Route by complexity to control cost.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Run the agent inside a trace span for observability.
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. Cache and return.
response_cache.set(normalize(query), response.text)
return response.text
La porta di valutazione che protegge una release appare 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 # only deploy if the gate passes
Leggi ogni riga — il notebook mantiene i primitivi volutamente piccoli così nulla è nascosto dietro una chiamata di framework.
La porta di valutazione sopra funziona offline sul tuo oggetto agente. Una volta che l’agente è distribuito come Hosted Agent, serve un controllo ulteriore, ancora più economico: l’endpoint distribuito risponde effettivamente?
Distribuire “con successo” dimostra solo che il piano di controllo ha accettato la definizione — non prova che l’agente risponda. Una dipendenza mancante, un errato instradamento modello o una connessione scaduta possono lasciare una distribuzione verde che però non risponde. Un smoke test lo rileva in pochi secondi, ad ogni distribuzione, senza il costo di una valutazione completa.
Questo repository include una pipeline di smoke-test pronta all’uso costruita sull’azione GitHub AI Smoke Test:
tests/lesson-16-smoke-tests.json contiene prompt e asserzioni per l’agente di supporto Contoso (risposte policy fondate, ricerca ordini, mantenere l’argomento, continuità multi-turno). Cataloghi per agenti di altre lezioni vivono accanto — vedi tests/README.md..github/workflows/smoke-test.yml si autentica con Azure OIDC e POSTa ogni prompt all’endpoint Risposte dell’agente, fallendo il job su qualsiasi asserzione errata.- 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 punto di accesso del progetto Foundry e il nome dell’agente. L’identità federata necessita del ruolo Azure AI User a livello di ambito del progetto Foundry. Pensa agli strati come a una piramide: i test smoke (raggiungibile e risponde?) vengono eseguiti ad ogni distribuzione, la valutazione offline (abbastanza buona per la distribuzione?) viene eseguita prima della promozione, e la valutazione online (come si comporta in situazioni reali?) viene eseguita continuamente.
Metti alla prova la tua comprensione prima di passare all’assegnazione.
1. Approssimativamente, quanto di un agente in produzione è “il modello” e cosa rappresenta il resto?
2. Quando sceglieresti un Agente Hostato rispetto a un agente ospitato dal 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’è un “evaluation gate” e dove si colloca nel ciclo di vita?
6. Perché un server MCP deve essere trattato come un confine non affidabile in produzione?
7. Quale singola modifica ha di solito l’impatto maggiore sul costo di un 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 rafforzalo per uno scenario specifico: un agente di supporto alla fatturazione per abbonamenti per una società SaaS.
La tua consegna dovrebbe:
get_subscription_status, get_invoice e issue_credit (crediti superiori a $50 richiedono l’approvazione umana).Scrivi un breve paragrafo (in una cella markdown) spiegando quale regola di routing del modello hai scelto e come la convalideresti con traffico reale. Non esiste una risposta univoca corretta — sarai valutato sulla coerenza con cui i requisiti di produzione sono integrati.
In questa lezione hai spostato un agente da prototipo a produzione con Microsoft Foundry:
La lezione successiva compie il percorso opposto: invece di scalare gli agenti verso il cloud, li porterai giù su un singolo computer di sviluppo e li eseguirai interamente localmente.
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.