想象一座城市同时运营着两种出行方式:公交车线路固定、只在站牌停靠,你说出准确的站名,它就能准时送你到站;网约车没有固定线路,你说个大概方向,司机凭理解把你送到楼下,但每单成本更高、高峰期还要排队。用户出门时不会自己琢磨该坐公交还是叫车,而是打给调度中心——调度员根据目的地信息,快速判断派哪种车。这座“调度中心”,就是混合检索系统里的查询路由(Query Routing):它站在用户查询和多种检索通道之间,为每一趟“出行”选择最合适的通道。稀疏检索(关键词)像公交,稠密检索(语义向量)像网约车,而查询路由则负责派单。本文将从规则路由讲到学习路由,再聊延迟、回退、训练和工程落地,帮你彻底理解这个混合搜索的“智慧大脑”。

岗位关联

对 AI 从业者而言,查询路由是混合检索落地时性价比最高的优化点之一:一个轻量路由模型就能同时降低延迟、节省算力成本并提升整体检索效果,是面试和实战中都绕不开的核心技能。

目录
  1. 可视化演示
  2. 路由概述
  3. 规则路由
  4. 学习路由
  5. 延迟与回退
  6. 训练与更新
  7. 系统工程
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

模拟查询路由根据查询特征选择稀疏或稠密检索通道,展示路由决策、双通道对比与RRF结果融合过程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

模式1:路由决策流程 词法特征→精确匹配→稀疏检索 语义特征→描述查询→稠密检索 channel = Classifier(features(query)) 路由器根据查询特征选择最优通道。

路由概述

城市调度中心的价值在哪里?它让每一单出行都花最少的时间、最少的钱到达目的地。如果每趟车都让乘客自己去路口拦,早高峰会乱成一锅粥。混合检索系统也是一样:稀疏检索和稠密检索各有优势,但用户并不关心“通道”这个概念,他们只想要最匹配的结果。查询路由,就是那个站在用户和通道之间的“调度中心”。

在混合检索架构里,检索通道通常不止一条:稀疏检索基于倒排索引做精确关键词匹配,稠密检索基于向量相似度做语义理解,还有两者并行的混合通道。路由模块在召回(Retrieval)阶段之前插入一层决策:给定一个查询,先判断走哪条通道,再交给对应的检索后端执行。这个决策要足够快、足够准,因为它是所有查询的必经之路。

从数学上看,路由决策可以抽象成一个从查询到通道的映射函数。路由的目标是在给定查询时,选择“最可能产出好结果”的通道,而不是机械地让所有查询都走同一条路。现代路由系统的决策粒度也不断细化:可以是通道级(dense 还是 sparse),也可以细到索引分片级、甚至模型版本级。

调度中心不会让乘客在雨里纠结半天“该坐什么车”,路由也一样——它把“选通道”这件专业事从用户手里接过来,变成系统内部一次毫秒级的决策。

r=froute(q),r∈{dense,sparse,hybrid}\displaystyle r = f_{\text{route}}(q), \qquad r \in \{\text{dense}, \text{sparse}, \text{hybrid}\}
这个公式说:路由函数 $f_{\text{route}}$ 吃进查询 $q$,吐出一个通道代号 $r$——要么走语义通道,要么走关键词通道,要么两个一起走。
  1. 查询 $q$查询就是用户输入的那段自然语言文本,比如“如何申请年假”,它是路由决策的唯一输入。
    q="如何申请年假"\displaystyle q = \text{"如何申请年假"}
  2. 路由函数 $f_{\text{route}}$它是一段策略代码或一个分类模型,负责把查询映射到最合适的通道上。
    froute:Q→R\displaystyle f_{\text{route}}: \mathcal{Q} \to \mathcal{R}
  3. 路由结果 $r$最终选中的通道代号,它决定了后续查询请求被转发给哪个检索后端。
    r=dense / sparse / hybrid\displaystyle r = \text{dense / sparse / hybrid}
  4. 候选集合三个互相补充的选项——稠密通道靠向量语义,稀疏通道靠词项精确,混合通道则是两者并行,适合难以抉择的查询。
    {dense,sparse,hybrid}\displaystyle \{\text{dense}, \text{sparse}, \text{hybrid}\}

