
bm25s 快速上手从零到 500 QPS 的 Python BM25 词法检索【免费下载链接】bm25sFast BM25 search in Python, powered by Numpy and Numba项目地址: https://gitcode.com/gh_mirrors/bm/bm25sbm25s 是一个纯 Python 实现的 BM25 检索引擎用 Numpy 和稀疏矩阵预计算每个文档词的得分查询时只做矩阵累加。官方在 15 个 BEIR 公开数据集上测出的单线程 QPS 全部排名第一Elasticsearch、PyTorch 实现和 rank-bm25 都慢它一到两个数量级而整个依赖装完不到 200MB。 写检索服务时最常撞的三堵墙rank-bm25 太慢它是纯 Python 逐词累加2M 文档的数据集上 QPS 只有 0.1 左右跑一轮批量评估要等半天Elasticsearch 太重装一套 Java 环境加 JVM虚拟环境直接 1.2GB为几路召回引入这么重的依赖不值得语料一多就 OOM整库索引塞进内存MS MARCO 级别800 万文档直接把 10GB 内存吃光bm25s 的思路是把每次查询现算换成索引期一次性算好把 TF×IDF 分数提前写进稀疏矩阵查询时只需把查询词的列向量相加再取 top-k这就是它快的根本原因。 六行代码跑通第一次检索先装再跑安装细节在后面一节最小可运行示例import bm25s corpus [ a cat is a feline and likes to purr, a dog is the humans best friend and loves to play, a bird is a beautiful animal that can fly, a fish is a creature that lives in water and swims, ] corpus_tokens bm25s.tokenize(corpus, stopwordsen) retriever bm25s.BM25(corpuscorpus) # corpus 参数让返回原文而非文档 id retriever.index(corpus_tokens) results, scores retriever.retrieve( bm25s.tokenize(does the fish purr like a cat?), k2 )想加词干化purr/purrs 归一就pip install PyStemmer然后stemmer Stemmer.Stemmer(english)把stemmer传进每次bm25s.tokenize调用。索引建完可以落盘下次直接加载不用重新建retriever.save(animal_index_bm25, corpuscorpus) # 索引 语料一起存 reloaded bm25s.BM25.load(animal_index_bm25, load_corpusTrue)如果嫌 API 步骤多高层接口三行搞定load直接读 CSV/TXT/JSON/JSONL 文件import bm25s.high_level as bm25 corpus bm25.load(documents.csv, document_columntext) retriever bm25.index(corpus) results retriever.search([how to learn python], k5) bm25s 比 rank-bm25 和 Elasticsearch 快多少官方基准单线程 Intel Xeon 2.70GHzKaggle 环境10 次取平均OOM表示跑爆内存数据集bm25sElasticsearchbm25_ptrank-bm25arguana573.9113.67110.512.00climate-fever13.094.02OOM0.03cqadupstack170.9113.38OOM0.77dbpedia-entity13.4410.68OOM0.11fever20.197.45OOM0.06fiqa507.0316.9620.524.46hotpotqa20.887.11OOM0.04msmarco12.2011.88OOM0.07nfcorpus1196.1645.84256.67224.66nq41.8512.16OOM0.10quora183.5321.806.491.18scidocs767.0517.9341.349.01scifact952.9220.81184.3047.60trec-covid85.647.343.731.48webis-touche202060.5913.53OOM1.10单位 QPS每秒查询数。对比图里纵轴是相对 rank-bm25 的加速倍数磁盘占用也是同一量级优势完整虚拟环境大小方案占用bm25s基础51MBbm25s[core]含 numba 等188MBrank-bm2551MBelasticsearch1183MBbm25_pt5346MBpyserini6976MB 安装三条 pip 命令搞定pip install bm25s # 最小安装只依赖 numpy pip install bm25s[core] # 推荐orjson tqdm PyStemmer numba pip install bm25s[full] # 全量可选依赖hf、mcp、cli 等核心依赖只有 numpyPython 3.8。想从源码装也可以git clone https://gitcode.com/gh_mirrors/bm/bm25s cd bm25s pip install -e .[core]extras 对照见 setup.pystemPyStemmer、hfhuggingface_hub、mcp、clirich 交互选择器、indexingscipy、selectionjax。⚙️ k1、b、backend 三个参数怎么调BM25构造函数默认值见 bm25s/ 里的 docstring参数默认值管什么 / 怎么调k11.5词频饱和速度IR 文献推荐 1.2~2.0语料偏短可往上加b0.75文档长度归一化强度长短文档差异大时保持 0.75delta0.5仅methodbm25l/bm25生效methodlucene打分变体可选robertson/atire/bm25l/bm25默认与 Lucene 完全一致backendnumpy检索后端numba开 JIT大语料约 2 倍加速auto有 numba 用 numbacsc_backendnumpy稀疏矩阵构建用 numpy 还是 scipy开 numba 后端后两者差异可忽略auto_compileTruenumba 后端下初始化时预编译 JIT 函数首次慢、后续快换打分变体只改一个参数retriever bm25s.BM25(methodbm25, delta1.5) 大语料建索的三条路CLI、高层 API、mmap命令行不想写 Python 时一条命令把 CSV/TXT/JSON/JSONL 建成索引再一条命令查bm25 index documents.csv -o my_index -c text bm25 search -i my_index what is machine learning? -k 20 -s results.json加-u可把索引存进~/.bm25s/indices/统一管理bm25 search -u your query不带索引名时弹出交互式选择器需bm25s[cli]。高层 APIbm25s.high_level封装了分词、词干、建索引全流程默认自动用 numba 后端适合快速验证数据集。mmap 加载索引太大不想全进内存时用内存映射按页读取retriever bm25s.BM25.load(bm25s_very_big_index, mmapTrue)官方在 NQ200 万 文档、1 亿 token上的实测方式加载索引 (s)检索 (s)建索后 RAM (GB)检索时 RAM (GB)全内存8.6121.094.364.45mmap0.5320.220.492.16mmap 分批重载0.4820.960.490.70检索耗时几乎不变内存占用降到原来的 1/6。完整的 200 万文档建索与检索流程可参考 examples/ 下的index_nq.py和retrieve_nq.py。 三个高频问题的排查路径现象ImportError: Numba is not installed。原因显式设了backendnumba但环境里没有 numbaauto不会抛这个错会静默回退 numpy。解法pip install numba或直接pip install bm25s[core]不想装就改回backendnumpy。现象scipy is not installed。原因指定了csc_backendscipy但没装 scipy。解法pip install scipy或改回默认的csc_backendnumpy。现象首次查询/初始化明显卡几秒到十几秒。原因numba JIT 在首次编译函数属正常行为后续查询恢复正常速度。解法保持默认auto_compileTrue让它在建索引时一次性编完批量跑任务可先空查询预热。 跑通之后变体、MCP 与合规说明检索质量调优换methodbm25l/bm25对短查询文档更友好、自定义stopwords、给Tokenizer传splitter正则测试集在 tests/ 里可直接对照回归接给 LLM 当工具bm25s[mcp]自带 MCP serverbm25 mcp launch --port 8000 --index-dir ./your_index一行起服务暴露retrieve/get_info两个工具合规项目采用 MIT 许可证商用无障碍注意bm25s.high_level目前词干化只支持英语非英语会抛NotImplementedError多语种语料用bm25s.tokenize时换对应语言的 stopwords 或关闭词干化即可建好第一个索引之后下一步自然是拿自己的评估集跑一遍 Recallkutils/beir.py内置了 BEIR 评测函数确认排序质量达标再接进 RAG 管道或业务 API。【免费下载链接】bm25sFast BM25 search in Python, powered by Numpy and Numba项目地址: https://gitcode.com/gh_mirrors/bm/bm25s创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考