vLLM Production Stack 的语义智能层
1. 概述
本文旨在概述 vLLM Semantic Router 与 vLLM Production Stack 之间的全面集成策略。vLLM Production Stack 是一个用于大规模部署 vLLM 的云原生参考系统,提供了多种部署方式来启动 vLLM 服务器、请求路由和可观测性堆栈。请求路由可以将流量导向不同的模型,通过 Kubernetes API 执行服务发现和容错,并支持轮询 (Round-robin)、基于会话、前缀感知 (Prefix-aware)、KV 感知 (KV-aware) 以及具有 LMCache 原生支持的分离式预填充路由。Semantic Router 增加了一个 系统智能层,用于对每个用户请求进行分类,从模型池中选择最合适的模型,注入特定领域的系统提示词 (System Prompt),执行语义缓存,并强制执行企业级安全检查(如 PII 和 Jailbreak 检测)。
通过结合这两个系统,我们构建了一个统一的推理堆栈。Semantic Router 确保每个请求都由最合 适的模型回答;Production Stack 路由最大限度地提高了基础设施和推理效率,并公开了丰富的指标。它们共同提供:
- 系统级智能 — 理解用户意图,选择正确的模型,注入适当的系统提示词并预过滤工具。
- 基础设施效率 — 从单个实例扩展到分布式 vLLM 部署而无需更改应用程序代码,通过 Token 级优化和 LMCache 原生支持在多个模型之间路由流量。
- 安全与合规 — 在 PII 和 Jailbreak 提示词到达模型之前将其拦截。
- 可观测性 — 通过 Production Stack 的 Grafana 仪表板监控请求、延迟和 GPU 使用情况,并追踪 Semantic Router 的决策。
2. 动机:为什么在 Production Stack 中使用 Semantic Router?
2.1 Production Stack 能力(当前状态)
vLLM Production Stack 为大规模服务大语言模型提供了构建模块:
| 能力 | 描述 |
|---|---|
| 分布式部署 | 部署具有 LMCache 原生支持的多个 vLLM 实例,在不更改应用程序代码的情况下从单实例扩展到多实例集群。 |
| 请求路由 | 将请求路由到不同的模型和实例,支持包括分离式预填充、KV Cache 感知、前缀感知、会话和基于轮询的多种路由逻辑。 |
| 服务发现与容错 | 使用 Kubernetes API 进行自动发现,并从池中移除故障节点。 |
| 可观测性 | 提供 Grafana 仪表板以显示延迟分布、首字延迟 (TTFT)、运行中或挂起的请求数量以及 GPU KV Cache 使用情况。 |
| 部署简易性 | 使用 Helm Charts/CRD/推理网关安装堆栈并公开 OpenAI 兼容的 API。 |
这些功能优化了基础设施的使用,但在路由 Token 和请求的级别上运行,而不是基于请求的含义。路由无法感知任务的复杂性或领域,除了简单的用户指定模型 ID 之外,不会决定由哪个模型处理给定的提示词。
2.2 Semantic Router 能力(语义智能层)
Semantic Router 在 vLLM 之上增加了系统级智能:
| 能力 | 描述 |
|---|---|
| 模型混合路由 | 对每个传入的 OpenAI API 请求进行分类,并根据任务复杂性和领域选择最合适的模型。通过将任务路由到专门的模型而不是单一的通用模型,提高了准确性。 |
| 自动工具选择 | 识别哪些外部工具与提示词相关,减少不必要的工具调用。 |
| 特定类别的系统提示词 | 根据查询分类注入专门的系 统提示词(数学、编码、业务等),以提高推理能力和 Token 效率。 |
| 安全过滤器 | 检测 PII 并拦截包含敏感数据的提示词;识别 Jailbreak 提示词并防止其被发送到 LLM。 |
| 相似性缓存 | 使用嵌入 (Embedding) 来缓存提示词的语义表示;如果新提示词与之前的提示词相似,则可以立即返回缓存的响应。 |
| 分布式追踪 | 发出涵盖分类、安全检查、缓存和路由决策的 OpenTelemetry 追踪。 |
这些能力实现了任务感知推理,可以根据每个请求调整推理深度和模型选择。然而,Semantic Router 不管理 GPU 资源或 KV Cache,在与可扩展的服务堆栈耦合时运行效果最佳。
2.3 差异化分析:优势互补
这两个系统针对推理堆栈的不同层级:
Semantic Router – 请求智能层
- 通过多信号分类(结合关键字匹配、嵌入相似性和基于 LLM 的分类)理解用户意图。
- 根据特定领域的评分选择性能最佳的模型和可选工具。
- 通过注入系统提示词和添加路由元数据标头来丰富请求。
- 执行安全过滤(PII 和 Jailbreak 检测)和语义缓存。
Production Stack – 基础设施优化层
- 通过 LMCache 原生支持,使用轮询、基于会话、前缀感知路由、KV Cache 感知和分离式预填充路由来提高推理效率。
- 将 KV Cache 卸载到 CPU 内存和远程存储(通过 LMCache),并支持 KV Cache 感知路由策略。
- 通过 Kubernetes 进行水平扩展,并公开用于监控的指标和追踪。
这些层级之间的重叠极小。Semantic Router 根据用户在问什么做出决策,而 Production Stack 优化请求如何执行。因此,集成将语义智能与 GPU 级效率结合在一起。
2.4 为什么集成很重要:实现系统级智能
如果没有语义智能,Production Stack 会平等地处理所有请求:简单的提示词与复杂的任务使用相同的大模型和推理深度,导致不必要的成本和延迟。如果没有基础设施级的优化,Semantic Router 无法扩展到高 QPS 工作负载或高效管理 KV Cache。通过集成它们:
- 简单的查询(例如事实性问题)可以路由到更小、更便宜的模型,并使用最少的推理,而复杂的任务则使用更大的模型和思维链 (Chain-of-Thought) 推理。
- Semantic Router 的模型选择会过滤 Worker 池,仅保留 服务于所选模型的 Worker;然后 Production Stack 的路由选择具有最高 KV Cache 重叠或负载最低的 Worker。
- 双层缓存(语义缓存 + KV Cache)允许系统要么从缓存中立即提供响应,要么重用 Token 级前缀以减少预填充成本。
- 端到端追踪提供了对语义和基础设施决策的可见性,从而实现持续优化。
3. 目标与非目标
3.1 目标
集成的首要目标是:
- 无缝集成 – Semantic Router 作为 Production Stack 路由之前的预处理层运行。请求从网关流向 Semantic Router,然后流向 Production Stack 路由,最后流向适当的 vLLM Worker。
- 双层缓存 – 将语义缓存(请求级)与 KV Cache 重用(Token 级)结合,使得精确或相似的提示词可以避免完整推理,且部分重叠可以最大限度地减少预填充成本。
- 模型感知路由 – Production Stack 路由根据 Semantic Router 选择的模型过滤 Worker。根据不同的路由逻辑选择最佳 Worker,以最大限度地提高缓存命中率。
- 安全强制执行 – 在提示词到达模型之前拦截包含 PII 或 Jailbreak 模式的提示词。
- 统一可观测性 – 使用 OpenTelemetry 在单个 Span 中追踪语义决策和基础设施路由,并通过 Grafana 监控系统指标。
- 零停机更新 – Semantic Router 的路由规则和模型评分可以热加载,而无需重启 Production Stack。生产路由器的动态配置允许实时更新服务发现和路由逻辑。
3.2 非目标
- 替换 Production Stack 路由 – Semantic Router 增强了现有路由;它不接管基础设施路由。如果 Semantic Router 发生故障,Production Stack 路由将继续使用默认模型路由运行。
- 修改 vLLM 或 Production Stack 核心 – 集成使用标准 API(Envoy 的 ExtProc gRPC 或 HTTP 标头注入),不需要更改 vLLM 内部。
- 统一配置 – 将语义策略的配置与基础设施设置分开,以允许独立演进。
- 同步耦合 – 如果其中一个系统不可用,两个系统都可以独立运行;回退路径可确保优雅降级。
4. 提案细节
4.1 设计原则
- 关注点分离 – 保持语义智能与基础设施优化解耦。Semantic Router 专注于理解和丰富请求,而 Production Stack 路由负责 Worker 选择和调度。
- API 驱动集成 – 使用 Envoy 的外部处理 (ExtProc) gRPC API 或 HTTP 标头注入将 Semantic Router 与 Production Stack 网关和路由集成。这避免了 修改任何一个系统的内部。
- 故障安全设计 – 如果 Semantic Router 不可用或返回错误,网关会将原始请求转发给 Production Stack 路由(绕过语义处理)。Production Stack 路由默认使用用户指定的模型或轮询逻辑。
- Kubernetes 原生 – 利用 Helm Charts/CRD 进行可重复部署。
4.2 系统架构
集成系统由四个层级组成:
系统架构图
-
网关与语义智能
- Envoy 网关 — 接收 OpenAI 兼容的 API 请求,并通过 ExtProc gRPC 将其转发给 Semantic Router。作为统一的入口点。
- Semantic Router 服务 — 一个无状态的 gRPC 服务,运行多个副本以实现高可用性。它执行分类、安全过滤、语义缓存查找、模型和工具选择以及请求丰富。
- Milvus 服务 — 用于语义缓存的向量数据库;存储具有可配置 TTL 的嵌入和响应。
- ConfigMap 和模型 PVCs — 保存路由规则、类别定义和下载的模型权重。
-
基础设施优化 (Production Stack)
- vLLM-router 服务 — 现有的 Production Stack,负责服务发现、负载均衡和 KV Cache 感知/分离式预填充路由。它解析由 Semantic Router 注入的
model字段,并将 Worker 过滤为 提供该模型的 Worker。 - LMCache / KV-Cache 管理器 — 可选地将 KV Cache 卸载到远程存储,并公开缓存命中的指标。
- Prometheus 和 Grafana — 收集并可视化请求延迟、TTFT 和 GPU KV Cache 使用情况等指标。
- vLLM-router 服务 — 现有的 Production Stack,负责服务发现、负载均衡和 KV Cache 感知/分离式预填充路由。它解析由 Semantic Router 注入的
-
执行 (vLLM Worker)
- 模型池 — 每个模型独立的 StatefulSet(例如 llama-3 chat, deepseek-v31, qwen3)和无头服务 (Headless Service)。每个 Worker 运行具有前缀感知或 KV 感知缓存的 vLLM 并生成响应。
- 动态扩展 — Horizontal Pod Autoscaler 或 KEDA 根据 QPS 和 GPU 利用率扩展 Worker 副本。
-
存储层
- 语义缓存存储 — Milvus 使用持久卷 (Persistent Volume) 存储嵌入和响应。
- KV Cache 存储 — 用于热缓存的 GPU 内存;用于温/冷缓存的系统内存或 NVMe。LMCache 可以通过多级存储层次结构在实例之间卸载和共享 KV Cache。
4.3 请求流程
4.3.1 端到端请求处理
- 客户端请求 — 客户端向网关发送一个 OpenAI 兼容的请求(例如
/v1/chat/completions),并指定model:"auto"。 - Envoy 拦截请求 — Envoy 接收 HTTP 请求,并通过 ExtProc gRPC 调用 Semantic Router,传递请求体和标头。
- Semantic Router 处理 — Semantic Router 执行以下流水线:
- 安全过滤 — 运行 PII 和 Jailbreak 检测;如果概率超过阈值,则拦截或脱敏提示词。
- 语义缓存查找 — 生成 MiniLM 嵌入并在 Milvus 中搜索相似查询。命中时,立即返回缓存的响应。
- 多信号分类 — 应用关键字匹配(快速路径)、嵌入相似性(概念搜索)和 ModernBERT 分类。选择置信度最高的信号并分配类别。
- 模型和工具选择 — 查找该类别的模型评分并选择最佳模型。根据查询选择相关的工具和推理模式(开启/关闭)。
- 请求丰富 — 注入系统提示词,将
model字段更新为所选模型,添加路由标头(例如X-VSR-Category、X-VSR-Model、X-VSR-Reasoning)并转发给 Envoy。
- Envoy 转发丰富的请求 — Envoy 将丰富的请求转发给 Production Stack 路由 (vllm-router 服务)。路由无法感知语义修改,并将其视为对指定模型的正常请求。
- Production Stack 路由 — vLLM-router 执行服务发现,并将 Worker 池过滤为提供所选模型的 Worker。它使用轮询、基于会话或前缀/KV 感知算法来选择具有最高缓存重叠或最低负载的 Worker。
- vLLM Worker 执行 — 选定的 vLLM Worker 接收包含注入系统提示词的请求并执行推理。前缀缓存和 KV Cache 重用减少了预填充时间。
- 语义缓存更新 — 当 Worker 返回响应时,Semantic Router 将查询嵌入和响应存储在 Milvus 中,并设置可配置的 TTL。
- 客户端响应 — Envoy 将响应返回给客户端,可选地添加可观测性标头(所选模型、类别、推理模式、缓存命中/未命中)。
4.3.2 双层缓存策略
集成利用了两个互补的缓存层:
- 第 1 层:语义缓存(请求级) — 在 Milvus 中存储完整的请求/响应对。当新查询与缓存查询之间的余弦相似度超过阈值(例如 0.85)时,直接返回缓存的响应而无需任何推理。这消除了不必要的 Token 生成。
- 第 2 层:KV Cache(Token 级) — 由 Production Stack 路由和 LMCache 管理。前缀感知或 KV 感知路由确保具有重叠前缀的请求被路由到 KV Cache 所在的同一 Worker。即使语义缓存未命中,重用 KV Cache 也能减少预填充时间并提高吞吐量。
结合起来,这些缓存提供了三种场景:
| 场景 | 语义缓存 | KV Cache | 结果 |
|---|---|---|---|
| 精确语义匹配 | 命中 | 不适用 | 立即返回缓存响应(无推理) |
| 部分匹配 / 重叠 | 未命中 | 命中 | 执行推理但重用 KV Cache;降低延迟 |
| 新查询 | 未命中 | 未命中 | 完整推理;正常进行分类和 Worker 路由 |