会话感知代理路由:针对长周期 LLM 代理的连续性感知模型选择
长周期 LLM 代理带来了一个单轮提示词路由器无法解决的路由难题。路由器不仅需要知道哪个模型最适合当前请求,还需要知道何时切换模型会破坏会话的连续性。
本文介绍了会话感知代理路由 (SAAR),这是 vLLM 语义路由器中的一种会话感知模型选择策略。SAAR 保留了语义路由功能,但增加了路由器专属的会话内存、工具循环与不可移植提供商状态的硬锁定、安全重置边界、前缀缓存感知切换定价以及可重放的追踪功能。
在 21,600 次确定性轮次测试中,SAAR 将模型切换次数减少了 79.29%,消除了 3,836 次不安全切换,并将预估物理模型成本降低了 78.71%。在 2,896 次实时 AMD ROCm 请求中,它保持了会话连续性,且 0 次观测到违反规则。

图 1:长周期代理需要能够理解会话轨迹的路由决策,而不仅仅是理解最新的提示词。
从提示词路由到会话路由
vLLM 语义路由始于一个简单的系统观察:并非每个请求都应在推理堆栈中走同一条路径。简短的事实提问、安全敏感的提示词、多模态请求、复杂的推理任务以及特定领域的查询,都可能需要不同的处理方式。
这一理念的第一代是提示词路由。路由器从当前请求中提取信号,匹配路由决策,并选择合适的路径。Iris 使这些信号具有可组合性。Athena 通过扩展模型选择、内存、重放、长上下文信号、多模态原语和 AMD ROCm 部署路径,使路由器更具策略性。
代理再次改变了路由的单元。
编码或研究代理不是一个简单的提示词,而是一个会话。它会计划、调用工具、接收工具输出、编辑文件、运行测试、从错误中恢复、暂停、恢复,并且经常发送非常简短的后续消息,例如“继续”、“修复它”、“再运行一次”或“使用之前的结果”。这些轮次只有结合之前的轨迹才有意义。
这就是为什么这个里程碑对语义路由器如此重要。路由器不再仅仅回答:
哪个模型应该处理这个请求?
对于代理流量,路由器还必须回答:
此时在该会话中切换模型是否安全?
这第二个问题正是 SAAR 设计要解决的。
为什么单轮路由对代理不再适用
单轮路由在局部可能是正确的,但对整个会话来说可能是错误的。
考虑一个典型的工具使用代理循环:
| 轮次 | 客户端发送的内容 | 提示词路由器看到的内容 | 会话路由器必须记住的内容 |
|---|---|---|---|
| 1 | “重构此模块并运行测试。” | 编码任务 | 会话已在某个物理模型上启动 |
| 2 | 模型发出工具调用 | 模型响应 | 接下来的工具结果应属于同一个模型 |
| 3 | 客户端发送工具结果 | 简短的观察 | 请求工具的模型应接收结果 |
| 4 | 用户说“修复失败的案例” | 简短的后续 | 指令依赖于之前的代码、测试输出和路由状态 |
| 5 | 会话闲置并稍后恢复 | 新的短消息 | 路由器可以重新考虑是否仍有必要保持旧模型 |
仅凭最新消息是不够的。提示词路由器可能会认为工具结果看起来“廉价”而将其发送给较小的模型。它可能会看到一个通用的“继续”并重新运行普通的筛选器。它可能会漏掉提供商管理的延续状态属于特定物理后端的事实。由于当前消息很短,它可能会丢弃前沿模型的预热前缀缓存。
每一个错误都有不同的失效模式:
- 工具结果可能被发送给未进行工具调用的模型。
- 不可移植的延续 ID 可能被发送到错误的物理后端。
- 一个长且温暖的会话可能会失去前缀局部性,从而导致不必要的昂贵开销。
- 逻辑模型(如
auto)可能会变得难以调试,因为用户不再知道实际上是哪个物理模型处理了该轮次。
重点不是代理永远不应该切换模型。它们应该切换。好的路由器在任务变难时应从廉价模型切换到更强大的模型,并在会话达到安全边界时切回。问题在于,路由器需要会话上下文来识别哪些时刻是安全的。
SAAR 设计
SAAR 保留了现有的语义路由器决策管道。依然从请求中提取信号,依然匹配决策,模型选择算法依然在匹配的决策内对候选模型进行排名。
SAAR 在该结果之上增加了一个会话控制层。

