会话感知代理路由:面向长周期LLM代理的连续性感知模型选择
Session-Aware Agentic Routing: Continuity-Aware Model Selection for Long-Horizon LLM Agents
vLLM 团队提出 Session-Aware Agentic Routing (SAAR),一种用于长时域 LLM agent 的会话感知模型选择策略。SAAR 在 vLLM Semantic Router 中增加了路由器记忆、工具循环与不可移植提供者状态的硬锁、空闲与决策漂移重置边界、前缀缓存感知切换定价及可重放追踪记录。在 21,600 次确定性轮次中,SAAR 将模型切换减少 79.29%,消除 3,836 次不安全切换,估计物理模型成本降低 78.71%。在 2,896 个实时 AMD ROCm 请求中,观察到 0 次连续性违规。
长时域 LLM agent 产生了一个单轮 prompt 路由器(router)本非设计要解决的路由问题。路由器仍然需要知道哪个模型最适合当前请求,但它还需要知道何时切换模型会中断会话。
本文介绍 Session-Aware Agentic Routing (SAAR),这是 vLLM Semantic Router 中的一种会话感知模型选择策略。SAAR 保留了语义路由,但增加了路由器拥有的会话记忆、围绕工具循环和不可移植提供者状态的硬锁、安全重置边界、前缀缓存感知的切换定价以及可重放的追踪记录。
在 21,600 次确定性轮次中,SAAR 将模型切换减少了 79.29%,消除了 3,836 次不安全切换,并将估计的物理模型成本降低了 78.71%。在 2,896 个实时 AMD ROCm 请求中,它保持了会话连续性,观察到 0 次违规。
图 1:长时域 agent 需要理解会话轨迹的路由决策,而不仅仅是理解最新的 prompt。
从 Prompt 路由到会话路由
vLLM Semantic Router 始于一个简单的系统观察:并非每个请求都应通过推理栈走相同的路径。一个简短的事实性问题、一个安全敏感的 prompt、一个多模态请求、一个困难的推理任务以及一个特定领域的查询,可能都需要不同的处理方式。
该想法的第一代是 prompt 路由。路由器从当前请求中提取信号,匹配一个路由决策,并选择一条合适的路径。Iris 使这些信号变得可组合。Athena 通过扩展模型选择、记忆、重放、长上下文信号、多模态原语和 AMD ROCm 部署路径,使路由器更具战略性。
Agent 再次改变了路由的单位。
一个编码或研究 agent 不是一个 prompt。它是一个会话。它进行规划、调用工具、接收工具输出、编辑文件、运行测试、从错误中恢复、暂停、恢复,并且经常发送非常简短的后续消息,例如“继续”、“修复它”、“再运行一次”或“使用之前的结果”。这些轮次之所以有意义,仅仅是因为它们之前的轨迹。
这就是为什么这个里程碑对 Semantic Router 很重要。路由器不再仅仅回答:
哪个模型应该处理这个请求?
对于 agent 流量,路由器还必须回答:
现在在这个会话内部切换模型安全吗?
第二个问题正是 SAAR 设计要处理的。
为什么单轮路由对 Agent 失效
单轮路由在局部可能是正确的,但对于整个会话来说仍然可能是错误的。
考虑一个典型的工具使用 agent 循环:
| 轮次 | 客户端发送的内容 | Prompt 路由器看到的内容 | 会话路由器必须记住的内容 |
|---|---|---|---|
| 1 | “重构这个模块并运行测试。” | 一个编码任务 | 会话已在一个物理模型上开始 |
| 2 | 模型发出一个工具调用 | 一个模型响应 | 下一个工具结果属于同一个模型 |
| 3 | 客户端发送工具结果 | 一个简洁的观察结果 | 请求该工具的模型应该接收结果 |
| 4 | 用户说“修复失败的情况” | 一个简短的后续指令 | 该指令依赖于先前的代码、测试输出和路由状态 |
| 5 | 会话空闲并在之后恢复 | 一条新的简短消息 | 路由器可以重新考虑旧模型是否仍然值得保留 |
仅凭最新的消息并不包含足够的信息。一个 prompt 路由器可能会认为工具结果看起来成本很低,并将其发送给一个较小的模型。它可能会看到一个通用的“继续”指令,并重新运行常规的选择器。它可能会错过提供者管理的延续状态属于一个物理后端的事实。它可能会因为当前消息很短而丢弃一个前沿模型的预热前缀缓存。
这些错误中的每一个都有不同的失败模式:
- 工具结果可能会发送给未发出该工具调用的模型。
- 不可移植的延续 ID 可能会被发送到错误的物理后端。
- 一个长而热的会话可能会失去前缀局部性,并变得不必要地昂贵。
- 像
auto这样的逻辑模型可能会变得难以调试,因为用户不再知道哪个物理模型实际服务了该轮次。
重点不在于 agent 永远不应该切换模型。它们应该切换。一个好的路由器仍然应该在任务变得更困难时从廉价模型切换到更强模型,并且应该在会话达到安全边界时切换回来。问题在于路由器需要会话上下文才能知道哪些时刻是安全的。
SAAR 设计
SAAR 保留了现有的 Semantic Router 决策流水线。仍然从请求中提取信号,仍然匹配决策,并且模型选择算法仍然在匹配的决策内对候选模型进行排序。
SAAR 在该结果周围添加了一个会话控制层。
图 2:SAAR 在选择物理模型之前,结合了路由器记忆、硬锁、重置边界、切换经济学和可重放追踪记录。
共有五个部分:
| 部分 | 存储或决定的内容 | 为何重要 |
|---|---|---|
| 路由器记忆 | 上一个物理模型、匹配的决策、阶段、切换次数、空闲时间、缓存证据和重放元数据 | 在不成为应用程序记忆的情况下,为路由器提供会话上下文 |
| 硬锁 | 在活跃的工具循环或不可移植的提供者管理状态期间阻止切换 | 在优化成本或质量之前保证正确性 |
| 重置边界 | 在空闲超时或决策漂移后允许重新选择 | 防止会话感知路由退化为粘性会话 |
| 切换经济学 | 对切换成本、切换历史、剩余轮次先验和前缀缓存检出进行定价 | 使切换在不同模型层级和会话长度上具有不对称性 |
| 重放追踪记录 | 记录路由器为何保持、切换或拒绝切换 | 使 auto 这样的逻辑模型可检查 |
这是一个模型选择策略,而不是端点负载均衡器。Semantic Router 可以通过网关契约选择模型或集群。集群内的端点成员资格、健康检查和负载均衡仍然是基础设施的职责。
最重要的规则:有时路由器不得切换
最安全的模型切换并不总是那个在最新 prompt 上得分最高的。对于 agent 流量,某些轮次受到连续性约束。
图 3:工具循环和提供者管理的延续状态是硬连续性约束;空闲和决策漂移边界允许安全地重新选择。
SAAR 将两种情况视为硬锁:
- 工具循环连续性。 如果一个物理模型请求了一个工具调用,那么工具结果应该返回到同一个物理模型。后续的观察结果不是一个全新的 prompt;它是本地执行循环的一部分。
- 提供者管理状态。 如果请求携带不可移植的延续状态,例如属于一个后端的响应标识符,SAAR 会保持上一个物理模型,而不是静默地将状态移动到别处。
这些规则有意比成本规则更强。如果切换不安全,路由器不应该通过使用更便宜的模型来“买通”出路。
SAAR 也定义了相反的边界:路由器何时可以再次切换。空闲超时和决策漂移会重新打开选择。如果 agent 暂停了足够长的时间,连续性的价值就会衰减。如果匹配的决策发生变化(例如用户从代码编辑转向综合,或从检索转向调试),旧的模型选择不应永远持续下去。
这种区别是会话感知 agent 路由的核心:
| 情况 | SAAR 行为 | 原因 |
|---|---|---|
| 工具调用正在等待工具结果 | 保持上一个物理模型 | 工具结果属于该模型的本地推理循环 |
| 请求携带不可移植的提供者状态 | 保持上一个物理模型 | 该状态在另一个后端上可能无效 |
| 会话空闲超过配置的边界 | 允许重新选择 | 连续性压力已经衰减 |
| 匹配的路由决策发生变化 | 允许重新选择 | 任务形态发生了变化 |
| 会话在一个昂贵模型上运行时间长且热 | 提高切换阈值 | 前缀局部性很有价值 |
| 在小模型上进行廉价的短重试 | 降低切换阈值 | 检出成本很小 |
路由器记忆不是用户记忆
“路由器记忆”这个说法可能具有误导性,因此明确边界很重要。
SAAR 记忆不是对话记忆、检索记忆或用户画像记忆。它不会总结对话,也不会试图为模型记住事实。它的职责更窄:保留足够的路由状态,以使下一个模型选择决策安全且可解释。
对于每个会话,路由器会跟踪以下事实:
- 逻辑模型背后选择的最后一个物理模型;
- 最后一个匹配的路由决策;
- 会话是否处于正常、工具循环、提供者状态、空闲重置或漂移重置阶段;
- 最近发生了多少次切换;
- 最新的上下文长度和缓存证据;
- 一个将响应链接回路由器决策追踪记录的重放 ID。
这个范围使系统在操作上有用,而不会将路由器变成第二个 agent 记忆层。应用程序记忆应保留在应用程序中。检索记忆应保留在检索栈中。SAAR 记忆的存在仅仅是为了使跨轮次的路由保持一致。
前缀缓存使模型切换不对称
对于长 agent 会话,模型切换不仅仅是一个质量决策。它也是一个输入端的系统决策。
图 4:相同的切换根据模型层级、会话长度和物理前缀重用具有不同的成本。
在廉价模型上的短重试与在前沿模型上的 40 轮热会话不应被同等对待。后者已经积累了有价值的前缀。从它切换出去可能需要下一个物理模型支付更大的输入成本,即使可见的用户消息很短。
因此,SAAR 对缓存输入检出增量进行定价:所考虑物理模型的正常 prompt 输入价格与缓存输入价格之间的差距。会话越长、越昂贵,关于丢弃前缀局部性的策略就越严格。
这也澄清了路由逻辑模型的缓存 token 记账。如果用户调用 auto,路由器可能会随时间将该逻辑名称映射到不同的物理模型。一个后端报告的缓存命中是该后端的物理证据。它不能自动转移到另一个后端。SAAR 将后端报告的缓存 token 与路由器估计的重用分开,并且不会重写上游的使用字段。
这种分离在操作上很有用。操作员仍然可以检查物理缓存行为,同时路由器使用自己的记忆来决定切换是否值得付出检出成本。
请求如何通过 SAAR
服务路径保持熟悉。客户端向兼容 OpenAI 的网关发送请求,通常使用逻辑模型名称,例如 auto。为了启用会话感知路由,它们还会发送一个稳定的会话标识符,例如 x-session-id。
然后,SAAR 按以下顺序处理每个轮次:
- 读取当前请求、会话 ID、工具调用上下文、提供者状态标记和候选模型集。
- 运行正常的 Semantic Router 信号和决策流水线。
- 从配置的方法(例如混合评分)产生一个基础模型选择结果。
- 从路由器记忆中加载上一个会话路由状态。
- 对工具循环和提供者管理状态应用硬锁。
- 检查空闲超时和决策漂移边界。
- 使用前缀缓存检出成本和切换历史调整切换分数。
- 选择物理模型并发出诊断信息。
- 更新路由器记忆并写入重放追踪记录。
配置位于路由决策的模型选择算法内部:
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
这些值有意设计为策略旋钮,而非一刀切的常量。一个会话较短的客户服务助手可能会使用更宽松的空闲边界。一个具有长工具循环和昂贵上下文的编码 agent 可能会使用更严格的连续性和前缀缓存设置。
可观测性是功能的一部分
auto 背后的模型选择只有在操作员能够解释它时才有用。
图 5:SAAR 将逻辑模型背后隐藏的物理路由选择转变为可检查的追踪记录和响应头。
SAAR 发出诊断信息,例如选定的模型、选定的决策、重放 ID、会话阶段、选定置信度和上下文 token 数。重放 ID 将服务的响应链接回解释该决策的路由器追踪记录。
一个有用的追踪记录可以回答如下问题:
- 基础选择器会选择哪个模型?
- 路由器是否因为工具循环锁而保持了上一个模型?
- 提供者管理状态是否使切换不安全?
- 会话是否跨越了空闲或漂移边界?
- 前缀缓存证据如何改变了调整后的候选分数?
- 最终决策是保持、切换还是锁定保持?
这使得会话感知路由可操作。没有重放,逻辑模型背后的路由器会变得难以调试。有了重放,操作员可以审计路由器为何保持连续性或决定切换是安全的。
我们如何评估它
评估围绕一个问题设计:该策略是否使路由对 agent 更友好,同时不隐藏正确性问题?
我们使用三层证据。
首先,一个确定性策略矩阵在许多合成会话中测试控制逻辑。这将路由策略与服务噪声隔离开来,并让我们能够对工具循环、提供者状态、空闲边界、漂移边界、模型层级和切换历史进行压力测试。
其次,实时兼容 OpenAI 的服务运行通过路由器和服务后端路径在 AMD ROCm 上测试相同的不变量。这检查了头部、会话 ID、诊断信息和故障处理是否能在真实的请求流中存活。
第三,确定性 agent 任务追踪记录增加了任务结构。这些追踪记录不仅计算切换次数,还包括模拟的工具观察结果和精确的最终答案评分。
目标不是让每个图表都显示“更少的切换”。粘性会话可以做到这一点。目标是展示 SAAR 消除了不安全切换,保留了有用的移动,尊重昂贵的前缀局部性,并且在实时服务中保持可观测性。
结果 1:SAAR 将控制单位从轮次转移到会话
确定性策略矩阵涵盖了平衡型、工具密集型、前沿密集型、空闲密集型、提供者状态密集型和漂移密集型会话。每个工作负载运行五个种子,每个种子 40 个会话,每个会话 18 轮,总共 21,600 轮。
图 6:在 21,600 次确定性轮次中的主要策略结果。
主要结果是 SAAR 减少了模型变动,同时保留了移动能力:
| 策略 | 切换次数 | 不安全切换 | 估计成本降低 | 质量差异 |
|---|---|---|---|---|
| 单轮 | 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。
这些不是微小的调优胜利。它们是正确性边界。工具结果不是一个普通的 prompt。不可移植的延续 ID 不是一个普通的文本字段。如果路由器忽略这些事实,它可能会破坏交互,同时表面上在最新消息上做出合理的语义选择。
SAAR 通过在策略中明确连续性约束来修复这个问题。
结果 3:SAAR 不是换了个名字的粘性会话
明显的基线是粘性路由:为会话选择第一个模型并保持它。
粘性路由很有吸引力,因为它易于推理。它也通过完全避免切换来解决许多不安全切换的情况。但这种简单性对 agent 来说变成了一个产品问题。长会话会漂移。用户会改变任务。一个廉价的初始模型可能不再合适。一个强大的模型可能不再必要。
图 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 服务中成立
策略模拟很有用,但路由器必须通过真实的请求流工作。实时服务运行使用兼容 OpenAI 的流量通过路由器和 AMD ROCm 后端路径,并使用匹配的调度进行路由和直接后端运行。
图 9:实时 ROCm 运行在长会话和注入的后端故障下保持连续性。
在长会话运行中,路由器完成了 2,896 个实时请求,观察到 0 次连续性违规。
| 工作负载 | 请求数 | 成功率 | p95 开销 | 连续性违规 |
|---|---|---|---|---|
| balanced-32x64 | 2,048 | 100.00% | 6.181 ms | 0 |
| stateful-16x48 | 768 | 100.00% | 26.805 ms | 0 |
| idle-16x5-75s | 80 | 100.00% | 283.463 ms | 0 |
空闲工作负载包括真实的挂钟睡眠,因此其 p95 开销应与热路径路由开销分开解释。重要的结果是连续性:实时路径保留了确定性矩阵中测试的硬锁和重置边界行为。
结果 5:会话在后端故障后恢复
长时域 agent 需要会话级恢复,而不仅仅是每请求成功。一个后端可能为一个请求返回 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 响应后恢复。
这很重要,因为 agent 会话比普通的聊天轮次要长。一个瞬时的后端故障不应使路由器忘记工具循环是活跃的、提供者状态是不可移植的,或者会话具有可重放的历史。
结果 6:任务追踪记录锻炼了 Agent 循环
连续性计数器是必要的,但还不够。我们还运行确定性的多轮任务追踪记录,其中包含模拟的工具观察结果和精确的最终答案评分。循环中没有评判模型:最终答案要么包含所需的标签,要么不包含。
在 AMD 服务任务运行中,18/18 个精确评分的任务实例完成,重放头部出现在 96/96 个路由轮次上,并且没有观察到连续性违规。
这仍然比一个广泛的真实编码 agent 基准要小,但它比单独的策略计数器提供了更强的信号,因为它使用工具观察结果和最终答案检查来锻炼任务循环。
这对 vLLM 用户意味着什么
会话感知路由使 Semantic Router 对于 agent 服务栈更有用,在这些栈中,逻辑模型名称隐藏了一个模型组合。
对于用户来说,体验可以保持简单:调用一个像 auto 这样的模型,发送一个稳定的会话 ID,让路由器选择物理模型。对于操作员来说,行为变得更加可控:配置何时需要连续性、空闲会话何时可以重置、前缀局部性有多重要,以及路由决策如何被追踪。
这在以下情况下特别有用:
- 候选模型具有不同的成本、延迟和能力概况;
- agent 跨多个轮次使用工具;
- 客户端依赖于提供者管理的延续状态;
- 长会话建立了有价值的前缀缓存局部性;
- 操作员需要检查在逻辑路由背后,每个轮次由哪个物理模型服务。
它还创建了一个清晰的基础设施边界。Semantic Router 拥有策略级模型选择。Envoy、Kubernetes 和服务后端仍然拥有端点成员资格、健康检查和负载均衡。这种分离使 SAAR 专注于它可以安全决定的事情:会话级的模型连续性、模型切换和可追溯性。
更大的方向
这个里程碑延续了从 Signal-Decision 路由开始的相同轨迹。
Iris 使路由决策可组合。Athena 将 Semantic Router 推向混合模型和 agent 部署的战略系统大脑。多模态强化将证据面从文本 prompt 扩展到请求级信号。会话感知 agent 路由拓宽了时间视野:路由器现在不仅推理一个请求,还推理该请求在一个长时间运行的交互中的位置。
这个方向对现代服务栈很重要。Agent 系统越来越希望在一个逻辑模型接口下拥有多个物理选项。它们希望为简单步骤使用更便宜的模型,为困难步骤使用更强的模型,通过工具循环保持连续性,对长上下文进行缓存感知处理,以及足够的可观测性以在生产中信任系统。
SAAR 是朝着那个运营模式迈出的一步。它不会使路由器成为一个 agent。它使路由器意识到良好服务 agent 所需的最小会话事实。
核心思想很简单:auto 背后的路由器应该知道何时允许模型切换、何时禁止切换,以及对于一个热的长运行会话,切换的成本是多少。
加入我们
寻找合作! SAAR 是使 Semantic Router 对长时域 agent 有用的下一步,前方还有很多开放的工作。
我们正在寻找希望帮助的贡献者:
- 为真实 agent 流量制定会话感知路由策略;
- 开发多轮和工具循环评估套件;
- 进行 AMD ROCm 服务验证和性能实验;
- 改进路由器可观测性、重放追踪记录和生产调试工作流;
- 开发 Envoy、Kubernetes 和网关集成,使路由策略与端点负载均衡分离。
如果你正在构建 agent 系统、在 AMD GPU 上运行模型组合,或研究连续性感知模型选择,我们很乐意合作。
资源:
- GitHub:vllm-project/semantic-router
- 文档:vllm-semantic-router.com
- 社区:加入 vLLM Slack 上的 #semantic-router 频道