![]()
到目前為止,您已構建了運行在筆記本電腦上、由 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[用戶端寄存]
A1[您的應用程式流程] --> M1[模型提供者]
end
subgraph P2[寄存代理]
A2[輕量客戶端] --> F2[Foundry 代理服務]
F2 --> M2[模型 + 工具 + 線程存儲]
end
subgraph P3[代理工作流程]
A3[協調器] --> S1[分診代理]
S1 --> S2[解析代理]
S2 --> H[人工審批節點]
H --> S3[行動代理]
end
部署代理不是一次性的 push。它是一個循環,非常像軟件發布週期,因為它就是那樣。
flowchart LR
Create[建立 / 作者] --> Version[版本]
Version --> Evaluate[離線評估]
Evaluate -->|通過閘口| Deploy[部署託管]
Evaluate -->|未通過閘口| Create
Deploy --> Observe[在線觀察]
Observe --> Improve[收集失敗]
Improve --> Create
Deploy --> Retire[退役舊版本]
關鍵理念,沿用自 第10課:離線評估是一道門檻,不是事後補充。 新版本代理不通過評估門檻將不會發布。線上可觀察性將真實失敗輸出回離線測試集。這就是整個循環。
擴展代理不同於擴展無狀態 web API,因為每個請求可能觸發多個昂貴的模型和工具調用。四種技術承擔大部分負載。
無狀態請求處理。 不在進程記憶體中保留每用戶狀態。將對話線程持久化在 Foundry 線程存儲或記憶服務,任何實例都能處理任何請求。這讓你水平擴展成為可能 — 新增實例,無需綁定會話。
模型路由。 並非每個請求都需要最強大(最昂貴)的模型。將簡單請求——意圖分類、短事實回答——路由到小而快的模型,保留大型模型處理真實推理。Foundry 的 模型路由器 可以為您做到這點,或者您可自建輕量級分類器。您會在實作中構建 DIY 版本。
回應緩存。 許多支援查詢近乎重複(「如何重設密碼?」)。緩存常見問題的答案,避免每次都調用模型。即使是適度的緩存命中率,也會顯著降低成本和延遲。
併發與背壓。 模型提供者有速率限制。限制併發數量,使用指數回退重試,並優雅失敗(一個排隊的「我們正在處理」比 500 錯誤好)。
flowchart LR
Q[使用者查詢] --> C{快取命中?}
C -->|是| R[回傳快取答案]
C -->|否| Router{複雜度?}
Router -->|簡單| SLM[細模型]
Router -->|複雜| LLM[大模型]
SLM --> Out[回應]
LLM --> Out
Out --> Store[快取 + 偵錯]
看不到就管不好。如第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")
# 代理執行會自動在此區間內被追蹤
像 customer.tier 和 routed.model 這樣的屬性,讓一堵牆的追蹤變成可回答的問題(「企業客戶是否過度路由到小模型?」)。
生產代理的成本主導是代幣。三個杠杆,按影響力排序:
評估門檻和成本控制是從兩個角度看同一件事:評估告訴您品質底線,路由和緩存使成本盡可能接近該底線。
治理。 託管代理繼承 Foundry 的 RBAC、內容安全和審計日誌。給每個代理一個最低權限的受管身份 — 對知識庫只讀,對工單 API 有作用範圍訪問,無更多權限。
人工審批。 有些操作後果太嚴重,不能全自動化—發放退款、刪除賬戶、升級到法律團隊。Microsoft Agent Framework 支持 需要審批 的工具:代理提出操作,執行暫停,人批准或拒絕,流程繼續。您在 第6課 見過原始版本;這裡將其部署。
生產中的 MCP。 MCP 使代理可通過標準接口使用外部工具。在生產環境中,將每個 MCP 服務視為不受信任邊界:釘住服務版本,用有作用域的身份運行,驗證輸出,且永不暴露秘密。MCP 服務是依賴,依賴需要打補丁、審核和速率限制。
flowchart TB
subgraph Dev[開發架構]
D1[筆記本] --> D2[代理框架]
D2 --> D3[模型供應商]
D2 --> D4[本地工具]
end
subgraph Deploy[部署架構]
E1[CI 流水線] --> E2[評估閘門]
E2 -->|通過| E3[Foundry 代理服務]
E3 --> E4[有版本的託管代理]
end
subgraph Run[執行架構]
F1[用戶端應用程式] --> F2[託管代理]
F2 --> F3[模型路由器]
F2 --> F4[Azure AI 搜尋 RAG]
F2 --> F5[記憶服務]
F2 --> F6[MCP 工具]
F2 --> F7[OTel -> Foundry 追蹤]
F2 --> F8[人為審批]
end
這三張圖 — 開發、部署、運行時 — 是同一代理在三個生命階段。接下來的實驗將帶您構建它。
開啟 code_samples/16-python-agent-framework.ipynb,從頭到尾完成。您將組裝一個 Contoso 客戶支持代理,完整連結每個生產關注點:
筆記本組織為每個生產關注點一個獨立可執行區塊。核心是路由加緩存的請求處理器:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. 儘量由快取服務。
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. 按複雜度路由以控制成本。
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. 喺追蹤跨度內運行代理以便觀察。
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. 快取並返回。
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 # 只有當門檻通過才部署
詳讀每行 — 筆記本故意讓原語保持小而細,讓沒東西藏在框架調用背後。
上述評估門檻在 離線 對代理對象執行。代理一旦部署為託管代理,您還需要一個更便宜的檢查:已部署的端點真的有回應嗎?
「成功」部署僅證明控制平面接受了定義 — 不保證代理有回答。缺少依賴、模型路由不佳或連線過期,都能導致綠燈部署卻無回應。煙霧測試秒級發現此類問題,每次部署都執行,且成本遠低於完整評估。
本存儲庫自帶基於 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
在代理已部署後,從 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 進行翻譯。雖然我們力求準確,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議尋求專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或曲解承擔責任。