隨著 AI 應用進入大規模部署階段,開發者面臨的挑戰不再僅僅是模型的能力,成本、可用性(Uptime)與延遲(Latency)變成了架構設計的核心限制。為了在多個模型或供應商之間取得平衡,Microsoft 在其 Microsoft.Extensions.AI 庫中引入了一系列新的路由與故障轉移(Failover)原語。這些機制允許開發者根據請求內容動態選擇模型,或在特定供應商失效時自動切換備援方案,而所有這些功能都統一實作在 IChatClient 介面之下,確保了高度的抽象化與可替換性。
背景與路由核心概念
在複雜的 AI 系統中,單一模型往往無法兼顧成本與效能。例如,簡單的問候不需要使用昂貴的高階模型,而複雜的程式碼分析則不能依賴小型模型。路由(Routing)的核心目的就是根據請求的特性,將其導向最合適的客戶端(Client)。
Microsoft.Extensions.AI 引入了 RoutingChatClient 作為基礎抽象類別。它在每次請求時會呼叫 SelectClientAsync 方法來決定將請求轉發給哪個 IChatClient。這種設計將選項設定分為兩個層級:請求級選項(Request-level options)存在於 RoutingContext 中,在整個請求生命週期(包含重試過程)中保持一致;而路由級選項(Route-level options)則綁定在具體的客戶端上,允許針對不同模型設定特定的參數。
基於語義的動態路由
為了實現更智慧的導向,SemanticRoutingChatClient 提供了一種基於語義相似度的路由方式。它參考了語義路由的概念,允許開發者為不同的客戶端定義一組範例短語(Example Utterances)。
運作方式是將使用者的最後一條訊息透過 Embedding(將文字轉換為高維向量的過程,以便計算語義相似度)進行向量化,並與預設的範例向量進行比對。系統會計算相似度分數,若最高分超過設定的閾值(scoreThreshold),則導向該客戶端;否則則使用預設客戶端。為了提升效能,範例的向量會採取延遲生成並快取,因此後續請求僅需對使用者輸入進行一次向量化計算。
在實務應用中,建議使用 Mean(平均值)聚合方式並設定較大的 Top-K 值(例如 Top-K 為 5),這比單純依賴最接近的單一匹配更穩定,能有效避免因使用者措辭微小差異而導致的路由跳變。
故障轉移與可用性保障
當 AI 供應商發生 API 故障或達到速率限制(Rate Limit)時,系統需要具備自動恢復能力。FailoverChatClient 擴展了路由功能,增加了一個重試迴圈。如果選定的客戶端在輸出任何內容之前失敗,它會重新觸發選擇機制並嘗試另一個客戶端。
值得注意的是,故障轉移僅在「輸出開始前」有效。一旦模型開始串流(Streaming)回傳內容給使用者,故障轉移即告終止,因為無法在串流中途無縫切換到另一個模型而不會造成使用者體驗中斷。
OrderedFailoverChatClient 則是此機制的具體實作,它允許開發者提供一個優先級列表(例如:主模型 $\rightarrow$ 備援模型 $\rightarrow$ 最後手段模型),系統會依序嘗試直到成功或所有選項耗盡。此外,透過 OnRoutingUpdateAsync 回調函數,開發者可以追蹤每個嘗試的耗時(Duration)與首個 Token 回傳時間(TimeToFirstUpdate),這為實作斷路器(Circuit Breaker)或基於延遲的動態評分提供了數據基礎。
進階實作模式與限制
除了內建類別,開發者可以利用這些原語構建更複雜的模式。例如「黏性選擇」(Sticky Selection),在多輪對話中,頻繁地在不同模型間切換會導致推理模型(Reasoning Models)的快取失效,增加計算成本並遺失供應商特定的狀態。透過將會話 ID(Session ID)儲存在 Redis 等分佈式快取中,可以確保同一個會話在整個生命週期內固定使用同一個路由路徑。
另一種高效策略是「單一模型、多級推理」。如果同一個模型支援不同的推理努力程度(Reasoning Effort),可以將其封裝成多個 IChatClient,根據請求複雜度在「低努力」與「高努力」配置之間切換,這樣既能維持 Prompt Caching 的效能,又能控制成本。
然而,目前的 RoutingChatClient 機制存在某些限制。它採取的是「先選擇、後執行」的模式,因此不適用於以下場景: 模型級聯(Model Cascading):即根據第一個模型的輸出品質決定是否交給第二個模型。 集成路由(Ensemble Routing):同時發送請求給多個模型並對結果進行投票或合併。 競賽路由(Hedging):同時發送請求給多個客戶端,取最快回傳者以降低尾端延遲。
總結而言,Microsoft.Extensions.AI 透過將路由與故障轉移標準化為 IChatClient 的實作,讓開發者能以低耦合的方式建構具備高可用性且成本可控的 AI 應用。這些功能目前在 10.9.0 版本中以實驗性(Experimental)標記發布,旨在透過社群回饋進一步優化 API 形狀與狀態管理。
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。