市立图书馆里有两个出了名的检索专家:语义顾问“小语”和索引老匠“老索”。小语擅长“感觉”——你只要说“想找一本让人安静下来的书”,她就能凭着对内容的理解,把你领到正确的书架;老索擅长“字眼”——你说“书名里要有'月亮'两个字”,他一秒翻完卡片箱,把符合条件的书全搬到你面前。可是读者阿远发现,单独找谁都会碰壁:跟小语说“我要书名带'告别'的手册”,她抱来一堆风格忧郁的散文;跟老索说“我想找一本讲漫天星辰的小说”,他只认字面,漏掉了封面全是星星的《夜航》。 馆长老张琢磨了很久,终于想通了:这两位专家不是谁比谁厉害,而是各管一段——一个管“语义”,一个管“字面”。于是图书馆成立了“联合评审会”:让两位专家各自排出候选书单,再按统一的规则合出一份最终推荐。这个思路,正是今天向量数据库里最热门的“混合检索”:把向量相似度(懂语义)与 BM25 关键词(抠字面)融合起来,既懂语境、又保精确。这篇文章就沿着这场图书馆改革,把混合检索的原理、公式、落地与调优一次讲透。
对 AI 从业者而言,掌握混合检索是 RAG 工程落地的核心能力,能显著提升召回质量,也是向量数据库方向面试与实战的高频考点。
目录
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
检索困境:两位专家的盲区
阿远第一次走进图书馆,跟小语说:“我想找一本讲'告别'的书。”小语眨了眨眼,抱来一摞封面泛黄、气质忧郁的散文集。阿远哭笑不得——他要的是书名里带“告别”两个字的实用手册。第二天阿远学乖了,跑到老索的卡片箱前:“书名里要有'月亮'。”老索哗啦啦抽出三张卡片,三本书,而书架尽头那本封面画满月亮、书名却叫《夜航》的小说,他看都没看一眼。阿远明白了:一个太“走心”,一个太“走字”。
这个困境在真实的检索系统里每天都在发生。纯向量检索用语义相似度找“意思相近”的文档,却对精确字面命中无能为力:你搜索“iPhone 15 Pro MAX 256G“,向量召回的可能是一堆”手机评测“,而不是你想要的商品参数页。纯 BM25 关键词检索恰好相反,它对”2024-03-15”“合同编号 A-1024”这类字面查询又快又准,但你把“怎么退掉我不想要的订单”换个说法,它就听不懂了。
真实世界的查询往往同时包含这两种需求。比如 RAG 场景里用户问“请查一下 2024 年 Q3 的应收账款明细”——“应收账款”是一个需要语义理解的财务概念,“2024 年 Q3”则是一个必须字面精确的时间范围。只靠任何一路,都会漏掉一半线索。所以混合检索的目标很朴素:把两路候选集合并,取长补短。
图书馆的联合评审会就此成立。老张馆长的想法很简单:不再赌任何一位专家全对,而是让两个专家都发表意见,再设计一套公平的规则把它们揉成一份最终书单。接下来我们要做的,就是分别走进两位专家的工作室,看看他们各自的看家本领,再回到评审会现场,学习那套“融合配方”。
- 语义路候选集 R_vector由语义顾问找出的、与查询意思最相近的若干文档集合。
- 字面路候选集 R_bm25由索引老匠找出的、字面命中查询词的若干文档集合。
- 取并集合并两份候选合在一起去重,彼此的盲区由对方补上。
- TopK 截断合并后按统一标准排序,只把前 K 个结果交给下游。
向量检索:给小语一双“语义坐标”
小语的工作室里挂着一张巨大的星图。她告诉阿远,自己不看字,只看“位置”:每本书进馆时,都会被她浓缩成一个坐标点(专业上叫向量),意思相近的书会落在星图相近的位置。“讲孤独的小说”和“讲离别的散文”虽然一个词都不重样,坐标却挨得很近。这就是小语能“秒懂”的原因——她不是理解了文字,而是比较了坐标的远近。文本经嵌入模型(Embedding)映射到高维空间后,每个词、每句话都变成了一个几百维的向量,维度虽多,道理和星图一模一样:方向相近,语义相近。
那么“方向有多近”怎么量化?小语用的是余弦相似度,也就是比较两个向量夹角的余弦值。夹角越小,余弦越接近 1,说明两个文本越“对味”。
小语的优势很突出:同义改写、语序调整、跨语言查询都难不倒她。但她也有一块天生的短板——对“字面约束”睁一只眼闭一只眼。你问她“书名里必须有'月亮'两个字”,她会茫然地抱来《夜航》;你搜产品编号“SKU-88231“,她给你推一堆”类似的高端耳机“。因为语义坐标里没有”这个字必须出现”的意志。所以阿远明白了:小语是感觉派,要精确的活儿,还得另请高人。
- 分子点积把查询向量和文档向量的每一维对应相乘再求和,衡量两个方向一致的程度。
- 分母长度归一化各自求模长再相乘,把文本长短差异消掉,只看方向不看“厚度”。
- 余弦夹角点积除以模长乘积,结果落在负一到一之间,越接近 1 表示越同向。
BM25 算法:老索的字面计分法
老索的工位比小语凌乱得多:一屋子卡片箱,每张卡片上写着一个词,记录着它在哪本书里出现、出现多少次。老索不看“意思”,只看“证据”——你说“月亮”,他就去翻“月亮”这张卡片,把出现过这个词的书全部搬出来,并给每本书打一个分。这个打分体系,就是 BM25 算法,它继承了经典的“词频-逆文档频率”(TF-IDF)思想,又加上了更细致的调节旋钮。
老索的计分规则有三条。第一,一个词在一本书里出现越多,分数越高,但高到一定程度就不再涨了——出现 100 次的“月亮”不一定是出现 10 次的书的十倍好。第二,越稀有的词越值钱:满书库都是“的”“是”,它们几乎不加分;而全书库只有三本提到“月全食”,这个词一旦出现就含金量极高,这叫逆文档频率(IDF)。第三,书越厚越吃亏:一本 500 页的百科全书提到一次“月亮”,和一本 50 页的散文集提到一次“月亮”,含金量完全不同,所以要按文档长度打折。
老索的绝活是快、准、可解释。“合同编号 A-1024”一出口,他三秒锁定唯一那本档案;“书名有月亮”这种刁钻要求,他按字面百分百执行。但老索也有死穴:“想退掉我不想要的东西”这种绕来绕去的自然语言,他的卡片箱理解不了——字全认识,意思不懂。阿远叹了口气:感觉派和字面派,果然谁都不能单飞。
- 词频项查询词在文档中出现 f 次,次数越多贡献越大,但乘上 k1 后趋于饱和。
- 饱和与长度归一分母中的 k1 控制“多出现”的边际递减速度,b 与文档长度占比配合,惩罚篇幅冗长的文档。
- IDF 稀有词加权包含该词的文档数越少,这个词的信息量越大,权重越高。
- 对所有查询词求和查询里每个词的贡献累加,得到文档关于整个查询的最终分数。
融合策略:RRF 与加权,两种评审配方
馆长老张召集评审会,把两位专家的书单摆在桌上。问题来了:小语给出的是“相似度 0.91、0.85、0.79……”,老索给出的是“词频分 23.5、18.2、7.9……”,分数根本不是一套度量衡,没法直接比。老张设计了两套配方。第一套叫 RRF(倒数排名融合),规矩极简:两位专家不许报分数,只报名次,然后按“名次越靠前,奖励越多”折算。它就像一个只看排名、不看过往成绩的委员会——你考 95 分还是 59 分无所谓,只要你是全班第一,就拿第一名的奖励。
第二套配方叫加权融合,更像是馆长亲自打分:先把两位专家的分数各自“翻译”到同一个量纲(归一化),再按信任比例 α 加权求和。α 越大越信语义,α 越小越信字面。它的优点是精细可控,代价是你必须先解决“分数不通”的老问题。
老张在实践中发现:RRF 简单稳健,不需要精细标定分数尺度,适合快速上线;加权融合上限更高,但归一化和 α 都考验调参功力。阿远记下了两套配方,心想:配方再好,也得放到真正的业务里去检验。他很快获得了这样的机会——图书馆准备开一个“智能咨询台”。
- 归一化分数 ŝ用 min-max 或 z-score 把余弦值和 BM25 值都压到同一量纲,通常是 0 到 1。
- 权重系数 α取 0 到 1 之间,表示语义路的信任占比,剩下 1-α 给字面路。
- 线性加权求和两路归一化分数按权重相加,得到最终融合分。
RAG 实战:让讲解员读对书
图书馆新设了智能咨询台,阿远成了实习生。他的工作流程像极了今天最火的 RAG(检索增强生成):读者提问后,他先用混合检索从书库里捞出“候选书”,再把候选书交给一位口才极好的讲解员(大语言模型),由讲解员组织语言回答。阿远很快发现,这个流程的命门不在讲解员,而在自己选的候选书——书选错了,讲解员再能说也是瞎编。
混合检索在这个流程里立了大功。读者问“我的订单都付款了怎么还没发货”——“订单”“付款”“发货”这些词字面命中,老索立刻锁定客服文档;而“都付款了怎么还没”这种情绪化、口语化的语义,小语也能找到“支付成功但物流延迟”的相关条目。两路候选合并后,TopK 再交给讲解员,回答既引用了精确的规则原文,又贴合了用户的实际表述。
阿远的咨询台口碑很好,因为他的候选书单“既懂语境又保精确”。但他也意识到,这套评审配方不是一成不变的:不同的书库、不同的问题分布,可能需要不同的 k 值、α 值和候选数量。理论与实践之间,还差一个“调参”的环节。
- 相关文档集 Rel(q)人工标注的、真正回答这个问题的文档集合。
- TopK 结果集 Ret_k(q)混合检索返回的前 k 个候选文档。
- 交集占比正确答案里有多少被召回,比值越高说明漏得越少。
- 对所有问题求平均把每个查询的召回率累加取平均,得到系统整体表现。
调优评估:用满意度问卷调配方
馆长给阿远发了一沓“读者满意度问卷”——每张问卷是一个问题,以及它对应的“标准答案书”。阿远要做的是反复调整评审会的参数,让最终书单和标准答案越来越接近。这个过程在工程上叫作评测与调优:构造评测集,定义指标,搜索参数。RRF 里的 k(通常取 60 附近)、加权融合里的 α(0 到 1)、返回的候选数 topK、BM25 自己的 k1 和 b、向量路的召回数量,全都是可以拧的旋钮。
最常用的评价指标除了召回率,还有 MRR(平均倒数排名):它只关心“标准答案书”出现在书单第几位。如果排第一,得 1 分;排第二,得 0.5 分;排第十,只能得 0.1 分。这个指标非常贴合“问答只需最前面一个答案”的场景。
调参没有银弹。阿远试过把 α 调成 0.5,发现有的书库表现好,有的书库反而下降——因为一个以精确编号查询为主的书库,本该更信老索。他用网格搜索遍历参数组合,在评测集上选出最优配方,再上线做 A/B 对比,用真实读者的满意度验证。馆长老张看着阿远的实验记录,点了点头:“参数没有标准答案,只有数据给出来的答案。”
- 首个答案名次 r_i对第 i 个问题,标准答案在系统结果中的排名位置。
- 倒数奖励名次的倒数作为得分,第一名 1 分,第二名 0.5 分。
- 求平均所有问题的得分取平均,就是整个系统的 MRR。
演进趋势:检索特种部队
图书馆系统迎来大升级,老张把“双专家评审制”写进了新馆规。如今,主流向量数据库和检索引擎几乎都把混合检索做成了默认能力:Elasticsearch、OpenSearch 原生支持 BM25 与向量的混合查询,Milvus、Weaviate、Qdrant、pgvector 等新一代向量数据库也陆续内建了混合检索接口。阿远不用再手工拼两个系统,一条 API 就能同时调起两位专家。
趋势还在往前走。单一的两路融合开始变成“多路召回”:除了稠密向量和 BM25,还加入了稀疏向量(如 SPLADE、Learned Sparse Retrieval)、图结构召回、知识图谱召回等更多专家,各路候选先召回,再由一个重排模型(Reranker)精排。融合方式也从固定的 RRF、固定权重,升级为学习型融合——用一个模型根据查询类型自动决定各路的话语权。未来,配合 LLM Agent,检索系统甚至能自己判断“这个问题该多信语义还是多信字面”。
从最初的小语和老索搭班,到今天的检索特种部队,混合检索的理念始终没变:没有一个检索器是万能的,把不同视角的证据合在一起,才最接近真相。阿远看着新馆规上那行字——“向量懂语义,关键词保精确,融合才是完整。”这正是混合检索给所有检索系统最朴素也最深刻的启示。
AI 应用场景
企业知识库智能问答(RAG 客服助手)
阶段:检索增强生成(RAG)的召回环节
解决的问题:传统纯向量客服问答对“订单号 JS20240315”“发票号 INV-88231”这类精确编号经常召回错误文档,回答牛头不对马嘴;而只有关键词检索又接不住“我的退款怎么还没到账”这种口语化问法。混合检索同时覆盖两路,显著降低漏召回与错召回。
具体案例:某电商平台的客服机器人接入混合检索后,用户输入“我上个月买的那双鞋想退”,向量路召回“退货政策”相关条目,BM25 路按“退”字精确命中退换货流程文档,融合后由 LLM 生成带流程步骤的回复,一次解决率提升约 30%。
法律与合规文档检索
阶段:专业领域检索与引用溯源
解决的问题:法律条文、监管条款要求极高的字面精确性(“《民法典》第 585 条”一字不能差),同时律师的自然语言问题往往充满同义改写。混合检索让“条文号精确命中”与“争议点语义召回”同时成立。
具体案例:某律所知识库系统,律师提问“合同违约金的司法上限依据”,向量路召回到“违约金调整”相关裁判观点,BM25 路精确锁定含“第 585 条”的原文文档,融合后输出既附法条原文、又带司法解释的完整答案。
电商商品搜索
阶段:召回与粗排
解决的问题:用户常混用精确型号与模糊描述,例如“索尼 WH-1000XM5 降噪耳机打游戏行不行”——型号必须字面精确,用途描述则需要语义理解。混合检索一条查询同时满足两种需求。
具体案例:某 3C 电商平台将搜索改为“BM25 精确匹配商品名/型号 + 向量匹配描述/评价”双路召回后,长尾查询的成交转化率明显提升,“不记得型号只记得外观”的用户也能找到目标商品。
Python 演示
# 混合检索演示: 简易BM25 + 词频向量余弦 + RRF/加权融合import mathimport refrom collections import Counter CORPUS = [ "苹果发布新款手机, 摄像头大幅升级", "苹果公司公布季度财报, 营收创新高", "如何挑选新鲜水果, 苹果与香蕉的保存技巧", "手机电池续航成为用户最关心的问题", "富士康代工苹果手机, 生产线加班加点",] def tokenize(text): return re.findall(r"[\u4e00-\u9fa5a-zA-Z0-9]+", text) class BM25: def __init__(self, corpus, k1=1.5, b=0.75): self.corpus = corpus self.doc_len = [len(tokenize(d)) for d in corpus] self.avgdl = sum(self.doc_len) / len(corpus) self.k1 = k1 self.b = b self.N = len(corpus) self.dfs = Counter() for d in corpus: for t in set(tokenize(d)): self.dfs[t] += 1 def idf(self, term): n = self.dfs.get(term, 0) return math.log((self.N - n + 0.5) / (n + 0.5) + 1) def score(self, query, i): s = 0.0 doc_tokens = Counter(tokenize(self.corpus[i])) for t in set(tokenize(query)): f = doc_tokens.get(t, 0) if f == 0: continue length_norm = 1 - self.b + self.b * self.doc_len[i] / self.avgdl s += self.idf(t) * (f * (self.k1 + 1)) / (f + self.k1 * length_norm) return s class SimpleVector: def __init__(self, corpus): self.tf = [Counter(tokenize(d)) for d in corpus] def cos_sim(self, query, i): q = Counter(tokenize(query)) common = set(q) & set(self.tf[i]) dot = sum(q[t] * self.tf[i][t] for t in common) n1 = math.sqrt(sum(v * v for v in q.values())) n2 = math.sqrt(sum(v * v for v in self.tf[i].values())) return dot / (n1 * n2 + 1e-9) def rrf_score(rank, k=60): return 1.0 / (k + rank) def norm_scores(scores): lo = min(scores.values()) hi = max(scores.values()) if hi == lo: return {i: 0.0 for i in scores} return {i: (v - lo) / (hi - lo) for i, v in scores.items()} def hybrid_rrf(query, bm25, vec): v_ord = sorted(range(len(CORPUS)), key=lambda i: vec.cos_sim(query, i), reverse=True) b_ord = sorted(range(len(CORPUS)), key=lambda i: bm25.score(query, i), reverse=True) rv = {doc: r for r, doc in enumerate(v_ord)} rb = {doc: r for r, doc in enumerate(b_ord)} scores = {i: rrf_score(rv[i]) + rrf_score(rb[i]) for i in range(len(CORPUS))} return sorted(scores.items(), key=lambda x: x[1], reverse=True) def hybrid_weighted(query, bm25, vec, alpha=0.5): v_scores = {i: vec.cos_sim(query, i) for i in range(len(CORPUS))} b_scores = {i: bm25.score(query, i) for i in range(len(CORPUS))} vn = norm_scores(v_scores) bn = norm_scores(b_scores) merged = {i: alpha * vn[i] + (1 - alpha) * bn[i] for i in range(len(CORPUS))} return sorted(merged.items(), key=lambda x: x[1], reverse=True) def main(): bm25 = BM25(CORPUS) vec = SimpleVector(CORPUS) for q in ["苹果 手机", "水果 保存", "新款 手机 摄像头"]: rr = hybrid_rrf(q, bm25, vec) wm = hybrid_weighted(q, bm25, vec, alpha=0.5) print("查询:", q) print(" RRF 融合:", [(i, round(s, 4)) for i, s in rr]) print(" 加权融合:", [(i, round(s, 4)) for i, s in wm]) if __name__ == "__main__": main()
class BM25:定义“字面路”专家,用词频与逆文档频率给文档打分。return math.log((self.N - n + 0.5) / (n + 0.5) + 1)稀有词加权:包含该词的文档越少,权重越高。s += self.idf(t) * (f * (self.k1 + 1)) / (f + self.k1 * length_norm)词频与长度归一化相乘,构成 BM25 核心打分。return dot / (n1 * n2 + 1e-9)余弦相似度,分母加极小值防止除零。def rrf_score(rank, k=60):RRF 的倒数排名分,k 取 60 是常见经验值。scores = {i: rrf_score(rv[i]) + rrf_score(rb[i]) for i in range(len(CORPUS))}把向量路与 BM25 路的名次合并成融合分。vn = norm_scores(v_scores)两路分数量纲不同,融合前必须先归一化。merged = {i: alpha * vn[i] + (1 - alpha) * bn[i] for i in range(len(CORPUS))}加权融合:按 α 分配两路话语权。
常见误区
误区向量检索这么强大,BM25 这种老古董早该淘汰了,我只要语义相似度就够了。
正解向量检索对“字面精确约束”天然弱——商品编号、人名、法条号、报错代码这类查询,BM25 往往远胜向量。语义顾问再厉害,也记不住“书名第三个字必须是'孤'”这种精确条件,而索引老匠一秒锁定。混合互补才是主流,不是新旧替代。
为何常见:因为大模型与向量数据库的营销声量太大,初学者容易把“语义能力强”误当成“所有检索能力都强”。
误区RRF 不就是把两个检索分数取个平均吗?顺手调调 α 就行。
正解RRF 根本不看原始分数,只看文档在每路的排名位置,用 1/(k+rank) 折算并求和。而“取平均”属于加权融合,前提是把两路分数先归一化,否则量纲大的一路会垄断结果。一个像“只问名次的委员会”,一个像“校长亲自打分的加权制”。
为何常见:两类融合都输出一个最终分数排序,黑箱外看起来差不多,容易混为一谈。
误区α=0.5 正好是 50/50 五五开,听起来最公平,肯定是最优配置。
正解α 的最优值取决于语料分布与查询类型。以精确编号为主的系统应该更信 BM25,以开放问答为主的系统应该更信向量。没有免费午餐,必须用评测集数据去搜索 α,而不是拍脑袋取 0.5。
为何常见:“对称即公平”是人的直觉偏好,但检索效果的好坏由数据分布决定,不是由参数的对称性决定。
误区只要把两路检索融合起来,效果一定比任何单路好。
正解如果两路本身都弱——嵌入模型质量差、分词与清洗没做好、语料过短——融合只是“两个差生商量答案”,甚至可能互相干扰。混合检索只是扩大了候选池,是否提升最终必须用 Recall@k、MRR 等指标验证。
为何常见:看到不少案例报道混合检索提升明显,容易把“充分条件”误当成“必然条件”。
面试题
Q1. 向量检索主要通过什么来衡量两段文本的相似度?
- A.关键词出现次数
- B.向量空间的距离← 正确答案
- C.文档字数的多少
- D.发布时间的前后
答案:B。向量检索把文本映射成高维向量,用余弦相似度或欧氏距离衡量“语义方向”的远近;关键词次数是 BM25 的活,字数和发布时间与语义无关。就像小语靠“坐标方向”识书,不数笔画、不看日期。
Q2. BM25 中 IDF 的主要作用是什么?
- A.降低常见词的权重← 正确答案
- B.提高所有词的权重
- C.计算文档的向量
- D.压缩倒排索引体积
答案:A。IDF 按“多少文档包含该词”加权:满库皆是的“的、是”权重趋近于零,只有少数文档出现的稀有词权重很高。这就像老索判断哪个词更有信息量,人人都会说的词不值钱。
Q3. RRF 融合的核心依据是什么?
- A.各路检索的原始分数
- B.文档在每路的排名位置← 正确答案
- C.文档长度与更新时间
- D.查询词出现的总次数
答案:B。RRF 用 1/(k+rank) 把每路的名次折算成分数再求和,完全不看原始分数,天然免疫量纲差异。就像评审会只问“你排第几”,不问你考了多少分。
Q4. RRF 公式中的常数 k 通常取多少?
- A.1 到 10 之间
- B.30 到 80 之间← 正确答案
- C.100 到 200 之间
- D.任意负整数都可以
答案:B。业界经验值 k=60,常见范围 30 到 80。k 的作用是平滑名次差距,防止第一名垄断——1/61 与 1/62 的差距不会碾压后排选手。k 不能为负,否则会除零或反转排名。
Q5. 纯向量检索的短板包括哪些?
- A.精确匹配专有名词困难← 正确答案
- B.对同义改写完全不敏感
- C.无法处理多语言的文本
- D.忽略字面精确的约束← 正确答案
答案:AD。向量检索擅长同义改写与多语言(B、C 恰是它的强项),但对专有名词、编号这类“必须逐字命中”的约束无能为力。就像小语抱来一堆忧郁散文,却不知道书名里有没有“告别”两个字。
Q6. BM25 检索最适合下列哪类查询?
- A.描述模糊的心情
- B.精确的型号与编号← 正确答案
- C.抽象的概念对比
- D.跨语言的近义词
答案:B。BM25 的本质是词频加稀有权重,对"SKU-88231"“合同编号 A-1024”这类字面查询打分明快、可解释;模糊心情、抽象概念、跨语言恰恰是语义顾问的主场。
Q7. 加权融合前通常需要做哪些处理?
- A.将两路分数归一化← 正确答案
- B.消除分数的量纲差异← 正确答案
- C.直接取两路的最小值
- D.确定权重系数 α 的取值← 正确答案
答案:ABD。余弦值在负一到一,BM25 值可能到几十,不归一化直接加权,分数大的一路会垄断结果。所以要先归一化、消除量纲差异,再确定 α。“取最小值”是另一种(不常用的)聚合方式,不是加权融合的必备步骤。
Q8. RAG 场景采用混合检索的主要收益是什么?
- A.降低模型的参数量
- B.兼顾语义与精确召回← 正确答案
- C.加快模型推理的速度
- D.减少训练数据的数量
答案:B。RAG 的查询常混合精确实体与口语语义,混合检索让 BM25 命中“订单号、法条号”,向量路召回“换个说法的同义表达”,两路互补减少漏召回。参数量、推理速度、训练数据都与检索方式无关。
Q9. 以下哪些属于混合检索的融合策略?
- A.RRF 排名位置融合← 正确答案
- B.加权分数的线性融合← 正确答案
- C.学习型权重的融合← 正确答案
- D.只保留向量路的结果
答案:ABC。RRF、加权线性融合、学习型融合都是主流融合策略;学习型融合用模型根据查询自动决定各路权重,是演进方向。“只保留一路”压根没有融合。
Q10. 加权融合前不做归一化会出现什么后果?
- A.分数大的一路垄断结果← 正确答案
- B.融合结果完全不可逆
- C.检索速度显著提升
- D.索引空间占用下降
答案:A。BM25 分数通常远大于余弦相似度,不归一化时 1-α 那一路几乎决定全部排序,α 形同虚设。就像评审会上老索声如洪钟,小语的声音再准也听不见,融合便名存实亡。