

传统的反向代理与负载均衡算法,其调度决策完全建立在 L4/L7 协议层的确定性特征(如 IP、Header、URL)或后端服务器负载(如连接数、响应延迟)之上。随着大语言模型(LLM)集群成为新的流量下游,传统的调度范式遭遇了资费、容量及模型能力的非对称限制。
目前,许多传统网关通过适配 OpenAI 兼容协议演进为“AI 网关”,但在实现基于语义的智能路由时,仍普遍停留在利用外部嵌入(Embedding)模型计算向量距离,或依赖生成式大模型进行提示词分类的阶段。这不仅带来了工程盲区,也在延迟、成本及稳定性上引入了网关层难以承受的代价。与此同时,以 vllm-sr 为代表的、在路由运行时原生内嵌轻量分类器的全新架构正在打破这一局面。本文将深入 Higress、Kong 以及 vllm-sr 的底层设计与源码实现,解构语义路由的技术演进道路。
在分布式系统架构中,我们常常借用 Scalability Cube(可扩展性立方体) 的 X、Y、Z 三轴模型来观察流量与服务的扩展:
长期以来,传统反向代理与网络协议在这一套三轴范式下运行得很完美。
然而,当流量的下游从“传统微服务”演变为“大语言模型(LLM)集群”时,传统的负载均衡算法突然失效了。
大模型集群的流量分流,表面上看属于 X 轴(有多个语义对等的模型实例可供选择)或 Y 轴(不同规格的模型提供不同的服务能力),但在实际落地中,它引入了一组极其复杂的、传统算法完全无法对齐的多维非对称限制:
如果此时仍然沿用传统无状态的 X 轴负载均衡,或者生搬硬套基于 Path 的 Y 轴路由,企业将面临要么 Token 成本瞬间爆表,要么核心推理业务因流量错配到低端模型而全面崩溃的灾难。
面对大模型时代的流量治理冲突,传统的网络七层(L7)路由显得无能为力,必须深入到请求的文本语义中去寻找答案。至此,语义路由(Semantic Router) 正式登场。
在早期的工业界尝试中,人们尝试利用传统 API 网关挂载 AI 插件来破解多模型路由难题。典型的代表是企业级网关 Kong 的 ai-proxy-advanced 插件。虽然该插件属于闭源的企业级组件(截止V3.9.3版本还未开源),但我们完全可以从其声明式的配置声明中,反推出它的底层实现机制:
_format_version: "3.0"
services:
- name: openai-chat-service
url: https://httpbin.konghq.com/
routes:
- name: openai-chat-route
paths:
- /chat
plugins:
- name: ai-proxy-advanced
config:
embeddings:
auth:
header_name: Authorization
header_value: Bearer <token>
model:
name: text-embedding-3-small
provider: openai
vectordb:
dimensions: 1024
distance_metric: cosine
strategy: redis
threshold: 0.7
redis:
host: redis-stack-server
port: 6379
balancer:
algorithm: semantic
targets:
- model:
name: gpt-4
provider: openai
options:
max_tokens: 512
temperature: 1.0
route_type: llm/v1/chat
auth:
header_name: Authorization
header_value: Bearer <token>
description: "What is Kong?"
- model:
name: gpt-4o-mini
provider: openai
options:
max_tokens: 512
temperature: 1.0
route_type: llm/v1/chat
auth:
header_name: Authorization
header_value: Bearer <token>
description: "What is Microsoft?"从配置中可见,embeddings 配置指定了 OpenAI 的 text-embedding-3-small 模型来获取 1024 维的浮点特征向量。这一机制在工程上包含两个层面的协作:
整个流量的生命周期可以抽象为:请求内容 → Embedding 转化 → 语义向量 → 相似度匹配 → 最优节点转发。
看到这里,熟悉大模型的同学可能会问:既然像 bge-small 这类开源轻量级嵌入模型的推理执行速度已经能压到 5 毫秒以内,为什么网关不直接内置模型,而是大费周章地通过 HTTP 去异步请求外部的 OpenAI 或部署 Sidecar(边车)独立服务?
这背后隐藏着传统反向代理单线程异步事件循环物理限制。
Kong 的底层基于 OpenResty或者说Nginx 实现。Nginx 采用的是经典的 epoll 多路复用模型,采用“单 CPU 单 Worker 进程”的架构。在生产环境下,一个 Worker 进程往往同时并发承载着几十万个网络连接(详见《都是事件驱动,为什么nginx的性能远高于redis》)。
尽管 Embedding 推理只需 5 毫秒,但在这一瞬间,它属于绝对的 CPU 密集型矩阵运算。如果选择在 Nginx Worker 进程内直接通过 Lua FFI 或 C 原生运行该模型,会导致该 Worker 进程的 CPU 利用率在这 5 毫秒内瞬间飙升至 100%。
对于事件循环来说,5 毫秒的同步阻塞等同于灾难——它意味着该 Worker 进程上并发挂载的其他数十万个网络连接的读写事件、定时器都将被全部挂起。因此,网关必须引入非阻塞机制,将网络 IO 与计算分离。这里通过异步 HTTP 请求将向量计算外包给第三方服务或独立的向量 Sidecar 进程,虽然增加了网络延时,却保证了 Nginx 本身的高并发吞吐底线。
然而,这种基于嵌入模型的初代解决方案,在实际工业落地中很快暴露出一个严重的工程痛点:高维意图的“想不到”与预置盲区。
自然语言的变体与上下文是无穷无尽的。无论架构师在后台为模型预设了多么完美的 description 标签,用户的真实 Prompt 总是会轻易跳出预设的语义网(例如隐晦的复合提问、长文本 Prompt 注入攻击等)。
当系统单纯依赖“用户提示词 vs 静态模型描述”的相似度矩阵计算时,会陷入两难境地:阈值卡得太死(如上文配置中的 threshold: 0.7),略带修辞或长尾的提问就会因低于阈值而路由失败;阈值放得太松,错配与误判又会接踵而至。
为了缓解这种由于文本长度、噪声引起的匹配误差,Kong 在配置中允许引入不同的向量相似度度量标准,最典型的就是余弦相似度(Cosine)与欧氏距离(Euclidean)。
正如上文配置中的 distance_metric: cosine,余弦相似度只关注向量夹角的方向,而忽略向量的绝对长度,这意味着它更看重“文本主题的一致性”;相反,欧氏距离(Euclidean)则会严格反映高维空间中的绝对位移距离,对词频的绝对强度、文本长度更为敏感。
如下图所示:
在几何空间中,两条代表提示词的向量其夹角余弦值可能完全相同,但由于文本长度或信息密度的不同,它们的绝对长度不同,从而导致欧氏距离拉开巨大差距。
然而,无论是切换为余弦相似度还是欧氏距离,这种“刻舟求剑”的几何空间路由设计,都无法从根本上绕过“预置盲区”的物理限制。它依然要求架构师能穷举所有业务边界,在面对冷启动业务和复杂的复合用例时,调优空间依然是个死角。
为了彻底解决“想不到”的工业落地痛点,语义路由的技术演进被迫走向了更深的变革——从简单的向量空间距离映射,向动态的、多信号驱动的智能分类决策演进。接下来,我们来看看第二流派:基于生成模型的语义识别。
Higress 是阿里基于 Envoy 开发的网关(我们曾在APISIX架构分析中分析过同类网关的工作原理),因此可通过 Wasm 插件来增加网关功能。其中,ai-intent 插件可用于实现语义识别路由,其配置示例如下:
scene:
category: "金融|电商|法律|Higress"
prompt: "你是一个智能类别识别助手,负责根据用户提出的问题和预设的类别,确定问题属于哪个预设的类别,并给出相应的类别。用户提出的问题为:'%s',预设的类别为'%s',直接返回一种具体类别,如果没有找到就返回'NotFound'。"
llm:
proxyServiceName: "intent-service.static"
proxyUrl: "http://127.0.0.1:80/intent/compatible-mode/v1/chat/completions"
proxyDomain: "127.0.0.1"
proxyPort: "80"
proxyModel: "qwen-long"
proxyApiKey: ""
proxyTimeout: "10000"插件运行时,会把 category 作为模型分类标签,将 scene 加载到如下结构体中:
type SceneInfo struct {
Category string `require:"true" yaml:"category" json:"category"` // 对应 category: "金融|电商|法律|Higress"
Prompt string `require:"false" yaml:"prompt" json:"prompt"` // 对应 prompt: "你是一个智能类别识别助手..."
CategoryArr []string `yaml:"-" json:"-"` // 解析后变成 ["金融","电商","法律","Higress"]
}在请求进入网关时,实际传给大模型的组装逻辑如下:
// 从请求体提取用户问题
originalQuestion := extractUserQuestion(body)
// 将用户问题和预设类别填入模板
promptStr := fmt.Sprintf(config.SceneInfo.Prompt, originalQuestion, config.SceneInfo.Category)
// 例如实际传给 LLM 的是:
// "你是一个智能类别识别助手...用户提出的问题为:'今天天气怎么样?',预设的类别为'金融|电商|法律|Higress'..."而访问生成式模型的则是 llm 部分的配置。其技术本质是利用大模型的强泛化和推理能力。网关在 Access 阶段将请求拦截,组装一个 System Prompt,直接让 LLM 吐出分类结果。
这里存在一个工程细节:由于大模型返回的是自然语言,插件必须在回调中对返回的文本做结构化验证与后处理:
func callback(statusCode int, responseHeaders http.Header, responseBody []byte) {
if statusCode == 200 {
// 解析响应 JSON
proxyResponseBody, _ := proxyResponseHandler(responseBody, log)
if len(proxyResponseBody.Choices) > 0 {
// 提取 LLM 返回的类别文本
category := proxyResponseBody.Choices[0].Message.Content // 例如:"金融" 或 "电商"
// 验证是否属于预设类别
for _, allowed := range config.SceneInfo.CategoryArr { // ["金融","电商","法律","Higress"]
//基于概率的模型输出值可能包含无关的描述,所以只是包含关系也算作识别成功
if allowed == category || strings.Contains(category, allowed) {
// 写入属性,供后续路由使用
_ = proxywasm.SetProperty([]string{"intent_category"}, []byte(allowed))
break
}
}
}
}
// 恢复请求处理
_ = proxywasm.ResumeHttpRequest()
}可以看到,其总体流程图如下所示:

