![]()
Fram till denna punkt i kursen har du byggt agenter som körs på din bärbara dator, inuti en anteckningsbok, drivna av az login och några miljövariabler. Det är precis rätt sätt att lära sig på. Det är inte rätt sätt att köra en agent som tusentals kunder är beroende av klockan 3 på morgonen.
Den här lektionen handlar om gapet mellan “det funkar på min maskin” och “det funkar, pålitligt och prisvärt, i produktion.” Vi stänger det gapet med hjälp av Microsoft Foundry och Microsoft Foundry Agent Service, och gör det genom att bygga en riktig kundsupportagent som har verktyg, hämtning, minne, utvärdering och övervakning.
Den här lektionen kommer att täcka:
Efter att ha slutfört denna lektion kommer du att kunna:
Den här lektionen förutsätter att du har gjort de tidigare lektionerna och är bekväm med:
Du behöver också:
az login).requirements.txt.En prototypeagent och en produktionsagent delar samma kärnloop — resonera, anropa verktyg, svara. Vad som ändras är allt som är omslutet runt den loopen. Modellen är kanske 20 % av en produktionsagent; de andra 80 % är den operationella skelettet.
| Aspekt | Prototyp | Produktion |
|---|---|---|
| Hosting | Körs i din anteckningsbok | Körs som en hostad tjänst, versionerad och ut rullad |
| Identitet | Din az login-token |
Hanterad identitet med avgränsad RBAC |
| Tillstånd | I minnet, förloras vid omstart | Externiserat (tråd-lagring, minnestjänst) |
| Fel | Du ser felspårningen | Försök igen, fallback, död-brevlåda, larm |
| Kostnad | “Det är några ören” | Spåras per förfrågan, routas, cachas, budgeteras |
| Kvalitet | Du granskare utdata | Utvärderas automatiskt före varje release |
| Förtroende | Du godkänner varje åtgärd | Policy + människa-i-slingan för riskfyllda åtgärder |
Tänk på denna tabell. Varje avsnitt nedan motsvarar en av dessa rader.
Det finns tre mönster du kommer att använda, ofta i kombination.
Agentobjektet lever inuti din applikationsprocess. Din kod anropar modellleverantören direkt; resonemangsloopen körs i din tjänst. Detta är vad varje tidigare lektion har gjort.
Agenten är registrerad som en resurs i Microsoft Foundry. Foundry hostar resonemangsloopen, lagrar trådar, upprätthåller innehållssäkerhet och RBAC, och gör agenten synlig i Foundry-portalen. Din app blir en tunn klient som skapar trådar och läser svar.
Flera agenter (och verktyg) komponerade i en graf med explicit kontrollflöde — sekventiella steg, grenindelning, mänskliga godkännandenoder, och hållbara kontrollpunkter som kan pausa och återuppta. Detta är Microsoft Agent Frameworks Workflows-funktion använde i distributionsskala.
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
Att distribuera en agent är inte en engångshändelse push. Det är en loop, och det liknar mycket en mjukvarureleasecykel eftersom det är precis vad det är.
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]
Nyckelidén, hämtad från Lektion 10: offline-utvärdering är en port, inte en eftertanke. En ny agentversion levereras inte om den inte klarar dina utvärderingströsklar. Online-observerbarhet matar sedan verkliga fel tillbaka in i din offline-testuppsättning. Det är hela loopen.
Att skala en agent skiljer sig från att skala ett tillståndslöst webb-API, eftersom varje förfrågan kan trigga flera kostsamma modell- och verktygsanrop. Fyra tekniker bär det mesta av lasten.
Tillståndslös förfråganhantering. Behåll inget användarspecifikt tillstånd i processminnet. Persistenta konversations-trådar i Foundrys trådlager eller en minnestjänst så att vilken instans som helst kan hantera vilken förfrågan som helst. Detta är vad som låter dig skala horisontellt — lägg till instanser, inga klibbiga sessioner.
Modellruttning. Inte varje förfrågan behöver din mest kapabla (och dyraste) modell. Rutt enkla förfrågningar — avsiktsklassificering, kortfattade faktasvar — till en liten, snabb modell, och reservera den stora modellen för verkligt resonemang. Foundrys Model Router kan göra detta åt dig, eller så kan du implementera en lättviktsklassificerare själv. Du bygger DIY-versionen i labbet.
Svarscachelagring. Många supportfrågor är nästan dubletter (“hur återställer jag mitt lösenord?”). Cachera svar på vanliga frågor och leverera dem utan att träffa modellen alls. Även en modest cacheträfffrekvens minskar kostnad och latens betydligt.
Samtidighet och tryckavlastning. Modellleverantörer har hastighetsbegränsningar. Begränsa din samtidighet, använd försök igen med exponentiell backoff, och feila snyggt (ett köat “vi jobbar på det”-svar är bättre än ett 500-fel).
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]
Du kan inte driva det du inte kan se. Som täcks i Lektion 10, emitterar Microsoft Agent Framework OpenTelemetry-spårningar nativt — varje modellanrop, verktygsanrop och orkestreringssteg blir en span. I produktion exporterar du dessa spans till Microsoft Foundry (eller någon OTel-kompatibel backend) så att du kan:
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
Attribut som customer.tier och routed.model är vad som förvandlar en vägg av spårningar till besvarbara frågor (“blir företagskunder routade till den lilla modellen för ofta?”).
Kostnaden i produktionsagenter domineras av tokens. Tre spakar, i ordning efter påverkan:
Utvärderingsportar och kostnadskontroll är samma disciplin sedd från två vinklar: utvärdering talar om kvalitetsgolvet, ruttning och caching håller dig så nära golvets kostnad som möjligt.
Styrning. Hostade agenter ärva Foundrys RBAC, innehållssäkerhet och revisionsloggning. Ge varje agent en hanterad identitet med minsta privilegium den behöver — läsbehörighet till kunskapsbasen, avgränsad åtkomst till ärende-API:et, inget mer.
Människa-i-slingan. Vissa åtgärder är för viktiga för att automatiseras rakt av — utfärda återbetalning, radera ett konto, eskalera till en juridisk avdelning. Microsoft Agent Framework stöder godkännande-krävande verktyg: agenten föreslår åtgärden, exekveringen pausas, en människa godkänner eller avvisar, och arbetsflödet fortsätter. Du såg primitivet i Lektion 6; här distribuerar du det.
MCP i produktion. MCP låter din agent använda externa verktyg genom ett standardgränssnitt. I produktion behandla varje MCP-server som en opålitlig gräns: fixa serverversionen, kör den med avgränsad identitet, validera dess resultat och exponera aldrig hemligheter för den. En MCP-server är ett beroende, och beroenden patchas, granskas och får hastighetsbegränsningar.
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
Dessa tre diagram — utveckling, distribution, körning — är samma agent i tre livsstadier. Labbet som följer går igenom att bygga den.
Öppna code_samples/16-python-agent-framework.ipynb och arbeta igenom den från början till slut. Du kommer att sätta ihop en Contoso kundsupportagent med alla produktionskrav inkopplade:
Anteckningsboken är organiserad så att varje produktionsaspekt är en självständig, körbar sektion. Hjärtat i den är routning-plus-cachehanteraren:
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
Utvärderingsporten som skyddar en release ser ut så här:
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
Läs varje rad — anteckningsboken håller primitivena medvetet små så att inget är dolt bakom en ramverksanrop.
Utvärderingsporten ovan körs offline mot ditt agentobjekt. När agenten är distribuerad som Hosted Agent behöver du en till, ännu billigare kontroll: svarar den distribuerade endpointen faktiskt?
Att distribuera “framgångsrikt” bevisar bara att kontrollplanet accepterade definitionen — det bevisar inte att agenten svarar. En saknad beroende, en felaktig modellruttning eller en utgången anslutning kan lämna en grön distribution som inte returnerar något. Ett röktest fångar det på sekunder, vid varje distribution, utan kostnaden för en full utvärdering.
Detta förvar levereras med en färdig att använda röktestpipeline byggd på AI Smoke Test GitHub Action:
tests/lesson-16-smoke-tests.json innehåller prompts och påståenden för Contoso supportagent (grundade policy-svar, en orderuppslagning, hålla sig ämnesrelaterad och kontinuitet i flera svängar). Kataloger för andra lektionsagenter finns bredvid — se tests/README.md..github/workflows/smoke-test.yml loggar in med Azure OIDC och POST-ar varje prompt till agentens Responses-endpoint, misslyckas jobbet vid varje påståendefel.- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
Kör det från fliken Actions när din agent är distribuerad, och ange din Foundry-projektendpoint och agentnamn. Den federerade identiteten behöver rollen Azure AI User på Foundry-projektets nivå. Tänk på lagren som en pyramid: röktester (tillgänglig och svarar?) körs vid varje distribution, offline utvärdering (bra nog för att leverera?) körs innan befordran, och online utvärdering (hur går det i verkligheten?) körs kontinuerligt.
Testa din förståelse innan du går vidare till uppgiften.
1. Ungefär hur stor del av en produktionsagent är “modellen” och vad är resten?
2. När skulle du välja en Hosted Agent framför en klienthostad agent?
3. Varför måste en skalbar agent vara stateless i sin egen processminne?
4. Vilket problem löser modellriktning och hur relaterar det till utvärdering?
5. Vad är en “utvärderingsgrind” och var sitter den i livscykeln?
6. Varför bör en MCP-server behandlas som en otillförlitlig gräns i produktion?
7. Vilken enskild förändring har oftast störst påverkan på produktionsagentens kostnad, och varför?
8. Vilken roll spelar spanattribut som customer.tier och routed.model i observabilitet?
Ta kundsupportagenten från labbet och förstärk den för ett specifikt scenario: en prenumerationsfaktureringssupportagent för ett SaaS-företag.
Din inlämning ska:
get_subscription_status, get_invoice, och issue_credit (krediter över 50 dollar kräver mänskligt godkännande).Skriv ett kort stycke (i en markdowncell) som förklarar vilken modellroutningsregel du valde och hur du skulle validera den med verklig trafik. Det finns inget enda rätt svar — du bedöms på om produktionsaspekterna är sammanfogade på ett koherent sätt.
I denna lektion gick du från prototyp till produktion med Microsoft Foundry:
Nästa lektion tar motsatt väg: istället för att skala upp agenter i molnet tar du ner dem till en utvecklarmaskin och kör dem helt lokalt.
Bygga Computerrustningsagenter (CUA)
Ansvarsfriskrivning: Detta dokument har översatts med hjälp av AI-översättningstjänsten Co-op Translator. Även om vi strävar efter noggrannhet, var vänlig notera att automatiska översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess modersmål bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för några missförstånd eller feltolkningar som uppstår till följd av användningen av denna översättning.