规则路由

新调度员上岗第一天,师傅给他一本《调度手册》:乘客报出完整站名,派公交;乘客说“我要去个大概什么方向的地方”,派网约车;高峰期公交优先,雨天网约车优先……这本手册,就是基于规则的查询路由。它把人类的经验直觉,翻译成一条条 if-else 规则。

编写规则路由时,工程师会从查询里提取一些容易计算的特征做判断。最常用的特征是查询长度:短查询往往信息不足、存在歧义,交给稠密检索用语义理解更合适;长查询包含大量精确词,交给稀疏检索做 BM25 精确匹配性价比更高。此外,查询中是否含引号(精确匹配意图)、是否含型号代码、是什么语言、属于哪个垂直领域,都可以作为规则分支的依据。

规则路由在简单场景下非常有效:可解释、零训练成本、延迟几乎可以忽略。它的数学形态就是一个分段函数:当查询特征落入某个区间时,走对应的分支。下面的公式展示了一个最简单的规则——用查询长度 $|q|$ 与阈值 $\tau$ 比较,决定走哪条通道。

手册虽好,却写不完城市的每一种突发状况。规则路由最大的问题是维护成本:每新增一种查询模式,就要加一条规则;规则之间还可能互相冲突。当城市越来越大,调度员开始意识到——光靠手册,不够用了。

