人人都会AI编程

3.4 稀疏检索原理:BM25、TF-IDF 关键词匹配机制

更新时间:2026-07-12

在 RAG 的检索环节,除了基于语义的向量检索(稠密检索),还有一种更经典、更可解释的检索方式——稀疏检索。它不依赖深度学习模型将文本映射为稠密向量,而是通过统计文本中关键词的词频和分布,来计算查询与文档的相关性。其中最具代表性的算法是 TF‑IDFBM25

3.4.1 为什么需要稀疏检索

向量检索擅长理解语义,但在以下场景中却容易“失手”:

  • 精确词汇匹配:如产品型号“X200-A”、法律条款号“第5.2.3条”,向量模型可能将其模糊匹配,导致检索到不相干的型号。
  • 低频专有名词:公司内部项目代号、人名、缩略词等,训练数据中极少出现,语义嵌入质量往往很差。
  • 可解释性要求:向量检索的相似度分数很难直观解释为什么返回某段文本,而关键词匹配可以明确指出是哪些词命中了。

稀疏检索完全基于词汇共现,天然解决了上述问题,常被用作向量检索的补充,或基数较小的知识库的唯一检索方式。

3.4.2 TF‑IDF:词的重要性由频率与范围共同决定

TF‑IDF(Term Frequency – Inverse Document Frequency) 是一种经典的关键词权重计算方法,用来衡量一个词对某篇文档的重要程度。它的核心思想是:一个词在某篇文档中出现得越频繁,且在整个文档集中越稀有,那么它对这篇文档就越具代表性。

  • 词频(TF):某个词在当前文档中出现的次数(通常会做归一化,如除以文档总词数,防止长文档天然占优)。数字越高,说明这个词与该文档的内容关联越紧密。
  • 逆文档频率(IDF):定义为 \(\log\left(\frac{N}{df}\right)\),其中 N 是文档总数,df 是包含该词的文档数。一个词在越少的文档中出现(即 df 越小),IDF 越大,意味着它越能区分不同文档。例如“的”、“是”这类词几乎每篇文档都有,IDF 趋近于 0,权重极低;“年假”或“X200-A”只在少数文档中出现,IDF 就高。

最终,一个词的 TF‑IDF 权重为 TF × IDF。把查询语句看作一篇短文档,同样计算其每个词的 TF‑IDF,然后通过余弦相似度等方式计算查询向量和文档向量之间的相似度,即可得到相关性分数。

实际应用中的样子
知识库文档集中,每篇文档都可以被表示为一个稀疏向量,向量的每个维度对应一个词,值为该词的 TF‑IDF。当用户提问“X200-A 笔记本的电池续航”时,查询被转换为同样的词汇权重向量,然后在倒排索引中快速找到同样高权重包含“X200-A”和“电池续航”的文档,返回结果。

3.4.3 BM25:对 TF‑IDF 的实战优化

BM25(Best Matching 25) 是基于概率模型的关键词检索算法,可以看作 TF‑IDF 的进化版。它在多项真实检索评测中表现优异,至今仍是许多搜索引擎和检索系统的默认算法。

BM25 对 TF‑IDF 的主要改进有:

  1. 饱和的词频处理

TF‑IDF 中,词频线性增长会导致某个词出现 100 次的文档得分远高于出现 10 次的文档,但这并不合理。BM25 引入了非线性饱和函数:\(\frac{TF \times (k_1 + 1)}{TF + k_1 \times (1 - b + b \times \frac{dl}{avgdl})}\),当词频超过一定阈值后,其对得分的贡献增长会迅速减缓,避免少数高频词主导结果。

  1. 文档长度归一化

长文档天然含有更多词,因此相同词频在长文档中的实际密度更低。BM25 通过参数 b 和文档长度 dl 与平均长度 avgdl 的比值来调节惩罚幅度。b 通常取 0.75,意味着长度惩罚的影响在完全无惩罚(b=0)与全部惩罚(b=1)之间。

  1. 可调节的参数

k1b 可以根据具体文档集进行调整,以获得更符合业务需求的相关性排序。

BM25 的得分公式直观上是:对查询中的每个词,计算它在该文档中的实际权重(受词频和文档长度影响),再乘以该词的 IDF(常使用一种类似概率版本的 IDF),最后求和。

3.4.4 TF‑IDF 与 BM25 的对比

| 特性 | TF‑IDF | BM25 |
|------|--------|------|
| 理论基础 | 向量空间模型,启发式 | 概率检索模型,更原则 |
| 词频饱和 | 无,线性增长 | 有,非线性饱和 |
| 文档长度处理 | 简单的归一化(如除以文档长度) | 带可调参数的原生机制 |
| 实际效果 | 尚可,但容易被高频词和长度影响 | 显著优于 TF‑IDF,是成熟搜索系统的基石 |
| 可解释性 | 高,每个词的贡献清晰可见 | 高,同样可以逐词分析 |

简单实用建议:在实际搭建 RAG 检索模块时,如果能使用 Elasticsearch、OpenSearch 或 Lucene 等成熟库,可以直接采用其内置的 BM25 实现,基本不需要自己实现 TF‑IDF。而如果自行构建极轻量级的关键词检索,TF‑IDF 也足够用于小规模和原型验证。

3.4.5 在 RAG 中的实际用法

稀疏检索在 RAG 系统中有两种典型的应用模式:

  • 单独使用(小规模知识库或强关键词场景)

对于只包含几百到几千篇文档的知识库,全文关键词检索(BM25)可能已经足够好用,无需引入向量数据库。尤其适合知识本身充满代码、序列号、特定术语,语义检索优势不明显的领域。

  • 与向量检索混合使用(混合检索)

这是目前生产级 RAG 的主流做法。同时执行 BM25 关键词检索和向量语义检索,然后将两路结果进行融合(例如通过融合分数 RRF 或加权合并),结合两者的优势。这样既能抓住精确匹配,又能通过语义覆盖同义表达。例如用户问“怎么更换笔记本的电池”,BM25 能命中含有“电池更换”的文档,向量检索能命中含有“拆卸电源”的表述,混合后结果更全面。

实用要点

  • 为了保证稀疏检索正常运行,知识库文本需要保留原始词汇形式,不可在预处理时过度清洗;停用词过滤要谨慎,因为某些看似通用的词在专有领域可能有关键意义。
  • 混合检索时,注意调优两路权重。对于型号、代码等硬匹配要求较高的场景,可提高 BM25 权重;对于 FAQ、口语化问题较多的场景,可侧重向量检索。
  • 利用 BM25 的可解释性,在调试时可查看每个查询词的得分贡献,快速定位检索不到正确文档的原因(如某关键词在数据库中完全缺失或不纳入索引)。

总之,稀疏检索以简洁透明的机制,在 RAG 检索阶段扮演着不可或缺的角色。它没有向量检索那样“聪明”,却足够“诚实”,在处理精确词汇匹配、冷门术语和需要可解释排名的场景中,常常是更可靠的选择。