当前代码并没有对 LLM 返回的非预期文本做显式的错误处理,而是通过一种“匹配则注入属性,不匹配或异常则静默忽略”的策略来应对。
优点:
缺点则很多:
注意: 截止 2026 年 7 月最新的 2.2.3 版本,Higress 的 ai-intent 插件依然基于此架构实现语义路由,未来官方可能会对其做进一步的优化演进。
vllm sementic router(vllm-sr) 代表了当前原生 AI 路由的技术前沿。它既不盲目相信简单的向量空间距离,也不去调用沉重且不可控的生成式大模型。它的设计哲学是在路由运行时中,直接加载一个极轻量、高度微调的专用文本分类模型。
从技术演进上看,它使用的是基础模型底座(如轻量的 BERT 变体),并通过 LoRA 等微调技术,使用少量的领域语料,实现了对自然语言提示词的极速、准确分类。
这种架构设计完美规避了前两代方案的工程缺陷:
在执行效率上,分类模型的性能表现远优于生成式模型。因为它不需要进行昂贵的逐字自回归生成,只需一次前向推理即可得出分类概率。借助 Rust 语言底层的矩阵加速引擎,其耗时通常可以控制在 50 毫秒以内,实现了并发吞吐与意图识别准确度之间的工程平衡。
事实上,vllm-sr 的 LoRA 架构还解决了先前多任务路由系统中的效率低下问题。当一个分类系统需要同时确定业务意图、检测个人身份信息、越狱企图、推理复杂度等问题时,传统的常规做法会并行或串行运行多个独立的微调模型。这导致每个模型都会通过其整个网络处理一遍输入(包括开销较大的基础 Transformer 层),使得整体时间复杂度随着分类任务数量 n 的增加而呈现 O(n) 线性增长。
LoRA 通过共享基础模型计算改变了这一点:基础模型只运行一次并生成中间表示,然后每个轻量化的 LoRA 适配器仅应用特定任务的低秩权重更新来专门化输出。由于 LoRA 适配器通常只修改模型不到 1% 的参数,最后一步的并行计算开销极低。这成功将多任务语义计算的复杂度降维到了接近 O(1) 的水平。

