![]()
到目前為止,您已經建立了在筆記型電腦上運行、在筆記本中執行、由 az login 和少量環境變數驅動的代理。這正是學習的正確方式。但這並非成千上萬客戶依賴的凌晨三點穩定運作代理的正確方式。
本課程將探討「它在我的機器上運行良好」和「在生產環境中可靠且經濟地運作」之間的差距。我們將利用 Microsoft Foundry 和 Microsoft Foundry Agent Service 來彌合這個差距,並建構一個具備工具、檢索、記憶、評估和監控的真實客戶支持代理。
本課程將涵蓋:
完成本課程後,您將能夠:
本課程假設您已完成前面課程,並熟悉:
您還需要:
az login)。requirements.txt。原型代理與生產代理共享相同的核心循環—推理、呼叫工具、回應。改變的是包裹該循環的所有周邊。模型大概只佔生產代理的 20%;其他 80% 是運營骨架。
| 關注點 | 原型 | 生產 |
|---|---|---|
| 承載 | 運行於筆記本中 | 作為托管服務運行,有版本控制和推出流程 |
| 身份 | 您的 az login 令牌 |
具有限定 RBAC 的管理身份 |
| 狀態 | 在記憶體中,重啟後遺失 | 外部化(線程存儲、記憶服務) |
| 失敗處理 | 您看到錯誤追蹤 | 重試、備援、死信、警報 |
| 成本 | 「只有幾分錢」 | 每請求追蹤,路由,快取,有預算控管 |
| 品質 | 人工檢視輸出 | 每次發佈前自動評估 |
| 信任 | 您審批每項行動 | 政策規範 + 高風險行動有人審核 |
請記住此表格,下方每節內容對應其一列。
您會使用三種模式,且常混合搭配。
代理物件存在於您的應用程序進程中。您的程式碼直接呼叫模型提供者;推理循環在您的服務中執行。這就是之前所有課程的作法。
代理作為資源註冊於 Microsoft Foundry。Foundry 承載推理循環,存放線程,強制內容安全和 RBAC,並在 Foundry 入口網站中展示代理。您的應用成為簡易客戶端,負責建立線程和讀取回應。
多個代理(和工具)組成一個以明確控制流程的圖—順序步驟、分支、人為審核節點及可暫停續行的耐久檢查點。這是 Microsoft Agent Framework 工作流程 功能於部署規模的應用。
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
部署代理並非一次性的 push。這是一個循環,酷似軟體釋出週期,因為它正是軟體釋出週期。
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]
關鍵觀念,承襲自 第10課:離線評估是門檻,而非事後想法。 新版本代理必須通過評估門檻才能發佈。線上可觀察性會將真實世界失敗回饋至離線測試集合。這就是完整的循環。
擴展代理不同於擴展無狀態 Web API,因為每個請求可能觸發多次昂貴的模型和工具呼叫。有四種技術承擔大部分負載。
無狀態請求處理。 不在您的進程記憶體中保留每使用者狀態。將對話線程保存在 Foundry 線程存儲或記憶服務中,以便任何實例都能處理任意請求。這就是讓您可以水平擴展 — 新增實例,無需黏性會話。
模型路由。 並非每個請求都需用到您最強大(且最昂貴)的模型。將簡單請求—意圖分類、簡短事實性回答—路由給體積小、速度快的模型,大模型則保留給真正推理需求。Foundry 的 模型路由器 可以幫您做到這點,或者您可自行實作輕量分類器。實驗室會教您 DIY 版本。
回應快取。 許多客服查詢極為相似(「我該如何重設密碼?」)。將常見問題的答案快取起來,直接提供,不需再呼叫模型。即使中等快取命中率,也能有效降低成本和延遲。
併發與背壓。 模型供應商有速率限制。限制您的併發,使用帶指數退避的重試,且優雅失敗(比起 500,排隊回應「我們正在處理」更佳)。
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]
您無法運營看不到的系統。如第10課所述,Microsoft Agent Framework 本地生成 OpenTelemetry 追蹤—每次模型呼叫、工具調用及協調步驟都成為一個 span。於生產環境中,您將這些 span 匯出至 Microsoft Foundry(或任何 OTel 兼容後端),能夠:
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
屬性如 customer.tier 與 routed.model,是將一堆追蹤轉化為可解答問題(「企業客戶是否過度被導往小模型?」)的關鍵。
生產代理的成本主要由標記數(token)主導。三項槓桿,依重要性排序:
評估門控和成本控制是同一紀律的兩面:評估告訴您 品質底線,路由與快取則協助將成本維持在該底線之下。
治理。 托管代理繼承 Foundry 的 RBAC、內容安全與稽核記錄。為每個代理指派具最小權限的管理身份—僅有知識庫唯讀存取、限定票務 API 存取,無多餘權限。
人為介入。 某些操作過於重要,不能全自動—發送退款、刪除帳號、升級至法務團隊。Microsoft Agent Framework 支援 需審批 工具:代理提出操作,執行暫停,人員批准或拒絕後工作流程續行。您於 第6課 看到該原語;此處進行部署。
生產環境中的 MCP。 MCP 允許代理透過標準介面使用外部工具。生產中將每個 MCP 伺服器視為不受信任邊界:鎖定伺服器版本、以限定身份運行、驗證輸出,且嚴禁洩露機密。MCP 伺服器是依賴項,依賴項需修補、稽核並限制速率。
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
這三張圖—開發、部署、執行時—是在代理生命週期的三個階段。緊接著的實作坊將帶您逐步建立它。
打開 code_samples/16-python-agent-framework.ipynb,完整完成練習。您將組裝一個包含所有生產考量的 Contoso 客戶支持代理:
筆記本組織為每項生產考量均為獨立、可執行段落。核心是路由加快取的請求處理程序:
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
保護發佈的評估閘門如下:
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
請詳讀每行—筆記本故意保持基元小巧,避免隱藏在框架調用背後。
上述評估閘門會離線執行於您的代理物件。代理被部署為托管代理後,您還需一項更簡易的檢查:已部署的端點是否真有回應?
「部署成功」僅證明控制平面接受定義—不保證代理會回應。缺少依賴、模型路由錯誤、連線逾時都可能導致部署綠燈但無回應。煙霧測試能在數秒內偵測此狀況,每次部署皆執行,且成本遠低於全面評估。
本存放庫提供已組態的煙霧測試管線,基於 AI Smoke Test GitHub Action:
tests/lesson-16-smoke-tests.json 收錄 Contoso 支援代理的提示與斷言(根據政策回答、訂單查詢、保持主題及多輪線程連續性)。其他課程代理的目錄與其並列,詳見 tests/README.md。.github/workflows/smoke-test.yml 使用 Azure OIDC 登入,並對代理的 Responses 端點 POST 每條提示,任何斷言失敗即標記作業失敗。- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
部署您的代理後,從 操作 標籤中執行,並提供您的 Foundry 專案端點和代理名稱。聯邦身份需要在 Foundry 專案範圍中擁有 Azure AI 使用者 角色。可以將層級想像成金字塔:每次部署時都會執行煙霧測試(是否可達並回應?)、提升前執行離線評估(是否足夠好可出貨?),而線上評估(實際應用如何?)則持續運行。
在進入作業前先測試您的理解。
1. 大約多少比例的生產代理是「模型」,其餘的是什麼?
2. 何時會選擇託管代理而不是客戶端託管代理?
3. 為什麼可擴展的代理必須在其自身的程序記憶體中是無狀態的?
4. 模型路由解決了什麼問題,它與評估的關係是什麼?
5. 什麼是「評估閘門」,它在生命週期中位於哪裡?
6. 為什麼 MCP 伺服器在生產環境中必須被視為不受信任的邊界?
7. 通常哪個單一改變對生產代理成本影響最大?為什麼?
8. 像 customer.tier 和 routed.model 這樣的追蹤屬性在可觀察性中扮演什麼角色?
使用實驗室中的客服代理並強化以適應特定情境:一個針對 SaaS 公司的訂閱計費支援代理。
您的提交應包含:
get_subscription_status、get_invoice 和 issue_credit(超過 50 美元的點數需要人工審核)。請用一段簡短的段落(於 markdown 單元中)說明您選擇了哪個模型路由規則,以及您如何用實際流量來驗證它。沒有唯一正確答案 — 評分重點是您是否能連貫地整合生產顧慮。
本課程帶您將代理從原型轉移到微軟 Foundry 的生產環境:
下一課程將走相反的路線:不是將代理擴展至雲端,而是將它們 縮小 到單一開發者機器,完全在本地執行。
免責聲明: 此文件已使用 AI 翻譯服務 Co-op Translator 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。