应用程序可以将来自不同推理服务的模型用于会话的不同轮次。 例如,应用程序可能会根据用户选择、模型功能、可用性或成本更改模型。
更改下一个请求的目标只是路由的一部分。 新模型还需要之前的对话内容,才能在相同的上下文中继续进行。 它是否可以接收该上下文取决于聊天历史记录的存储位置以及控制聊天历史记录的人员。
聊天历史记录存储确定可移植性
推理服务支持以不同方式处理对话状态。 某些 API 要求调用方为每个请求提供相关的消息历史记录。 其他 API 将会话存储在推理服务中,并通过传递标识符让调用方继续聊天。
| 历史记录模型 | 存储消息的位置 | 调用方发送的内容 |
|---|---|---|
| 由调用方管理 | 在应用程序控制的内存或持久存储中 | 相关的消息历史记录,以及每次请求附带的任何新消息 |
| Inference-service-managed | 在由推理服务控制的存储中 | 特定于服务的会话或响应标识符,以及任何新消息。 |
某些推理服务通过不同的 API 或选项支持这两种方法。 例如,OpenAI Responses 提供了 store 参数,你可以将其设置为 false,以使用由推理服务管理的聊天记录;也可以将其设置为 true,以使用由调用方管理的聊天记录。
由调用方管理的历史记录支持路由
当调用方管理历史记录时,它可以访问之前轮次中的消息。 路由器可以选择另一个模型或推理服务,调用方可以使用下一个请求发送这些消息。
历史记录不必保留在进程内存中。 只要应用程序可以加载它并将其发送到所选服务,它就可以来自应用程序拥有的持久存储。 目标还必须支持此前对话中使用的消息内容和功能。
由推理服务管理的历史记录限制路由
当推理服务管理历史记录时,它是对话的真相来源。 调用方通常保留不透明的标识符,而不是消息本身。
该标识符是指原始服务保留的状态。 访问还取决于用于创建会话的帐户或项目、终结点和凭据。 另一个服务的客户端无法使用标识符来检索消息。 如果同一服务的另一个客户端使用不同的范围,则可能无法访问会话。
服务可能支持在其自己的存储会话中更改模型。 该行为特定于服务,并且不是可移植路由。 一般路由器无法在不首先检索或重新构造消息的情况下将服务端对话传输到另一个提供程序。
| 路由方案 | 历史模型 | Result |
|---|---|---|
| 在同一提供商的模型之间切换 | 由调用方管理 | 调用方可以向新模型重放历史记录。 新模型必须支持前面轮次中使用的消息和内容类型。 |
| 在不同推理提供程序之间切换 | 由调用方管理 | 调用方可以将历史记录回放给新的提供程序。 新提供程序必须接受早期轮次使用的角色、内容类型、工具调用消息和工具结果消息。 |
| 在一个服务端对话中更改模型 | Inference-service-managed | 仅当推理服务允许现有聊天继续使用新模型时,该开关才有效。 路由客户端无法启用此行为。 |
| 切换到其他推理服务 | Inference-service-managed | 新服务无法访问原始服务的聊天标识符。 检索或重新构造消息,并使用调用方管理的历史记录启动新路由。 |
有关这些存储模型的详细信息,请参阅 存储。
代理框架如何实现运行时路由
Agent Framework 可以提供可移植路由所需的由调用方管理的历史记录。 在此路由模式中,聊天历史记录提供程序是聊天的真相来源。 它可以将消息存储在代理会话或应用程序拥有的存储中。
在 Agent Framework 中,调用方管理的历史记录包括本地会话状态和自定义聊天历史记录存储。 由推理服务托管的历史记录对应于由服务托管的存储。
对于 ChatClientAgent,路由聊天客户端位于 代理管道的聊天客户端层。 当路由客户端为每个请求选择多个命名 IChatClient 实例之一时,代理及其会话保持不变。
路由请求遵循以下顺序:
- 聊天历史记录提供程序加载会话历史记录。
- 代理将历史记录与当前轮次的输入组合在一起。
- 路由客户端为该会话选择当前使用的聊天客户端。
- 所选客户端接收完整的请求。
- 聊天历史记录提供程序在运行后存储新消息。
由于所选客户端接收提供程序加载的历史记录,因此应用程序可以在不手动重新生成会话的情况下更改路由。
.NET SDK 提供了实验性的 RoutePersistingRoutingChatClient。 使用 RoutePersistingRoutingChatClientOptions.DefaultRoute 设置初始路由,使用 GetActiveRoute 查看某个会话的路由,并使用 SetActiveRoute 更改该路由。 如果未设置默认路由,客户端将使用构造时提供的第一个路由。
在 Microsoft.Extensions.AI 中还有更多路由客户端,可支持进一步的路由策略。
有关完整的 C# 实现,请参阅 多模型路由示例 。
Important
作为路由注册的每个聊天客户端都必须使用由聊天历史记录提供程序提供的、由调用方管理的历史记录。 提供程序可以将该历史记录存储在会话或应用程序拥有的存储中。 不要注册使用由推理服务管理的会话历史记录的路由。
Python支持目前不可用。
目前暂不提供对 Go 的支持。