图 2:SAAR 在选择物理模型之前,结合了路由器内存、硬锁定、重置边界、切换经济学和可重放追踪。
它包含五个部分:
| 部分 | 存储或决定的内容 | 为何重要 |
|---|---|---|
| 路由器内存 | 上次的物理模型、匹配决策、阶段、切换次数、闲置时间、缓存证据和重放元数据 | 在不成为应用内存的情况下提供会话上下文 |
| 硬锁定 | 防止在主动工具循环或不可移植的提供商管理状态期间进行切换 | 在优化成本或质量之前确保正确性 |
| 重置边界 | 允许在闲置超时或决策漂移后重新选择 | 防止会话感知路由退化为粘性会话 |
| 切换经济学 | 为切换成本、切换历史、剩余轮次先验及前缀缓存校验定价 | 使切换在模型层级和会话长度间表现为不对称 |
| 重放追踪 | 记录路由器为何选择保持、切换或拒绝切换 | 使逻辑模型(如 auto)变得可审计 |
这是一种模型选择策略,而不是端点负载均衡器。语义路由器可以通过网关契约选择模型或集群。集群内的端点成员资格、健康检查和负载均衡仍然是基础设施的职责。
最重要的原则:有时路由器必须保持不变
最安全的模型切换并不总是对最新提示词评分最高的那个。对于代理流量,有些轮次受连续性限制。

图 3:工具循环和提供商管理的延续状态是硬性连续性限制;闲置和决策漂移边界允许安全的重新选择。
SAAR 将两种情况视为硬锁定:
- 工具循环连续性。 如果某个物理模型发出了工具调用,工具结果应返回到同一个物理模型。后续的观察不是全新的提示词,而是局部执行循环的一部分。
- 提供商管理的状态。 如果请求携带不可移植的延续状态(例如属于某个后端的响应标识符),SAAR 将保持之前的物理模型,而不是默默地将状态转移到别处。
这些规则在设计上强于成本规则。如果切换是不安全的,路由器不应为了使用更便宜的模型而“买单”。
SAAR 还定义了相反的边界:何时可以再次切换。闲置超时和决策漂移会重新开启选择。如果代理暂停时间足够长,连续性的价值就会衰减。如果用户从代码编辑转向合成,或从检索转向调试,导致匹配的决策发生变化,那么旧的模型选择不应永远保持。
这种区别是会话感知代理路由的核心:
| 情况 | SAAR 行为 | 原因 |
|---|---|---|
| 工具调用正在等待结果 | 保持之前的物理模型 | 工具结果属于该模型的局部推理循环 |
| 请求携带不可移植的提供商状态 | 保持之前的物理模型 | 该状态在其他后端上可能无效 |
| 会话已超过配置的闲置边界 | 允许重新选择 | 连续性压力已衰减 |
| 匹配的路由决策发生变化 | 允许重新选择 | 任务形态已改变 |
| 会话在昂贵模型上运行时间长且已热身 | 提高切换阈值 | 前缀局部性很有价值 |
| 在小模型上的廉价短时重试 | 降低切换阈值 | 检出成本很小 |
路由器内存不是用户内存
“路由器内存”这个词可能会引起误解,因此边界至关重要。
SAAR 内存不是对话内存、检索内存或用户画像内存。它不总结对话,也不试图为模型记忆事实。它的职责更狭窄:保持足够的路由状态,以便使下一次模型选择决策既安全又可解释。
对于每个会话,路由器跟踪以下事实:
- 逻辑模型背后上次选择的物理模型;
- 上次匹配的路由决策;
- 会话是否处于正常、工具循环、提供商状态、闲置重置或漂移重置阶段;
- 最近发生了多少次切换;
- 最新的上下文长度和缓存证据;
- 将响应链接回路由器决策追踪的重放 ID。
这种范围使得系统在保持运营实用性的同时,不会让路由器变成第二层代理内存。应用内存应留在应用中。检索内存应留在检索堆栈中。SAAR 内存的存在仅为了使跨轮次的路由保持连贯。
前缀缓存使模型切换变得不对称
对于长代理会话,模型切换不仅仅是质量决策,也是输入端的系统决策。