r={dense,∣q∣≤τsparse,∣q∣>τ\displaystyle r = \begin{cases} \text{dense}, & |q| \leq \tau \\ \text{sparse}, & |q| > \tau \end{cases}
这个公式是典型的规则路由:查询长度小于等于阈值 $\tau$ 时走稠密语义通道,否则走稀疏关键词通道。
  1. 查询长度 $|q|$查询分词后的词项数量,比如“年假申请流程”长度为 5。
    ∣q∣=n\displaystyle |q| = n
  2. 阈值 $\tau$工程师根据经验人工设定的分界线,比如 10 个词,需要通过线下数据调优。
    τ=10\displaystyle \tau = 10
  3. 条件分支当查询长度不超过阈值时,说明查询简短、语义模糊,交给稠密检索理解。
    ∣q∣≤τ⇒dense\displaystyle |q| \leq \tau \Rightarrow \text{dense}
  4. 反向分支查询很长时,说明用户已经给出足够精确的信息,用稀疏检索做词项匹配更快更准。
    ∣q∣>τ⇒sparse\displaystyle |q| > \tau \Rightarrow \text{sparse}

学习路由

老调度员退休前带了个徒弟,徒弟每天坐在调度台前看她派单,看了整整三个月。三个月后,徒弟开始自己接手,虽然说不清理由,但派的车越来越准。这个“说不出理由却学得会”的徒弟,就是基于学习的查询路由。

学习路由把路由决策建模为一个分类问题:输入是查询,输出是通道类别。模型从海量历史数据中自动学习“什么样的查询适合什么样的通道”,而不是靠人肉写规则。常用的模型包括逻辑回归(Logistic Regression)、梯度提升树(GBDT)等轻量分类器——因为路由要求低延迟,模型必须足够小、足够快。

特征工程是学习路由的关键环节。常用的特征有:查询长度、词频统计、是否含精确匹配符号、查询的向量表示(用预训练模型把 query 编码成 embedding)、查询所属领域或意图类别等。模型将特征向量映射为每个通道的概率,最后取概率最大的通道作为路由结果。下面是用 softmax 分类器做路由决策的数学形式:

徒弟的经验来自三个月里看过的十万次派单,学习路由的经验则来自历史查询数据。规则路由是“师傅说”,学习路由是“我自己学会了判断”——它不再需要人一条条写规则,但需要高质量的数据来投喂。

P(y=k∣q)=exp⁡(wk⊤ϕ(q))∑j=1Kexp⁡(wj⊤ϕ(q))\displaystyle P(y = k \mid q) = \frac{\exp(w_k^{\top} \phi(q))}{\sum_{j=1}^{K} \exp(w_j^{\top} \phi(q))}
这个公式计算查询 $q$ 属于通道 $k$ 的概率:先把查询映射成特征向量,再对每个通道打分,最后用 softmax 把分数变成概率。
  1. 特征映射 $\phi(q)$把查询文本变成数字向量,比如用词频加查询长度的组合,让模型能“算”而不是“读”。
    ϕ(q)∈Rd\displaystyle \phi(q) \in \mathbb{R}^{d}
  2. 通道得分 $w_k^{\top} \phi(q)$第 $k$ 个通道类别对应的权重 $w_k$ 与特征向量做内积,得到这个通道的得分。
    sk=wk⊤ϕ(q)\displaystyle s_k = w_k^{\top} \phi(q)
  3. Softmax 归一化把所有通道的得分取指数并求和,把得分转换成总和为 1 的概率分布。
    P(y=k∣q)=esk∑j=1Kesj\displaystyle P(y=k \mid q) = \frac{e^{s_k}}{\sum_{j=1}^{K} e^{s_j}}
  4. 决策取 argmax选概率最大的通道,作为最终的路由结果 $r$。
    r=arg⁡max⁡kP(y=k∣q)\displaystyle r = \arg\max_k P(y=k \mid q)

延迟与回退

调度员最怕什么?一是想太久,二是派错车。乘客打电话进来说“我要去机场”,调度员翻手册想了五分钟才派车——乘客早挂了电话自己打车走了;调度员一分钟内派了公交,结果乘客要去的是新机场,公交根本不到——乘客回来投诉,调度中心还得赶紧补派一辆网约车。这两件事,对应路由系统的两个核心问题:延迟开销和误路由回退。

路由本身是一次额外的计算,它花掉的时间会直接叠加到总查询延迟上。如果路由决策要 100ms,而实际检索只要 50ms,那路由就成了最大的性能瓶颈。因此在工程上,路由模型必须轻量,决策时间通常要控制在 10ms 以内。另一方面,误路由不可避免——没有任何模型能 100% 猜中用户的真实意图。所以系统必须设计回退机制:当路由选中的通道返回的结果质量较差(比如最高分低于阈值、结果数太少、或触发超时),自动尝试另一个通道,兜底保证用户体验。

延迟和回退可以用一个期望公式来描述。总延迟等于路由时间加上检索时间,再加上“误路由概率 × 回退额外开销”。这个公式揭示了三个设计杠杆:让路由更快、让检索更快、让误路由率更低。

好调度员的原则是“宁可多问一句,不可错派一趟”——但系统里不能真的“多问”,只能靠阈值兜底。回退机制就像调度中心的应急预案:派错车不可怕,怕的是没有换车的能力。

Ttotal=Troute+Tsearch+perr×Tfallback\displaystyle T_{\text{total}} = T_{\text{route}} + T_{\text{search}} + p_{\text{err}} \times T_{\text{fallback}}
这个公式说明:一条查询的总耗时由三部分构成——路由决策时间、主通道检索时间,以及误路由时回退的期望时间。
  1. 路由时间 $T_{\text{route}}$路由模型做一次通道判断的耗时,要求远小于检索耗时,否则路由成为瓶颈。
    Troute→10ms\displaystyle T_{\text{route}} \to 10\text{ms}
  2. 检索时间 $T_{\text{search}}$被选中的通道真正执行召回的耗时,与通道类型和后端性能有关。
    Tsearch≈50ms\displaystyle T_{\text{search}} \approx 50\text{ms}
  3. 误路由率 $p_{\text{err}}$路由选错通道的概率,是模型能力的直接体现,通常在 5\%~30\% 之间。
    perr=P(r≠r∗)\displaystyle p_{\text{err}} = \mathbb{P}(r \neq r^{*})
  4. 回退时间 $T_{\text{fallback}}$发现派错车后,补跑另一个通道所花费的额外时间;回退越快,用户体验损失越小。
    Tfallback≈Tsearch\displaystyle T_{\text{fallback}} \approx T_{\text{search}}

训练与更新

新调度员的成长路径是三段式:先在培训中心学三个月,再上岗实习,之后每个月都要回炉复盘当月遇到的新案例。学习路由模型的生命周期也一样:离线训练 → 上线部署 → 在线更新。

离线训练的第一步是构造数据。训练数据需要“查询 + 最优通道标签”的配对。标签从哪来?最直接的办法是:把历史查询分别在稠密和稀疏通道各跑一遍,用评估指标(如 NDCG、Recall@K)或线上反馈(点击率、转化率)来判断哪条通道效果更好,把效果更好的通道当作标签。这个“上帝视角”的标注过程可以在离线自动完成,不需要人工逐条标注。模型训练的目标就是让预测的通道尽量匹配这个最优标签。训练完成后模型上线,用新产生的查询持续评估效果。

但查询分布不是一成不变的——双十一大促时全是商品词,新品发布后多了一批新品牌词。模型必须在线更新:常见的做法是定期用最近一周的日志数据重新训练,或者在离线重训之间插入轻量的在线学习(如在线梯度下降)作为补充。冷启动时没有足够历史数据,可以先用规则路由顶着,攒够了数据再切换成学习路由,这也是一种实际的降级策略。下面是二分类交叉熵损失及其梯度更新公式:

调度员每个月复盘,是为了不让经验过时;路由模型持续更新,是为了不让决策落后于查询分布的变化。训练不是一次性的,而是伴随系统全生命周期的持续动作。

L(w)=−1N∑i=1N[yilog⁡y^i+(1−yi)log⁡(1−y^i)]\displaystyle \mathcal{L}(w) = -\frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log \hat{y}_i + (1 - y_i) \log (1 - \hat{y}_i) \right]
w←w−η∇wL(w)\displaystyle w \leftarrow w - \eta \nabla_w \mathcal{L}(w)
第一个公式是交叉熵损失:衡量模型预测的通道概率 $\hat{y}_i$ 与真实最优通道 $y_i$ 的差距;第二个公式是梯度下降更新:让权重朝损失减小的方向挪动一小步。
  1. 标签 $y_i$第 $i$ 条查询的真实最优通道,通过双通道对跑实验得出,1 表示稀疏通道、0 表示稠密通道。
    yi∈{0,1}\displaystyle y_i \in \{0, 1\}
  2. 预测概率 $\hat{y}_i$模型输出“走稀疏通道”的概率,越接近真实标签说明预测越准。
    y^i=σ(w⊤ϕ(qi))\displaystyle \hat{y}_i = \sigma(w^{\top} \phi(q_i))
  3. 交叉熵损失 $\mathcal{L}$真实标签与预测概率之间的负对数似然,损失越小,路由决策和最优决策越一致。
    L=−log⁡y^i当 yi=1\displaystyle \mathcal{L} = -\log \hat{y}_i \quad \text{当 } y_i = 1
  4. 梯度更新 $w \leftarrow w - \eta \nabla_w \mathcal{L}$用损失对权重求梯度,乘以学习率 $\eta$ 后沿反方向更新权重,让模型逐步逼近最优。
    η=0.05\displaystyle \eta = 0.05