因此,vllm-sr 可以针对用户的提示词同时输出多维度的治理信号,这为语义分析和负载均衡算法提供了更多的可能性。目前,vllm-sr 内置提供了多维度的启发式信号:
信号族 | 配置 | 用途 |
|---|---|---|
authz | config/signal/authz/ | 按身份、角色或租户策略路由 |
context | config/signal/context/ | 按有效 token 窗口需求路由 |
keyword | config/signal/keyword/ | 词法或 BM25 风格匹配 |
language | config/signal/language/ | 按检测到的请求语言路由 |
structure | config/signal/structure/ | 按请求形态(如问题数量、有序工作流标记)路由 |
以及深度治理所需的学习型信号:
信号族 | 配置 | 用途 |
|---|---|---|
complexity | config/signal/complexity/ | 检测难/易推理流量 |
domain | config/signal/domain/ | 请求主题族分类 |
embedding | config/signal/embedding/ | 语义相似度匹配 |
modality | config/signal/modality/ | 纯文本、图像生成或混合输出模式 |
fact-check | config/signal/fact-check/ | 需证据核验的提示 |
jailbreak | config/signal/jailbreak/ | 提示注入或越狱企图 |
pii | config/signal/pii/ | 敏感个人数据 |
preference | config/signal/preference/ | 推断响应风格偏好 |
kb | config/signal/kb/ | 将知识库标签或分组绑定为命名路由信号 |
user-feedback | config/signal/user-feedback/ | 纠正或升级类反馈 |
在机制上,学习型信号负责走底层的分布式 LoRA 分类模型,而启发式信号则通过正则表达式、文本长度统计等非模型方式在微秒级快速产生。
最终,vllm-sr 会基于这些产生出的多维信号,使用插件式的声明配置方式来决定请求到底落地到哪个后端:

在 AI 流量治理的工程实践中,如何组合与编排这些信号属于控制面的路由策略问题,而选择何种语义分析机制则属于底座的架构选型问题。
值得注意的是,目前 vllm-sr 官方的预训练底座模型及相关的 LoRA 适配层完全基于英文语料训练,其对中文提示词的特征提取与泛化分类能力在生产环境中基本处于不可用状态。在实际落地国内业务时,必须将基础底座替换为中文 BERT 变体等中文字词表模型。由于 LoRA 权重与底层模型的矩阵维度、分词器词表空间存在强数学绑定,底座切换后,上层的 PII、安全及领域分类等所有 LoRA 适配层均无法直接复用,必须基于中文业务语料重新训练。
从嵌入模型的向量化拓扑映射,到生成模型的提示词控制,再到分类模型的多维适配器输出,语义路由的演进路径清晰地展示了 AI 流量治理在“准确度”、“确定性”与“时延成本”三者之间的工程权衡。
然而,当前的语义路由方案依然将计算逻辑寄托于通用的 CPU 运行时(如 Lua、Wasm 或 Rust 进程空间),在应对更大规模的生产级高并发流量时,基础设施层面依然存在演进空间。
随着大模型流量在企业总流量中的占比持续攀升,在软件层运行向量检索或分类推理,不可避免地会挤占网关高并发网络 IO 的物理计算资源。未来的技术走向之一是语义路由的硬件芯片化。通过将微型张量计算单元(NPU Core)集成至智能网卡或数据处理器(DPU)中,网关可以在数据包流经物理端口的硬件流水线阶段,直接完成特征向量比对或轻量分类器的前向传播,从而实现真正的“硬件级网络语义分流”,将路由延迟压低至微秒级。
现阶段的 AI 网关本质上仍是“无状态”的代理,主要职责是完成单次请求的意图识别与传话。但随着多模态交互、实时音频流(如WebRTC)以及长文本复杂 Agent 工作流的普及,语义路由必须具备上下文感知的状态保持能力。未来的语义路由网络将演变为智能 Agent 的流量操作系统,路由决策不仅取决于当前的 Prompt 语义,还将结合用户历史会话状态、会话窗口内的 Token 消耗趋势,在网关层动态完成多模态流量的切片、上下文合并与协议降级。
从工程本质来看,语义路由是 AI 基础设施演进中不可或缺的底层纽带——它通过对自然语言意图的结构化解构,首次在反向代理层实现了“理解用户意图”与“精准调度物理资源”的深层闭环。随着底座模型的轻量化与硬件卸载技术的发展,语义路由将最终成为分布式 AI 系统的标准控制面协议。
关于作者: 我是 陶辉(《深入理解Nginx:模块开发与架构解析》作者,极客时间《Nginx 核心知识 150 讲》、《Web协议详解与抓包实战》、《系统性能调优必知必会》等专栏讲师)。
本文所有的架构思辨与源码解构,均同步沉淀于我的个人长期技术专栏 “陶辉笔记”。我习惯从底层网络协议(HTTP/3, QUIC, TLS)与高性能网络基础设施(Nginx, Envoy内核)的视角,来审视现代 AI 流量调度(AI Gateway, 语义路由)的系统级演进。
如果你也对分布式系统底座、AI 网关落地或网络性能优化感兴趣,欢迎在评论区留下你的看法,我们一起探讨。