應用程式可以在對話的不同回合使用不同推論服務的模型。 例如,應用程式可能會根據使用者選擇、模型能力、可用性或成本來改變模型。
更改下一個請求的目的地只是路由的一部分。 新模式也需要先前的對話在相同的情境下繼續進行。 它能否接收這些上下文,取決於聊天紀錄存放在哪裡以及誰掌控它。
聊天歷史的儲存決定了可攜性
推論服務支援不同的對話狀態處理方式。 有些 API 期望呼叫者在每個請求時提供相關的訊息歷史。 其他 API 則將對話儲存在推論服務中,並讓呼叫者透過傳遞識別碼繼續對話。
| 歷史模型 | 訊息儲存地點 | 來電者傳送的內容 |
|---|---|---|
| 由來電者管理 | 在應用程式控制的記憶體或持久性儲存體中 | 相關的訊息歷史,以及每次請求中新增的訊息 |
| 推論服務管理 | 在受推論服務控制的儲存體中 | 服務專屬的對話或回應識別碼,以及任何新訊息。 |
有些推論服務透過不同的 API 或選項支援這兩種方法。 例如,OpenAI Responses 具有 store 參數,你可以將其設為 true,以使用由推論服務管理的聊天記錄;設為 false 時,則由呼叫端管理。
由來電者管理的歷程記錄支援路由功能
當呼叫者管理歷史時,可以存取先前回合的訊息。 路由器可以選擇其他型號或推論服務,呼叫者則可在下一個請求時發送這些訊息。
歷史不必留在程序記憶體中。 它可以來自應用程式擁有的耐用儲存,只要應用程式能載入並傳送到所選服務。 目的地還必須支援對話中先前使用的訊息內容與功能。
由推論服務管理的歷史限制路由
當推論服務管理歷史時,它就是對話的真實來源。 呼叫者通常保留不透明的識別碼,而非訊息本身。
該識別碼指的是原始服務所持有的州。 存取權限也可能取決於用於建立對話的帳號或專案、端點及憑證。 其他服務的客戶端無法使用該識別碼來擷取訊息。 同一服務的其他客戶端如果使用不同的範圍,也可能無法存取對話。
某項服務可能支援在其已儲存的某個對話中切換模型。 這種行為是服務特有的,不是可攜式路由。 一般路由器無法在未先取得或重建訊息前,將服務端對話轉交給其他服務提供者。
| 路由情境 | 歷史模型 | Result |
|---|---|---|
| 在不同供應商間切換車型 | 由來電者管理 | 呼叫端可以將歷史記錄重播給新模型。 新模式必須支援先前回合使用的訊息與內容類型。 |
| 在不同的推論提供者間切換 | 由來電者管理 | 來電者可以將歷史資料重播給新的服務提供者。 新提供者必須接受先前回合中使用的角色、內容類型、工具呼叫訊息及工具結果訊息。 |
| 在同一服務端對話中變更模型 | 推論服務管理 | 只有當推論服務允許現有對話在新模型中繼續時,切換才有效。 路由用戶端無法啟用這種行為。 |
| 切換到不同的推論服務 | 推論服務管理 | 新服務無法存取原服務的對話識別碼。 取回或重建訊息,並以由呼叫端管理的歷程啟動新路由。 |
欲了解更多關於這些儲存模式的資訊,請參閱儲存。
Agent Framework 如何實作執行時路由
代理框架可提供可攜式路由所需的呼叫者管理歷史。 在此路由模式中,聊天歷史提供者是對話的真實來源。 它可以將訊息儲存在代理會話或應用程式擁有的儲存中。
在 Agent Framework 中,來電者管理的歷史記錄包括本地會話狀態及自訂聊天歷史儲存。 由推論服務管理的歷史記錄對應到由服務管理的儲存空間。
對於 ChatClientAgent,路由聊天客戶端位於 代理管線的聊天客戶端層。 代理及其會話保持不變,路由用戶端則為每個請求選擇多個命名 IChatClient 實例之一。
路由請求遵循以下序列:
- 聊天紀錄提供者會載入對話紀錄。
- 代理人將歷史與當前回合的輸入結合。
- 路由用戶端會為此工作階段選取作用中的聊天用戶端。
- 被選中的客戶會收到完整的請求。
- 聊天紀錄服務會在跑完後儲存新訊息。
由於所選客戶端會接收提供者載入的歷史紀錄,應用程式可以在不手動重建對話的情況下更改路由。
.NET SDK 提供實驗性的 RoutePersistingRoutingChatClient。 使用 RoutePersistingRoutingChatClientOptions.DefaultRoute 設定初始路由,使用 GetActiveRoute 檢查工作階段的路由,並使用 SetActiveRoute 變更路由。 如果你沒有設定預設路由,客戶端會使用施工時提供的第一個路由。
還有更多路由用戶端 Microsoft.Extensions.AI ,允許進一步的路由策略。
完整 C# 實作請參見 多模型路由範例 。
Important
每個註冊為路由的聊天客戶端,必須使用由聊天記錄提供者提供的來電者管理歷史紀錄。 提供者可以將這些歷史記錄儲存在會話中或應用程式擁有的儲存中。 不要註冊使用推論服務管理的對話歷史的路由。
目前尚未支援 Python。
目前尚未提供 Go 支援。