设想一座藏书百万的城市图书馆。管理索引柜的老王在这里工作 20 年,他的绝活是“词条卡”——馆里有一整面墙的卡片,每张卡片对应一个词,每本书只在它真正写到的词条下登记。你想找“量子纠缠”,老王直奔那个词条,把登记过的书全部抽出来。这就是稀疏检索。后来,馆里来了性格完全相反的小稠,他不碰词条卡,而是给每本书写“气味笔记”——一份 768 维的感觉描述,你随便问,他凭直觉推荐。这是稠密检索。老王太死板,你说“原子的幽灵联系”,他愣是找不到“量子纠缠”卡;小稠太飘忽,你要“第 3 章 214 页那本红皮书”,他没概念。再后来,爱学习的小稀加入,他悄悄给老王的卡片补备注——不重画卡片墙,只是在“量子纠缠”卡上添了“幽灵联系”几个字。最后馆长拍板:两人各找各的,名单合并,重新排序。这就是现代搜索引擎的混合检索。这篇教程,就是三位管理员、两套表示、一种融合的故事。
理解 BM25 与学习型稀疏检索,是设计召回系统、构建混合搜索的基石,也是搜索/推荐岗面试中“召回阶段如何保证精确与语义兼得”的必答考点。
目录
可视化演示
演示BM25倒排索引评分、SPLADE学习型稀疏扩展及稀疏-稠密融合检索三种范式的核心机制与互补性。
本节配有交互动效(进入视口后自动加载,约 3KB)。
BM25倒排索引 词项映射文档链表 TF-IDF评分排序 BM25=IDF·TF·(k1+1)/(TF+k1·(1-b+b·dl/avgdl)) 基于词频饱和与文档长度归一化计算相关性得分
稀疏检索概述:词条卡墙上的留白
老王的词条卡墙是图书馆最壮观的景象。五万张卡片整整齐齐,每张对应一个词,从“阿”到“做”。每本书入库时,老王翻开它,把“真正写到的词”登记到对应卡片上——书写了“量子”就在“量子”卡下登记书名,没写的词绝不动笔。于是这本书在五万张卡片里通常只出现在几十张上。这堵墙的绝大多数位置是空的,但每一张非空的卡片都明白无误地告诉你:这个词,这本书里确实有。
在信息检索的世界里,这堵墙被称为“词项维度空间”。设词表(vocabulary)大小为 V=50000,每个文档都能表示成一个 50000 维的向量:第 i 维对应词表中第 i 个词,取值是该词在文档中是否出现、出现几次。一本书只写过 50 个不同词汇,它的向量里就只有 50 个非零位置,剩下 49950 维全是 0——这就是“稀疏”(sparse)二字的由来,这种表示也叫词袋模型(Bag of Words)。
词袋模型的优缺点同样鲜明。优点是严格忠实于文本表面,“小猫”就是“小猫”,不会与“幼猫”混淆,检索工程师能精确解释每个命中;缺点是没有半点变通,文档里写“爱宠”就永远匹配不到“宠物”。与之相对,BERT 这类大模型把文档编码成 768 维稠密向量,每个维度都有非零实数值,语义被压进一串密密麻麻的数字里——像小稠笔记本上那一整页浓得化不开的“气味评分”。
所以,当别人说起“稀疏检索”,请先浮现老王那面卡片墙:绝大多数位置空着,但每一处留白都是一种严格的声明——这个词在这本书里,确实没有。
BM25 原理:老王二十年的工作手册
老王不只负责登记,他检索时还有一套给书排序的经验。第一,书里出现“的、了、是”这类词不算本事,全馆每本书都有,他会直接划掉。第二,一个词越生僻越值得重视——全馆只有两本书写过“量子纠缠”,那你要找的就是它们。第三,一本三百页的书里“猫”出现三次,和一本三十页的书里“猫”出现三次,后者更可疑——地广人稀的长篇里撞见关键词可能是过场,短小精悍的册子里反复出现八成是主题。第四,同一本书里“猫”出现十次和一百次,对老王来说区别没那么大——知道这书跟猫有关就够了。
老王的四条经验正是 BM25(Best Matching 25)算法的骨架。它脱胎于更早的 TF-IDF:TF(Term Frequency)衡量词在文档内的密集程度,IDF(Inverse Document Frequency)衡量词在全语料中的稀有程度。但 TF-IDF 有个硬伤——TF 线性增长,“猫”出现 100 次的得分是 10 次的 10 倍,这显然不合理。BM25 引入的关键改造是词频饱和:词频的边际收益递减,出现几次后,“再多一次”几乎不再加分。
BM25 还有两个核心参数:k1 控制词频饱和的速度,k1 越大,词频要很高才会“腻”;k1 越小,出现几次就饱和。b 控制文档长度归一化的强度,b=0 时完全不考虑长度,b=1 时完全按长度折抵。业界默认经验值 k1=1.5、b=0.75,配合平滑后的 IDF,能让得分曲线稳健地运行在大多数语料上。这份工作手册不是老王拍脑袋写的,而是 Robertson 等人在 1994 年基于多年 BM 系列实验总结的数学结晶——老王的直觉,被精确地刻成了算法。
BM25 公式:把经验写成分数
老王退休前,馆长请他留一份“传世手册”,把二十年选书经验凝成一条公式。老王挠了半天头,最终写下的正是 BM25。这条公式由三个部件构成:IDF 负责稀有词加权,词频项负责衡量密集度,长度比负责修正篇幅偏见。其数学形式如下:
把字母换回工作语言:IDF 是“这词全馆几本书写过”,词频饱和是“出现十次和一百次都说明它重要”,长度归一那句“短书里撞见更可疑”,与老王二十年的口头禅一字不差。BM25 就是老王的经验被刻成的数学碑文。
- 外层求和(对查询词的遍历)查询 Q 被拆成 n 个词 q\_i,每个词对文档 D 的贡献独立计算,最后相加——查询里每个词都要“投票”,票数累加出总分。
- IDF 因子(稀有度加权)N 是语料中文档总数,n\_i 是包含 q\_i 的文档数。n\_i 越小,IDF 越大——一个词越稀有,它的“投票”分量越重。加 0.5 是为了平滑,防止分母为 0。
- 分子(词频的正向收益)f\_i 是词 q\_i 在文档 D 中出现的次数,分子 f\_i(k\_1+1) 让词频带来正的线性收益——出现越多,基础分越高。
- 分母(饱和与长度归一的合体)f\_i 加上 k\_1 乘以长度比修正项。当 f\_i 很大时,分母被 f\_i 主导,整个分数趋近于 IDF·(k\_1+1),实现“边际递减”;长度比 |D|/avgdl 大于 1 时惩罚长文档,小于 1 时奖励短文档。
- 长度比与参数 b|D| 是文档长度,avgdl 是语料平均文档长度。b 在 0~1 之间滑动,决定长度因素介入多深——这正是“短书里撞见关键词更可疑”的数学化表达。
学习型稀疏:小稀给卡片补备注
老王有个顽固的毛病——认死理。读者问“有没有讲时间旅行的书”,老王只翻“时间”和“旅行”两张卡,《回到未来》通篇没写“时间旅行”四个字,就这样漏掉了。小稀第一天上班就发现了这个问题。他没动卡片墙的结构,而是搬了把椅子坐在老王旁边,打开每本书读上下文,然后轻手轻脚在卡片空白处补了几行小字:在“时间旅行”卡上添上《回到未来》《时间机器》,在“量子纠缠”卡上添上“原子的幽灵联系”。
老王的困境在学术上称为词汇不匹配(vocabulary mismatch):查询和文档字面上没有共同词,但语义高度相关。传统 BM25 对此无能为力,因为索引完全依赖字面词项。SPLADE(SParse Lexical AnD Expansion)这类学习型稀疏检索模型,正是“小稀”的化身——它用预训练语言模型 BERT 理解上下文,像完形填空一样从语境中推断被省略的语义关联,把“没写出来但语义相关”的词也激活进稀疏向量。
具体地说,SPLADE 把文档切成 token 序列,过 BERT 编码器,每个 token 都携带整句话的上下文信息;然后通过一个 LogSumExp 池化操作,把整篇文档的信息汇集到词表上——词表中每个词都得到一个权重,大部分词的权重为 0(依然稀疏),但与文本语义相关的词即使没有字面出现,也能获得非零权重。最终得到的还是 30000 维稀疏向量,却带上了语义扩展能力。
注意,小稀没有建新墙、没有拆卡片,他只是在五万张卡片上“补备注”。这正是学习型稀疏检索的本质——保持稀疏结构和倒排索引的加速优势,同时把语义理解注入稀疏权重的分配中。稀疏的壳,语义的心。
SPLADE 机制:LogSumExp 如何“扩写”卡片
小稀补卡的“手艺”值得拆开看。他的操作是一个可微分的数学过程:对文档 d 中的每个词 w,先用 BERT 得到它的上下文向量;再拿这个向量与词表中每一个候选词 t 做相似度打分;最后把所有词的打分汇总,得到文档在词 t 上的权重。文档侧权重的核心公式如下:
SPLADE 的训练是端到端的。它用对比学习:从语料中取相关文档对,让相关对的点积高、随机负样本对点积低;同时加一个 FLOPs 正则项,惩罚非零权重过多,保持稀疏性。这个“又准确又稀疏”的平衡,正是小稀实习期反复读书、练习补卡,还被馆长叮嘱“别把卡片墙涂满”的完整过程。最终,他的卡片墙与老王一样稀疏、一样能用倒排索引,只是每张卡上多了几行理解语义的备注——这是学习型稀疏最迷人的地方:用学习重写了权重的含义,却没牺牲稀疏结构带来的工程优势。
- 词表维度 tw\_t(d) 是文档 d 在词表第 t 个词上的权重。SPLADE 要为词表里每个词都算一个这样的权重,最终得到 30000 维稀疏向量。
- 上下文向量 h\_w文档中每个词 w 经 BERT 编码后得到 h\_w,它带着完整上下文信息——“赛跑”里的“跑”和“跑业务”里的“跑”,向量截然不同。
- 相关性打分把 h\_w 与词 t 的嵌入向量 e\_t 做内积,衡量“词 w 在当前语境下与词 t 有多相关”,相关度高则内积大。
- ReLU 截断内积为负说明不相关,ReLU 直接归零;正值保留。这一步让大多数词表位置保持 0,维持稀疏性。
- exp 放大与求和先指数放大正分,再把文档内所有词的贡献相加。即使“时间旅行”没出现在《回到未来》里,只要“穿越”“未来”“时空”这些词与它的关联分够高,最终也会被激活。
- log(1+·) 压缩对数把累加后的巨大值拉回可控范围,保证权重在不同文档间尺度可比。
优劣对比:各有绝活,也各有盲区
现在把小稠也请上场。老王查“书名里有《三体》”,稳准狠;但读者问“我孩子喜欢宇宙探险,有什么书”,他会当场呆住。小稠对“宇宙探险”这种模糊描述信手拈来,连《星球大战》小说都能推荐;但你要“ISBN 978-7-115-12345-6 的那本”,他就彻底抓瞎。馆里渐渐流传一句话:精确的事找老王,感觉的事找小稠。
这在检索领域是一个根本性的张力。稀疏检索的优势首先在精确匹配:专有名词、型号、工单号、DOI、代码标识符——这些需要字面完全一致的场景,稠密向量几乎必然失真。第二个优势是可解释性:命中即“文档里确实有这个词”,用户可以理解为什么被搜到,工程师也能针对失败样本直接诊断。软肋同样明显——同义词、改写、抽象描述统统失效,语义泛化能力接近于零。
稠密检索恰好互补。BERT 这类编码器让语义相似的句子在向量空间里距离很近,“猫”和“小猫咪”可以互相召回;但它在精确匹配上经常翻车:用户搜“iOS 18“,向量可能把”iPhone 系统“拉得很近,而字面精确包含”iOS 18“的文档反而排到后面。此外稠密检索可解释性差,”为什么排在前面?“只能用”向量距离近”来回答,无法指出是哪个词命中。工程上,稀疏向量用倒排索引(inverted index)可实现亚毫秒级检索,稠密检索则需要 ANN(近似最近邻)索引,还要承担模型训练与向量存储的额外成本。
老王和小稠各怀绝技、各露软肋。与其争论谁取代谁,不如想想怎么让他们合作——这正是本文所属章节“38.3.2 混合搜索稠密+稀疏”要解决的问题。
混合搜索:一张合并名单
馆长最终拍板:以后每个查询,老王交一份精排队列,小稠也交一份推荐队列,两人名单合并成一张重新排序。但怎么合?直接拼接行不通——前面全是老王的精确命中,小稠那些“可能相关”的书全被挤到末尾。小稀献上一计:别按绝对分数拼,按“名次”拼——两路都排在前面几名的书,一定最重要。
这个方案在业界就叫 RRF(Reciprocal Rank Fusion,倒数排名融合),公式极其简洁:一本书在一路名单中排第 r 名,就记 1/(k+r) 分,k 是平滑常数(通常取 60);把每一路名单上的分数相加,总分排序即最终结果。
其中 R(d) 是文档 d 在各路召回列表中名次的集合。如果老王把它排第 1、小稠排第 3,k=60,得分 = 1/61 + 1/63 ≈ 0.0323;如果只被一方排第 10,得分仅 1/70 ≈ 0.0143。两路都靠前的文档,优势极其明显。
真实工程比公式更丰富。Elasticsearch 8.x 提供 native hybrid query,支持 BM25 与向量检索的加权求和或 RRF 融合;OpenSearch 的 Hybrid Search、Weaviate 的 fusion 都实现了类似策略;更进阶的做法是用学习模型对两路分数做归一化加权。RRF 因为零参数、无需训练、效果稳定,成为落地首选。混合检索也因此成为 RAG、电商搜索、知识库问答中召回阶段的黄金标配。
老王找“确有此词”,小稠找“感觉相关”,小稀用名次把两张名单揉成一张。三位管理员的合作,既有精确的底线,又有语义的广度——这就是现代搜索引擎里“稠密+稀疏”混合检索的全部智慧。
- 求和(多路名次的汇总)把文档 d 在每一路召回中的贡献加起来——一路一个分,合起来是它的融合分。
- 倒数(名次越前分越高)排名越靠前,r 越小,分数越高。RRF 不看绝对分数——各路分数尺度不一致,无法直接比较——只看名次,名次是排序后的相对位置,天然可比。
- 平滑常数 kk 的作用是压平头部优势,让第一名与第二名的差距不被过分放大,避免某一方的绝对榜首碾压一切。
AI 应用场景
电商商品搜索:精确型号与语义品类的双通道召回
阶段:召回(Recall)
解决的问题:用户搜“iPhone 15 手机壳”,传统 BM25 能精确命中标题含完整型号的商品,但漏掉写成“苹果 15 硅胶壳”的长尾商品;稠密检索能理解语义却容易把“iPhone 14 壳”也拉进来。混合检索让两条通道互补,兼顾型号精确与品类覆盖。
具体案例:某电商平台搜索团队对 query 同时跑 BM25 与向量召回,再用 RRF 融合,头部点击率(CTR)提升 23%,且“型号错配”投诉显著下降——用户搜"iPhone 15"时不再出现大量 iPhone 14 的壳。
企业知识库问答(RAG):工单号与语义问题的通吃
阶段:检索增强生成(RAG)的检索器
解决的问题:客服助手需要回答“上次那个 OOM 工单怎么处理的”,其中工单号 TICKET-2381 必须精确命中,而“内存溢出排查”这类描述需要语义召回。只用稠密检索会把工单号搞混,只用 BM25 则答不出“换个写法”的问题。
具体案例:某 SaaS 公司的内部知识库 RAG 系统,将 BM25 与向量检索结果做 RRF 融合后喂给大模型,回答准确率从 61% 提升至 84%,且回答能附上“命中来源文档”,方便用户核对,大大增强信任感。
学术论文检索:方法名精确、主题模糊两相宜
阶段:候选集生成(candidate generation)
解决的问题:科研搜索中,用户常输入精确的方法名(LoRA、DPO、FlashAttention),也常输入模糊描述(“让大模型对齐人类偏好的轻量方法”)。前者需要字面精确,后者需要语义扩展,两路结合才能构建完整候选集。
具体案例:某学术搜索引擎在 arXiv 语料上部署三通道召回——BM25 精确通道 + 稠密语义通道 + SPLADE 学习型稀疏通道,最终 RRF 融合。经评测,top-20 召回率比单一 BM25 提升约 19%,比单一稠密提升约 11%。
Python 演示
import mathfrom collections import Counter class BM25: """极简 BM25 检索器,复现正文的公式""" def __init__(self, corpus, k1=1.5, b=0.75): self.k1 = k1 self.b = b self.corpus = corpus self.doc_len = [len(doc.split()) for doc in corpus] self.avgdl = sum(self.doc_len) / len(self.corpus) self.doc_freq = Counter() for doc in corpus: for term in set(doc.split()): self.doc_freq[term] += 1 self.total = len(self.corpus) def _idf(self, term): n = self.doc_freq.get(term, 0) return math.log(1 + (self.total - n + 0.5) / (n + 0.5)) def score(self, query, idx): tf = Counter(self.corpus[idx].split()) dl = self.doc_len[idx] total = 0.0 for term in query.split(): f = tf.get(term, 0) if f == 0: continue denom = f + self.k1 * (1 - self.b + self.b * dl / self.avgdl) total += self._idf(term) * f * (self.k1 + 1) / denom return total def search(self, query, top_k=5): scores = [(idx, self.score(query, idx)) for idx in range(self.total)] scores.sort(key=lambda x: -x[1]) return [idx for idx, _ in scores[:top_k]] def rrf_fuse(rank_lists, k=60): """RRF 倒数排名融合:只依赖名次,不依赖分数尺度""" fused = {} for ranks in rank_lists: for rank, doc_id in enumerate(ranks): fused[doc_id] = fused.get(doc_id, 0) + 1.0 / (k + rank + 1) return sorted(fused.items(), key=lambda x: -x[1]) if __name__ == "__main__": corpus = [ "猫 在 垫子 上 睡觉 猫 很 安静", "狗 追 着 猫 跑 过 公园 草地", "今天 天气 晴 适合 去 公园 野餐", "宠物 猫 需要 定期 喂食 和 陪伴", ] bm25 = BM25(corpus) query = "猫 公园" bm25_rank = bm25.search(query) print("BM25 检索顺序:", bm25_rank) # 模拟稠密检索结果(真实场景由向量模型产出) dense_rank = [2, 3, 1, 0] print("稠密检索顺序:", dense_rank) fused = rrf_fuse([bm25_rank, dense_rank]) print("混合排序(RRF):") for doc_id, score in fused: print(" #%d RRF=%.4f %s" % (doc_id, score, corpus[doc_id]))
self.doc_freq = Counter()统计每个词出现在多少篇文档中,用于后续 IDF 计算。if term not in self.idf跳过查询中语料从未出现的词,避免未登录词干扰。denom = f + self.k1 * (1 - self.b + self.b * dl / self.avgdl)BM25 分母,同时实现词频饱和与文档长度归一。total += self._idf(term) * f * (self.k1 + 1) / denom每个查询词的贡献累加,对应公式的外层求和。scores.sort(key=lambda x: -x[1])按得分降序排列,得到稀疏检索的精排队列。dense_rank = [2, 3, 1, 0]模拟一条稠密检索返回的文档次序,真实场景中由向量模型产出。fused[doc_id] = fused.get(doc_id, 0) + 1.0 / (k + rank + 1)RRF 核心:把每路名次换算成倒数分并累加。
常见误区
误区稀疏向量大部分维度是 0,信息量肯定不如稠密向量丰富,所以稠密检索一定比 BM25 强,深度学习时代不需要稀疏检索了。
正解稀疏向量的“零”不是缺陷,而是精确的声明——“这个词不存在于文档中”。精确匹配任务(专名、工单号、型号)恰恰需要这种硬约束。BM25 至今仍是 Elasticsearch 默认检索器,在精确匹配与可解释性上,稠密检索无法取代它。
为何常见:深度学习的直觉是“特征越密越好”,但检索任务对精确性的特殊需求被忽略了。
误区BM25 无非是统计一下词出现的次数,没有任何智能,应该被淘汰。
正解BM25 的 IDF 平滑、k1 词频饱和、b 长度归一都是几十年经验沉淀的非线性设计。它零训练成本、可解释、可倒排索引加速,在混合检索中作为精确通道至今不可替代。
为何常见:看到“词频”二字就低估了它,忽略了公式中的精巧设计与其在工程中的统治地位。
误区SPLADE 内部是 BERT 模型,输出一定和 BERT 一样是 768 维稠密向量。
正解SPLADE 输出维度仍是词表大小(如 30000 维),只是不再只按字面词激活,而是通过 LogSumExp 把语义相关词也激活出非零权重。它依然是稀疏向量,因此能继续使用倒排索引加速。
为何常见:把“用了神经网络”与“稠密向量”划等号,混淆了模型结构与输出表示两个层次。
误区把 BM25 的前 10 条和稠密检索的前 10 条去重合并,就是混合搜索。
正解直接拼接只是并集,不是融合——它无法决定“两路都排第 1 的文档”和“一路排第 2 的文档”谁该在前。RRF 或加权融合会重新排序,让两路共识文档脱颖而出,才是真正的混合。
为何常见:把“混合”理解成集合操作,忽略了排序层面才是融合的主战场。
误区k1=1.5、b=0.75 是官方默认值,所有语料直接用就行,调参收益不大。
正解不同语料的最优参数差异很大:代码库检索可能希望 k1 更大以强调词频,短标题电商语料可能希望 b 更小以弱化长度惩罚。需要通过验证集或网格搜索来校准。
为何常见:默认值在大部分场景“能工作”,让人误以为它是最优解,而忽略了检索系统的精细调优空间。
面试题
Q1. 关于“稀疏向量”的描述,下列哪项最准确?
- A.大部分维度取值为零← 正确答案
- B.所有维度都有非零值
- C.维度数量固定为 768
- D.只能由神经网络生成
答案:A。稀疏向量指大多数维度为 0,例如词表 5 万维的文档向量只有几十个非零位置。B 是稠密向量的特征;C 的 768 是常见稠密向量维度;D 错误,BM25 的词袋向量无需神经网络。
Q2. BM25 中 IDF 的主要作用是什么?
- A.惩罚语料中的常见词← 正确答案
- B.提高长文档的得分
- C.计算词的嵌入相似度
- D.减少查询词的数量
答案:A。IDF 公式中,包含该词的文档数 n 越大,IDF 值越小,相当于惩罚“的、了、是”这类常见词。长文档归长度参数 b 管,嵌入相似度是稠密检索的事,IDF 与查询词数量无关。
Q3. 关于 BM25 的参数,下列说法正确的有哪些?
- A.k1 控制词频饱和速度← 正确答案
- B.b 控制长度归一强度← 正确答案
- C.b 越大长文档得分越高
- D.k1 越大词频饱和越慢← 正确答案
答案:ABD。k1 在分母中控制词频递减速率,k1 越大饱和越慢,因此 A、D 正确;b 控制长度归一化强度,b 越大对长文档惩罚越强而非得分越高,B 正确 C 错误。
Q4. 当 BM25 参数 b=0 时,说明什么?
- A.完全不考虑文档长度← 正确答案
- B.文档长度惩罚最强
- C.词频不参与计算
- D.IDF 恒等于 1
答案:A。b=0 时,长度比 |D|/avgdl 被完全忽略,分母只剩 f + k1,退化成长度无关形式。b=1 才是惩罚最强;词频与 IDF 始终参与计算,故 C、D 错误。
Q5. SPLADE 与传统 BM25 最本质的区别是什么?
- A.能激活语义相关的扩展词← 正确答案
- B.检索速度一定更快
- C.不需要任何词表
- D.输出 768 维稠密向量
答案:A。SPLADE 通过 BERT 上下文与 LogSumExp 池化,让“没写出来但语义相关”的词获得非零权重,这是对 BM25 字面匹配的本质升级。速度、词表、稠密输出均不符合 SPLADE 实际特征。
Q6. 为什么 BM25 在检索专有名词时往往优于稠密检索?
- A.依赖精确字面词项匹配← 正确答案
- B.对语义相似度更敏感
- C.专名有专门的模型
- D.不区分大小写形式
答案:A。BM25 基于倒排索引做字面词项匹配,“iOS 18“ 就是 ”iOS 18“,不会像稠密向量那样被语义相近的 ”iPhone 系统” 干扰。它没有专名模型,也未必不区分大小写,B、C、D 均不成立。
Q7. RRF 融合的核心思想是什么?
- A.按名次倒数加权各路名单← 正确答案
- B.将多路分数直接累加
- C.训练网络学习权重融合
- D.只保留两路都出现的词
答案:A。RRF 对文档在每路名单中的名次 r 计算 1/(k+r) 并求和,只看名次不看原始分数,因为各路分数尺度不可比。B 是加权求和,C 是学习型融合,D 是集合操作,均非 RRF。
Q8. 稠密检索相比稀疏检索最突出的优势是什么?
- A.更强的语义理解能力← 正确答案
- B.更强的精确匹配能力
- C.更好的结果可解释性
- D.完全无需标注训练
答案:A。稠密向量用神经网络编码语义,能召回“换种说法”的相关文档,这是稀疏检索的短板。精确匹配与可解释性恰恰是稀疏检索的强项;稠密检索通常需要训练,D 也错误。
Q9. 下列哪些是稀疏向量表示的典型特征?
- A.维度对应词表大小← 正确答案
- B.大多数维度取值为零← 正确答案
- C.可由倒排索引加速← 正确答案
- D.每个维度都有实数值
答案:ABC。稀疏向量维度数等于词表大小,绝大多数维度为 0,因此能用“词 → 文档列表”的倒排索引加速检索。D 描述的是稠密向量,每个维度都有值。
Q10. 下列哪些属于混合搜索的合理融合策略?
- A.RRF 倒数排名融合← 正确答案
- B.两路分数加权求和← 正确答案
- C.丢弃所有稀疏结果
- D.学习型分数归一化← 正确答案
答案:ABD。RRF 按名次融合、加权求和直接组合分数、学习型归一化用模型学融合权重,三者都是业界常用方案。C 丢弃稀疏结果等于退回纯稠密,不是混合。