![]()
到目前為止,本課程你已經建立了在筆記本電腦上運行的代理,透過 az login 和少量環境變數驅動。這是學習的正確方式。但這並非讓數千客戶依賴、深夜 3 點穩定運行代理的正確方式。
本課程討論「只在我機器可運行」與「穩定且經濟地在生產環境運行」之間的鴻溝。我們將使用 Microsoft Foundry 與 Microsoft Foundry 代理服務 來彌補這個差距,並透過建置一個具備工具、檢索、記憶、評估與監控的真實客服代理來實現。
本課程將涵蓋:
完成本課程後,你將學會如何:
本課程假設你已完成早期課程,並熟悉:
你還需要:
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 的 模型路由器 可為你完成此事,或你可自行實作輕量分類器。實驗室中你將構建此自助版本。
回應快取。 許多客服查詢幾乎是重複問題(「如何重設密碼?」)。快取常見問題答案,無需調用模型直接回應。即使是適度的快取命中率,也能顯著降低成本和延遲。
併發與背壓。 模型提供者有限速限制。限制你的併發量,使用帶指數退避的重試,並優雅失敗(一個排隊中的「我們正在處理」回應優於 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 追蹤 — 每次模型調用、工具呼叫及編排步驟皆成為一個跨度。生產環境中,你會將這些跨度匯出到 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 登入,並將每個提示 POST 至代理的 Responses 端點,任一斷言失敗則使任務失敗。- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
當你的代理部署完成後,請在 Actions 標籤頁中運行它,並提供你的 Foundry 專案端點和代理名稱。聯邦身份需要在 Foundry 專案範疇中擁有 Azure AI User 角色。把這些層次想像成一個金字塔:冒煙測試(是否可達且有回應?)會在每次部署時執行,離線評估(是否足夠良好可上線?)會在晉升前執行,線上評估(在實際運行中表現如何?)則持續執行。
在進入作業之前,先測試你的理解。
1. 大約生產代理中「模型」佔多少比例,剩下的是什麼?
2. 何時會選擇 Hosted Agent 而非用戶端托管代理?
3. 為何可擴展代理必須在其自身進程記憶體中保持無狀態?
4. 模型路由解決了什麼問題,且與評估有何關聯?
5. 何謂「評估閘門」,它位於生命週期的哪個階段?
6. 為什麼 MCP 伺服器在生產環境中應被視為不可信邊界?
7. 哪個單一變更通常對生產代理成本影響最大?為什麼?
8. 像 customer.tier 和 routed.model 這類追蹤屬性在可觀察性中扮演什麼角色?
以實驗室的客戶支援代理為基礎,針對特定場景強化它:一家 SaaS 公司的訂閱計費支援代理。
你的提交應該包括:
get_subscription_status、get_invoice、以及 issue_credit(超過 50 美元需人工核准)。撰寫一小段(在 markdown 儲存格中)說明你所選的模型路由規則,以及你將如何用實際流量驗證它。沒有唯一正確答案——評估重點是各項生產面向是否連結有序。
本課中你將代理從原型推向 Microsoft Foundry 的生產:
下一課將走相反的路線:不再將代理擴展到雲端,而是將它們縮小到單一開發者機器並完全在本地運行。
免責聲明: 本文件由 AI 翻譯服務 Co-op Translator 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。