![]()
到目前為止,您已經構建了在筆記本內、透過 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[持續整合流程] --> 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 登入並將每個提示 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 用戶 角色。可以把這些層次想像成金字塔:每次部署時執行煙霧測試(是否可達且有回應?),促銷前執行離線評估(是否足夠好可發布?),持續執行線上評估(實際狀況如何?)。
在進入作業前,先測試你的理解程度。
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 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。