![]()
Indtil dette punkt i kurset har du bygget agenter, som kører på din bærbare computer, inde i en notesbog, drevet af az login og en håndfuld miljøvariabler. Det er præcis den rigtige måde at lære på. Det er ikke den rigtige måde at køre en agent, som tusindvis af kunder er afhængige af kl. 3 om natten.
Denne lektion handler om kløften mellem “det virker på min maskine” og “det virker pålideligt og prisvenligt i produktion.” Vi lukker den kløft ved hjælp af Microsoft Foundry og Microsoft Foundry Agent Service, og vi gør det ved at bygge en ægte kundesupportagent med værktøjer, hentning, hukommelse, evaluering og overvågning.
Denne lektion vil dække:
Efter at have gennemført denne lektion vil du vide, hvordan du:
Denne lektion forudsætter, at du har gennemført tidligere lektioner og er fortrolig med:
Du får også brug for:
az login).requirements.txt.En prototypeagent og en produktionsagent deler samme kerne loop — ræsonner, kald værktøjer, svar. Det der ændrer sig, er alt, hvad der er lagt omkring denne loop. Modellen udgør måske 20 % af en produktionsagent; de øvrige 80 % er den operationelle skelett.
| Bekymring | Prototype | Produktion |
|---|---|---|
| Hosting | Kører i din notesbog | Kører som en hostet service, versioneret og rullet ud |
| Identitet | Dit az login token |
Administreret identitet med scoped RBAC |
| Tilstand | I hukommelsen, mistet ved genstart | Externaliseret (thread store, hukommelsestjeneste) |
| Fejl | Du ser traceback | Genforsøg, fallback, dead-letter, advarsler |
| Omkostning | “Det er et par øre” | Registreret per forespørgsel, routet, cached, budgetteret |
| Kvalitet | Du vurderer output visuelt | Evalueret automatisk før hver release |
| Tillid | Du godkender hver handling | Politik + menneske-i-løkken for risikable handlinger |
Hold denne tabel i baghovedet. Hvert afsnit nedenfor svarer til en af disse rækker.
Der er tre mønstre, du vil bruge, ofte i kombination.
Agent-objektet lever inden i din applikationsproces. Din kode kalder modeludbyderen direkte; ræsonnementsløkken kører i din service. Det er det, alle tidligere lektioner har gjort.
Agenten registrereres som en ressource i Microsoft Foundry. Foundry hoster ræsonnementsløkken, gemmer tråde, håndhæver indholdssikkerhed og RBAC, og gør agenten synlig i Foundry-portalen. Din app bliver en tynd klient, der opretter tråde og læser svar.
Flere agenter (og værktøjer) sammensættes til en graf med eksplicit kontrolflow — sekventielle trin, forgrening, menneskelig godkendelsesknudepunkter og holdbare checkpoints, som kan pause og genoptage. Dette er Microsoft Agent Frameworks Workflows-funktion anvendt i udrulningsskala.
flowchart TB
subgraph P1[Kunde-hostet]
A1[Din App-proces] --> M1[Modeludbyder]
end
subgraph P2[Hostet Agent]
A2[Tynd Klient] --> F2[Foundry Agent Service]
F2 --> M2[Model + Værktøjer + Tråd Lager]
end
subgraph P3[Agent Arbejdsgang]
A3[Orkestrator] --> S1[Triageringsagent]
S1 --> S2[Resolver Agent]
S2 --> H[Menneskelig Godkendelsesnode]
H --> S3[Handlingsagent]
end
At udrulle en agent er ikke et engangspush. Det er en loop, og det ligner meget et software-release-cyklus, fordi det netop er det.
flowchart LR
Create[Opret / Forfatter] --> Version[Version]
Version --> Evaluate[Evaluer offline]
Evaluate -->|godkender port| Deploy[Implementer hostet]
Evaluate -->|fejler port| Create
Deploy --> Observe[Overvåg online]
Observe --> Improve[Indsaml fejl]
Improve --> Create
Deploy --> Retire[Udgå gammel version]
Den centrale idé, videreført fra Lektion 10: offline evaluering er en port, ikke en efterskrift. En ny agentversion sendes ikke ud, medmindre den passerer dine evalueringskriterier. Online observabilitet føder så virkelige fejl tilbage til dit offline testset. Det er hele løkken.
At skalere en agent er anderledes end at skalere et stateless web-API, fordi hver forespørgsel kan udløse flere dyre model- og værktøjskald. Fire teknikker bærer det meste af belastningen.
Stateless request håndtering. Hold ingen per-bruger tilstand i din processhukommelse. Gem samtaletråde i Foundrys trådlager eller en hukommelsestjeneste, så enhver instans kan håndtere enhver forespørgsel. Det er det, der lader dig skalere horisontalt — tilføj instanser, ingen sticky sessions.
Modelrouting. Ikke alle forespørgsler behøver din mest kapable (og dyreste) model. Routed simple forespørgsler — intensklassificering, korte faktuelle svar — til en lille, hurtig model, og reserver den store model til ægte ræsonnering. Foundrys Model Router kan gøre dette for dig, eller du kan implementere en letvægtsklassifikator selv. Du vil bygge DIY-versionen i laboratoriet.
Respons-caching. Mange supportforespørgsler er næsten dubletter (“hvordan nulstiller jeg mit kodeord?”). Cache svar på almindelige spørgsmål og servér dem uden at ramme modellen overhovedet. Selv en beskeden cache-hit-rate skærer mærkbart i omkostninger og latenstid.
Samtidighed og backpressure. Modeludbydere har raterestriktioner. Begræns din samtidighed, brug genforsøg med eksponentiel backoff, og fejlhåndter yndefuldt (et køet “vi arbejder på det” svar slår en 500-fejl).
flowchart LR
Q[Brugerforespørgsel] --> C{Cache-træf?}
C -->|ja| R[Returner cachet svar]
C -->|nej| Router{Kompleksitet?}
Router -->|simpel| SLM[Lille model]
Router -->|kompleks| LLM[Stor model]
SLM --> Out[Svar]
LLM --> Out
Out --> Store[Cache + spor]
Du kan ikke drive, hvad du ikke kan se. Som dækket i Lektion 10 udsender Microsoft Agent Framework OpenTelemetry traces oprindeligt — hvert modelkald, værktøjsopkald og orkestreringstrin bliver til et span. I produktion eksporterer du disse spans til Microsoft Foundry (eller enhver OTel-kompatibel backend), så 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")
# agentudførelse spores automatisk inden for denne span
Attributter som customer.tier og routed.model er de faktorer, der forvandler en væg af traces til besvarelige spørgsmål (“bliver virksomhedskunder for ofte routed til den lille model?”).
Omkostninger i produktionsagenter domineres af tokens. Tre spjæld, i rækkefølge efter effekt:
Evalueringsporte og omkostningskontrol er den samme disciplin betragtet fra to vinkler: evaluering fortæller dig kvalitetsgulvet, routing og caching holder dig så tæt på dette gulvs omkostninger som muligt.
Styring. Hosted Agents arver Foundrys RBAC, indholdssikkerhed og revisionslogning. Giv hver agent en administreret identitet med mindst mulighed — skrivebeskyttet adgang til vidensdatabasen, scoped adgang til ticketing-API’en, ikke mere.
Menneske-i-løkken. Nogle handlinger er for vigtige til at automatisere direkte — udstedelse af refundering, sletning af konto, eskalering til en juridisk afdeling. Microsoft Agent Framework understøtter godkendelseskrævede værktøjer: agenten foreslår handlingen, udførelsen pauser, en person godkender eller afviser, og workflowen genoptages. Du så primitive i Lektion 6; her udruller du den.
MCP i produktion. MCP lader din agent bruge eksterne værktøjer via en standardiseret grænseflade. I produktion betragtes hver MCP-server som en ubetroet grænse: fastlås serverversionen, kør den med scoped identitet, valider output, og udsæt aldrig hemmeligheder for den. En MCP-server er en afhængighed, og afhængigheder opdateres, revideres og får raterestriktioner.
flowchart TB
subgraph Dev[Udviklingsarkitektur]
D1[Notesbog] --> D2[Agentrammeværk]
D2 --> D3[Modeludbyder]
D2 --> D4[Lokale værktøjer]
end
subgraph Deploy[Udrulningsarkitektur]
E1[CI-pipeline] --> E2[Evalueringsport]
E2 -->|godkendt| E3[Foundry Agent Service]
E3 --> E4[Versionsstyret hostet agent]
end
subgraph Run[Runtime-arkitektur]
F1[Klientapp] --> F2[Hostet agent]
F2 --> F3[Model-router]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[Hukommelsestjeneste]
F2 --> F6[MCP-værktøjer]
F2 --> F7[OTel -> Foundry-tracing]
F2 --> F8[Menneskelig godkendelse]
end
De tre diagrammer — udvikling, udrulning, runtime — er den samme agent på tre stadier i dens liv. Det følgende laboratorium guider dig gennem opbygningen.
Åbn code_samples/16-python-agent-framework.ipynb og gennemgå den fra ende til anden. Du vil samle en Contoso kundesupportagent med alle produktionshensyn tilsluttet:
Notesbogen er organiseret, så hvert produktionshensyn er et selvstændigt, kørbart afsnit. Kernen er routing-plus-caching request-handleren:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Server fra cache når vi kan.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Ruter efter kompleksitet for at kontrollere omkostninger.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Kør agenten inden for en trace span for observerbarhed.
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 og returner.
response_cache.set(normalize(query), response.text)
return response.text
Evalueringsporten, der beskytter en release, ser sådan ud:
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 # deploy kun hvis porten godkendes
Læs hver linje — notesbogen holder primitivene bevidst små, så intet skjules bag et framework-kald.
Evalueringsporten ovenfor kører offline mod dit agentobjekt. Når agenten er udrullet som Hosted Agent, har du brug for en mere, endnu billigere kontrol: svarer det udrullede endepunkt faktisk?
At udrulle “med succes” beviser kun, at kontrolplanet accepterede definitionen — det beviser ikke, at agenten svarer. En manglende afhængighed, en dårlig modelrouting eller en udløbet forbindelse kan give en grøn udrulning, der ikke returnerer noget. En smoke test fanger det på sekunder, ved hver udrulning, uden omkostningerne ved en fuld evaluering.
Dette repository leverer en klar-til-brug smoke-test pipeline bygget på AI Smoke Test GitHub Action:
tests/lesson-16-smoke-tests.json indeholder prompts og assertions til Contoso support agenten (forankrede politiksvar, en ordreopslagning, forblive on-topic og multi-turn tråd kontinuitet). Kataloger for andre lektions agenter ligger ved siden af — se tests/README.md..github/workflows/smoke-test.yml logger ind med Azure OIDC og POST’er hver prompt til agentens Responses-endpoint, og fejler jobbet ved ethvert 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 fra fanen Handlinger, når din agent er implementeret, og angiv dit Foundry-projekt-endpoint og agentnavn. Den fødererede identitet skal have rollen Azure AI User på Foundry-projektets scope. Tænk på lagene som en pyramide: smoke tests (tilgængelig og svarer?) kører ved hver implementering, offline evaluering (god nok til at sende i produktion?) kører før promovering, og online evaluering (hvordan klarer den sig i virkeligheden?) kører kontinuerligt.
Test din forståelse før du går videre til opgaven.
1. Cirka hvor stor en del af en produktionsagent er “modellen”, og hvad er resten?
2. Hvornår vil du vælge en Hosted Agent over en klient-hostet agent?
3. Hvorfor skal en skalerbar agent være stateless i sin egen processhukommelse?
4. Hvilket problem løser model-routing, og hvordan relaterer det til evaluering?
5. Hvad er en “evaluationsport” og hvor sidder den i livscyklussen?
6. Hvorfor bør en MCP-server behandles som en ikke-tillidfuld grænse i produktion?
7. Hvilken enkelt ændring har som regel den største indvirkning på produktionsagentens omkostninger, og hvorfor?
8. Hvilken rolle spiller span-attributter som customer.tier og routed.model i observerbarhed?
Tag kundesupportagenten fra labbet og gør den robust til et specifikt scenarie: en abonnementsfaktureringssupportagent for en SaaS-virksomhed.
Din aflevering skal:
get_subscription_status, get_invoice og issue_credit (kreditter over 50$ kræver menneskelig godkendelse).Skriv et kort afsnit (i en markdown-celle), der forklarer, hvilken model-routing-regel du valgte, og hvordan du ville validere den med reelt trafik. Der findes ikke et enkelt korrekt svar — du bliver vurderet på, om produktionsaspekterne er koblet sammen sammenhængende.
I denne lektion flyttede du en agent fra prototype til produktion med Microsoft Foundry:
Næste lektion tager den modsatte rejse: i stedet for at skalere agenter op i skyen, vil du bringe dem ned på en enkelt udviklers maskine og køre dem helt lokalt.
Ansvarsfraskrivelse: Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten Co-op Translator. Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.