← GEO Tutorial Series
AI TechnicalP2-05

混合搜索是什么:BM25 + 向量检索,AI 搜索的两条腿

2026-04-02·26 min read

混合搜索是什么:BM25 + 向量检索,AI 搜索的两条腿

RAG 系统的在线检索阶段,用户提交一个查询后,系统需要从几十亿个内容块里快速找到最相关的几十到几百个候选。这个「粗筛」阶段用的不是单一算法,而是两套完全不同的检索系统同时运行——关键词匹配(BM25)和向量语义搜索——然后把两边的结果合并成一个候选列表,送入后续的精排阶段。这就是「粗筛精排」里的「粗筛」。

这就是混合搜索(Hybrid Search)。

为什么要同时跑两套?因为关键词搜索和语义搜索各有致命短板。BM25 关键词搜索不懂「怎么做 GEO」和「生成式引擎优化方法」其实说的是同一件事;向量搜索不敏感于「GPT-4o」和「GPT-5.4」是两个不同的模型版本。单独用任何一套,都会漏掉大量相关内容。两套一起用,互补盲区,才是目前 Perplexity、ChatGPT Search、Google AI Overviews 等主流平台的标准做法。

对我们做 GEO 来说,这意味着:内容需要同时通过两道筛子。 只优化关键词或者只优化语义表达,都只能被一半的检索系统找到。

这篇文章我把 BM25 和向量检索分别拆开讲清楚,然后解释它们怎么合并(包括 RRF 算法),最后推导出可执行的 GEO 优化策略。术语不熟悉的话,可以查看《GEO 术语表》


BM25 关键词匹配——AI 检索的第一条腿

BM25(Best Matching 25)是一个有三十多年历史的文本检索算法。Google 传统搜索的底层就有 BM25 的影子,RAG 系统沿用了它,因为关键词精确匹配这件事上它依然是最高效的方案之一。

BM25 的核心逻辑

BM25 回答的问题很简单:用户查询里的关键词,在你的内容里出现了多少次、有多「稀有」。

具体来说,BM25 的打分基于三个因素:

  1. 词频(TF, Term Frequency):查询关键词在你的 chunk 里出现了多少次。出现越多,说明这个 chunk 跟查询越相关——但有边际递减,出现 3 次和出现 30 次的得分差距远小于 0 次和 3 次。

  2. 逆文档频率(IDF, Inverse Document Frequency):这个词在整个索引库里有多「稀有」。「的」「是」「在」这些词到处都有,IDF 极低,几乎不贡献分数。「GEO」「RAG」「Perplexity」这些词出现频率低,IDF 高,一旦你的内容包含它们,加分明显。

  3. 文档长度归一化:短 chunk 和长 chunk 的词频不能直接比较——一个 200 字的 chunk 出现 3 次「GEO」,比一个 1000 字的 chunk 出现 3 次「GEO」要更聚焦。BM25 会做长度修正。

BM25 打分简化示意:

用户查询:"GEO 内容优化 策略"
                    ┌──────────────┐
    "GEO"     ──────│ 出现 3 次     │──→ TF 得分高
                    │ IDF 高(稀有词)│──→ 加分多
                    └──────────────┘
                    ┌──────────────┐
    "内容"    ──────│ 出现 5 次     │──→ TF 得分高
                    │ IDF 中(常见词)│──→ 加分中等
                    └──────────────┘
                    ┌──────────────┐
    "优化"    ──────│ 出现 2 次     │──→ TF 得分中
                    │ IDF 中        │──→ 加分中等
                    └──────────────┘
                    ┌──────────────┐
    "策略"    ──────│ 出现 0 次     │──→ TF = 0
                    │              │──→ 该词无贡献
                    └──────────────┘

最终 BM25 得分 = 各词得分加权求和

BM25 的优势

  • 精确匹配能力强:搜"PerplexityBot",它就找包含"PerplexityBot"这个精确字符串的内容。不会把"ClaudeBot"召回来。
  • 对专有名词、数字、型号极敏感:搜"text-embedding-3-large 3072 维",BM25 能精准找到包含这些精确术语的 chunk。
  • 速度快:基于倒排索引,毫秒级响应,适合从几十亿 chunk 中做第一轮海选。
  • 可解释性强:为什么召回这个结果?因为它包含了查询中的关键词。逻辑简单清晰。