图 4:同一切换操作根据模型层级、会话长度和物理前缀重用情况具有不同的成本。
在廉价模型上的短期重试与在前沿模型上 40 轮的热身会话不应被同等对待。后者已经积累了宝贵的前缀。切换它可能要求下一个物理模型支付更高的输入成本,即使显式的用户消息很短。
因此,SAAR 会对缓存输入检出增量进行定价:即正常提示词输入价格与考虑中的物理模型的缓存输入价格之间的差距。会话越长、越昂贵,关于丢弃前缀局部性的策略就越严格。
这也澄清了逻辑模型的缓存 Token 计费问题。如果用户调用 auto,路由器可能会随着时间推移将该逻辑名称映射到不同的物理模型。一个后端报告的缓存命中是该后端的物理证据,不能自动转移到另一个后端。SAAR 将后端报告的缓存 Token 与路由器估算的重用分开,并且不会改写上游的使用字段。
这种分离在运营上很有用。操作员仍然可以检查物理缓存行为,而路由器可以使用自己的内存来决定切换是否值得付出检出成本。
请求如何在 SAAR 中流转
服务路径依然保持熟悉感。客户端将请求发送到兼容 OpenAI 的网关,通常使用逻辑模型名称(如 auto)。为了启用会话感知路由,它们还会发送稳定的会话标识符(如 x-session-id)。
SAAR 随后按此顺序处理每一轮次:
- 读取当前请求、会话 ID、工具调用上下文、提供商状态标记和候选模型集。
- 运行正常的语义路由器信号和决策管道。
- 根据配置的方法(如混合评分)生成基础模型选择结果。
- 从路由器内存中加载之前的会话路由状态。
- 对工具循环和提供商管理状态应用硬锁定。
- 检查闲置超时和决策漂移边界。
- 使用前缀缓存检出成本和切换历史调整切换分数。
- 选择物理模型并发出诊断信息。
- 更新路由器内存并写入重放追踪。
配置存在于路由决策的模型选择算法中:
routing:
decisions:
- name: agentic_routing
modelRefs:
- model: qwen3-8b
- model: qwen3-32b
algorithm:
type: session_aware
session_aware:
base_method: hybrid
idle_timeout_seconds: 300
tool_loop_hard_lock: true
context_portability_hard_lock: true
decision_drift_reset: true
prefix_cache_weight: 0.20
switch_history_weight: 0.04这些值是有意的策略旋钮,而非通用的常量。具有短会话的客户服务助手可以使用更宽松的闲置边界。具有长工具循环和昂贵上下文的编码代理可以使用更严格的连续性和前缀缓存设置。
可观测性是功能的一部分
auto 后面的模型选择只有在操作员可以解释它时才有用。

图 5:SAAR 将逻辑模型背后隐藏的物理路由选择转化为了可审计的追踪和响应头。
SAAR 发出诊断信息,例如所选模型、所选决策、重放 ID、会话阶段、选择置信度和上下文 Token 数量。重放 ID 将已服务的响应与解释决策的路由器追踪关联起来。
有用的追踪可以回答以下问题:
- 基础选择器会选择什么模型?
- 路由器是否因为工具循环锁定而保留了前一个模型?
- 提供商管理的状态是否导致切换不安全?
- 会话是否越过了闲置或漂移边界?
- 前缀缓存证据如何改变了调整后的候选分数?
- 最终决策是保持、切换还是锁定保持?
这使得会话感知路由具备可操作性。没有重放功能,逻辑模型后面的路由器将难以调试。有了重放功能,操作员可以审计路由器为何保持连续性,或者为何决定切换是安全的。
我们如何评估它
评估围绕一个问题设计:该策略是否在不隐藏正确性问题的前提下使路由对代理更友好?
我们使用三层证据:
首先,确定性策略矩阵在许多合成会话中测试控制逻辑。这使路由策略与服务噪声隔离,并让我们对工具循环、提供商状态、闲置边界、漂移边界、模型层级和切换历史进行压力测试。
其次,实时兼容 OpenAI 的服务运行通过路由器和 AMD ROCm 上的后端服务路径验证相同的不变量。这检查了头部、会话 ID、诊断信息和故障处理是否能在真实的请求流中生效。
第三,确定性代理任务追踪增加了任务结构。这些追踪不仅计算切换次数,还包括模拟的工具观察和精确的最终答案评分。
目标不是让每个图表都显示“切换更少”。粘性会话可以做到这一点。目标是证明 SAAR 消除了不安全切换,保留了有用的变动,尊重了昂贵的前缀局部性,并在实时服务中保持了可观测性。
结果 1:SAAR 将控制单元从单轮提升到会话级
确定性策略矩阵涵盖了均衡、工具密集型、前沿密集型、闲置密集型、提供商状态密集型和漂移密集型会话。每个工作负载运行五个种子,每个种子 40 个会话,每个会话 18 个轮次,总计 21,600 次轮次。

