第一部分:BM25检索介绍BM25是一种用于信息检索的概率性排序函数,它用于估算文档与查询的相关性分数。 它是经典的TF-IDF方案的进化,但效果通常更好,是现代搜索引擎中的基石算法之一(尽管很多最新系统已经转向基于神经网络的模型,但BM25依然是一个强大且高效的基线)。 公式分解最常用的BM25公式(OkapiBM25)如下:对于一个查询(Q),包含多个词项(q_1,q_2,... 第二部分:C++实现下面是一个简化但功能完整的BM25检索系统实现。它包含以下部分:Document:表示一个文档。BM25:核心算法类,负责建立索引和计算分数。 BM25类:addDocuments:该方法接收文档集合,计算全局统计信息(平均文档长度avgdl_和每个词项的文档频率doc_freq_)。这相当于“构建索引”的过程。
image.png 本文cmd地址:经典检索算法:BM25原理 bm25 是什么? bm25 解释 讲bm25之前,我们要先介绍一些概念。 bm25算法。 BM25里的一些参数是经验总结得到的,后面我会继续介绍BM25的变种以及和其他文档信息(非文字)结合起来的应用。 参考 BM25 算法浅析 搜索之 BM25 和 BM25F 模型 经典搜索核心算法:BM25 及其变种 信息检索导论
显然,ranking function是决定检索效果最重要的因素,本文选用了在实际应用中效果很好的BM25。BM25其实只用到了一些基础的统计和文本处理的方法,没有很高深的算法。 ? BM25 上图是BM25的公式,对于一个搜索q和所有文本,计算每一篇文本d的权重。 显然,d比平均值大,则normalizer大于1,代入BM25最终的权重变小,反之亦然。 ? length normalization Python实现 下面通过一个例子来实现根据BM25来进行文本检索。现在从网上爬下来了几十篇健康相关的文章,部分如下图所示。 文本列表 python的实现用到了gensim库,其中的BM25实现的源码如下: #!
深入理解TF-IDF、BM25算法与BM25变种:揭秘信息检索的核心原理与应用 1.文本特征表示方法: TF-IDF 在信息检索, 文本挖掘和自然语言处理领域, IF-IDF 这个名字, 从它在 20 以下是BM25的一些重要的变种和衍化算法: BM25L(BM25 with Length Normalization):BM25L算法是在BM25算法的基础上,考虑了文档长度对得分的影响,通过引入文档长度规范化项来平衡不同长度的文档 2.1 BM25详解 首先,简单概括 BM25 究竟作何用途。BM25 算法实质上是一个用于信息检索中,对给定查询(query)和若干 “相关” 文档(document)进行相关性排序打分的排序函数。 从以上对 BM25 的完整讨论,我们知道了 BM25 其实是一个(准确说,是一系列)经验公式,这里面的每一个环节都是经过很多研究者的迭代而逐步发现的。 他们在 “When documents are very long, BM25 fails!” 一文中提出了 BM25L 算法,用来弥补 BM25 的这一不足。
NewBeeNLP公众号原创出品 公众号专栏作者 @Maple小七 北京邮电大学·模式识别与智能系统 TL;DR 虽然以SentenceBERT为代表的语义向量检索展现出了超越传统的以BM25 Information Retrieval for Large Index Sizes 链接:https://arxiv.org/abs/2012.14210 开篇 传统的信息检索技术通常使用TF-IDF、BM25 下表展示了稠密向量与BM25向量比较的相对错误率,随着索引量的增大,稠密向量检索和BM25向量检索的差距逐渐减小。 ? 值得注意的是,BM25却完全没有受到随机字符串的影响,这是因为生成和查询词汇匹配的字符串的概率是非常低的。 因此并不是在任何场景下稠密检索都要优于稀疏检索,SentenceBERT也并不能完全替代BM25。
BM25算法是一种常见用来做相关度打分的公式,思路比较简单,主要就是计算一个query里面所有词和文档的相关度,然后在把分数做累加操作,而每个词的相关度分数主要还是受到tf/idf的影响。 BM25在实际应用中效果要远远好于BIM模型。 具体的bm25 bm25算法是常见的用来计算query和文章相关度的相似度的。 来举个栗子:“bm25”这个词只在很少一部分的文章中出现,n(qi)就会很小,那么“bm25”的IDF值就很大;“我们”,“是”,“的”这样的词,基本上在每一篇文章中都会出现,那么n(qi)就很接近N, 我们把K的展开式带入到bm25计算公式中去: ? 以上就是bm25算法的流程了。 以下是实现过程:
毕业快4年了,最近准备梳理一下《我毕业这4年》,在整理文档时看到了好久之前的一个比赛,想起了当时TFIDF、BERT的方案都没在指标上赢过BM25的情景,本文作为“炼丹秘术”系列的第7期,我们来聊一聊相似文本搜索的相关知识点 什么是BM25 BM25是信息索引领域用来计算Query与文档相似度得分的经典算法,不同于TFIDF,BM25的公式主要由三个部分组成: 对Query进行语素解析,生成语素qi; 对于每个搜索结果 BM25的实现 class BM25: def __init__(self, corpus, tokenizer=None): self.corpus_size = len(corpus 同时对句子中的词使用IDF为权重进行加权得到Sentence Embedding,同时为了得到更好的效果,这里做了一个改进,即使用Smooth Inverse Frequency代替IDF作为每个词的权重;其二是利用BM25
这里介绍2种重要的权重度量方法:TF-IDF和BM25。 在进入理论探讨之前,我们先举个例子。假如,我们想找和“Lucence”相关的文章。 作为默认的相关性算法,而是采用了BM25(BM是Best Matching的意思)。 BM25是基于TF-IDF并做了改进的算法。 BM25中的TF 传统的TF值理论上是可以无限大的。而BM25与之不同,它在TF计算方法中增加了一个常量k,用来限制TF值的增长极限。 BM25如何对待文档长度 BM25还引入了平均文档长度的概念,单个文档长度对相关性的影响力与它和平均长度的比值有关系。BM25的TF公式里,除了k外,引入另外两个参数:L和b。 BM25在传统TF-IDF的基础上增加了几个可调节的参数,使得它在应用上更佳灵活和强大,具有较高的实用性。
从 Elasticsearch 5 开始,Elasticsearch 的默认相似度算法是 Okapi BM25,Okapi BM25模型于 1994 年提出,BM25 的 BM 是缩写自 Best Match 在这篇文章中,我们将一步步拆解 Okapi BM25 模型的内部工作原理。 在拆解评分算法之前,必须简单解释一下背后的理论——Elasticsearch 基于 Lucene。 1、Okapi BM25 基本概念 Okapi BM25 模型的计算公式如下: ? 类似的公式,我看到后的第一反应:这是科研人员才能搞懂的事情,我等只能围观。 search-explain.html https://www.infoq.com/articles/similarity-scoring-elasticsearch/ 6、小结 一步步拆解,才能知道 BM25
二、什么是 BM25:一套给关键词打分的检索规则BM25 可以理解为一种经典的文本相关性排序算法。用户输入一个查询词,系统拿它和文档库里的每篇文档做对比,然后给每篇文档打一个分。 BM25 会给稀有词更高权重。文档长度要被校准:长文档天然更容易包含更多词,如果不校准,长文档会更容易拿高分。BM25 会考虑文档长度,避免“长”本身变成优势。 例如“RAG 为什么要用 BM25”可以拆成“RAG”“为什么”“BM25”等词。真正实现时,还会考虑大小写、停用词、中文分词、同义词扩展等细节。优点:处理过程清晰,速度快,容易调试。 BM25 能帮助系统快速找到包含关键字的原始材料。代码和日志检索:函数名、类名、错误码、配置项往往必须精确命中。向量检索可能理解大意,但 BM25 更容易把具体片段捞出来。 BM25 可以先召回强相关候选,再交给向量模型或重排序模型精筛。工业界实践工程上常见的方案是混合检索:一路用 BM25,一路用向量检索,然后把两边结果合并、去重、重排序。
方法一:BM25词法检索(Lexical retrieval) 查找具体标识符的场景:错误码、条款编号、产品名称。 BM25 不理解含义,它只统计某个词在一篇文档中出现多少次,以及该词在整个语料库中有多稀有(TF-IDF)。这和 Google 搜索最底层做的事情是同一件。 BM25 字面地搜索 E-4012,要么找到,要么找不到。 但是,查询"OOM error"匹配不到讲"out of memory crash"的文档。BM25 不懂同义词。 → 加 BM25 或结构化信号——问题出在精确度。 完全找不到相关文档?→ 加向量检索——问题出在召回率(recall)。 复杂查询返回的是垃圾?→ 加 re-ranker 或 Agent 层。 2026 年大多数成熟的系统都是混合式的:向量负责语义召回,BM25 负责精确匹配,re-ranker 负责质量,基于推理的检索负责最难的那部分查询。
BM25 擅长什么 BM25 是搜索引擎用来估计文档与查询相关性的一个排名函数。它针对精确词项重叠和稀有词项重要性做优化,本质上是一个 lexical 匹配引擎。 下面是用 bm25s 库在 Python 中实现一个快速、现代的 BM25 retriever。 具体例子 BM25 在精确标识符主导相关性时取胜。 BM25 分数可能是 18.5,cosine similarity 分数始终在 -1 到 1 之间。直接相加,BM25 分数会完全压过 cosine similarity。 如果一个文档在 vector search 里排第 1、在 BM25 里排第 4,会拿到一个高的组合分;如果它在 vector search 里排第 2、在 BM25 里完全没出现,仍能拿到一个不错的分数
背景在搜索领域,BM25一直是文本相关性打分的默认选择。它简单、稳定、可解释,用ES做搜索的团队基本都在用。 第一段是粗筛,行内的叫法是"召回"——用BM25或者向量检索,从千万级文档里先捞几十到几百条候选出来。这一步要的是快、要的是别漏。 BM25打多少分算一样,标题命中没命中算一样,片子热不热门、新不新,都算。把要看的这些列出来、说清楚每条怎么算出来,定义就完事了。光列出来没用,得真把数据整理出来。 BM25的全字段命中、title是否完全匹配、热度、时效性、点击率统计……这些信号都可以以同样的形式塞进feature_extractors。 如果你手头的搜索业务正好卡在那种「BM25已经调到不能再调」的阶段,不妨找个空闲的下午,拿自己的数据跑一遍——说不定那个一直排不上去的结果,这次真就上来了。
二、经典永流传:BM25——关键词匹配的“老兵” BM25(Best Matching 25)是一种久经考验的排序算法,广泛应用于传统搜索引擎中。 但BM25会进行“饱和度”处理,避免某些超高频词过度影响结果。 BM25、全文搜索与倒排索引:它们是如何协同工作的? • BM25:在通过倒排索引找到候选文档后,BM25算法登场,为每个文档计算一个相关性得分,然后按分排序,将最相关的结果呈现给用户。 把它们比作在图书馆找特定主题的书籍: 1. 可以看作是BM25等基于词频方法的延伸和智能化,试图在关键词匹配的基础上增加一些语义理解。
2.5 BM25 整体而言 BM25 就是对 TF-IDF 算法的改进,对于 TF-IDF 算法,TF(t) 部分的值越大,整个公式返回的值就会越大。 BM25 就针对这点进行来优化,随着TF(t) 的逐步加大,该算法的返回值会趋于一个数值。 ? 该图来自ES官网 BM25 有一个比较好的特性就是提供了两个可调参数: ? ,BM25(度)= 0.6099695; 5)根据"description": "sum of:",当检索【es的相关度】,文档1的_score = BM(es)+ BM25(的)+ BM25(相关 根据结果,我们可以看到:对应文档的_score = BM25(es in title) + BM25(es in content);其中BM25(es in title)= boost * idf * 4.4 更改BM25 参数 k1 和 b 的值 在介绍BM25算法时,我们知道 k1 参数【默认值1.2】控制着词频结果在词频饱和度中的上升速度。
那么,TF-IDF 或 BM25 中的权重(比如 IDF 值)是不是“词向量”? 也不是。 所以 BM25 引入了“饱和机制”:次数多了,加分就变慢。 所以 BM25 会惩罚过长的文档,避免它们靠堆字数占便宜。 把上面的逻辑变成公式对于一个词 t 和一篇文档 d,BM25 的得分是: 别被吓到! 但这是新一代技术,和 BM25 属于不同范式。目前工业界主流做法是: BM25(关键词匹配) + 向量检索(语义匹配) → 混合搜索(Hybrid Search)既保证精准召回,又覆盖语义泛化。 总结一句话: BM25 不是向量化,而是一套基于统计的“现场打分规则”,高效、可解释、工程友好
本文首先通过回答以下问题深入了解 CE(Cross-Encoder)BERT和 BM25(排名)的相互关系: CE 和 BM25 排名有何不同? CE 能否对 BM25 检索到的文档进行更好地排名? 问题1:CE 和 BM25 排名有何不同? 结果如下图(a)所示: CE 和 BM25 在顶部差异很大(CE@10 33%),低排名(CE@1000 60%)时相反。 BM25 排名靠前的文档很少被 CE 评为低,说明精确匹配是一种重要的基础排名策略。 问题2:CE 能否对 BM25 检索到的文档进行更好地排名? 对不相关文档(图d),CE 从低排名中给 CE@10 带来了大量不相关文件,高估了 BM25 正确认为不相关的文档。 问题3:CE 能否更好地找到 BM25 漏掉的文档? CE 低估了 BM25 正确排名的一些高度相关的文档,同时又高估了不相关的文档。精度的提高主要源于将高度相关的文档从 BM25 的后面提到前面。
无论是 动态配置管理、多值向量支持,还是 BlockMax WAND 加速的 BM25,这一版本都在性能、灵活性和用户体验上迈出了一大步。 BlockMax WAND 加速 BM25(GA)—— 关键词搜索性能飙升 BM25 是传统关键词搜索的核心算法,Weaviate 现在采用 BlockMax WAND 技术,带来: • 更快的查询速度 需按文档迁移 • 动态用户管理:需通过 DYNAMIC_USERS_ENABLED 启用 • 多值向量:现支持所有量化选项,可优化存储 推荐场景 ✅ RAG 应用:动态切换模型,优化生成效果 ✅ 电商搜索:BM25
= BM25Okapi(tokenized_corpus) # 持久化到本地 bm25_data = {"bm25": bm25, "doc_texts": doc_texts} return bm25_data BM25 的原理(简单理解): BM25 是 TF-IDF 的改良版。 BM25 稀疏检索 → Top-5 3. RRF 融合 → 最终 Top-5 排名 """ bm25 = bm25_data["bm25"] doc_texts = bm25_data["doc_texts"] 检测到已有 BM25 索引,加载中... ================================================== 开始混合检索问答测试(FAISS + BM25 + RRF
本文介绍了一种显著提升 RAG 检索步骤的方法,称为“上下文检索”,它利用两个子技术:上下文嵌入(Contextual Embeddings)上下文 BM25(Contextual BM25)该方法可将检索未命中率减少 BM25(最佳匹配 25)是一种排名函数,使用词汇匹配来查找精确的单词或短语匹配。对于包含唯一标识符或技术术语的查询,它特别有效。BM25 基于 TF-IDF(词频-逆文档频率)的概念。 BM25 通过考虑文档长度并对词频应用饱和函数来改进这一点,这有助于防止常见词主导结果。以下是 BM25 在语义嵌入失败时的成功之处:假设用户查询“错误代码 TS-999”在技术支持数据库中的信息。 而 BM25 则通过查找这个特定的文本字符串来识别相关文档。 2 引入上下文检索上下文检索通过在嵌入前将块特定的解释性上下文添加到每个块中(“上下文嵌入”)以及创建 BM25 索引(“上下文 BM25”)来解决此问题。让我们回到美国证券交易委员会文件的例子。