![]()
Frem til nå i kurset har du bygget agenter som kjører på din bærbare PC, inne i en notatbok, drevet av az login og en håndfull miljøvariabler. Det er akkurat den riktige måten å lære på. Det er ikke den riktige måten å kjøre en agent på som tusenvis av kunder er avhengige av kl 03.00.
Denne leksjonen handler om gapet mellom “det fungerer på maskinen min” og “det fungerer, pålitelig og rimelig, i produksjon.” Vi lukker det gapet ved å bruke Microsoft Foundry og Microsoft Foundry Agent Service, og vi gjør det ved å bygge en ekte kundestøtteagent som har verktøy, henting, hukommelse, evaluering og overvåking.
Denne leksjonen vil dekke:
Etter å ha fullført denne leksjonen vil du vite hvordan du kan:
Denne leksjonen forutsetter at du har fullført de tidligere leksjonene og er komfortabel med:
Du vil også trenge:
az login).requirements.txt.En prototypeagent og en produksjonsagent deler samme kjerneløkke — resonnere, kalle verktøy, svare. Det som endrer seg er alt som er pakket rundt den løkken. Modellen utgjør kanskje 20 % av en produksjonsagent; de andre 80 % er den operative skjelettet.
| Bekymring | Prototype | Produksjon |
|---|---|---|
| Hosting | Kjører i din notatbok | Kjører som en hostet tjeneste, versjonert og rullet ut |
| Identitet | Din az login-token |
Administrert identitet med avgrenset RBAC |
| Tilstand | I minnet, mistes ved omstart | Eksternalisert (trådlagring, minnetjeneste) |
| Feil | Du ser sporet av feil | Gjentakelser, tilbakefall, døde brev, varsler |
| Kostnad | “Det er noen få cent” | Sporet per forespørsel, rutet, cachet, budsjettert |
| Kvalitet | Du vurderer utdataene | Evaluert automatisk før hver utgivelse |
| Tillitt | Du godkjenner hver handling | Policy + menneske-i-løkken for risikofylte handlinger |
Husk dette tabellen. Hver seksjon nedenfor tilsvarer en av disse radene.
Det finnes tre mønstre du vil bruke, ofte i kombinasjon.
Agentobjektet lever inne i din applikasjonsprosess. Koden din kaller modellleverandøren direkte; resonnementsløkken kjører i tjenesten din. Dette er hva alle tidligere leksjoner har gjort.
Agenten er registrert som en ressurs i Microsoft Foundry. Foundry hoster resonnementsløkken, lagrer tråder, håndhever innholdssikkerhet og RBAC, og gjør agenten synlig i Foundry-portalen. Appen din blir en tynn klient som lager tråder og leser svar.
Flere agenter (og verktøy) settes sammen til en graf med eksplisitt kontrollflyt — sekvensielle steg, grener, menneskelig godkjenningspunkter, og holdbare sjekkpunkter som kan pause og gjenoppta. Dette er Microsoft Agent Frameworks Workflows-funksjon anvendt i distribusjonsskala.
flowchart TB
subgraph P1[Klient-vert]
A1[Din appprosess] --> M1[Modellleverandør]
end
subgraph P2[Vert agent]
A2[Tynn klient] --> F2[Foundry Agent-tjeneste]
F2 --> M2[Modell + Verktøy + Trådlagring]
end
subgraph P3[Agent arbeidsflyt]
A3[Orkestrator] --> S1[Triageagent]
S1 --> S2[Resolver-agent]
S2 --> H[Menneskelig godkjenningsnode]
H --> S3[Handlingsagent]
end
Distribuere en agent er ikke en engangs push. Det er en løkke, og det ligner mye på en programvareutgivelsessyklus fordi det er akkurat det det er.
flowchart LR
Create[Opprett / Forfatter] --> Version[Versjon]
Version --> Evaluate[Evaluer offline]
Evaluate -->|passer port| Deploy[Distribuer vert]
Evaluate -->|feiler port| Create
Deploy --> Observe[Observer online]
Observe --> Improve[Samle feil]
Improve --> Create
Deploy --> Retire[Pensjoner gammel versjon]
Den viktigste ideen, hentet fra Leksjon 10: offline evaluering er en port, ikke en ettertanke. En ny agentversjon blir ikke utgitt med mindre den passerer dine evalueringsgrenser. Online observability mater deretter virkelige feil tilbake til ditt offline testsett. Det er hele løkken.
Skalering av en agent er annerledes enn skalering av et stateless web-API, fordi hver forespørsel kan utløse flere dyre modell- og verktøy-kall. Fire teknikker bærer mesteparten av belastningen.
Stateless håndtering av forespørsler. Ikke behold noen per-bruker tilstand i prosessminnet ditt. Lagre samtaletråder i Foundry trådlager eller en minnetjeneste slik at hvilken som helst instans kan håndtere enhver forespørsel. Dette lar deg skalere horisontalt — legg til instanser, ingen sticky sessions.
Modellruting. Ikke alle forespørsler trenger din mest kapable (og dyreste) modell. Ruter enkle forespørsler — intensjonsklassifisering, korte faktuelle svar — til en liten, rask modell, og reserver den store modellen til ekte resonnement. Foundrys Model Router kan gjøre dette for deg, eller du kan implementere en lettvektsklassifiserer selv. Du vil bygge gjør-det-selv versjonen i laben.
Svar-caching. Mange supportsøknader er nesten duplikater (“hvordan tilbakestiller jeg passordet mitt?”). Cache svar på vanlige spørsmål og server dem uten å treffe modellen i det hele tatt. Selv en beskjeden cache-hitrate reduserer kost og latens betydelig.
Samtidighet og backpressure. Modellleverandører har ratelimiting. Begrens samtidigheten din, bruk gjenforsøk med eksponentiell tilbakegang, og feile grasiøst (et køsystem “vi jobber med det” er bedre enn en 500).
flowchart LR
Q[Brukerforespørsel] --> C{Hurtigbuffer treff?}
C -->|ja| R[Returner hurtigbufret svar]
C -->|nei| Router{Kompleksitet?}
Router -->|enkel| SLM[Lite modell]
Router -->|kompleks| LLM[Stor modell]
SLM --> Out[Svar]
LLM --> Out
Out --> Store[Hurtigbuffer + spor]
Du kan ikke drifte det du ikke kan se. Som dekket i Leksjon 10, emitterer Microsoft Agent Framework OpenTelemetry spor innfødt — hvert modellkall, verktøysinvokasjon og orkestreringssteg blir en span. I produksjon eksporterer du disse span-ene til Microsoft Foundry (eller hvilken som helst OTel-kompatibel backend) slik at 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")
# agentutførelse spores automatisk inne i dette spennet
Attributter som customer.tier og routed.model er det som forvandler en vegg av spor til besvarbare spørsmål (“blir bedriftskunder for ofte rutet til den lille modellen?”).
Kostnaden i produksjonsagenter domineres av tokens. Tre spaker, i rekkefølge etter effekt:
Evalueringsporter og kostnadskontroll er samme disiplin sett fra to vinkler: evaluering forteller deg kvalitetsgulvet, ruting og caching holder deg så nær gulvets kostnad som mulig.
Styring. Hostede agenter arver Foundrys RBAC, innholdssikkerhet og revisjonsloggen. Gi hver agent en administrert identitet med minste nødvendige privilegier — skrivebeskyttet tilgang til kunnskapsbasen, begrenset tilgang til billett-API-et, ikke mer.
Menneske-i-løkken. Noen handlinger er for viktige til å automatiseres rett ut — utstede refusjon, slette konto, eskalere til en juridisk avdeling. Microsoft Agent Framework støtter godkjenning-påkrevd verktøy: agenten foreslår handlingen, utførelse pauser, et menneske godkjenner eller avviser, og arbeidsflyten gjenopptas. Du så primitive i Leksjon 6; her distribuerer du den.
MCP i produksjon. MCP lar agenten din konsumere eksterne verktøy via en standardgrensesnitt. I produksjon bør du behandle hver MCP-server som en ikke-tillitsfull grense: fest serverversjonen, kjør den med en avgrenset identitet, valider utdata, og eksponer aldri hemmeligheter for den. En MCP-server er en avhengighet, og avhengigheter patcher, reviderer og begrenser duppet.
flowchart TB
subgraph Dev[Utviklingsarkitektur]
D1[Notatbok] --> D2[Agent-rammeverk]
D2 --> D3[Modellleverandør]
D2 --> D4[Lokale verktøy]
end
subgraph Deploy[Distribusjonsarkitektur]
E1[CI-pipeline] --> E2[Evalueringsport]
E2 -->|godkjent| E3[Foundry Agent-tjeneste]
E3 --> E4[Versjonert hostet agent]
end
subgraph Run[Kjøretidsarkitektur]
F1[Klientapp] --> F2[Hostet agent]
F2 --> F3[Modell-ruter]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[Hukommelsestjeneste]
F2 --> F6[MCP-verktøy]
F2 --> F7[OTel -> Foundry sporing]
F2 --> F8[Menneskelig godkjenning]
end
De tre diagrammene — utvikling, distribusjon, kjøretid — er samme agent i tre faser av livet. Laben som følger går deg gjennom hvordan du bygger den.
Åpne code_samples/16-python-agent-framework.ipynb og arbeid deg gjennom den fra start til slutt. Du vil sette sammen en Contoso kundestøtteagent med alle produksjonsbekymringer koblet inn:
Notatboken er organisert slik at hver produksjonsbekymring er en selvstendig, kjørbar seksjon. Kjernen er ruting-pluss-caching forespørselshåndtereren:
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 etter kompleksitet for å kontrollere kostnad.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Kjør agenten inne i en sporingsspan for observerbarhet.
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 som vokter en utgivelse ser slik ut:
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 # distribuer kun hvis porten passerer
Les hver linje — notatboken holder primitive bevisst små slik at ingenting er skjult bak et rammeverkskall.
Evalueringsporten ovenfor kjøres offline mot agentobjektet ditt. Når agenten er distribuert som en Hosted Agent, trenger du én sjekk til, som er enda rimeligere: svarer egentlig det distribuerte endepunktet?
Å distribuere “vellykket” beviser bare at kontrollplanet aksepterte definisjonen — det beviser ikke at agenten svarer. En manglende avhengighet, feil modellruting, eller en utløpt tilkobling kan etterlate en grønn distribusjon som ikke returnerer noe. En røyktest fanger dette på sekunder, ved hver distribusjon, uten kostnaden av en full evaluering.
Dette depotet leverer en klar-til-bruk røyktestpipeline bygget på AI Smoke Test GitHub Action:
tests/lesson-16-smoke-tests.json inneholder prompt og påstander for Contoso supportagenten (grunnlagte policy-svar, en ordreoppslag, holde seg på tema, og flerspors-sammenheng). Kataloger for andre leksjoners agenter ligger ved siden av — se tests/README.md..github/workflows/smoke-test.yml logger inn med Azure OIDC og POSTer hver prompt til agentens Responses-endepunkt, og feiler jobben ved ethvert påstandsbrot.- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
Kjør det fra Actions-fanen når agenten din er implementert, og oppgi endepunktet for Foundry-prosjektet og agentnavnet ditt. Den fødererte identiteten trenger rollen Azure AI User i Foundry-prosjektets omfang. Tenk på lagene som en pyramide: røyktester (er den tilgjengelig og svarer?) kjører ved hver deploy, offline evaluering (god nok til å sende i produksjon?) kjører før promotering, og online evaluering (hvordan går det i felt?) kjører kontinuerlig.
Test forståelsen din før du går videre til oppgaven.
1. Omtrent hvor stor del av en produksjonsagent er “modellen,” og hva er resten?
2. Når ville du valgt en Hosted Agent fremfor en klient-hostet agent?
3. Hvorfor må en skalerbar agent være tilstandsløs i sin egen prosessminne?
4. Hvilket problem løser modellruting, og hvordan henger det sammen med evaluering?
5. Hva er en “evaluering-port” og hvor befinner den seg i livssyklusen?
6. Hvorfor bør en MCP-server behandles som en uautorisert grense i produksjon?
7. Hvilken enkelt endring har vanligvis størst innvirkning på kostnadene for produksjonsagenten, og hvorfor?
8. Hvilken rolle spiller span-attributter som customer.tier og routed.model i observabilitet?
Ta kundestøtteagenten fra laboratoriet og styrk den for et spesifikt scenario: en abonnementsfaktureringsstøtteagent for et SaaS-selskap.
Innsendingen din skal:
get_subscription_status, get_invoice, og issue_credit (kreditter over 50 $ krever menneskelig godkjenning).Skriv et kort avsnitt (i en markdown-celle) som forklarer hvilken modellrutingregel du valgte og hvordan du ville validere den med ekte trafikk. Det finnes ikke ett riktig svar — du blir vurdert på om produksjonsbekymringene er koblet sammen koherent.
I denne leksjonen flyttet du en agent fra prototype til produksjon med Microsoft Foundry:
Neste leksjon tar motsatt vei: i stedet for å skalere agenter opp i skyen, vil du bringe dem ned på én utviklermaskin og kjøre dem helt lokalt.
Bygge datamaskinbrukagenter (CUA)
Ansvarsfraskrivelse: Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten Co-op Translator. Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det opprinnelige dokumentet på originalspråket skal betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.