图 6:跨 21,600 次确定性轮次的策略结果摘要。
核心结果是 SAAR 在保留移动能力的同时减少了模型 churn:
| 策略 | 切换次数 | 不安全切换 | 预估成本降低 | 质量增量 |
|---|---|---|---|---|
| 单轮 | 9,709 | 3,836 | 0.00% | +0.0000 |
| 粘性会话 | 340 | 0 | 98.65% | -0.1433 |
| 初始 SAAR | 1,810 | 200 | 70.92% | -0.0122 |
| 完整 SAAR | 2,011 | 0 | 78.71% | -0.0453 |
单轮路由切换频繁并产生不安全变动。粘性会话几乎消除了变动,但由于拒绝在任务改变后重新选择,它们牺牲了过多的质量。完整的 SAAR 基于合理的理由居于中间:它消除了不安全变动,同时仍允许闲置和漂移边界重新开启决策。
这是从轮次级控制到会话级控制的转变。路由器不再将每条消息视为独立的事件。
结果 2:硬锁定消除了正确性故障
第二个结果隔离了最重要的不变量:当切换不安全时,SAAR 不应切换。

图 7:硬锁定消除了工具循环和不可移植提供商状态期间的不安全切换。
工具循环切换违规从 3,404 降至 0。提供商状态切换违规从 432 降至 0。
这些不是微小的调整胜利,而是正确性边界。工具结果不是普通的提示词,不可移植的延续 ID 不是普通的文本字段。如果路由器忽略这些事实,它可能会在处理最新消息时看似做出合理的语义选择,但实际上破坏了交互。
SAAR 通过在策略中明确连续性约束来解决这一问题。
结果 3:SAAR 不是改了名字的粘性会话
显而易见的基线是粘性路由:为会话选择第一个模型并保持住。
粘性路由很吸引人,因为易于理解。它还通过完全避免切换来解决许多不安全切换情况。但这种简单性对代理来说变成了产品问题。长会话会漂移,用户会改变任务,最初廉价的模型可能不再合适,强大的模型也可能不再必要。

图 8:SAAR 不仅仅是粘性会话;它平衡了连续性与移动性。
消融实验显示了 SAAR 为何需要多种机制:
| 变体 | 切换减少量 | 不安全切换 | 成本降低 | 解释 |
|---|---|---|---|---|
| 无工具锁定 | 74.96% | 760 | 60.05% | 重新引入工具循环违规 |
| 无提供商状态锁定 | 77.98% | 200 | 69.82% | 重新引入不可移植状态违规 |
| 无漂移重置 | 83.14% | 0 | 81.31% | 在任务漂移后过度粘滞 |
| 无闲置边界 | 83.98% | 0 | 80.14% | 在自然暂停后过度粘滞 |
| 无前沿成本 | 73.96% | 0 | 54.75% | 太容易切换离开昂贵的热身会话 |
| 完整 SAAR | 79.29% | 0 | 78.71% | 在保持锁定的同时保留安全重选择 |
锁定提供正确性,重置边界提供活性,前缀缓存检出定价提供经济纪律。移除其中任何一个,其行为的改变都会在指标中体现出来。
结果 4:在实际 AMD ROCm 服务中保持了不变量
策略模拟很有用,但路由器必须在真实的请求流中工作。实时服务运行通过路由器和 AMD ROCm 后端路径使用兼容 OpenAI 的流量,并为路由和直接后端运行提供匹配的调度。

