想象你是一位名侦探,收到一个寻人委托。你有两种查案方式:第一种,你凭目击证人的模糊描述——“穿红色连衣裙、短发、气质温婉”——去人海中“感觉”出最像的人;第二种,你根据户籍系统里的精确条目——“身份证号前六位是110105”——逐一筛选比对,锁定唯一目标。 第一种方式像极了稠密检索(Dense Retrieval):它把世间万物都压缩成一张“气质画像”(向量),凭直觉找“神似”的候选。第二种方式则像稀疏检索(Sparse Retrieval):它建立了一本巨大的“关键词账本”(倒排索引),凭铁证找“形似”的精确匹配。 但真正的高手从不只靠一种直觉。混合搜索,就是让这位侦探左手握着模糊画像、右手攥着精确账本,两路线索同时铺开,最终交叉验证,给出一个既懂“语义”又认“字面”的终极答案。今天,我们就跟着这位侦探,拆解混合搜索架构设计的每一个机关暗道。
职业价值:混合搜索是 RAG、企业知识库、电商推荐的底层标配。掌握它的架构设计,等于同时握住语义理解与精确匹配两把钥匙,是成为高级搜索/推荐工程师的必经之路。
可视化演示
演示双索引并行查询、分数融合与稀疏/稠密/混合效果对比,理解混合搜索的架构与融合机制。
本节配有交互动效(进入视口后自动加载,约 3KB)。
双索引:稀疏+稠密并行查询 倒排 向量 并行 两路索引并行检索后融合统一排序
搜索技术演进
话说这位侦探早年办案,靠的是一本厚重的“通缉令手册”。手册里每条通缉令按指纹编号排列——这就是关键词搜索:你输入什么字,系统就翻箱倒柜找包含这些字的文档。它精确但死板:你说“红色连衣裙”,它就绝不理睬“ crimson dress“或”朱红色长裙”,哪怕它们描述的是同一件衣服。
后来,侦探引入了一位“画像专家”(语义模型)。这位专家不看具体字眼,只看“神韵”——它能将“红色连衣裙”"crimson dress““朱红长裙”都映射成一个“红色长裙”的气质向量。这就是语义搜索的雏形,但它也有盲区:当用户搜索“iPhone 15 价格”时,语义模型可能把”iPhone 15“误解为”苹果手机“,而那些只包含”iPhone 15 售价"字样的网页反而排名靠后。
于是,混合搜索应运而生——侦探左手持通缉令手册(稀疏检索),右手拿画像专家的速写本(稠密检索)。两者互补,既不放跑“形似”的精准目标,也不漏掉“神似”的语义近亲。这是搜索技术从“精确”到“语义”再到“融合”的自然演进。
混合检索原理
现在,侦探要做一次真正的双路调查。稠密检索(Dense Retrieval)就像画像专家的速写:他把所有文档和查询都压缩成一组浮点数向量(比如 768 维),然后用“余弦相似度”这样的尺子,量出查询画像与每张文档画像的“神似程度”。
稀疏检索(Sparse Retrieval)则是翻通缉令手册:它维护一个巨大的“关键词-文档”倒排表,查询中每个词都能直接定位到包含它的文档列表,再按 BM25 之类的公式算出“字面契合度”。
两条路各有所长,也各有盲区。稠密检索能理解同义改写,但对“精确型号、专有名词”容易模糊;稀疏检索对“货号、人名、法律条款”一抓一个准,却对“意思相同、字面不同”的表述毫无办法。双路召回,就是让两位调查员分头行动,各自带回一份候选名单,再合并去重,交给后排的“评审团”统一打分。
这就像侦探把画像专家的速写本和通缉令手册摊在桌上,圈出所有值得调查的人名——重叠的嫌疑人被重点标注,只出现在单一来源的也不放过。双路互补,才让探案成功率大幅提升。
- 稠密召回集由向量相似度 Top-K 得到的文档集合,代表“语义相近但字面可能不同”的候选。
- 稀疏召回集由关键词命中(如 BM25 得分)Top-K 得到的文档集合,代表“字面精确匹配”的候选。
- 并集合并两个集合取并集后去重,形成混合候选池,再进入精排阶段。
融合策略设计
当两位调查员各带回一份名单后,融合策略就是那位裁决官。面对“同一个文档在两份名单中排名不同”的情况,裁决官需要给出一个统一的最终分数。
最经典的方法是 RRF(Reciprocal Rank Fusion,倒数排名融合)——它不关心分数绝对值,只看排名位置。排名越靠前,贡献的融合得分越高。这就像两份证词中,越早被证人点名的人,越值得怀疑。
另一种是加权分数融合:将稠密得分与稀疏得分各自归一化后,乘以权重再相加。权重 $\lambda$ 是一个超参数——好比侦探更信任画像专家,就给稠密部分加 70% 的信任度。
RRF 的聪明之处在于:它天然对“两路都排名靠前”的文档给予加分,而不会因为某一路的绝对分数异常而失衡。这就像侦探最终拍板——两份证词都提到的嫌疑人,嫌疑值翻倍。
- 遍历召回列表对每一路检索结果(稠密/稀疏)中的每个文档 d,取其在对应列表中的排名 rank。
- 计算倒数贡献排名越靠前,贡献分数越大,同时加 k 做平滑。
- 求和得最终分一个文档在多少路结果中出现,就累加多少次贡献,最终按得分降序排列。
稀疏引擎构建
稀疏检索的基石是 BM25 算法和倒排索引。倒排索引就像通缉令手册的“特征词目录”:每个关键词后面,跟着一串“涉案文档 ID 及词频记录”。
BM25 的核心思想是:一个词在文档中出现越多越重要,但也不能太多——因为如果每篇文档都有这个词,它就没区分度了。 就像“嫌疑人”这个词在所有线索中都出现,那它不能说明任何问题。
工程实现上,稀疏检索通常以倒排索引为基础,将 BM25 的每个关键环节预计算或近似缓存。侦探翻手册的速度极快——因为手册本身已经按字母排序,而且每个词条下都备注了“出现次数”。分词器则负责把“红色连衣裙”切成“红色”“连衣裙”等可查询的最小单元。
- IDF 稀有度权重词越罕见,IDF 越大,代表它越能区分文档。
- 词频饱和函数词频增长到一定程度后,收益递减,防止长文档靠堆砌关键词得高分。
- 长度归一化文档越长,词频的稀释效应越强,避免长文档天然占优。
稠密引擎优化
与稀疏检索的“手册”不同,稠密检索更像画像专家的“神经网络”——它用深度模型把文本映射成高维浮点向量。但这些向量存储量极大:1000 万篇文档、768 维 float,就是 30GB 级别的内存占用。因此,ANN(近似最近邻)索引和向量量化应运而生。
常见的 ANN 索引包括 HNSW(分层可导航小世界图) 和 IVF(倒排文件索引)。HNSW 的思路就像侦探的“线人网络”:每个节点连接若干邻居,搜索时从高层粗粒度节点快速跳到低层,精准逼近目标;IVF 则像“按片区划分档案室”,先聚类分桶,搜索时只查几个最近的桶。
向量量化则负责“压缩画像”——比如用 PQ(乘积量化) 将 768 维向量切分成若干子空间,每个子空间用一个码本表示,内存能减少 8-16 倍。代价是精度略有损失,但配合 重排序(re-rank) 策略,可以弥补近似的误差。
语义模型选型上,从早期的 BERT 到如今的 Sentence-BERT、bge 系列,模型的目标都是让“语义相近的句子在向量空间中距离更近”。这就像画像专家不断进修,从只能画真人的脸,到能通过文字描述也画出神似的画像。推理时,查询向量只需与索引中的候选向量计算余弦距离,就能快速召回 Top-K。
总而言之,稠密引擎优化的核心就是在“检索速度、内存占用、召回精度”三者间找平衡。侦探必须权衡:画像画得越精细,携带越不便;但画得太粗糙,又容易认错人。
系统架构落地
真正的混合搜索系统,从来不是简单地在两台服务器上各跑一路检索,然后拼结果。系统架构落地需要考虑完整的调用链:查询进来 → 查询理解模块将原始文本分别路由到稠密和稀疏引擎 → 两路召回 → 融合打分 → 精排 → 返回结果。
工程上普遍采用召回与排序分离的架构。召回阶段,目标是“快”:从千万级文档中筛出几百个候选文档;排序阶段,目标是“准”:用更复杂的模型(比如交叉编码器)对几百个候选精排。这就像侦探先靠画像和手册快速圈定 20 个重点嫌疑人,再逐一审讯取证,最终锁定真凶。
常见的落地架构是两阶段级联:第一阶段用混合检索快速召回 Top-K,第二阶段用重排序模型精排。此外,缓存策略是关键——热门查询的结果可以直接缓存,冷门查询才触发完整链路;降级策略则保证某一路引擎故障时,另一路仍能兜底服务。
架构设计的精髓在于“留后路”:就像侦探不会把所有鸡蛋放在一个篮子里,即使画像专家临时缺席,通缉令手册也能独立撑起整个调查。
- 超时检测调用稠密引擎时记录耗时,超过阈值(如 50ms)则判定超时。
- 降级路由请求只走稀疏引擎路径,返回稀疏结果。
- 告警恢复异步记录降级事件并触发告警,待稠密引擎恢复后自动切回。
业务场景实践
电商搜索是混合搜索最典型的战场。用户搜“黑色连衣裙”,既希望精确匹配品牌和型号,又希望召回“小黑裙”这类语义近似款。稠密检索负责扩展“神似”商品,稀疏检索确保“黑色连衣裙”这个词不出错。两者融合后,搜索结果既精准又有惊喜。
企业知识库则更看重“精确+语义”的双保险。法律条款检索必须精确命中原文,用稀疏检索杜绝歧义;而员工用白话提问“年假怎么休”,就要靠稠密检索把它映射到对应的制度文档。混合搜索让知识库同时服务“专业用户”和“普通用户”。
更进一步,多模态检索正在扩展混合搜索的边界——把图片、音频也编码成向量,用稠密检索召回,用文本标签做稀疏过滤。比如搜索“夏天的海边”,既能召回文本描述,也能召回相关图片。这就像侦探不仅能看通缉令文字,还能看嫌疑人照片、听录音,多渠道信息交叉验证。
性能调优与挑战
混合搜索的性能调优,是一场延迟、吞吐、成本的三角博弈。
延迟方面,稠密检索的 ANN 查询通常在毫秒级,但排序阶段的交叉编码器可能耗时数十毫秒,因此需要将“粗排”与“精排”分层,把重计算留给小规模候选集。吞吐量则取决于索引分片与并行度——将索引分片到多台机器,可以线性扩展 QPS。可扩展性还要求稀疏和稠密引擎能独立扩容:双十一的搜索流量激增时,可以只扩容稠密引擎,而稀疏引擎保持不变。
相关性调优是另一种艺术。RRF 的 k 值、加权融合的 λ 值都需要基于评估集反复调参。离线评估(如 NDCG、Recall@K)与在线 A/B 测试缺一不可:先离线挑出最优参数,再上线验证真实用户指标。
成本方面,稠密检索的索引内存占用和 GPU 推理成本远高于稀疏检索。常见的优化措施包括:对向量做量化压缩、对文档做分层存储、将热门向量常驻内存、冷门向量落盘。侦探团队的预算总归有限,每一次“精细画像”都要算清楚是否值得。
AI 应用场景
电商搜索系统升级
阶段:候选召回与相关性排序
解决的问题:传统电商搜索只依赖关键词匹配,用户搜“白色T恤女”时,无法召回标题为“白tee 女士上衣”的商品。混合搜索引入稠密向量召回后,语义相近的商品能被有效召回,同时稀疏检索确保“白色T恤”字面命中不被遗漏。
具体案例:某头部电商平台重构搜索架构,将混合搜索作为召回层核心:查询向量与商品向量做 ANN 检索,同时用 BM25 对商品标题做关键词召回,最后用 RRF 融合两者结果。上线后,搜索转化率提升 12%,无结果率下降 40%。
企业知识库智能问答
阶段:文档检索(RAG 管道的第一环)
解决的问题:企业知识库文档量大、员工提问口语化,纯关键词检索经常查不到,纯语义检索又容易返回“意思相关但并非所需”的文档。
具体案例:某大型律所部署内部法律知识库,采用混合搜索架构:稀疏检索精确定位法条原文(如“劳动法第39条”),稠密检索理解律师提的模糊问题(如“开除员工的合法流程”),两者融合后送入 LLM 生成答案。检索准确率提升 25%,律师查找资料时间缩短一半。
多模态内容检索平台
阶段:跨模态召回与过滤
解决的问题:视频平台需要让用户通过自然语言找到视频片段,但视频没有传统意义上的“关键词”,需要语义向量化。
具体案例:某短视频平台用 CLIP 类模型将视频帧编码为稠密向量,同时用 OCR 文本和用户标签构建稀疏索引。用户搜“海边求婚场景”,稠密检索召回视觉相似的片段,稀疏检索精确匹配“求婚”标签。混合检索上线后,视频搜索的点击率提升 18%。
Python 演示
import mathimport refrom collections import Counter class SparseBM25: """稀疏检索:BM25 算法 + 倒排索引""" def __init__(self, k1=1.5, b=0.75): self.k1 = k1 self.b = b self.doc_count = 0 self.avgdl = 0.0 self.docs = [] self.doc_lens = [] self.df = Counter() self.inverted_index = {} def train(self, docs): self.docs = docs self.doc_count = len(docs) total_len = 0 for doc in docs: terms = self._tokenize(doc) self.doc_lens.append(len(terms)) total_len += len(terms) unique_terms = set(terms) for term in unique_terms: self.df[term] += 1 if term not in self.inverted_index: self.inverted_index[term] = [] self.inverted_index[term].append(self.doc_count - len(self.docs) + len(self.docs) - len(self.inverted_index[term]) - 1) # 修正倒排索引构建,保证 ID 正确 self.inverted_index = {} for idx, doc in enumerate(docs): terms = set(self._tokenize(doc)) for t in terms: self.inverted_index.setdefault(t, []).append(idx) self.avgdl = total_len / self.doc_count def _tokenize(self, text): return re.findall(r"[\w]+", text.lower()) def score(self, query): scores = [0.0] * self.doc_count query_terms = self._tokenize(query) for idx, doc in enumerate(self.docs): term_counts = Counter(self._tokenize(doc)) total = 0.0 for term in query_terms: if term in term_counts: df_t = self.df.get(term, 0) idf = math.log((self.doc_count - df_t + 0.5) / (df_t + 0.5) + 1) tf = term_counts[term] dl = self.doc_lens[idx] denom = tf + self.k1 * (1 - self.b + self.b * dl / self.avgdl) total += idf * (tf * (self.k1 + 1)) / denom scores[idx] = total return scores class DenseRetriever: """稠密检索:用随机向量模拟语义向量(实际项目用深度学习模型生成)""" def __init__(self, dim=64): self.dim = dim self.doc_vectors = [] self.docs = [] def train(self, docs): self.docs = docs for doc in docs: vec = self._embed(doc) self.doc_vectors.append(vec) def _embed(self, text): # 模拟:用词频向量代替真实的语义向量,仅用于演示 terms = re.findall(r"[\w]+", text.lower()) vec = [0.0] * self.dim for i, t in enumerate(terms[:self.dim]): vec[i] = hash(t) % 100 / 100.0 return vec def _cosine(self, v1, v2): dot = sum(a * b for a, b in zip(v1, v2)) n1 = math.sqrt(sum(a * a for a in v1)) n2 = math.sqrt(sum(b * b for b in v2)) if n1 == 0 or n2 == 0: return 0.0 return dot / (n1 * n2) def score(self, query): q_vec = self._embed(query) return [self._cosine(q_vec, dv) for dv in self.doc_vectors] class HybridSearch: """混合搜索:融合稀疏与稠密两路召回结果""" def __init__(self, alpha=0.7, k=60): self.alpha = alpha self.k = k self.sparse = SparseBM25() self.dense = DenseRetriever() def train(self, docs): self.sparse.train(docs) self.dense.train(docs) def fuse_rrf(self, ranking_list, k=60): """RRF 融合:按排名倒数累加得分""" score_map = {} for ranking in ranking_list: for rank, doc_id in enumerate(ranking, start=1): score_map[doc_id] = score_map.get(doc_id, 0) + 1.0 / (k + rank) return score_map def fuse_weighted(self, sparse_scores, dense_scores): """加权融合:归一化后按 alpha 加权相加""" s_max = max(sparse_scores) d_max = max(dense_scores) fused = [] for s, d in zip(sparse_scores, dense_scores): s_norm = s / s_max if s_max > 0 else 0 d_norm = d / d_max if d_max > 0 else 0 fused.append(self.alpha * d_norm + (1 - self.alpha) * s_norm) return fused def search(self, query, strategy="rrf"): sparse_scores = self.sparse.score(query) dense_scores = self.dense.score(query) if strategy == "rrf": s_ranking = [i for i, v in sorted(enumerate(sparse_scores), key=lambda x: x[1], reverse=True)] d_ranking = [i for i, v in sorted(enumerate(dense_scores), key=lambda x: x[1], reverse=True)] fused = self.fuse_rrf([s_ranking, d_ranking]) elif strategy == "weighted": fused = self.fuse_weighted(sparse_scores, dense_scores) else: raise ValueError("Unknown strategy") results = sorted(fused.items(), key=lambda x: x[1], reverse=True) return [(idx, self.dense.docs[idx], score) for idx, score in results] if __name__ == "__main__": docs = [ "苹果发布新款手机 iPhone 15", "macbook pro 笔记本今日开售", "iPhone 15 价格与配置解析", "苹果公司发布第四季度财报", "红色连衣裙女夏款 2025 新款", "小黑裙女装显瘦气质连衣裙", ] hs = HybridSearch(alpha=0.7) hs.train(docs) print("查询: iPhone 15 价格") for idx, doc, score in hs.search("iPhone 15 价格", strategy="rrf"): print(f" rank={idx} score={score:.4f} doc={doc}") print("查询: 黑色裙子 女") for idx, doc, score in hs.search("黑色裙子 女", strategy="weighted"): print(f" rank={idx} score={score:.4f} doc={doc}")
class SparseBM25实现稀疏检索引擎,核心是 BM25 打分方程,train时构建倒排索引。self.inverted_index.setdefault(t, []).append(idx)构建“关键词 → 文档 ID 列表”的倒排表,检索时直接查表。idf = math.log(...)计算词的稀有度权重,词越罕见 IDF 越大,区分度越高。denom = tf + self.k1 * (1 - self.b + self.b * dl / self.avgdl)词频饱和 + 文档长度归一化,防止长文档堆词得高分。class DenseRetriever模拟稠密检索引擎,实际项目中用神经网络模型生成向量。_cosine计算查询向量与文档向量的余弦相似度,衡量“语义距离”。class HybridSearch混合搜索引擎框架,组合两路召回与融合策略。fuse_rrf按排名倒数累加融合得分,不依赖绝对分数,鲁棒性好。fuse_weighted归一化后加权求和,alpha 控制稠密与稀疏的信任权重。hs.search("黑色裙子 女", strategy="weighted")融合策略示例:查“黑色裙子”时,向量召回“小黑裙”,关键词命中“红色连衣裙”。
常见误区
误区我以为混合搜索就是在界面上同时展示“关键词结果”和“语义结果”两个列表,让用户自己挑。
正解实际上,混合搜索的核心在于“融合”,而非“并列”。两路召回的结果需要经过 RRF、加权归一化等策略合并为一个统一排序列表。用户看到的是一个混合了语义相关性和关键词相关性的综合结果,而不是两个独立列表。好比侦探听取两份证词后,会交叉比对形成一个疑犯排名,而不是把两份名单直接贴在墙上。
为何常见:因为初学阶段容易把“混合”理解为“同时展示”,忽略了“融合算法”才是决定排序质量的关键环节。
误区既然深度学习这么强,语义搜索肯定碾压关键词搜索,稀疏检索是不是该被淘汰了?
正解稠密检索擅长语义相似,但对精确匹配(如货号“iPhone 15 pro max“、法条”第38条“)经常失分。稀疏检索虽”笨”,但在专有名词、代码变量、人名地名等场景下精准命中、零延迟。混合搜索的价值就是让两者互补,而非替代。侦探不会因为有了画像专家就扔掉通缉令手册,因为手册上的指纹编号是最硬的事实证据。
为何常见:语义搜索是热点,容易让人忽略精确匹配在特定场景中的不可替代性。
误区RRF 公式简单,k 值取 60 是标准值,不需要调参。
正解k 值决定了排名倒数贡献的衰减速度。k 越小,越靠前的文档获得的融合加成越大,结果越偏向于各列表的头部;k 越大,融合结果越平滑。不同业务场景(电商 vs 知识库)的最佳 k 值可能完全不同。而且 RRF 忽略了分数差异——排名第 1 和第 2 的文档可能分数相差极大,但 RRF 只视为相邻名次。生产系统需要结合离线评估调参。
为何常见:因为论文中给出了推荐默认值,初学者容易把它当成“标准答案”。
误区把混合搜索当成银弹,认为只要用了混合搜索,召回率和相关性就万事大吉。
正解混合搜索解决的是“单一检索方式的盲区互补”问题,但排序质量还依赖精排模型。如果向量模型本身训练质量差,稠密路召回的全是噪声,RRF 也会被污染。此外,工程上还需要解决双路召回延迟不均、索引一致性维护、融合分数分布偏移等问题。
为何常见:新技术容易让人过度期望,忽视了模型质量与工程链路本身的重要性。
误区反正 GPU 算力够,把向量维度设成 1024、2048 甚至更高,效果肯定更好。
正解向量维度增高确实可能提升语义表达能力,但也会引入“维度灾难”:高维空间中向量趋向正交,距离区分度下降;内存占用线性增长;ANN 索引构建和查询变慢。现代工业实践通常用 256-768 维配合量化压缩。这就像画家把画像画得极其精细,但存放画像的档案柜越来越大,查阅越来越慢,收益却未必成比例。
为何常见:直觉上“信息越多越好”,但忽视了高维检索在工程上的边际效用递减。
面试题
Q1. 混合搜索中,稠密检索与稀疏检索的关系是?
- A.两者互斥,只能选一种
- B.两者互补,取长补短← 正确答案
- C.稀疏检索取代稠密检索
- D.稠密检索完全包含稀疏检索
答案:B。混合搜索的核心思想就是让稠密检索(语义匹配)与稀疏检索(关键词精确匹配)互补。稠密检索擅长同义改写、语义相关;稀疏检索擅长专有名词、精确符号。两者合并后,召回率和相关性都优于单一方式,因此是互补关系而非互斥、取代或包含关系。
Q2. 关于 RRF(倒数排名融合)算法的描述,正确的有哪些?
- A.它直接使用检索分数进行加权求和
- B.它只依赖文档在结果列表中的排名← 正确答案
- C.融合时需要设置超参数 k 来控制衰减← 正确答案
- D.排名第 3 的文档贡献恒大于排名第 5 的文档← 正确答案
答案:BCD。RRF 的核心公式是 1/(k + rank),它只利用排名而非原始分数,因此 B 正确;k 是超参数,控制倒数贡献的平滑程度,C 正确;当同一个文档在两路列表中的排名分别为 3 和 5 时,贡献为 1/(k+3) 与 1/(k+5) 之和,A 错——RRF 不直接加原始检索分数。D 错误的原因是:若文档 X 排名 3、文档 Y 排名 5,且 X 出现在一路而 Y 出现在两路,Y 的融合总分可能更高。
Q3. BM25 算法中,IDF(逆向文档频率)的作用是?
- A.衡量词在文档中出现的频率
- B.衡量词的稀有程度,越罕见越重要← 正确答案
- C.计算文档的总长度
- D.归一化查询向量
答案:B。IDF 的公式是 ln((N - n(t) + 0.5)/(n(t) + 0.5) + 1),n(t) 是包含词 t 的文档数。越少文档包含该词,IDF 越大,说明该词区分度越高。词频 f(t,d) 衡量词在文档中出现的次数,文档长度归一化是 b 参数负责,向量归一化与 BM25 无关。
Q4. HNSW 索引属于哪类检索算法?
- A.精确最近邻搜索
- B.倒排索引
- C.近似最近邻搜索(ANN)← 正确答案
- D.决策树分类
答案:C。HNSW(Hierarchical Navigable Small World)是一种经典的 ANN(近似最近邻)图索引。它通过分层“小世界网络”结构,让搜索在 O(log N) 复杂度内找到近似的最近邻,而不是遍历所有向量计算精确距离。倒排索引是稀疏检索的数据结构,决策树是机器学习算法,均与 HNSW 无关。
Q5. 混合搜索工程落地时,合理的架构设计包括哪些?
- A.召回与排序分离← 正确答案
- B.两阶段级联:粗召回 + 精排序← 正确答案
- C.缓存与降级策略← 正确答案
- D.完全依赖单一路召回结果
答案:ABC。混合搜索典型架构是:查询分发给稠密和稀疏两路召回组件,合并候选集后进行粗排和精排。召回/排序分离(A)能兼顾快和准;两阶段级联(B)让重模型只处理小规模候选集;缓存和降级(C)保障了高可用性。D 显然错误——混合搜索的存在就是要同时利用两路而非单一召回。
Q6. 稀疏检索(如 BM25)的主要优势是?
- A.理解同义词和上下文语义
- B.对专有名词和精确符号的匹配精准← 正确答案
- C.需要 GPU 才能运行
- D.能自动处理多语言翻译
答案:B。稀疏检索基于关键词的精确匹配,对"iPhone 15 Pro Max"、“合同法第 38 条”这类专有名词、型号、条款能精确命中,可解释性强且无需 GPU。理解同义词和上下文语义是稠密检索的优势;多语言翻译和 GPU 计算与稀疏检索无直接关联。
Q7. 加权分数融合中,超参数 α 的作用是?
- A.控制倒排索引的大小
- B.控制稠密与稀疏两部分得分的信任权重← 正确答案
- C.决定向量量化的精度
- D.设定缓存过期时间
答案:B。加权融合公式为 final = α × dense_norm + (1-α) × sparse_norm。α 越大,最终排序越偏向稠密检索的语义结果;α 越小,越偏向稀疏检索的关键词结果。α 是业务相关的超参数,需要离线评估和在线 A/B 测试调整,与索引大小、量化精度、缓存时间无关。
Q8. 稠密向量检索中存在“维度灾难”,以下哪些是常见缓解措施?
- A.采用 HNSW 等 ANN 索引← 正确答案
- B.用 PQ(乘积量化)压缩向量← 正确答案
- C.降低向量维度(如从 1024 降到 256)← 正确答案
- D.不做任何处理,盲目增加 GPU 数量
答案:ABC。维度灾难指高维空间中向量区分度下降、计算和存储成本剧增。常见缓解手段:ANN 索引避免全量暴力扫描;PQ 量化大幅压缩内存;合理选择维度(256-768 是工业界常见值)平衡精度和性能。盲目加 GPU 只增加算力,不解决维度升高带来的固有数学问题。
Q9. 倒排索引的基本结构是?
- A.文档 ID → 关键词列表
- B.关键词 → 文档 ID 列表← 正确答案
- C.文档向量 → 最近邻图
- D.关键词 → 同义词集合
答案:B。倒排索引将“文档 → 词”的正向映射反转为“词 → 文档列表”,使得给定一个查询词,能在 O(1) 时间内直接找到所有包含该词的文档。这类似字典的目录页:先查字(关键词),再定位到页码(文档 ID)。文档 ID → 关键词是正向索引,最近邻图属于 ANN 索引,同义词集合与倒排结构无关。
Q10. 混合搜索中采用降级策略的目的是?
- A.降低索引构建的时间
- B.当一路检索服务异常时,保证另一路仍能返回结果← 正确答案
- C.提升模型的语义理解能力
- D.减少向量维度
答案:B。降级策略是容灾设计:当稠密检索引擎因负载过大或故障导致超时时,系统自动切换到仅使用稀疏检索结果返回,避免整个搜索服务不可用。同样的原理也适用于稀疏引擎故障时降级为仅用稠密检索。降级策略是系统工程中的“安全带”,与索引构建、模型能力、向量维度无关。