系统工程

调度中心最终不是一张桌子加一个调度员,而是一整个大厅:大屏幕实时显示各路况、每个调度台分配不同片区、所有通话录音留档用于复盘、应急预案装在抽屉里随时可取。查询路由的工程落地,也是如此。

在实际系统中,路由服务位于查询入口之后、多个检索后端之前。完整的查询链路是:用户查询进入网关 → 路由服务根据查询特征和模型决策选择通道 → 请求转发至稠密检索后端或稀疏检索后端 → 返回候选结果 → 后续融合排序。路由服务本身要支持配置化:规则可以热更新,模型可以灰度切换,避免一次上线事故把整个检索链路拖垮。部署上,路由模块必须足够轻量,通常和检索服务部署在同一机房甚至同一进程内,避免额外的网络开销。

监控是工程的另一只眼睛。关键指标包括:路由决策准确率、路由耗时、总查询延迟分位数(P50/P95/P99)、回退率、各通道的流量占比。这些指标既能评估路由质量,也能在异常时快速定位问题:比如回退率突然升高,往往意味着路由模型需要更新或者规则配置有误。工程上还常配合 AB 测试,让新路由策略只对部分流量生效,对比指标后再全量发布。下面的公式定义了验证路由模型效果时最直接的准确率指标:

调度中心的大厅里,没有人关心某一次派单是怎么做决定的,大家只关心大屏上的指标是不是健康。路由系统的工程化,就是把“聪明的一次性判断”变成“稳定运转的日常服务”。