图 9:实时 ROCm 运行在长会话和注入后端故障下保持了连续性。
在长会话运行中,路由器完成了 2,896 个实时请求,且 0 次观察到连续性违规。
| 工作负载 | 请求数 | 成功率 | p95 开销 | 连续性违规 |
|---|---|---|---|---|
| balanced-32x64 | 2,048 | 100.00% | 6.181 毫秒 | 0 |
| stateful-16x48 | 768 | 100.00% | 26.805 毫秒 | 0 |
| idle-16x5-75s | 80 | 100.00% | 283.463 毫秒 | 0 |
闲置工作负载包括真实的挂钟时间睡眠,因此其 p95 开销应与热路径路由开销分开解读。重要的结果是连续性:实时路径保留了在确定性矩阵中测试的硬锁定和重置边界行为。
结果 5:会话在后端故障后可恢复
长周期代理需要会话级恢复,而不仅仅是每请求成功。后端可能对一个请求返回 HTTP 503,但会话应在稍后继续,且不丢失保持交互连贯性的路由不变量。
| 故障阶段 | 请求数 | 注入的 503 数量 | 受影响会话 | 恢复情况 | 连续性违规 |
|---|---|---|---|---|---|
| 提供商状态 | 360 | 48 | 8 | 100.00% | 0 |
| 工具循环 | 360 | 72 | 8 | 100.00% | 0 |
| 主题漂移 | 432 | 48 | 8 | 100.00% | 0 |
在一次性破坏矩阵中,32/32 个受影响会话均在稍后恢复。在重复故障矩阵中,24/24 个受影响会话在 168 次注入 HTTP 503 响应后成功恢复。
这一点很重要,因为代理会话比普通的聊天轮次更长。瞬态后端故障不应让路由器忘记工具循环正在活动、提供商状态不可移植或会话具有可重放的历史。
结果 6:任务追踪验证了代理循环
连续性计数是必要的,但还不够。我们还运行带有模拟工具观察和精确最终答案评分的确定性多轮任务追踪。循环中没有评判模型:最终答案要么包含要求的标签,要么不包含。
在 AMD 服务任务运行中,18/18 个精确评分任务实例完成,96/96 个路由轮次中存在重放头部,且未观察到连续性违规。
这虽然比广泛的编码代理基准测试规模小,但作为信号比单纯的策略计数更强,因为它通过工具观察和最终答案检查执行了任务循环。
这对 vLLM 用户意味着什么
会话感知路由使语义路由器在逻辑模型名称隐藏模型组合的服务堆栈中更具实用价值。
对于用户,体验可以保持简单:调用模型(如 auto),发送稳定的会话 ID,让路由器选择物理模型。对于操作员,行为变得更可控:配置何时需要连续性,何时闲置会话可以重置,前缀局部性的重要性,以及如何追踪路由决策。
这在以下情况特别有用:
- 候选模型具有不同的成本、延迟和能力配置;
- 代理在多轮次中调用工具;
- 客户端依赖提供商管理的延续状态;
- 长会话构建了宝贵的前缀缓存局部性;
- 操作员需要检查逻辑路由背后每轮次的服务模型。
它还创建了清晰的基础设施边界。语义路由器拥有策略级的模型选择权。Envoy、Kubernetes 和服务后端依然拥有端点成员资格、健康检查和负载均衡权。这种分离使 SAAR 专注于其可以安全决定的内容:会话级的模型连续性、模型切换和可追溯性。
更宏大的方向
这一里程碑延续了始于信号-决策路由的轨迹。
Iris 使路由决策可组合。Athena 将语义路由器推向了作为模型组合和代理部署的策略性系统大脑。多模态加固将证据表面从文本提示词扩展到请求级信号。会话感知代理路由拓宽了时间范围:路由器现在不仅在推理请求,还在推理该请求在长周期交互中所处的位置。
该方向对现代服务堆栈至关重要。代理系统越来越倾向于在多个物理选项之上使用一个逻辑模型接口。它们需要廉价模型执行简单步骤,强大模型执行复杂步骤,通过工具循环保持连续性,对长上下文进行缓存感知处理,以及足够的可观测性以在生产中信任系统。
SAAR 是迈向该运营模式的一步。它并没有让路由器成为代理,而是让路由器感知到了为了良好服务于代理所需的最基本会话事实。
核心理念很简单:auto 后面的路由器应该知道何时允许模型切换,何时禁止,以及对于长周期的热身会话,切换需要付出什么代价。
加入我们
寻求合作! SAAR 是使语义路由器适用于长周期代理的下一步,前方还有大量开源工作。
我们正在寻找希望在以下方面提供帮助的贡献者:
- 针对实际代理流量的会话感知路由策略;
- 多轮次和工具循环评估套件;
- AMD ROCm 服务验证和性能实验;
- 路由器可观测性、重放追踪和生产调试工作流;
- 将路由策略与端点负载均衡分离的 Envoy、Kubernetes 和网关集成。
如果您正在构建代理系统、在 AMD GPU 上运行模型组合,或研究连续性感知模型选择,我们希望能与您合作。
资源
- GitHub: vllm-project/semantic-router
- 文档: vllm-semantic-router.com
- 社区: 加入 vLLM Slack 上的 #semantic-router 频道