BM25 的致命短板

BM25 完全不理解语义。 「怎么做 GEO」和「生成式引擎优化的方法」在 BM25 看来几乎毫无关系——因为两句话共享的关键词极少。用户换一种说法问同一个问题,BM25 就可能找不到你的内容。

这个短板在中文场景下更明显。中文的同义表达特别丰富:「人工智能搜索优化」「AI 搜索优化」「生成式引擎优化」「GEO」说的都是一件事,但 BM25 把它们当作完全不同的词。


向量搜索——AI 检索的第二条腿

向量搜索(Dense Vector Retrieval)的原理在《向量嵌入是什么》里有详细拆解。这里只讲它跟 BM25 互补的关键差异。

向量搜索的核心逻辑

向量搜索不看关键词,看语义。它把用户查询和所有 chunk 都转换成向量(一串数字),然后计算向量之间的距离(通常用余弦相似度)。语义越接近的内容,向量距离越近,得分越高。

「怎么做 GEO」和「生成式引擎优化的方法」在向量空间里距离非常近——因为 Embedding 模型理解它们说的是同一件事。这恰好弥补了 BM25 的盲区。

向量搜索的优势

  • 语义理解能力强:同义表达、不同措辞问同一个问题,都能匹配到。
  • 跨语言潜力:一些多语言 Embedding 模型能把不同语言的同义内容映射到向量空间里的相近位置。
  • 对自然语言查询友好:用户用完整的句子提问("为什么我的网站在 Perplexity 上搜不到"),向量搜索能找到语义相关的内容,即使内容里没有出现完全相同的表述。

向量搜索的短板

向量搜索对精确术语和数字不够敏感。 搜「GPT-5.4 上下文窗口 1M token」时,向量搜索可能会召回一些讲「大模型参数规模」的 chunk——语义上「沾边」,但用户要的是 GPT-5.4 的具体数据,不是泛泛而谈。

另一个问题:向量搜索的计算成本比 BM25 高一个数量级。 在几十亿 chunk 的索引库里做精确的最近邻搜索太慢,实际系统用的是近似最近邻(ANN)算法,会牺牲一些精度换速度。这意味着即使你的 chunk 向量跟查询向量很近,ANN 也可能偶尔漏掉它。

两条腿的互补关系

维度BM25 关键词匹配向量语义搜索
匹配方式精确关键词语义相似度
「GEO」 vs 「生成式引擎优化」视为不相关视为高度相关
「GPT-5.4 1M token」精准匹配可能模糊匹配到其他模型
同义表达处理几乎无能力核心优势
专有名词/数字核心优势明显弱项
速度极快(毫秒级)较快(但比 BM25 慢)
可解释性弱(向量距离难以解释)

一句话总结:BM25 擅长「你说了什么词」,向量搜索擅长「你说了什么意思」。两者缺一不可。


混合搜索架构——两条腿怎么协调

混合搜索不是简单地把两种搜索的结果放在一起,它有一套明确的架构来协调两边的结果。

用户查询:"怎么让 AI 搜索引擎引用我的内容"
    │
    ├──────────────────┐
    │                  │
    ▼                  ▼
 BM25 检索          向量检索
 (倒排索引)       (向量数据库)
    │                  │
    ▼                  ▼
 Top-K 结果          Top-K 结果
 (按 BM25 分排序)  (按余弦相似度排序)
    │                  │
    └────────┬─────────┘
             │
             ▼
      分数融合(Score Fusion)
      例如 RRF 算法
             │
             ▼
      合并后的候选列表
      (50–200 个 chunk)
             │
             ▼
      送入精排(Reranker)

关键设计决策:两边各取多少? 大多数系统的做法是两边各取 Top-K(比如各取 Top-100),然后合并去重。有些系统会根据查询类型动态调整权重——如果查询看起来像是在找一个精确的名词(比如「PerplexityBot User-Agent」),就给 BM25 更高的权重;如果查询是一个模糊的概念性问题(比如「怎么提高 AI 可见性」),就给向量搜索更高的权重。

