![]()
Fram till denna punkt i kursen har du byggt agenter som körs på din bärbara dator, inuti en notebook, drivna av az login och ett par 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.
Denna lektion handlar om gapet mellan “det fungerar på min maskin” och “det fungerar, pålitligt och prisvärt, i produktion.” Vi stänger det gapet med hjälp av Microsoft Foundry och Microsoft Foundry Agent Service, och vi 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 genomfört denna lektion kommer du att veta hur man:
Denna lektion förutsätter att du har slutfört tidigare lektioner och är bekväm med:
Du kommer också behöva:
az login).requirements.txt.En prototype-agent och en produktionsagent delar samma kärnloop — resonera, anropa verktyg, svara. Vad som förändras är allt runt omkring den loopen. Modellen är kanske 20 % av en produktionsagent; de andra 80 % är den operativa skeletten.
| Aspekt | Prototyp | Produktion |
|---|---|---|
| Hosting | Körs i din notebook | Körs som en hostad tjänst, versioneras och rullas ut |
| Identitet | Din az login-token |
Hanterad identitet med scoped RBAC |
| State | I minnet, förloras vid omstart | Extern lagring (trådstore, minnestjänst) |
| Felhantering | Du ser tracebaken | Omgångsförsök, fallback, dead-letter, larm |
| Kostnad | “Det är några cent” | Spåras per förfrågan, ruttas, cachelagras, budgeteras |
| Kvalitet | Du granskar resultaten | Utvärderas automatiskt före varje release |
| Förtroende | Du godkänner varje åtgärd | Policy + människa i loopen för riskfyllda åtgärder |
Ha denna tabell i åtanke. Varje sektion nedan motsvarar en av dessa rader.
Det finns tre mönster du kommer använda, ofta i kombination.
Agentobjektet lever inuti din applikationsprocess. Din kod anropar modellleverantören direkt; resonemangsloopen körs i din tjänst. Det här ä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) är sammansatta i en graf med explicit kontrollflöde — sekventiella steg, förgrening, mänskliga godkännandenoder och hållbara checkpoints som kan pausas och återupptas. Detta är Microsoft Agent Frameworks Workflows-funktion tillämpad i distributionsskala.
flowchart TB
subgraph P1[Klienthostad]
A1[Din App-process] --> M1[Modellleverantör]
end
subgraph P2[Hostad Agent]
A2[Tunn Klient] --> F2[Foundry Agent-tjänst]
F2 --> M2[Modell + Verktyg + Trådlager]
end
subgraph P3[Agentarbetsflöde]
A3[Orkestrator] --> S1[Triage-agent]
S1 --> S2[Lösningsagent]
S2 --> H[Mänsklig Godkännandenod]
H --> S3[Aktionsagent]
end
Att distribuera en agent är inte ett engångs-push. Det är en loop, och det liknar mycket en mjukvarurelasecykel eftersom det är precis vad det är.
flowchart LR
Create[Skapa / Författare] --> Version[Version]
Version --> Evaluate[Utvärdera offline]
Evaluate -->|passerar grind| Deploy[Distribuera värdbaserat]
Evaluate -->|misslyckas vid grind| Create
Deploy --> Observe[Observera online]
Observe --> Improve[Samla in fel]
Improve --> Create
Deploy --> Retire[Pensionera gammal version]
Kärnidén, hämtad från Lektion 10: offline-utvärdering är en grind, inte en eftertanke. En ny agentversion skickas inte ut om den inte klarar dina utvärderingströsklar. Online-observerbarhet matar sedan tillbaka verkliga fel till ditt offline-testset. Det är hela loopen.
Att skala en agent skiljer sig från att skala ett stateless webb-API, eftersom varje förfrågan kan utlösa flera dyra modell- och verktygsanrop. Fyra tekniker bär större delen av belastningen.
Stateless förfrågningshantering. Behåll inget användar-specifikt tillstånd i din processminne. Spara samtalstrådar i Foundrys trådstore 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 kräver din mest kapabla (och dyraste) modell. Rutta enkla förfrågningar — avsiktsklassificering, korta faktabaserade svar — till en liten, snabb modell och reservera den stora modellen för äkta resonemang. Foundrys Model Router kan göra detta åt dig, eller så kan du implementera en lättviktsklassificerare själv. Du kommer att bygga en gör-det-själv-version i labbet.
Caching av svar. Många supportfrågor är nästan dubbletter (“hur återställer jag mitt lösenord?”). Cachea svar på vanliga frågor och leverera dem utan att alls anropa modellen. Även en måttlig cacheträffrate skär avsevärt kostnad och latens.
Samtidighet och backpressure. Modellleverantörer har hastighetsbegränsningar. Begränsa din samtidighet, använd omförsök med exponentiell backoff och faila snyggt (ett köat “vi arbetar på det”-svar är bättre än en 500).
flowchart LR
Q[Användarfråga] --> C{Cach träff?}
C -->|ja| R[Returnera cachad svar]
C -->|nej| Router{Komplexitet?}
Router -->|enkel| SLM[Liten modell]
Router -->|komplex| LLM[Stor modell]
SLM --> Out[Svar]
LLM --> Out
Out --> Store[Cache + spårning]
Du kan inte styra det du inte kan se. Som täcktes 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")
# agentens körning spåras automatiskt inom detta spann
Attribut som customer.tier och routed.model är det som förvandlar en vägg av spårningar till besvarbara frågor (“blir företagskunder alltför ofta ruttade till den lilla modellen?”).
Kostnaden i produktionsagenter domineras av tokens. Tre spakar, i ordning efter påverkan:
Utvärderingsgrindar och kostnadskontroll är samma disciplin sett från två vinklar: utvärdering berättar kvalitetsgolvet, medan ruttning och caching håller dig så nära det golvets kostnad som möjligt.
Styrning. Hostade agenter ärv det Foundrys RBAC, innehållssäkerhet och revisionsloggning. Ge varje agent en hanterad identitet med minsta privilegier den behöver — läsbehörighet till kunskapsbasen, scopad åtkomst till ärende-API:et, inget mer.
Människa i loopen. Vissa åtgärder är för betydande för att automatiseras helt — utfärda återbetalning, radera ett konto, eskalera till en juridisk avdelning. Microsoft Agent Framework stödjer godkännande-krävande verktyg: agenten föreslår handling, exekveringen pausas, en människa godkänner eller avvisar och arbetsflödet fortsätter. Du såg denna primitiv i Lektion 6; här distribuerar du den.
MCP i produktion. MCP låter din agent använda externa verktyg via ett standardgränssnitt. I produktion behandlar du varje MCP-server som en opålitlig gräns: fasttöm serverversion, kör med scopad identitet, validera dess output och exponera aldrig hemligheter till den. En MCP-server är en beroende komponent, och beroenden patchas, granskas och hastighetsbegränsas.
flowchart TB
subgraph Dev[Utvecklingsarkitektur]
D1[Anteckningsbok] --> D2[Agentramverk]
D2 --> D3[Modellleverantör]
D2 --> D4[Lokala verktyg]
end
subgraph Deploy[Driftsarkitektur]
E1[CI-pipeline] --> E2[Utvärderingsgrind]
E2 -->|godkänd| E3[Foundry Agent-tjänst]
E3 --> E4[Versionerad värdagent]
end
subgraph Run[Körningsarkitektur]
F1[Klientapp] --> F2[Värdagent]
F2 --> F3[Modellrouter]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[Minnestjänst]
F2 --> F6[MCP-verktyg]
F2 --> F7[OTel -> Foundry-spårning]
F2 --> F8[Mänskligt godkännande]
end
De tre diagrammen — utveckling, distribution, runtime — visar samma agent i tre stadier av dess liv. Labbet som följer går igenom hur du bygger den.
Öppna code_samples/16-python-agent-framework.ipynb och arbeta dig igenom den från början till slut. Du kommer att sätta ihop en Contoso kundsupportagent med alla produktionsaspekter inkopplade:
Notebooken är organiserad så varje produktionsbekymmer är en självständig, körbar sektion. Kärnan är request-handlern med routning plus caching:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Servera från cache när vi kan.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Rauta efter komplexitet för att kontrollera kostnad.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Kör agenten inom en spårningsspan för observabilitet.
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. Cachea och returnera.
response_cache.set(normalize(query), response.text)
return response.text
Utvärderingsgrinden 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 # distribuera endast om porten godkänns
Läs varje rad — notebooken håller primitiva funktioner medvetet små så att inget är dolt bakom ett ramverksanrop.
Utvärderingsgrinden ovan körs offline mot ditt agentobjekt. När agenten är distribuerad som en Hostad Agent behöver du en kontroll till, ännu billigare: svarar den distribuerade endpointen faktiskt?
Att distribuera “framgångsrikt” bevisar bara att kontrollplanet accepterade definitionen — det bevisar inte att agenten svarar. En saknad beroende, felaktig modellruttning eller en utgången anslutning kan lämna en grön distribution som inte returnerar någonting. Ett smoketest fångar detta på sekunder, vid varje distribution, utan kostnaden för en fullständig utvärdering.
Detta repository levereras med en redo-att-använda smoketestpipeline byggd på AI Smoke Test GitHub Action:
tests/lesson-16-smoke-tests.json innehåller promptar och assertioner för Contoso-supportagenten (grundade policy-svar, en orderuppslagning, ämneshållning och trådkontinuitet över flera vändor). Kataloger för andra lektioners agenter finns parallellt — se tests/README.md..github/workflows/smoke-test.yml loggar in med Azure OIDC och POSTar varje prompt till agentens Responses-endpoint, misslyckar jobbet vid varje assertion miss.- 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 (nåbar och svarar?) körs vid varje distribution, offlineutvärdering (tillräckligt bra för leverans?) körs före promotion, och onlineutvärdering (hur presterar den 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 modellroutning, 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 betraktas som en opålitlig 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 span-attribut som customer.tier och routed.model i observerbarhet?
Ta kundsupportagenten från labbet och förstärk den för ett specifikt scenario: en prenumerations- och faktureringssupportagent för ett SaaS-företag.
Din inlämning ska:
get_subscription_status, get_invoice och issue_credit (krediter över $50 kräver mänskligt godkännande).Skriv ett kort stycke (i en markdown-cell) där du 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å hur väl produktionsaspekterna är kopplade samman.
I denna lektion flyttade du en agent från prototyp till produktion med Microsoft Foundry:
Nästa lektion tar motsatt resa: istället för att skala upp agenter i molnet, ska du ta ner dem till en enskild utvecklarmaskin och köra dem helt lokalt.
Bygga datoranvändaragenter (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.