老杨开了二十年餐厅,最近遇到了一个烦恼:店里有两本点菜单。老顾客打电话来,直接报菜名:“来一份宫保鸡丁!”——这是精确匹配,一个字都不能错。新顾客在小程序上下单,写的是“想吃点酸辣开胃、适合夏天的小菜”——这是语义理解,说的是口味而不是菜名。老杨发现,如果只靠一本菜单接单,一定会漏掉另一批客人:报菜名的订单条理清晰但表达不了口味偏好,描述口味的订单灵活自由却经常词不达意。于是他决定:两个渠道都开,接单后再把所有订单汇总到后厨,一起排菜。这就是“混合检索”——一条路用关键词精确命中,一条路用语义向量理解意图,最后把两份候选名单融合排序,交给大模型生成答案。本文会用老杨餐厅的故事,带你从零看懂向量加关键词混合检索的完整链路:双路召回、RRF 融合、加权调参、重排序、端到端评估,以及生产落地。
对 AI 从业者而言,混合检索是 RAG 系统从“能跑”走向“好用”的分水岭。掌握向量与关键词双路融合与调参,是构建生产级检索系统的关键技能,也是算法工程师面试的高频考点。
可视化演示
动态演示向量加关键词混合检索的核心机制,通过源头/管道/节点/终端四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
向量加关键词混合检索:混合检索 混合检索系统架构设计与工程实现 RRF倒数排名融合算法的工程实 核心机制可视化 向量加关键词混合检索整体架构与关键组件
混合检索架构
老杨的餐馆开业第三年,他发现自己犯了一个错误:电话订餐和线上小程序是两套独立的系统,互不相通。电话订单里顾客说“糖醋排骨”,小程序订单里顾客写“想吃酸甜口的肉”,明明是一回事,后厨却要备两份菜单。老杨意识到,必须把两种订单汇总到一张总单上,厨房才能高效出菜。RAG 系统里的混合检索,就是干这件“汇总总单”的活——向量检索负责理解语义,关键词检索负责精确匹配,两者合力,才能覆盖真实世界的查询。
在 RAG 架构中,用户 query 先经过查询改写,然后同时发起两路检索:一路把 query 编码成向量,在向量数据库中做近似最近邻搜索,返回语义上相似的文档;另一路对 query 做分词,用 BM25 在倒排索引中召回字面匹配的文档。两路候选汇入“融合引擎”,常见的融合策略有 RRF(倒数排名融合)和加权分数融合。融合之后可以选择性地接 Rerank 模型精排,最终把 TopK 文档拼进上下文,送大模型生成回答。
混合检索的候选集规模,可以表示为两路召回结果的并集:
老杨把电话订单和小程序订单合成一张总单后,出错的订单少了,回头客也多了。混合检索的本质正是如此:两路召回不是二选一,而是合力把“菜”找齐,之后的融合与重排,才是决定“哪道菜先上桌”的关键。
- 候选集合$R_{\text{vec}}$ 是向量检索返回的候选文档列表,$R_{\text{kw}}$ 是关键词检索返回的候选列表,两路互为补充。
- 并集操作$\cup$ 把两份名单合并,重叠文档去重,避免同一份文档重复占用上下文窗口。
- 集合大小$|R_{\text{mix}}|$ 是最终候选数量,通常控制在 20~100 条,再交给融合与重排。
向量检索原理
老杨发现有经验的点菜员有个本事:客人说“想吃点清淡开胃的”,点菜员不会真的去后厨翻一本《菜名大全》,而是凭经验把这句话翻译成一种“口味画像”——少油、微酸、有鲜味,再和每道菜的口味画像比对,挑出最接近的几道。向量检索做的事几乎一样,只不过它把“口味画像”叫做 Embedding(嵌入向量)。
把文本编码成向量的模型叫 Embedding 模型。它把“清淡开胃”这句话映射成一组几百维的浮点数,每道菜对应的文档也被映射成同样维度的向量。向量之间有多“像”,用余弦相似度来度量,夹角越小,语义越接近。寻找相似向量的过程叫近似最近邻搜索(ANN),配合 HNSW、IVF 等索引结构,可以在亿级向量里毫秒级返回 TopK。
余弦相似度的计算方法是:
点菜员的“口味画像”也有失灵的时候——客人报出“松鼠鱼”这种具体菜名,画像再准也猜不出字怎么写。这正是老杨保留电话订餐(关键词检索)的原因,两种能力天生互补。
- 向量表达$u$ 是查询语句的向量,$v$ 是文档的向量,$u_i$ 与 $v_i$ 是它们第 $i$ 个维度上的数值。
- 点积$\sum_{i=1}^{n} u_i v_i$ 逐位相乘后累加,结果越大说明两个向量在同一方向上“共振”越强。
- 模长归一化分母 $\sqrt{\sum_{i=1}^{n} u_i^2}$ 是向量长度,用它做标尺,消除文档长短带来的偏差。
- 相似度结果$\text{sim}(u,v)$ 越接近 1,两段文字语义越相近,“想吃的”和“端上来的”越对味。
关键词检索原理
老杨的电话订餐之所以可靠,是因为老顾客报菜名时一字不差:“水煮牛肉,不要香菜。”电话那头的伙计不用猜,直接在《菜名抽屉柜》里找“水煮牛肉”这一格,把对应食材单抽出来。这个“从菜名到食材单”的抽屉柜,在信息检索里叫做倒排索引——提前建立“词 → 包含该词的文档列表”的映射,查询时按词查表,比逐篇翻文档快几个数量级。
倒排索引建好后,剩下的问题是如何给命中的文档排序。BM25 是目前最经典的排序算法:它同时考虑词频(词在文档里出现越多越重要)、逆文档频率(越稀有的词越有区分度)和文档长度(越长的文档对词频越“宽容”)。比如搜“年假”,一篇反复出现“年假”的短制度文档,会比一篇夹带提了一次“年假”的冗长报告得分更高。
BM25 的打分公式为:
不过,电话订餐(关键词)也怕“说不清”:客人在电话里说“随便来点下饭的”,伙计就懵了。老杨很清楚,只有电话通道会漏单,只有口味画像通道会听错菜名,两条通道缺一不可。
- 稀有词权重$N$ 是文档总数,$n(q_i)$ 是包含词 $q_i$ 的文档数。越少文档包含该词,IDF 越大,说明它越能区分文档。
- 词频分子$f(q_i,D)$ 是词 $q_i$ 在文档 $D$ 中出现的次数,配合 $k_1+1$($k_1$ 通常取 1.5)做饱和控制,避免重复词无限加分。
- 长度归一化分母$|D|/ \text{avgdl}$ 是文档长度与平均长度的比值,参数 $b$(通常 0.75)控制惩罚力度,长文档的同词频得分会被压低。
- 求和汇总对查询中的每个词独立计算再求和,得到文档与查询的整体相关度分数。
RRF融合算法
两份订单汇总到老杨桌上后,新的问题来了:电话订单记的是“宫保鸡丁第 1 名、鱼香肉丝第 2 名”,小程序订单记的是“鱼香肉丝第 1 名、宫保鸡丁第 2 名”,两边评分标准还不一样——电话订单按顾客语音清晰度排序,小程序订单按收藏人数排序。这分数根本没法直接比大小!老杨一拍大腿:我不比分值,只比名次。第 1 名的单子都记 1 分,第 2 名记 0.5 分,第 3 名记 0.33 分……把每道菜在两边拿到的名次分加总,谁高谁先做。
这个“只看名次、不看原始分”的思路,就是 RRF(Reciprocal Rank Fusion,倒数排名融合)。它最大的好处是免疫两路分数分布不一致的问题:向量分数可能是 0.8 到 0.9 之间拥挤,BM25 分数可能从 0 到 15 稀疏分布,但名次永远是 1、2、3 这样均匀可比的。RRF 为每个候选文档计算融合分:
老杨用“名次积分”合并订单后,后厨再也没有吵过架:榜单第一名和第二名的菜都认真做,T3 之后的菜按需备料。RRF 在工程上还有一个额外的好处——它不需要提前归一化两路分数,部署成本极低,这也是它成为生产级混合检索默认首选的原因。
- 榜单集合$R$ 是所有检索结果列表的集合,在混合检索里就是关键词榜单和向量榜单。
- 名次函数$r(d)$ 是文档 $d$ 在某个榜单中的排名,第 1 名 $r=1$,第 10 名 $r=10$,名次越小越好。
- 倒数折算$\frac{1}{k+r(d)}$ 把名次转成分数,$k$ 是平滑常数(惯例取 60),$k$ 越大,名次之间的分差越平缓。
- 分数加总$\sum_{r \in R}$ 把文档在所有榜单上的倒数分相加,得到跨榜单的公平融合分。
加权融合调参
名次积分制解决了一部分问题,但老杨发现它有个别扭的地方:电话订单是老顾客的,回头客多、价值高;小程序订单虽然量大,但很多顾客只是随便看看。老杨想,能不能给两种订单不同的权重?比如“电话订单说话算数”权重占 70%,“小程序口味描述”权重 30%。加权融合就是干这件事的——它直接对两路的原始相似度分数做加权求和,但前提是先把分数归一化到同一个量纲。
加权融合公式如下:
权重怎么定?经验做法是在验证集上扫描:从 $\alpha=0.1$ 到 $\alpha=0.9$ 步长 0.1,对每组权重计算离线评估指标(如 Recall@K 或 NDCG),选指标最高的一组。要注意的是,权重扫描结果容易过拟合到特定验证集,所以还要留一份“未见过的测试集”做最终确认。老杨拍板了“电话单七成、小程序单三成”之后,果然回头客更满意,新客人也没流失——调参的价值就在这个平衡点上。
- 归一化分数$\tilde{s}_{\text{vec}}(d)$ 和 $\tilde{s}_{\text{kw}}(d)$ 是向量分和关键词分归一化到 0~1 区间后的结果,消除量纲差异。
- 平衡系数$\alpha$ 是向量语义分的权重,取值范围 0~1;$1-\alpha$ 自动成为关键词分的权重。
- 加权求和$s_{\text{mix}}(d)$ 是文档的最终混合分,分数越高排名越靠前。
- 权重示例$\alpha=0.7$ 表示语义理解占主导;$\alpha=0.3$ 表示更强调精确匹配,适合专有名词多的领域。
重排序优化
融合引擎把候选名单排好之后,老杨发现还差最后一道工序:主厨亲自把关。融合排名靠前的菜,可能因为今天缺食材、或者口味搭配不合理而做不了。主厨必须把每一道候选菜都亲自核对一遍——看看食材新不新鲜、客人有没有忌口,然后再决定最终出菜顺序。在 RAG 里,这道“主厨把关”就是 Rerank(重排序)。
为什么要重排序?因为向量检索和融合阶段的打分模型(双塔结构)都太“粗糙”了:它们把 query 和 doc 各自编码成向量,最后只算一个相似度,细节信息在压缩过程中丢失了。而 Rerank 模型使用交叉编码器(Cross-Encoder),把 query 和 doc 拼接成一个完整的序列,让 Transformer 模型同时看两边的内容,逐词交互地判断相关性。代价是计算量大——每对 query-doc 都要跑一次完整的前向传播,所以只能对融合后的少数候选(如 20~50 条)精排。
交叉编码器重排序的打分形式为:
主厨把每一道“菜”亲自过目之后,端上桌的菜品质量明显提升了一个档次。在 RAG 管线里,Rerank 通常放在融合之后、大模型生成之前,是“以算力换精度”的经典一步——生产环境往往用精排模型只处理 Top20 候选,把延迟控制在可接受范围。
- 拼接输入$\text{concat}(q,d)$ 把查询词序列和文档词序列拼成一个长序列,模型能同时看到双方的完整内容。
- 交叉编码器$\text{CE}_{\theta}$ 是 BERT 类模型,输出一个代表“相关 vs 不相关”的 logit 值。
- Sigmoid 映射$\sigma(x)=1/(1+e^{-x})$ 把 logit 压到 0~1,得到相关性概率。
- 重排序应用对融合榜中的每一条候选计算 $\hat{p}$,按概率降序取 TopK 送入 LLM。
端到端评估
老杨的新菜单上线一个月,他该怎么判断成功?只看“上菜速度”(检索时延)显然不够——菜上了桌但客人觉得难吃,照样给差评。老杨决定做三件事:统计每桌客人的“满意率”(召回质量)、看“招牌菜推荐准不准”(排序质量)、最后直接看“回头客比例”(端到端 RAG 效果)。评估混合检索,也必须这样分层。
最基础的指标是 Recall@K:在人工标注的“相关文档集合”里,有多大比例被检索系统排进了前 K 名。比如知识库里 10 篇相关文档,检索 Top10 命中了 6 篇,Recall@10 就是 0.6。Recall@K 只关心“有没有找到”,不关心“排第几”,所以还需要 MRR(第一个正确答案的平均倒数排名,越高说明好结果越靠前)和 NDCG(考虑排序位置加权的质量指标)来补全排序质量的维度。
Recall@K 的计算公式为:
更重要的是端到端评估:把混合检索放进 RAG 全景里,用“生成答案是否正确、有没有幻觉、是否引用了正确来源”来衡量整体效果。老杨的最终判断标准不是某个单店指标,而是顾客是否愿意再次光顾——正如 RAG 系统最终要回答好用户的问题,而不只是“检索很准”。
- 相关文档集合$R_{rel}$ 是标注员确认与查询真正相关的文档集合,是评估的“标准答案”。
- 检索结果切片$R_{topK}$ 是系统返回的前 K 篇文档,K 通常取 5、10 或 20。
- 交集计数$|R_{rel}\cap R_{topK}|$ 是 TopK 结果里有多少篇真正相关,分子越大越理想。
- 命中比例$\text{Recall@K}$ 的值在 0~1 之间,越高说明漏掉的答案越少。
生产实践
菜单定型后,老杨决定开连锁店。他总结了三条经营铁律:第一,招牌菜提前备好半成品,客人点单直接出餐(缓存加速);第二,后厨装监控,哪道菜出餐慢了马上报警(监控告警);第三,新菜品先在 10% 的门店试卖,没问题再全量推广(渐进发布)。这三条平移过来,就是混合检索生产落地的完整方案。
缓存加速方面,可以用一个哈希表做高频 query 的检索结果缓存,命中后直接返回。结合前面的缓存命中率公式,理想状态下命中率大于 50%,检索 P95 延迟能下降一个量级。监控方面,除了常规的 QPS、P95 延迟,还要盯住“检索召回率”与“空结果比例”,用日志做离线回归,防止上游模型升级导致线上检索质量雪崩。渐进发布则建议按“内部白名单 → 5% 流量 → 50% 流量 → 全量”的节奏推进,每一步都对比新旧链路的离线评估指标。
缓存命中率的衡量公式:
成本控制上,向量检索需要占用大量内存的 ANN 索引,关键词检索需要维护倒排索引和分词词典,两路叠加的算力开销不容小觑。常见做法是:向量库用分层量化压缩(如 PQ 量化)减少内存;关键词路对短查询直接走缓存;两路共用一套文档分片,减少存储冗余。老杨的连锁店越开越大,靠的不是某一道菜有多惊艳,而是整条流水线的稳定和可复制——混合检索的生产实践同理:先让链路标准可监控,再谈效果优化的上限。
- 命中次数$H$ 是查询命中缓存的次数,例如“年假休几天”这种高频问题直接返回缓存结果。
- 未命中次数$M$ 是缓存未命中的请求数,需要走完整的双路检索流程。
- 命中率计算$h=H/(H+M)$ 是缓存命中率,生产环境通常希望大于 50%。
AI 应用场景
企业知识库智能助手
阶段:检索召回与融合排序
解决的问题:企业知识库中大量文档既有“准确编号”(如合同编号、制度条款号)又有“口语化描述”(如“我们年假能休几天”)。纯向量检索对“FT-2024-0711“这种编号不敏感,纯关键词检索理解不了”请假能拿多少钱”这类口语提问,导致回答经常翻车。
具体案例:某公司内部 QA 机器人接入混合检索后,用户提问“去年入职的能休几天年假”——向量路召回“年假制度”文档,关键词路精确命中“入职满一年”字样的条款,RRF 融合后送到 Rerank 精排,最终 LLM 依据正确条款生成回答。上线后检索命中率从 62% 提升到 89%。
电商智能客服
阶段:多路召回与反馈调参
解决的问题:电商客服语料中商品型号(“iPhone 15 Pro Max“)和用户口语(”最新款的苹果手机”)并存,单一检索路要么匹配不到型号,要么不懂口语。加权融合可以让模型对型号词加大关键词分,对口语描述加大语义分。
具体案例:某电商平台的售后助手使用加权融合,通过验证集扫描确定 $\alpha=0.65$,即语义分占 65%、关键词分占 35%。优化后“数据线坏了怎么办”这类问题能稳定召回“三包政策”相关文档,转人工率下降了 23%。
学术文献 RAG
阶段:检索评估与端到端优化
解决的问题:学术论文检索中,用户既需要“检索 Transformer 注意力机制”这种抽象主题(语义匹配),又需要“BERT 2019 年那篇原始论文”这种精确指代(关键词匹配)。混合检索配合重排序能显著提升引文召回质量。
具体案例:某科研助手基于 ArXiv 构建混合检索 RAG,用 Recall@10 评估发现混合检索比纯向量检索高出 14 个百分点;在端到端 RAG 评测中,生成的引文正确率从 71% 提升到 84%。
Python 演示
import math DOCS = [ "公司年假制度: 入职满一年享五天年假", "年假可以跨年度累计, 最多叠加十天", "病假需要医院证明, 每年不超过十五天", "加班调休需提前一天在系统提交申请", "公司福利包括年度体检和补充医疗保险", "调休额度每季度清零, 不可跨季使用",] def tokenize(text): # 简化二元分词, 演示用 return [text[i:i+2] for i in range(len(text) - 1)] class MiniBM25: def __init__(self, docs, k1=1.5, b=0.75): self.k1 = k1 self.b = b self.doc_count = len(docs) self.doc_len = [] self.inverted = {} self.avgdl = 0.0 for idx, doc in enumerate(docs): terms = tokenize(doc) self.doc_len.append(len(terms)) self.avgdl += len(terms) for term in terms: if term not in self.inverted: self.inverted[term] = {} self.inverted[term][idx] = self.inverted[term].get(idx, 0) + 1 self.avgdl /= self.doc_count def idf(self, term): n = len(self.inverted.get(term, {})) return math.log((self.doc_count - n + 0.5) / (n + 0.5) + 1.0) def score(self, query, doc_idx): dl = self.doc_len[doc_idx] total = 0.0 for term in set(tokenize(query)): tf = self.inverted.get(term, {}).get(doc_idx, 0) if tf == 0: continue denom = tf + self.k1 * (1 - self.b + self.b * dl / self.avgdl) total += self.idf(term) * tf * (self.k1 + 1) / denom return total def hybrid_search(query, k=60, top=3): bm25 = MiniBM25(DOCS) kw_rank = sorted(range(len(DOCS)), key=lambda i: bm25.score(query, i), reverse=True) # 模拟向量检索: 用字符重合度近似语义相似度 vec_score = [sum(1 for c in set(query) if c in DOCS[i]) for i in range(len(DOCS))] vec_rank = sorted(range(len(DOCS)), key=lambda i: vec_score[i], reverse=True) rrf = {} for i, doc_idx in enumerate(kw_rank): rrf[doc_idx] = rrf.get(doc_idx, 0) + 1.0 / (k + i + 1) for i, doc_idx in enumerate(vec_rank): rrf[doc_idx] = rrf.get(doc_idx, 0) + 1.0 / (k + i + 1) final = sorted(rrf.items(), key=lambda x: x[1], reverse=True)[:top] print("关键词榜:", [d + 1 for d in kw_rank]) print("向量榜:", [d + 1 for d in vec_rank]) print("RRF融合Top%d:" % top) for doc_idx, score in final: print(" Doc%d RRF=%.4f %s" % (doc_idx + 1, score, DOCS[doc_idx])) if __name__ == "__main__": hybrid_search("年假能休多少天")
DOCS = [...]定义 6 篇微型企业文档,当作小规模知识库基准测试集。def tokenize(text)二元切词,用相邻字符对构造词项,演示无需安装分词库。self.inverted[term] = {}构建倒排索引,记录每个词项出现在哪些文档、出现几次。self.avgdl /= self.doc_count计算平均文档长度,为 BM25 的长度归一化做准备。return math.log(...)平滑 IDF 公式,词项越稀有、区分度越高。denom = tf + self.k1 * (1 - self.b + ...)BM25 分母部分,用 k1 和 b 控制饱和与长度惩罚。kw_rank = sorted(...key=lambda i: bm25.score(query, i)...)关键词路排序,按 BM25 分从高到低。vec_rank = sorted(...)向量路排序,演示中简化成 query 与文档的字符重合度。rrf[doc_idx] = ... + 1.0 / (k + i + 1)RRF 核心:把两路的排名分别折算成 1/(k+rank) 并累加。sorted(rrf.items(), ..., reverse=True)[:top]按融合分从高到低取 TopN,得到最终候选。
常见误区
误区既然 RRF 只依赖排名不依赖分数,那参数 k 取什么值都无所谓,默认 60 永远最优。
正解k 是倒数融合的平滑常数,它决定了“名次差异”对分数的敏感度:k 越小,第 1 名与第 10 名的分差越大,榜单头部优势越明显;k 越大,各名次分差越平缓,长尾候选越容易冒头。文档总量大、单路召回列表长时,适当增大 k 能避免头部垄断;候选少的数据集,k 取 60 通常没问题。生产环境建议在验证集上对 k 做 30/60/100 的对比实验。
为何常见:因为看到“RRF 免归一化”的宣传,容易进一步误以为所有参数都免调,忽略了 k 依然影响排序偏好。
误区Embedding 模型连语义都能理解,肯定比“机械匹配”的关键词检索强,混合检索只是过度设计。
正解向量检索对专有名词、代码变量、型号编号、精确数字天然不敏感——“iPhone 15 Pro Max“和”苹果最新款手机“在语义上很接近,但”接口返回码 401”这种精确 token 很难靠语义向量区分。关键词检索的精确匹配能力、可解释性和对长尾词项的鲁棒性,是向量检索无法替代的。二者面向的是互补的失败模式,混合检索的意义正在于此。
为何常见:从业者容易受“深度学习碾压传统算法”的叙事影响,忽视了检索场景里精确匹配的刚需。
误区RRF 加权融合之后得到了最终排序,Rerank 只是锦上添花,可做可不做。
正解融合(RRF 或加权)解决的是“如何把多路候选合并成一份名单”的粗排问题,它依然基于向量相似度或 BM25 这类低精度信号;Rerank 用交叉编码器对每个候选做过精细的相关性判断,能纠正融合阶段的明显错误——比如向量分接近但语义漂移的文档。实验显示,融合后加 Rerank 通常能在 NDCG@10 上带来 5~10 个百分点的提升。两者是“粗排聚合”与“精排校验”的关系,不能混为一谈。
为何常见:可视化演示和教程常常止步于融合排序,让人误以为长流程已经走完,忽略了紧接其后的精排环节。
误区语义检索是“高科技”,关键词检索是“老古董”,加权融合时把 $\alpha$ 设成 0.9 甚至 1.0,效果肯定最好。
正解权重过高会导致模型对精确信息视而不见——用户搜“合同编号 LT-2024-09”时,语义分数会把一堆“合同相关”的泛文档顶上榜首,精确编号反而沉底。正确做法是先在验证集上扫描 $\alpha$,同时观察不同查询类型分组的效果:口语化查询占比高的场景可以偏向语义分,专有名词密集的领域应提高关键词分权重。
为何常见:人们容易用“技术先进程度”代替“场景适配度”来判断权重,忽略了检索效果是由失败模式而不是技术光环决定的。
误区Recall@K 和 NDCG 都刷得很高,说明混合检索系统已经达到生产标准,用户满意度肯定没问题。
正解检索指标只衡量“找没找对”,不衡量“答没答对”。LLM 可能从正确的上下文里生成错误结论、产生幻觉,或者引用正确但生成格式混乱。端到端 RAG 评估还需要看生成答案的正确性、忠实度、引用完整性,以及用户反馈。检索变好是必要条件而非充分条件,上线前必须做端到端评测。
为何常见:检索环节最容易被量化、最容易优化,于是团队把注意力集中在指标上,反而忽略了链路下游的生成质量。
面试题
Q1. 混合检索的核心目标是什么?
- A.提高召回完整性和检索准确性← 正确答案
- B.降低向量的存储维度
- C.加快查询文本的切词速度
- D.用关键词替代语言模型生成
答案:A。混合检索通过向量路理解语义、关键词路精确匹配,两路互补提高召回完整性和准确性,B、C 只是优化手段,D 与检索无关。这就像老杨同时保留电话点单(精确)和小程序点单(语义),目标是把客人的需求都接住。
Q2. BM25 属于哪一类检索方法?
- A.基于统计的稀疏检索← 正确答案
- B.基于神经网络的稠密向量检索
- C.基于图像的视觉检索
- D.基于协同过滤的推荐算法
答案:A。BM25 利用词频、逆文档频率等统计信息在倒排索引上打分,属于经典的稀疏检索方法,不涉及神经网络。它像菜名抽屉柜一样按词查表,而不是靠口味画像。
Q3. 倒排索引的基本作用是什么?
- A.建立从词项到文档列表的映射← 正确答案
- B.建立从文档到词项的映射
- C.存储文档的向量表示
- D.对文档做聚类分析
答案:A。倒排索引以“词”为键、以“包含该词的文档列表”为值,查询时直接查表定位候选文档。B 是正排索引,C 是向量索引,D 与检索索引无关。
Q4. 在 RRF 融合公式中,参数 k 的作用是什么?
- A.平滑倒数排名,控制名次差异的敏感度← 正确答案
- B.控制向量的输出维度
- C.限定词频统计的上限
- D.设置模型的学习率
答案:A。RRF 中 $1/(k+r)$ 的 k 是平滑常数,k 越小头部名次的分数差越大,k 越大名次间分差越平缓,通常取 60。它不涉及向量维度、词频或学习率。
Q5. 加权融合前对两路分数做归一化的主要原因是什么?
- A.消除两路分数量纲和分布不一致的影响← 正确答案
- B.提高模型的训练速度
- C.减少文档的存储空间
- D.让查询语句长度保持一致
答案:A。向量分数通常集中在小数区间,BM25 分数可能从 0 到十几,量纲不一致直接加权会让大数值一路主导。归一化把两路压到同一尺度,再让权重真正发挥调节作用,就像把“评分”和“销量”换算成同一标准后再比较。
Q6. Recall@K 衡量的是检索系统的什么能力?
- A.相关文档被排进前 K 名的比例← 正确答案
- B.检索结果的排序稳定性
- C.模型参数量的多少
- D.单次检索的平均耗时
答案:A。Recall@K 计算的是相关文档集合中有多大比例出现在 TopK 结果里,衡量“找到”的能力,不关心具体排名先后。它就像统计客人爱吃的菜有多少道被收录进菜单前 10 名。
Q7. 以下哪些场景更适合引入混合检索?
- A.代码搜索需要匹配精确的变量名和函数签名← 正确答案
- B.用户用口语化描述搜索知识库文档← 正确答案
- C.合同检索必须精确命中条款编号← 正确答案
- D.纯图片数据集的相似图搜索
答案:ABC。A 和 C 依赖关键词精确匹配,B 依赖语义理解,都需要双路互补;D 是纯向量检索场景,不涉及文本关键词,混合检索帮助有限。
Q8. 关于 Rerank 模型,下列说法正确的是?
- A.使用交叉编码器对 query 和 doc 拼接打分← 正确答案
- B.在召回阶段大规模使用以提升效率
- C.训练成本低于双塔向量模型
- D.不会改变候选文档的排序结果
答案:A。Rerank 的交叉编码器把 query 与 doc 拼接后逐词交互计算相关性,精度高但计算量大,只适合对少量候选精排,而不是在召回阶段大规模使用。训练成本通常高于双塔模型,且一定会改变排序,因此 B、C、D 均错。
Q9. 生产环境中构建混合检索,哪些做法是合理的?
- A.限制各路 Top-K 深度避免短尾噪声← 正确答案
- B.对融合后的候选做去重← 正确答案
- C.让全部文档参与融合计算
- D.融合后接 Rerank 精排← 正确答案
答案:ABD。融合前应控制各路召回数量(如各取 20~50 条)并去重,避免长尾噪声和重复上下文;融合后接 Rerank 精排补足精度。C 中全部文档参与融合会造成计算浪费和低相关文档淹没信号,不合理。
Q10. 当两路检索结果的候选重叠度非常高时,最合理的处理方式是什么?
- A.降低重叠路的权重或引入去重机制← 正确答案
- B.同时调高两路的融合权重
- C.只保留其中一路的检索结果
- D.取消重排序直接送大模型
答案:A。重叠度过高说明两路的差异化信息很少,融合带来的增益有限,此时应降低冗余路的权重、在融合前去重,或者引入第三路补充多样性。同时调高权重会让重复信息过度强化,只保留一路会损失互补性,取消重排则会丢失精排收益。