![]()
到目前為止,你已經建構了在你的筆記型電腦上運行的代理,透過筆記本內執行,使用 az login 及少數環境變數來驅動。這確實是學習的正確方式。但這並不是讓數千用戶凌晨 3 點依賴的代理運行的正確方式。
本課程講授「在我機器上可用」和「在生產環境中可靠且實惠地可用」之間的差距。我們將使用 Microsoft Foundry 和 Microsoft Foundry Agent Service 來縮小這個差距,並透過構建具有工具調用、檢索、記憶、評估和監控功能的真實客戶支援代理來實現。
本課程將涵蓋:
完成本課程後,你將會瞭解如何:
本課程假設你已完成先前課程並對以下內容熟悉:
你還需要:
az login)。requirements.txt 內套件。原型代理和生產代理共享相同的核心循環 — 推理、呼叫工具、回應。改變的是包裹該循環的所有周邊。模型約佔生產代理的20%;其餘80%是操作骨架。
| 關注點 | 原型 | 生產 |
|---|---|---|
| 託管方式 | 運行於你的筆記本中 | 作為託管服務運行,具版本控制與分批推出 |
| 身份 | 你的 az login 令牌 |
具範圍 RBAC 的受管理身份 |
| 狀態 | 記憶體內,重啟時消失 | 外部化(線程存儲、記憶服務) |
| 故障 | 你看到追蹤堆疊 | 重試、後備、死信、警告 |
| 成本 | 「只有幾分錢」 | 按請求計費,路由,快取,預算控管 |
| 品質 | 你目視輸出 | 每次發佈前自動評估 |
| 信任 | 你批准每個行動 | 風險操作有政策 + 人工審核介入 |
請記住本表格。以下每個章節都對應到其中一行。
你將使用三種模式,且經常組合使用。
代理物件在你的應用程序進程內。你的代碼直接呼叫模型提供者;推理循環在你的服務中运行。這就是之前所有課程所示範的方式。
代理被註冊為 Microsoft Foundry 中的資源。Foundry 託管推理循環,存儲線程,實施內容安全與 RBAC,並在 Foundry 入口網站中顯示代理。你的應用程序變為輕量用戶端,建立線程並讀取回應。
多個代理(和工具)被組合為具明確控制流的圖形 — 包含順序步驟、分支、人工作業節點,以及可暫停與恢復的持久化檢查點。這是 Microsoft Agent Framework Workflows 功能在部署規模上的應用。
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 的 Model Router 可以替你做到,或你也可以自己實作輕量分類器。你會在實驗中構建 DIY 版本。
回應快取。 很多客服查詢都很類似(「我如何重設密碼?」)。快取常見問題答案,直接提供回應,完全不用碰模型。即使是中度的快取命中率也能明顯降低成本和延遲。
併發與背壓。 模型提供者有速率限制。限制併發度,使用指數退避重試,並優雅失敗(排隊回覆「我們正在處理」總比伺服器錯誤好)。
flowchart LR
Q[使用者查詢] --> C{快取命中?}
C -->|是| R[回傳快取答案]
C -->|否| Router{複雜度?}
Router -->|簡單| SLM[小型模型]
Router -->|複雜| LLM[大型模型]
SLM --> Out[回應]
LLM --> Out
Out --> Store[快取 + 追蹤]
「看不到就無法運營」。同第10課說明,Microsoft Agent Framework 原生輸出 OpenTelemetry 跟蹤 — 每次模型呼叫、工具調用和編排步驟變成一個 tracing 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")
# 程式代理的執行會在此區段中自動追蹤
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
在您的代理部署後,從 操作 標籤頁執行,並提供您的 Foundry 專案端點與代理名稱。聯邦身份需對 Foundry 專案作用域擁有 Azure AI User 角色。將這些層次想像成一個金字塔:煙霧測試(是否可達且有回應?)在每次部署時執行,離線評估(是否足夠好到可以發布?)在升級前執行,線上評估(實際運行狀況如何?)則持續執行。
在進入作業前測試您的理解。
1. 大約生產代理中「模型」佔多大比例,剩下的是什麼?
2. 何時會選擇 Hosted Agent 而非由客戶端託管的代理?
3. 為什麼可擴展代理必須在其自身程序記憶體中保持無狀態?
4. 模型路由解決了什麼問題?它與評估有何關聯?
5. 什麼是「評估閘門」,它在生命周期的何處?
6. 為什麼 MCP 伺服器在生產環境中應被視為不受信任的邊界?
7. 通常哪個單一變更對生產代理成本影響最大?為什麼?
8. customer.tier 和 routed.model 這類 span 屬性在可觀察性中扮演什麼角色?
以實驗室中的客戶支援代理為基礎,並針對特定場景強化:SaaS 公司的訂閱計費支援代理。
您的提交應包含:
get_subscription_status、get_invoice 與 issue_credit(超過 50 美元的信用額需人員核准)。撰寫一段簡短摘要(在 markdown 儲存格中),說明您選擇的模型路由規則,以及如何用真實流量驗證它。無單一正確答案,評估重點在生產考量是否彼此銜接合理。
本課程中,您將代理從原型推進到 Microsoft Foundry 的生產:
下一課程將走反方向旅程:您將把代理從雲端向下帶到單一開發者機器,完全本地執行。
免責聲明: 此文件已使用 AI 翻譯服務 Co-op Translator 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。