在執行階段切換模型與推論提供者

應用程式可以在對話的不同回合使用不同推論服務的模型。 例如,應用程式可能會根據使用者選擇、模型能力、可用性或成本來改變模型。

更改下一個請求的目的地只是路由的一部分。 新模式也需要先前的對話在相同的情境下繼續進行。 它能否接收這些上下文,取決於聊天紀錄存放在哪裡以及誰掌控它。

聊天歷史的儲存決定了可攜性

推論服務支援不同的對話狀態處理方式。 有些 API 期望呼叫者在每個請求時提供相關的訊息歷史。 其他 API 則將對話儲存在推論服務中,並讓呼叫者透過傳遞識別碼繼續對話。

歷史模型 訊息儲存地點 來電者傳送的內容
由來電者管理 在應用程式控制的記憶體或持久性儲存體中 相關的訊息歷史,以及每次請求中新增的訊息
推論服務管理 在受推論服務控制的儲存體中 服務專屬的對話或回應識別碼,以及任何新訊息。

有些推論服務透過不同的 API 或選項支援這兩種方法。 例如,OpenAI Responses 具有 store 參數,你可以將其設為 true,以使用由推論服務管理的聊天記錄;設為 false 時,則由呼叫端管理。

由來電者管理的歷程記錄支援路由功能

當呼叫者管理歷史時,可以存取先前回合的訊息。 路由器可以選擇其他型號或推論服務,呼叫者則可在下一個請求時發送這些訊息。

歷史不必留在程序記憶體中。 它可以來自應用程式擁有的耐用儲存,只要應用程式能載入並傳送到所選服務。 目的地還必須支援對話中先前使用的訊息內容與功能。

由推論服務管理的歷史限制路由

當推論服務管理歷史時,它就是對話的真實來源。 呼叫者通常保留不透明的識別碼,而非訊息本身。

該識別碼指的是原始服務所持有的州。 存取權限也可能取決於用於建立對話的帳號或專案、端點及憑證。 其他服務的客戶端無法使用該識別碼來擷取訊息。 同一服務的其他客戶端如果使用不同的範圍,也可能無法存取對話。

某項服務可能支援在其已儲存的某個對話中切換模型。 這種行為是服務特有的,不是可攜式路由。 一般路由器無法在未先取得或重建訊息前,將服務端對話轉交給其他服務提供者。

路由情境 歷史模型 Result
在不同供應商間切換車型 由來電者管理 呼叫端可以將歷史記錄重播給新模型。 新模式必須支援先前回合使用的訊息與內容類型。
在不同的推論提供者間切換 由來電者管理 來電者可以將歷史資料重播給新的服務提供者。 新提供者必須接受先前回合中使用的角色、內容類型、工具呼叫訊息及工具結果訊息。
在同一服務端對話中變更模型 推論服務管理 只有當推論服務允許現有對話在新模型中繼續時,切換才有效。 路由用戶端無法啟用這種行為。
切換到不同的推論服務 推論服務管理 新服務無法存取原服務的對話識別碼。 取回或重建訊息,並以由呼叫端管理的歷程啟動新路由。

欲了解更多關於這些儲存模式的資訊,請參閱儲存。

Agent Framework 如何實作執行時路由

代理框架可提供可攜式路由所需的呼叫者管理歷史。 在此路由模式中,聊天歷史提供者是對話的真實來源。 它可以將訊息儲存在代理會話或應用程式擁有的儲存中。

在 Agent Framework 中,來電者管理的歷史記錄包括本地會話狀態及自訂聊天歷史儲存。 由推論服務管理的歷史記錄對應到由服務管理的儲存空間。

對於 ChatClientAgent,路由聊天客戶端位於 代理管線的聊天客戶端層。 代理及其會話保持不變,路由用戶端則為每個請求選擇多個命名 IChatClient 實例之一。

路由請求遵循以下序列:

  1. 聊天紀錄提供者會載入對話紀錄。
  2. 代理人將歷史與當前回合的輸入結合。
  3. 路由用戶端會為此工作階段選取作用中的聊天用戶端。
  4. 被選中的客戶會收到完整的請求。
  5. 聊天紀錄服務會在跑完後儲存新訊息。

由於所選客戶端會接收提供者載入的歷史紀錄,應用程式可以在不手動重建對話的情況下更改路由。

.NET SDK 提供實驗性的 RoutePersistingRoutingChatClient。 使用 RoutePersistingRoutingChatClientOptions.DefaultRoute 設定初始路由,使用 GetActiveRoute 檢查工作階段的路由,並使用 SetActiveRoute 變更路由。 如果你沒有設定預設路由,客戶端會使用施工時提供的第一個路由。

還有更多路由用戶端 Microsoft.Extensions.AI ,允許進一步的路由策略。

完整 C# 實作請參見 多模型路由範例

Important

每個註冊為路由的聊天客戶端,必須使用由聊天記錄提供者提供的來電者管理歷史紀錄。 提供者可以將這些歷史記錄儲存在會話中或應用程式擁有的儲存中。 不要註冊使用推論服務管理的對話歷史的路由。

目前尚未支援 Python。

目前尚未提供 Go 支援。

下一步