![]()
Tot nu toe in de cursus heb je agents gebouwd die op je laptop draaien, binnen een notebook, gestuurd door az login en een paar omgevingsvariabelen. Dat is precies de juiste manier om te leren. Het is niet de juiste manier om een agent te laten draaien waarop duizenden klanten om 3 uur ‘s nachts vertrouwen.
Deze les gaat over de kloof tussen “het werkt op mijn machine” en “het werkt betrouwbaar en betaalbaar in productie.” We overbruggen die kloof met Microsoft Foundry en de Microsoft Foundry Agent Service, door een echte klantenservice-agent te bouwen die beschikt over tools, retrieval, geheugen, evaluatie en monitoring.
Deze les behandelt:
Na het voltooien van deze les weet je hoe je:
Voor deze les wordt ervan uitgegaan dat je de eerdere lessen hebt afgerond en vertrouwd bent met:
Je hebt ook nodig:
az login).requirements.txt.Een prototype-agent en een productie-agent delen dezelfde kernloop — redeneren, tools aanroepen, antwoorden. Wat verandert is alles wat die loop omsluit. Het model is misschien 20% van een productie-agent; de overige 80% is het operationele skelet.
| Zorgpunt | Prototype | Productie |
|---|---|---|
| Hosting | Draait in je notebook | Draait als een gehoste dienst, geversioneerd en uitgerold |
| Identiteit | Je az login token |
Beheerde identiteit met gerichte RBAC |
| Status | In geheugen, verloren bij herstart | Geëxternaliseerd (thread store, geheugenservice) |
| Foutafhandeling | Je ziet de tracebacks | Herhalingen, fallback, dead-letter, waarschuwingen |
| Kosten | “Het is een paar centen” | Bijgehouden per verzoek, gerouteerd, gecached, begroot |
| Kwaliteit | Je beoordeelt de output visueel | Automatisch geëvalueerd voor elke release |
| Vertrouwen | Je keurt elke actie goed | Beleidsregels + menselijke handeling bij risicovolle acties |
Houd deze tabel in gedachten. Elke onderstaande sectie correspondeert met één van deze rijen.
Er zijn drie patronen die je zult gebruiken, vaak in combinatie.
Het agentobject leeft binnen jouw applicatieproces. Je code roept direct de modelprovider aan; de redeneringsloop draait in jouw service. Dit is wat elke vorige les heeft gedaan.
De agent is geregistreerd als een resource in Microsoft Foundry. Foundry host de redeneringsloop, slaat threads op, dwingt contentveiligheid en RBAC af, en maakt de agent zichtbaar in het Foundry-portaal. Je app wordt een dunne client die threads aanmaakt en reacties leest.
Meerdere agents (en tools) worden gecomprimeerd in een netwerk met expliciete controleflow — opeenvolgende stappen, vertakkingen, menselijke goedkeuringsknopen, en duurzame checkpoints die kunnen pauzeren en hervatten. Dit is de Microsoft Agent Framework Workflows-functionaliteit toegepast op productieschaal.
flowchart TB
subgraph P1[Client-gehost]
A1[Jouw app-proces] --> M1[Modelprovider]
end
subgraph P2[Gehoste agent]
A2[Dunne client] --> F2[Foundry-agentdienst]
F2 --> M2[Model + Tools + Thread Store]
end
subgraph P3[Agent-werkstroom]
A3[Orkestrator] --> S1[Triage-agent]
S1 --> S2[Resolver-agent]
S2 --> H[Menselijke goedkeuringsknoop]
H --> S3[Actie-agent]
end
Het implementeren van een agent is geen eenmalige push. Het is een lus en lijkt sterk op een software-releasecyclus omdat het precies dat is.
flowchart LR
Create[Maak / Auteur] --> Version[Versie]
Version --> Evaluate[Offline evalueren]
Evaluate -->|slaagt poort| Deploy[Gehost implementeren]
Evaluate -->|faalt poort| Create
Deploy --> Observe[Online observeren]
Observe --> Improve[Verzamel fouten]
Improve --> Create
Deploy --> Retire[Oude versie uitfaseren]
Het kernidee, overgenomen uit Les 10: offline evaluatie is een poort, geen bijzaak. Een nieuwe agentversie wordt niet vrijgegeven tenzij deze je evaluatiedrempels haalt. Online observeerbaarheid voedt dan echte storingen terug in je offline testset. Dat is de hele cyclus.
Het opschalen van een agent verschilt van het opschalen van een stateless web-API, omdat elk verzoek meerdere dure model- en toolaanroepen kan triggeren. Vier technieken dragen het meeste bij.
Stateless verzoekafhandeling. Hou geen per-gebruiker status in je procesgeheugen. Bewaar conversatiedraden in de Foundry thread store of een geheugenservice zodat elk exemplaar elk verzoek kan afhandelen. Dit maakt horizontaal schalen mogelijk — extra exemplaren toevoegen, geen sticky sessions.
Modelrouting. Niet elk verzoek heeft je meest capabele (en duurste) model nodig. Routeer eenvoudige verzoeken — intentieclassificatie, korte feitelijke antwoorden — naar een klein, snel model en reserveer het grote model voor echte redenering. Foundry’s Model Router kan dit voor je regelen, of je kunt zelf een lichte classifier implementeren. Je bouwt de doe-het-zelf versie in het lab.
Responscaching. Veel ondersteuningsvragen zijn vrijwel identiek (“hoe reset ik mijn wachtwoord?”). Cache antwoorden op veelgestelde vragen en dien ze zonder modelaanroep. Zelfs een bescheiden cache hit-rate verlaagt kosten en latentie aanzienlijk.
Gelijktijdigheid en backpressure. Modelproviders hebben snelheidslimieten. Beperk je gelijktijdigheid, gebruik herhalingen met exponentiële achterstand, en faal gracieus (een wachtrij-antwoord “we zijn ermee bezig” is beter dan een 500-fout).
flowchart LR
Q[Gebruikersvraag] --> C{Cache treffer?}
C -->|ja| R[Retourneer gecachte antwoord]
C -->|nee| Router{Complexiteit?}
Router -->|eenvoudig| SLM[Klein model]
Router -->|complex| LLM[Groot model]
SLM --> Out[Antwoord]
LLM --> Out
Out --> Store[Cache + trace]
Je kunt niet bedienen wat je niet kunt zien. Zoals besproken in Les 10, emit het Microsoft Agent Framework OpenTelemetry traces native — elke modelaanroep, toolaanroep en orkestratiestap wordt een span. In productie exporteer je die spans naar Microsoft Foundry (of elke OTel-compatibele backend) zodat je kunt:
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")
# agentuitvoering wordt automatisch gevolgd binnen deze span
Attributen zoals customer.tier en routed.model veranderen een muur van traces in beantwoordbare vragen (“worden enterprise-klanten te vaak naar het kleine model gerouteerd?”).
Kosten in productieagents worden gedomineerd door tokens. Drie hefbomen, in volgorde van impact:
Evaluatiepoorten en kostenbeheersing zijn dezelfde discipline bekeken vanuit twee invalshoeken: evaluatie geeft je de kwaliteitsvloer, routing en caching houden je zo dicht mogelijk bij die vloer qua kosten.
Governance. Hosted Agents erven Foundry’s RBAC, contentveiligheid en audit logging. Geef elke agent een beheerde identiteit met de minste privileges die het nodig heeft — alleen-lezen toegang tot de kennisbasis, gerichte toegang tot de ticketing-API, niet meer.
Menselijke handeling. Sommige acties zijn te zwaarwegend om volledig te automatiseren — een terugbetaling uitvoeren, een account verwijderen, escaleren naar een juridisch team. Het Microsoft Agent Framework ondersteunt goedkeuringsvereiste tools: de agent stelt de actie voor, uitvoering pauzeert, een mens keurt goed of wijst af, en de workflow gaat door. Je zag het element in Les 6; hier implementeer je het.
MCP in productie. MCP laat je agent externe tools gebruiken via een standaardinterface. In productie behandel je elke MCP-server als een niet-vertrouwde grens: pin de serverversie, draai het met een gerichte identiteit, valideer de output, en geef nooit geheimen bloot. Een MCP-server is een afhankelijkheid, en afhankelijkheden worden gepatcht, geaudit en gelimiteerd.
flowchart TB
subgraph Dev[Ontwikkelingsarchitectuur]
D1[Notebook] --> D2[Agent Framework]
D2 --> D3[Modelprovider]
D2 --> D4[Lokale tools]
end
subgraph Deploy[Implementatiearchitectuur]
E1[CI-pijplijn] --> E2[Evaluatiepoort]
E2 -->|geslaagd| E3[Foundry Agent Service]
E3 --> E4[Gehoste agent met versiebeheer]
end
subgraph Run[Runtime-architectuur]
F1[Client-app] --> F2[Gehoste agent]
F2 --> F3[Modelrouter]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[Geheugendienst]
F2 --> F6[MCP-tools]
F2 --> F7[OTel -> Foundry-tracing]
F2 --> F8[Menselijke goedkeuring]
end
Die drie diagrammen — ontwikkeling, implementatie, runtime — zijn dezelfde agent in drie levensfasen. Het lab erna leidt je door het bouwen ervan.
Open code_samples/16-python-agent-framework.ipynb en werk het van begin tot eind door. Je zet een Contoso klantenservice-agent in elkaar met elke productiezorg erin verweven:
Het notebook is zo georganiseerd dat elke productiezorg een zelfstandige, uitvoerbare sectie is. Het hart ervan is de routing-plus-caching verzoekafhandelaar:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Serveren vanuit de cache wanneer mogelijk.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Routeren op complexiteit om de kosten te beheersen.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Voer de agent uit binnen een trace-span voor observeerbaarheid.
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 en retourneer.
response_cache.set(normalize(query), response.text)
return response.text
De evaluatiepoort die een release bewaakt ziet er zo uit:
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 # alleen implementeren als de poort slaagt
Lees elke regel — het notebook houdt de primitieve functies bewust klein zodat niets verstopt zit achter een framework-aanroep.
De evaluatiepoort hierboven draait offline tegen je agentobject. Zodra de agent als Hosted Agent is geïmplementeerd, heb je nog één extra, zelfs goedkopere controle nodig: geeft het geïmplementeerde endpoint daadwerkelijk antwoord?
“Succesvol” implementeren bewijst alleen dat het controlevlak de definitie accepteerde — het bewijst niet dat de agent reageert. Een ontbrekende afhankelijkheid, een slechte modelrouting, of een verlopen verbinding kunnen leiden tot een groene implementatie die niets teruggeeft. Een smoke test vangt dat in seconden, bij elke implementatie, zonder de kosten van een volledige evaluatie.
Deze repository bevat een kant-en-klare smoke-test pipeline gebouwd op de AI Smoke Test GitHub Action:
tests/lesson-16-smoke-tests.json bevat prompts en assertions voor de Contoso support agent (gegronde beleidsantwoorden, een orderopvraag, thematisch blijven, en multi-turn thread continuïteit). Catalogi voor andere lessen met agents staan ernaast — zie tests/README.md..github/workflows/smoke-test.yml logt in met Azure OIDC en POST elke prompt naar het Responses endpoint van de agent, faalt de taak bij elke mislukte assertion.- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
Voer het uit vanaf het Actions-tabblad zodra je agent is ingezet, waarbij je je Foundry-projectendpoint en agentnaam opgeeft. De gefedereerde identiteit heeft de rol Azure AI User nodig binnen de scope van het Foundry-project. Zie de lagen als een piramide: rooktests (bereikbaar en reagerend?) worden bij elke uitrol uitgevoerd, offline evaluatie (goed genoeg om uit te rollen?) loopt voorafgaand aan promotie, en online evaluatie (hoe presteert het in de praktijk?) draait continu.
Test je begrip voordat je naar de opdracht gaat.
1. Ongeveer hoeveel van een productie-agent is ‘het model,’ en wat is de rest?
2. Wanneer kies je voor een Hosted Agent boven een client-gehoste agent?
3. Waarom moet een schaalbare agent stateless zijn in het procesgeheugen?
4. Welk probleem lost modelroutering op, en hoe relateert dat aan evaluatie?
5. Wat is een “evaluatiepoort” en waar zit deze in de levenscyclus?
6. Waarom moet een MCP-server in productie worden behandeld als een niet-vertrouwde grens?
7. Welke enkele verandering heeft meestal de grootste impact op de kosten van een productie-agent, en waarom?
8. Welke rol spelen span-attributen zoals customer.tier en routed.model in observeerbaarheid?
Pak de klantenservice-agent uit het lab en versterk deze voor een specifiek scenario: een abonnement facturatie-ondersteuningsagent voor een SaaS-bedrijf.
Je inzending moet:
get_subscription_status, get_invoice en issue_credit (credits boven de $50 vereisen menselijke goedkeuring).Schrijf een korte paragraaf (in een markdown cel) waarin je uitlegt welke modelrouteringsregel je gekozen hebt en hoe je die zou valideren met echt verkeer. Er is geen eenduidig correct antwoord — je wordt beoordeeld op of de productie-overwegingen samenhangend zijn verbonden.
In deze les heb je een agent van prototype naar productie gebracht met Microsoft Foundry:
De volgende les maakt de omgekeerde reis: in plaats van agents op te schalen naar de cloud, breng je ze omlaag naar één ontwikkelaarmachine en draait ze volledig lokaal.
Computer Use Agents (CUA) bouwen
Disclaimer: Dit document is vertaald met behulp van de AI vertaaldienst Co-op Translator. Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.