混合搜索是什么: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 的打分基于三个因素:
-
词频(TF, Term Frequency):查询关键词在你的 chunk 里出现了多少次。出现越多,说明这个 chunk 跟查询越相关——但有边际递减,出现 3 次和出现 30 次的得分差距远小于 0 次和 3 次。
-
逆文档频率(IDF, Inverse Document Frequency):这个词在整个索引库里有多「稀有」。「的」「是」「在」这些词到处都有,IDF 极低,几乎不贡献分数。「GEO」「RAG」「Perplexity」这些词出现频率低,IDF 高,一旦你的内容包含它们,加分明显。
-
文档长度归一化:短 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 同时出现在多个排名列表里,就把各列表的倒数排名加起来。
举个例子:
| chunk | BM25 排名 | 向量搜索排名 | 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 的质量——而不仅仅是页面的质量——才是核心竞争维度。