Accroute=1M∑j=1M1{rj=rj∗}\displaystyle \text{Acc}_{\text{route}} = \frac{1}{M} \sum_{j=1}^{M} \mathbf{1}\{r_j = r_j^{*}\}
这个公式表示路由准确率:在所有被测查询中,路由模型选中的通道 $r_j$ 与真实最优通道 $r_j^{*}$ 一致的比例。
  1. 测试集规模 $M$用于评估的查询样本总数,通常来自线上日志的留出集,保证覆盖真实场景。
    M=10000\displaystyle M = 10000
  2. 路由预测 $r_j$模型对第 $j$ 条查询做出的通道选择。
    rj=froute(qj)\displaystyle r_j = f_{\text{route}}(q_j)
  3. 真实最优 $r_j^{*}$通过双通道对跑实验得到的“上帝视角”最优通道。
    rj∗=arg⁡max⁡NDCG(channel(qj))\displaystyle r_j^{*} = \arg\max \text{NDCG}(\text{channel}(q_j))
  4. 指示函数 $\mathbf{1}\{\cdot\}$当预测与真实一致时取 1、否则取 0,对所有样本取平均即得到准确率。
    1{rj=rj∗}={1,rj=rj∗0,否则\displaystyle \mathbf{1}\{r_j = r_j^{*}\} = \begin{cases} 1, & r_j = r_j^{*} \\ 0, & \text{否则} \end{cases}

AI 应用场景

电商平台的商品搜索路由

阶段:检索召回阶段的路由决策

解决的问题:用户在电商平台搜“苹果”时,可能是想买苹果手机,也可能是想买水果;搜“iPhone 15 保护壳”这类精确长词时,关键词匹配已经足够好,没必要每次都用大模型做向量语义检索,白白增加延迟和算力成本。传统做法是让所有查询都走同一条向量检索通道,成本高且精确词场景效果不佳。

具体案例:某电商平台在搜索架构中接入查询路由:短查询(如“苹果”“小白鞋女”)走稠密语义通道,利用向量召回理解模糊意图;含品牌型号的长查询(如“iPhone 15 Pro 256G 黑色”)走稀疏关键词通道,用 BM25 精确匹配商品标题。路由模型还会结合历史点击数据,识别出哪些查询在某个通道上的点击率显著更高,动态调整路由策略。上线后该平台搜索链路平均延迟降低 35%,GPU 算力成本下降约 20%,搜索转化率提升 8%。

企业知识库问答的降本增效

阶段:RAG 管道的查询预处理与检索分流

解决的问题:企业内部知识库问答中,“报销流程是什么”这类问题适合用稀疏检索精确命中制度文档的标题和关键词;而“同事总在会议上打断我怎么办”这类开放式问题没有精准关键词,必须靠稠密检索理解语义。如果所有问题都走向量检索,长尾制度类查询召回反而变差;如果都走关键词,开放式问题又答非所问。

具体案例:某企业内部 AI 助手在知识库问答管道中增加了查询路由模块。路由分类器接收查询文本,提取长度、词频、是否包含制度关键词等特征,将查询分流到不同的检索引擎;同时设置了回退机制——当稀疏检索引擎返回的结果置信度低于阈值时,自动补充一次稠密检索。系统上线后,问答命中率从 68% 提升至 84%,同时整体查询响应时间缩短约 30%。

Python 演示

python67 行
# -*- coding: utf-8 -*-"""演示两种查询路由方案:规则路由 vs 学习路由。用模拟数据训练一个逻辑回归路由分类器,对比两者在"选择稀疏/稠密检索通道"上的准确率。"""import numpy as np  def make_data(seed=42):    """构造模拟数据: 特征=[查询长度, 是否含精确词, 是否问句], 标签=最优通道"""    rng = np.random.default_rng(seed)    N = 2000    X, y = [], []    for _ in range(N):        q_len = int(rng.integers(2, 30))        has_exact = int(rng.random() < 0.3)        is_question = int(rng.random() < 0.2)        if q_len < 8 and not has_exact:            label = 0  # 短查询 + 无精确词 -> 稠密语义通道        elif q_len >= 15 and (has_exact or is_question):            label = 1  # 长查询 + 精确词/问句 -> 稀疏关键词通道        else:            label = 0 if rng.random() < 0.4 else 1        X.append([q_len, has_exact, is_question])        y.append(label)    return np.array(X, dtype=float), np.array(y)  def rule_route(feat):    """规则路由: 查询长度>=12 或 含精确词时走稀疏通道, 否则走稠密通道"""    q_len, has_exact, _ = feat    return 1 if (q_len >= 12 or has_exact) else 0  def train_logistic(X, y, lr=0.05, epochs=300):    """用梯度下降训练逻辑回归, 返回权重向量 w"""    X_aug = np.hstack([X, np.ones((X.shape[0], 1))])  # 偏置列    w = np.zeros(X_aug.shape[1])    for _ in range(epochs):        logits = X_aug @ w        prob = 1.0 / (1.0 + np.exp(-logits))        grad = X_aug.T @ (prob - y) / len(y)        w -= lr * grad    return w  def lr_route(feat, w):    """学习路由: 特征加权得分>=0 走稀疏通道, 否则走稠密通道"""    aug = np.array(feat + [1.0])    return 1 if (aug @ w) >= 0 else 0  def main():    X, y = make_data()    rule_pred = np.array([rule_route(f) for f in X])    rule_acc = (rule_pred == y).mean()    print("规则路由准确率: %.2f" % rule_acc)     w = train_logistic(X, y)    lr_pred = np.array([lr_route(f, w) for f in X])    lr_acc = (lr_pred == y).mean()    print("学习路由准确率: %.2f" % lr_acc)    print("学到的权重(长度/精确词/问句/偏置):", w)  if __name__ == "__main__":    main()
目的:用同一份模拟数据分别训练“写死规则的调度手册”和“会学习的调度员”,直观对比两种查询路由方案的准确率差异。
  1. if q_len < 8 and not has_exact:模拟“上帝视角”的最优通道标签:短查询且没有精确词时,稠密语义通道更优,标注为 0。
  2. rule_pred = np.array([rule_route(f) for f in X])用写死的规则给所有样本做预测,作为对照基线。
  3. X_aug = np.hstack([X, np.ones((X.shape[0], 1))])把偏置项拼进特征矩阵,这样权重向量的最后一维就是阈值偏移,简化了模型表达。
  4. logits = X_aug @ w线性得分,即公式中的 $w^{\top}\phi(q)$,每个样本的特征与权重做内积。
  5. prob = 1.0 / (1.0 + np.exp(-logits))Sigmoid 函数把得分压到 0~1 之间,作为“走稀疏通道”的概率。
  6. grad = X_aug.T @ (prob - y) / len(y)交叉熵损失对权重的梯度,直觉上就是“预测概率减真实标签”的残差乘以特征。
  7. w -= lr * grad沿梯度反方向更新权重,让模型逐步向“预测更准”的方向移动。
  8. return 1 if (aug @ w) >= 0 else 0学习路由的决策规则:得分非负走稀疏通道,否则走稠密通道。

常见误区

误区“查询路由不就是判断一下查询长度然后走不同通道吗?我写个 if-else 一小时就能搞定,为什么要学这么复杂?”

正解简单的规则路由确实能用一行 if-else 实现,但它只在查询分布稳定的小场景有效。真实系统的查询分布极其复杂——多义词、中英文混合、长尾新词、不同领域的查询特征天差地别。规则路由维护超过几十条规则后就会变得不可控,规则之间互相冲突、边界情况叠床架屋。学习路由的价值在于从数据中自动学到“说不清但很准”的判断边界,同时能随数据分布漂移而更新,这不是手写规则能覆盖的。

为何常见:规则路由的起点太简单,让人误以为路由的全部就是几个规则;而实际上路由的核心难点在于数据、评估和持续迭代。

误区“查询路由就是在稠密和稀疏两条通道里选一条,不存在第三种可能。”

正解路由的候选集合完全由系统设计决定,除了选稠密或选稀疏,还可以选混合(hybrid)通道——即两个通道并行召回,再融合结果。混合通道耗时更长、成本更高,但在查询意图特别模糊时效果最好。更精细的路由系统还可以在“仅稠密”“仅稀疏”“稠密优先稀疏兜底”“双通道并行”等多种模式之间做选择,甚至根据当前系统负载动态调整候选策略。

为何常见:教材和案例为了讲解清晰,常以二分类举例,导致学习者把二分类当成了路由的全部形态。

误区“反正把所有通道都跑一遍再融合结果,效果一定比路由选一个通道好,那还要路由干嘛?”

正解全通道并行确实能规避误路由风险,但代价是延迟上升和算力成本成倍增加。在搜索场景每毫秒都影响用户转化,在 RAG 场景每个额外通道都会增加 LLM 调用的等待时间。查询路由的核心价值恰恰是在“效果”和“成本”之间取平衡:让简单查询走轻量通道,只把复杂查询交给重型通道,再用回退机制兜底误判。路由 + 回退的整体期望效果,可以在接近全并行的质量下,把平均延迟和成本降低一个数量级。

为何常见:初学者只看到“全并行效果最好”的一面,忽略了工程上延迟和成本的约束才是路由存在的根本原因。

误区“路由分类器是离线训练好的,上线之后只要没有 bug 就可以一直跑,不需要再管它。”

正解查询分布是动态变化的:电商大促期间商品词暴涨、社会热点事件带来全新的长尾查询、新用户群体带来不同的语言习惯。如果路由模型不更新,它的判断就会逐渐偏离真实的最优通道,表现为回退率上升、检索效果下滑。生产级路由系统都有在线更新机制:定期用最新日志重训模型,配合滑动窗口保留近期样本,再通过监控指标触发应急更新。路由模型和调度员一样,需要持续进修。

为何常见:离线训练是完整流程里最显眼的一步,让人误以为模型上线即结束;实际上持续运营才是工程系统的主旋律。

面试题

Q1. 在混合检索架构中,查询路由的核心职责是什么?

单选题 · easy

  • A.对检索结果进行精确排序
  • B.为查询选择合适的检索通道← 正确答案
  • C.压缩索引以降低存储开销
  • D.重写用户查询以提升召回

答案:B。查询路由就像调度中心,职责是决策“这单派公交还是网约车”,而不是亲自开车。排序是排序模块的活,索引压缩和查询改写是其他优化手段,都不属于路由的核心职责。

Q2. 用户输入“iPhone 15 Pro 256G 黑色”做搜索,哪种路由策略最合理?

单选题 · easy

  • A.始终选择稠密语义检索通道
  • B.始终选择稀疏关键词精确匹配← 正确答案
  • C.按照查询长度随机选择通道
  • D.直接拒绝该查询不返回结果

答案:B。这条查询包含完整的型号和规格词,是“报出了准确站名的公交乘客”,稀疏检索的 BM25 精确匹配就能高效命中。完全走语义通道反而可能引入噪声,随机选择或拒绝更是无理取闹。

Q3. 与“写死规则的调度手册”最对应的是哪种路由方式?

单选题 · easy

  • A.基于规则的查询路由← 正确答案
  • B.基于学习的查询路由
  • C.向量最近邻检索
  • D.倒排索引精确匹配

答案:A。规则路由就是人工把经验写成 if-else 规则,和调度手册是一个性质;学习路由是 AI 调度员从数据里自己学判断;向量检索和倒排索引是被路由选择的通道,不是路由本身。

Q4. 查询“苹果手机和苹果哪种更值得买”在电商场景下,路由模型最应解决的问题是什么?

单选题 · mid

  • A.分词后去掉所有标点符号
  • B.判断苹果指品牌还是水果品种← 正确答案
  • C.把查询翻译成多种语言
  • D.计算查询哈希以加速缓存

答案:B。“苹果”是个多义词,指品牌还是水果对应不同的商品体系和检索策略。路由模型可以结合上下文、领域词表和历史行为判断查询意图,进而选择更合适的通道。分词、翻译、哈希都不是路由层面的核心问题。

Q5. 路由决策自身的延迟开销过大,最可能导致什么后果?

单选题 · mid

  • A.检索结果全部变成错误
  • B.总体查询延迟上升体验变差← 正确答案
  • C.索引文件大小自动翻倍
  • D.稠密向量维度发生变化

答案:B。总延迟 = 路由时间 + 检索时间 + 回退期望时间。路由时间直接叠加进总延迟,如果调度员想太久,乘客早就等不及走了。路由延迟过大不会改变检索结果本身,也不会影响索引或向量维度。

Q6. 关于稀疏检索和稠密检索,下列哪些描述正确?

多选题 · mid

  • A.稀疏检索依赖倒排索引匹配← 正确答案
  • B.稠密检索借助向量语义理解← 正确答案
  • C.两者只能二选一不能混合
  • D.路由基于查询特征做取舍← 正确答案

答案:ABD。稀疏检索基于倒排索引做精确词匹配,稠密检索用向量语义理解“大概意思”,二者各有所长。C 错误——混合搜索正是两者取长补短,查询路由则是根据查询特征在二者之间做取舍的调度员。

Q7. 某查询先走了稀疏通道,但返回结果质量很差,系统自动切换稠密通道重试。这个过程叫什么?

单选题 · mid

  • A.对索引进行水平分片存储
  • B.对用户查询进行同义改写
  • C.误路由之后的自动回退← 正确答案
  • D.大模型蒸馏小模型

答案:C。这是典型的误路由回退:路由一开始选错通道,发现结果质量不达标后自动“换车”到另一个通道。索引分片是存储方案,查询改写是预处理,模型蒸馏是模型压缩手段,都和这个场景无关。

Q8. 训练一个学习式查询路由模型时,哪些是合理的训练标签来源?

多选题 · hard

  • A.两通道分别跑历史查询取优← 正确答案
  • B.人工标注理想通道数据集← 正确答案
  • C.线上指标隐性反馈构造← 正确答案
  • D.完全随机生成标签再拟合

答案:ABC。标签的来源可以是“双通道对跑取效果更好的一方”(上帝视角)、人工标注的“理想通道”数据集,也可以用线上点击率等指标做隐性反馈。D 完全随机生成标签等于给调度员随机答案,模型学不到任何真实规律。

Q9. 查询路由模型上线后,哪些信号出现时应当触发在线更新?

多选题 · hard

  • A.新商品上线查询分布漂移← 正确答案
  • B.误路由回退率持续上升← 正确答案
  • C.大促期间长尾词激增← 正确答案
  • D.单次查询结果完全正常

答案:ABC。查询分布漂移、回退率上升、大促带来的新词洪峰,都是“调度员需要进修”的信号。单次查询正常只是个体样本没有问题,不代表全局模型不需要更新,D 不能作为触发更新的依据。

Q10. 路由耗时 10ms,主检索耗时 50ms,误路由率 20%,误路由后回退补跑另一通道再耗时 50ms。该查询的平均总耗时期望为多少毫秒?

单选题 · extreme

  • A.55 毫秒(只算路由与主检索)
  • B.60 毫秒(加入一半的回退成本)
  • C.70 毫秒(计入期望回退时间)← 正确答案
  • D.100 毫秒(每次必发生一次回退)

答案:C。总耗时期望 = 10 + 50 + 0.2 × 50 = 70ms。A 忽略了误路由的成本,D 把 20% 误路由当成 100% 误路由,B 的错误在于把回退成本减半处理,与 20% 的误路由率对不上。这也说明误路由率是路由工程质量的关键数字。