去重也是一个关键步骤。 同一个 chunk 可能同时被 BM25 和向量搜索召回。合并时不是简单地保留一个,而是把两边的分数都考虑进去——同时被两种系统选中的 chunk,说明它既有关键词匹配、又有语义相关,最终得分应该更高。


RRF——怎么把两个排名变成一个排名

两种搜索系统各返回一个排名列表,但它们的分数体系完全不同——BM25 的分数范围和向量搜索的余弦相似度分数范围不一样,直接相加没有意义。怎么合并?

目前最常用的方法是 Reciprocal Rank Fusion(RRF,倒数排名融合)。RRF 的思路很巧妙:不看分数,只看排名位置。

RRF 的计算方法

每个 chunk 的 RRF 得分 = Σ 1/(k + rank)

其中 rank 是它在某个排名列表中的位置(从 1 开始),k 是一个平滑常数(通常取 60)。如果一个 chunk 同时出现在多个排名列表里,就把各列表的倒数排名加起来。

举个例子:

chunkBM25 排名向量搜索排名RRF 得分(k=60)
chunk A第 1 名第 5 名1/61 + 1/65 = 0.0318
chunk B第 3 名第 2 名1/63 + 1/62 = 0.0320
chunk C第 2 名未召回1/62 + 0 = 0.0161
chunk D未召回第 1 名0 + 1/61 = 0.0164

看出来了吗?chunk B 在两个系统里都排名靠前(第 3 和第 2),最终 RRF 得分最高。 而 chunk A 虽然在 BM25 里排第一,但向量搜索里只排第五,总分反而略低于 B。chunk C 和 D 分别只被一个系统召回,得分明显低于同时被两个系统选中的 A 和 B。

RRF 的核心推论——对 GEO 的直接影响

同时被两种检索系统召回的内容,最终排名远高于只被一种系统召回的内容。 不是小差距——从上面的例子可以看到,同时被两个系统选中的 chunk 得分大约是只被一个系统选中的 2 倍。

这直接推导出一条 GEO 核心原则:每个 chunk 必须同时对关键词匹配和语义匹配友好。 只优化一个方向的 chunk,在 RRF 合并时会被严重惩罚——因为它只能从一个排名列表里拿分。


对 GEO 的实操意义——怎么同时通过两道筛子

理解了混合搜索的机制,优化策略就有了清晰的依据。以下每条都是从 BM25 + 向量搜索的互补逻辑直接推导出来的。

策略一:核心关键词必须出现在内容里

这条是给 BM25 的。不管语义表达多丰富,如果 chunk 里完全没有出现用户查询中的核心关键词,BM25 就给你零分。

具体做法:确认你的目标查询词(用户最可能搜的词)在 chunk 里至少出现一次。「GEO」「AI 搜索优化」「RAG」这些核心术语,在相关段落里不要省略。不是堆砌——BM25 有边际递减,出现一两次就够了——而是确保「存在」。

一个我在实际项目中见过的反面案例:某个讲 HSK 考试备考的页面全程用「中文水平考试」这个说法,一次都没提到「HSK」这三个字母。结果 BM25 在用户搜「HSK 备考」时完全找不到它——因为关键词根本不存在。加上「HSK」之后,BM25 这条路就通了。

策略二:用自然语言展开同义表达

这条是给向量搜索的。即使核心关键词到位了,如果内容只有干巴巴的关键词列表,向量搜索的语义匹配效果也会很差。

具体做法:在同一个 H2 小节里,用不同角度的自然语言描述同一个概念。比如讲「GEO」的段落里,自然地提到「让 AI 搜索引擎引用你的内容」「提高在 Perplexity 和 ChatGPT Search 里的可见性」「优化 AI 回答中的品牌出现概率」——这些都是「GEO」这个概念的语义变体。向量搜索会把它们映射到相近的位置,扩大你在向量空间里的覆盖面积。

这跟「语义锚点」原则是一致的:每个 chunk 有一个核心「语义锚点」(关键词),同时向外自然延伸出语义覆盖范围(同义表达)。关于「语义锚点」的详细解释,可以看《向量嵌入是什么》

策略三:标题同时包含关键词和语义信号

H2 标题在很多切块策略中会被包含在 chunk 内容里,有些系统甚至会给标题额外的权重。一个好的 H2 标题应该同时满足两个条件:

条件目的示例
包含核心查询词给 BM25"BM25 关键词匹配"
传达明确的语义信息给向量搜索"AI 检索的第一条腿"
两者结合同时通过两道筛子"BM25 关键词匹配——AI 检索的第一条腿"

「概述」「注意事项」「第三部分」这类标题在两个系统里都没有价值——BM25 里没有目标关键词,向量搜索里没有明确的语义信号。

策略四:FAQ 是天然的双引擎友好内容

FAQ 格式在混合搜索中有天然优势:

  • 对 BM25 友好:问题部分通常包含用户会搜的精确关键词("什么是 GEO"、"RAG 怎么工作")
  • 对向量搜索友好:回答部分用自然语言展开,提供丰富的语义信号
  • 对切块友好:每个 Q&A 天然是一个自包含的 chunk,通过「200 字独立测试」

这就是为什么 FAQ 在 GEO 里的效果一直很好——它不是在讨好某一种算法,而是在结构上同时满足了混合搜索的两个引擎。

策略五:专有名词和数字不要省略

向量搜索对精确术语和数字不够敏感,但 BM25 对它们极其敏感。如果你的内容涉及具体的产品名、模型名、数字指标,务必精确写出来

「那款防晒霜效果不错」在 BM25 里匹配不到「安耐晒小金瓶 SPF50+」——用户搜的是产品名和参数,你的内容里没有这些精确词就等于不存在。「这家咖啡店性价比很高」在 BM25 里匹配不到「Manner 美式 15 元」——具体品牌名和价格才是用户真正搜的关键词。精确的名词和数据不仅提高 BM25 匹配度,也提高了「命题式陈述」的信息密度——reranker 同样偏好具体信息。


常见问题

BM25 是不是已经过时了?

没有。BM25 在精确关键词匹配上依然是最高效的算法之一,而且计算成本极低。向量搜索擅长语义,但在精确术语、数字、专有名词上不如 BM25。这就是为什么所有主流 AI 搜索平台都用混合搜索而不是纯向量搜索——两者互补,缺一不可。在可预见的未来,BM25 或其改进版本仍然是 RAG 系统的标配组件。

我应该更侧重优化关键词还是语义?

两者都要,但如果必须选一个先做,先确保核心关键词存在(给 BM25),再优化语义表达(给向量搜索)。原因是:关键词不存在等于 BM25 给你零分,但语义表达不够丰富只是向量搜索给你的分偏低——前者是「从 0 到 1」的问题,后者是「从 70 分到 90 分」的问题。

不同 AI 平台的混合搜索权重一样吗?

不一样,这正是「平台偏好差」的技术根源之一。有些平台可能给 BM25 更高的权重(比如更偏好精确匹配的场景),有些可能更依赖向量搜索(比如更偏好语义理解的场景)。具体权重各平台没有公开,但核心策略不变:同时优化两个方向,才能在所有平台上都有表现。关于「平台偏好差」的详细分析,可以看《RAG 系统详解》

RRF 是唯一的分数融合方法吗?

不是。RRF 是最常用的,因为它简单、有效、不需要训练。其他方法包括学习型融合(用机器学习模型来决定最优权重组合)和归一化加权求和(先把两边的分数归一化到同一范围,再加权求和)。但对我们做 GEO 来说,具体用哪种融合方法不重要——重要的是所有融合方法都有一个共同逻辑:同时被两种系统选中的内容,最终排名更高。 这条原则不随融合算法变化。

Hybrid Search 跟 Google 传统搜索有什么区别?

Google 传统搜索也结合了关键词匹配和语义理解(Google 2019 年引入 BERT 就是为了加入语义能力),但最终产出是一个链接排名列表。RAG 系统的 Hybrid Search 产出的不是链接列表,而是一组内容片段(chunk),这些 chunk 会被直接喂给 LLM 来生成回答。区别在于:传统搜索的终点是「帮你找到网页」,Hybrid Search 的终点是「帮 LLM 找到参考材料」。这意味着 chunk 的质量——而不仅仅是页面的质量——才是核心竞争维度。