Token导航 LogoToken导航

MCP Server · 开发工具

BM25 Turbo Rust Python WASM CLI

BM25 Turbo是一个高性能的BM25评分引擎,专为快速检索和信息检索任务设计,支持多种编程语言和平台。

stdio官方级别未说明来源级核验工具 2
PythonClaude命令行工具

快速开始

作者 / 组织
alessandrobenigni
提供方
alessandrobenigni

工具数量

2

来源目录标注

资源数量

0

来源目录标注

提示词数量

0

来源目录标注

GitHub Star

44

仓库热度

收录来源

1 个

MCP World

选型结论

BM25 Turbo Rust Python WASM CLI 属于开发工具类 MCP Server,公开资料标注 2 个工具,通过stdio 本地进程接入,适配 Claude,有可以直接复制的安装命令;接入前先确认权限范围。

分类

开发工具

传输方式

stdio

认证方式

无需认证

部署方式

公开资料未说明

安装与配置

安装命令

pip install bm25-turbo

公开命令不是通用的启动方式,拼不出可靠配置示例;请在客户端 MCP 配置里按官方文档填写 command 和 args。

上手步骤

  1. 1

    准备运行环境

    stdio 服务在本地起进程,需要先装好 对应的运行时,再按安装命令拉取依赖。

  2. 2

    安装服务

    复制下面的安装命令执行;命令里带占位符的位置换成自己的密钥或路径。

  3. 3

    写入客户端配置

    在客户端的 MCP 配置里填启动命令和参数,保存后完全退出客户端再打开,让新配置生效。

  4. 4

    验证是否可用

    连接成功后客户端会列出 2 个工具,随便调一个只读工具确认能返回结果。

接入前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

详细介绍

BM25 Turbo ⚡

Rust · Python · WASM · CLI

The fastest BM25 scoring engine. Period.

______________________________________________________________________

28217次查询/秒 880万份文件。 8.6ms P50延迟预计算稀疏BM25,具有BMW修剪、内存映射持久性和零拷贝索引加载。专为RAG管道、搜索应用程序和ML工作流而构建。

use bm25_turbo::{BM25Builder, Method};

let index = BM25Builder::new()
    .method(Method::Lucene)       // Robertson, Lucene, ATIRE, BM25L, BM25+
    .k1(1.5).b(0.75)
    .build_from_corpus(&[
        "Rust is a systems programming language",
        "BM25 is a ranking function used in information retrieval",
        "Machine learning models benefit from fast retrieval",
    ])?;

let results = index.search("information retrieval", 10)?;
for (id, score) in results.doc_ids.iter().zip(results.scores.iter()) {
    println!("doc {} → {:.4}", id, score);
}

为什么选择BM25 Turbo?

大多数BM25库在查询时计算分数——在每次请求时扫描倒排索引。BM25 Turbo采取了相反的方法: 在索引时间预先计算每个BM25分数 查询变成稀疏向量查找,在服务时没有数学运算。

这使得BM25 Turbo在以下情况下成为正确的选择:

  • 你 多次查询同一索引 (RAG、重新排名、批量评估)
  • 你需要 确定性、可重复性得分 (ML管道、实验)
  • 你想要的 最简单的API (3行用于索引,1行用于查询)
  • 你正在建造一个 搜索功能 并且不需要完整的搜索服务器

演出

在标准信息检索基准MS MARCO(8841823个文档,509962个查询)上进行了基准测试。启用了BMW修剪。单螺纹。

查询吞吐量

查询延迟

跨语料库大小缩放

语料库文档P50延迟QPSnDCG@10
科学事实518367μs682,1270.665
财务报告57638711μs50,8120.254
马可女士88418238.6毫秒28,217—
10万个文档下的语料库为亚毫秒级。在数百万个文档语料库上,BMW修剪使延迟与倒排索引引擎保持竞争力,同时保持了批处理工作负载的预先计算的评分优势。

交易

BM25涡轮前部载荷计算: 索引一次,查询数百万次索引速度较慢,因为每个BM25分数都是预先计算并压缩到CSC矩阵中的。但每个后续查询都是稀疏向量查找——在服务时间没有数学运算。

特性

5个BM25评分变体

变体公式最适合
罗伯逊经典BM25(霍加皮)学术基准
LuceneApache Lucene的变体生产搜索(默认)
ATIREIDF没有+1平滑研究比较
BM25L长文档校正具有不同文档长度的语料库
BM25+下限项频率惩罚不匹配项

所有变体都支持可调 k1, b,以及 delta 参数。

宝马(Block Max WAND)修剪

在top-k检索过程中跳过非竞争性文档。对于百万文档语料库至关重要:

let mut index = BM25Builder::new()
    .build_from_corpus(&corpus)?;

// Build block-max index (one-time cost)
index.build_bmw_index()?;

// Queries now skip non-competitive blocks automatically
let results = index.search_approximate("distributed systems", 10)?;

BMW将得分矩阵划分为块,并保持每个块的上限。在查询评估过程中,当整个块的最大可能贡献不能超过当前的第k个最佳分数时,整个块都会被跳过。这将接触的文档数量从数百万减少到数千。

内存映射持久性

将索引保存到磁盘,并使用零拷贝内存映射立即重新加载:

use bm25_turbo::persistence;
use std::path::Path;

// Save (serializes CSC matrix + vocabulary + parameters)
persistence::save(&index, Path::new("my_index.bm25"))?;

// Standard load (deserialize into RAM)
let index = persistence::load(Path::new("my_index.bm25"))?;

// Memory-mapped load (instant, zero-copy, ideal for huge indexes)
let mmap_index = persistence::load_mmap(Path::new("my_index.bm25"))?;

加载内存映射索引 微秒 无论大小。操作系统按需分页数据——10GB索引立即开始为查询提供服务,而无需等待读取完整文件。

流式索引器

通过以可配置块处理文档来索引大于可用内存的语料库:

use bm25_turbo::{StreamingBuilder, Method};

let mut builder = StreamingBuilder::new()
    .chunk_size(100_000)          // Process 100K docs at a time
    .method(Method::Lucene);
builder.add_documents(&["doc one", "doc two", "doc three"]);
let index = builder.build()?;

峰值内存: O(chunk_size × avg_tokens) 而不是 O(total_corpus).

预写日志(WAL)

在不重建整个索引的情况下添加和删除文档:

use bm25_turbo::wal::WriteAheadLog;

let mut wal = WriteAheadLog::new();

// Incremental updates
index.add_documents(&mut wal, &["new document about Rust"])?;
wal.delete_documents(&[42, 87])?;

// Compact when the WAL grows large
index.compact(&mut wal)?;

内置令牌生成器

17种语言词干分析器,可配置停用词删除:

use bm25_turbo::Tokenizer;
use rust_stemmers::Algorithm;

let tokenizer = Tokenizer::builder()
    .stemmer(Algorithm::English)
    .stopwords(vec!["the".into(), "a".into(), "an".into(), "is".into()])
    .build()?;

let tokens = tokenizer.tokenize("Running distributed systems at scale");
// → ["run", "distribut", "system", "scale"]

支持的语言:阿拉伯语、丹麦语、荷兰语、英语、芬兰语、法语、德语、匈牙利语、意大利语、挪威语、葡萄牙语、罗马尼亚语、俄语、西班牙语、瑞典语、泰米尔语、土耳其语。

分布式搜索(gRPC)

在多个节点上分割大型索引,并将其作为一个节点进行查询:

use bm25_turbo::distributed::{QueryCoordinator, ShardEndpoint};

// Define shard endpoints (one per machine/core)
let shards = vec![
    ShardEndpoint { endpoint: "http://[::1]:50051".into(), shard_id: 0, doc_id_offset: 0 },
    ShardEndpoint { endpoint: "http://[::1]:50052".into(), shard_id: 1, doc_id_offset: 500_000 },
];

// Coordinator fans out queries and merges results
let coordinator = QueryCoordinator::connect(shards).await?;
let results = coordinator.query("distributed query", 10).await?;

接口

命令行界面

# Index a corpus
bm25-turbo index --input corpus.jsonl --output index.bm25 --field text

# Search
bm25-turbo search --index index.bm25 --query "information retrieval" -k 10

# Start HTTP server
bm25-turbo serve --index index.bm25 --port 8080

# Push/pull from HuggingFace Hub
bm25-turbo push --index index.bm25 --repo username/my-index
bm25-turbo pull --repo username/my-index --output index.bm25

支持CSV、JSONL、JSON数组和纯文本(每行一个文档)。如果可能,自动检测格式。

HTTP服务器

$ bm25-turbo serve --index index.bm25 --port 8080
# Search
curl -X POST http://localhost:8080/search \
  -H "Content-Type: application/json" \
  -d '{"query": "machine learning", "k": 10}'

# Health check
curl http://localhost:8080/health

# Index statistics
curl http://localhost:8080/stats

MCP服务器(AI代理集成)

通过以下方式将BM25搜索作为AI代理的工具 模型上下文协议:

bm25-turbo mcp --index index.bm25 --port 8080

MCP服务器公开了两个工具:

  • bm25_search --使用可配置的top-k查询索引
  • bm25_index_stats --获取索引元数据(文档计数、词汇大小)

适用于Claude、ChatGPT和任何兼容MCP的代理框架。

Python绑定

from bm25_turbo_python import BM25

# Build an index
engine = BM25(method="lucene", k1=1.5, b=0.75)
engine.index(["Rust is fast", "Python is flexible", "BM25 ranks documents"])

# Search — returns (doc_ids, scores) tuple
doc_ids, scores = engine.search("fast programming", k=5)
for doc_id, score in zip(doc_ids, scores):
    print(f"  doc {doc_id}: {score:.4f}")

# Save / load
engine.save("my_index.bm25")
engine = BM25.load("my_index.bm25")

Wasm(浏览器/边缘)

import init, { WasmBM25 } from 'bm25-turbo-wasm';

await init();

const index = new WasmBM25(
    ["JavaScript runs everywhere",
     "WebAssembly enables near-native performance",
     "BM25 is a proven ranking algorithm"],
    "lucene",  // method (optional)
    1.5,       // k1 (optional)
    0.75       // b (optional)
);

const results = index.search("native performance", 5);
console.log(results); // [{doc_id: 1, score: 0.82}, ...]

捆绑包大小:约1.3 MB(gzip压缩:约500 KB)。无需服务器,完全在浏览器中运行。

拥抱脸中心

在上共享和发现BM25索引 拥抱脸中心:

# Push your index
bm25-turbo push --index msmarco.bm25 --repo username/msmarco-bm25-turbo

# Pull someone else's index
bm25-turbo pull --repo username/msmarco-bm25-turbo --output msmarco.bm25

通用数据集(MS MARCO、NQ、SciFact、FiQA)的预构建索引可以在团队之间共享,而无需重新索引。

安装

锈

[dependencies]
bm25-turbo = "0.1"

命令行界面

cargo install bm25-turbo-cli

python

pip install bm25-turbo

需要Python 3.9-3.13。为Linux(x86_64,aarch64)、macOS(x86\_ 64,aarch 64)和Windows(x86_14)预构建的轮子。

WASM/npm

npm install bm25-turbo-wasm

建筑

┌─────────────────────────────────────────────────────────┐
│                      BM25 Turbo                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌────────┐ │
│  │ Tokenizer│  │  Scoring  │  │   CSC    │  │  BMW   │ │
│  │ 17 langs │  │ 5 variants│  │  Matrix  │  │ Pruning│ │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘  └───┬────┘ │
│       │              │             │             │      │
│  ┌────┴──────────────┴─────────────┴─────────────┴────┐ │
│  │              Index Builder / Streaming              │ │
│  └────────────────────┬───────────────────────────────┘ │
│                       │                                  │
│  ┌────────────────────┴───────────────────────────────┐ │
│  │               Persistence Layer                     │ │
│  │        Binary · Memory-Mapped · WAL · Hub           │ │
│  └─────────────────────────────────────────────────────┘ │
│                                                         │
├──────────┬──────────┬──────────┬──────────┬────────────┤
│   CLI    │  HTTP    │   MCP    │  Python  │    WASM    │
│          │  Server  │  Server  │ Bindings │   (npm)    │
└──────────┴──────────┴──────────┴──────────┴────────────┘

运作原理

  1. 分词 --通过可配置的停用词删除将文档拆分为带词干的标记
  2. 得分 --使用所选变量计算每个(学期、文档)对的BM25分数
  3. 压缩 --将分数存储在压缩稀疏列(CSC)矩阵中(仅限非零条目)
  4. 服务 --查询是稀疏向量点积:查找查询项的列,累积分数,返回top-k

CSC格式仅存储非零的BM25分数。对于一个包含880万个文档和50万个词汇的语料库,这通常压缩到2-4GB,远小于密集矩阵(约17TB)。

配置

BM25参数

参数默认值范围效果
k11.50.0-3.0项频率饱和。更高=重复项的权重更大
b0.750.0-1.0长度归一化。0=无归一化,1=完全归一化
delta0.50.0-infBM25L/BM25+下限(仅与这些变体一起使用)

选择变量

  • 从Lucene开始 --这是使用和测试最广泛的变体
  • 使用Robertson 如果你需要与学术论文进行精确比较
  • 使用BM25L 如果你的语料库有极端的文档长度变化
  • 使用BM25+ 如果短查询返回太多不相关的结果
  • 使用 ATIRE 如果您正在复制ATIRE的研究结果

基准测试

复制我们的数字

# Clone and build
git clone https://github.com/TheSauceSuite/BM25-Turbo-Rust-Python-WASM-CLI-
cd bm25-turbo
cargo build --release -p bm25-turbo-bench

# Run on SciFact (quick, 5K docs)
cargo run -p bm25-turbo-bench --release --bin beir_bench -- --datasets scifact

# Run on MS MARCO (full, 8.8M docs — requires ~16GB RAM)
cargo run -p bm25-turbo-bench --release --bin beir_bench -- --datasets msmarco --max-queries 1000

数据集会自动从以下位置下载 BEIR基准套件。首次运行可能需要几分钟才能下载。

BEIR基准结果

数据集文档Vocab索引时间QPSP50延迟nDCG@10
科学事实518319927223毫秒68212767μs0.665
光纤质量保证57638678931.8秒50812711μs0.254
马科女士8841823~500K66分钟282178.6毫秒--
MS MARCO nDCG在开发集上进行了测量(6980次查询)。在1000个查询的随机样本上测量的QPS和延迟。所有基准测试在消费者桌面上都是单线程的。

用例

RAG(检索增强生成)

BM25 Turbo是RAG管道中理想的回收阶段。对知识库进行一次索引,然后为每个LLM查询检索相关上下文:

let results = index.search(&user_question, 5)?;
let context = results.doc_ids.iter()
    .map(|id| documents[*id as usize].as_str())
    .collect::>()
    .join("\n\n");
// Feed context to your LLM

混合搜索(BM25+嵌入)

将BM25词汇评分与密集嵌入相似性相结合,实现两全其美的检索:

// BM25 lexical retrieval
let bm25_results = index.search(query, 100)?;

// Dense retrieval (from your embedding model)
let dense_results = embedding_index.search(query_embedding, 100)?;

// Reciprocal Rank Fusion
let fused = rrf_merge(&bm25_results, &dense_results, k=60);

批量评估

针对机器学习实验的语料库,对数十万个查询进行评分:

for query in &evaluation_queries {
    let results = index.search(query, 10)?;
    // Compute nDCG, MAP, recall...
}
// At 28K QPS, 500K queries finish in ~18 seconds

与其他工具的比较

BM25 Turbo不是全文搜索引擎。 这是一个专注的BM25评分库。如果你需要短语查询、分面搜索或查询DSL,请使用Tantivy或Elasticsearch。如果您需要最快的BM25分数和最简单的API,或者您正在从BM25迁移,需要2000倍以上的速度,请使用BM25 Turbo。

贡献

欢迎投稿!请看 贡献.md 作为指导方针。

# Run tests
cargo test --workspace --exclude bm25-turbo-wasm

# Run clippy
cargo clippy --workspace --exclude bm25-turbo-wasm -- -D warnings

# Build WASM
cd bm25-turbo-wasm && wasm-pack build --target web

许可证

BM25 Turbo具有双重许可:

开源——AGPL v3

该软件根据 GNU Affero通用公共许可证v3.0。您可以根据AGPL的条款自由使用、修改和分发此软件。如果将修改后的版本部署为网络服务,则必须在AGPL下向该服务的用户提供修改后版本的完整源代码。

商业许可证

对于无法遵守AGPL的公司和个人(例如,您想在专有软件中使用BM25 Turbo而不开源您的代码),可以使用商业许可证。

购买商业许可证→

商业许可证取消了所有AGPL copyleft义务,包括:

  • 在专有/闭源应用程序中使用
  • 无需披露您的源代码
  • 优先支持
  • 定制集成协助

有关许可证查询: alessandrobenigni.com

工具与能力

工具数量

2

资源数量

0

提示词数量

0

能力标签

BM25评分Rust本地部署信息检索高性能计算PythonWASMCLI

支持客户端

Claude

数量来自来源目录的标注,具体工具清单以官方文档为准。

典型使用场景

让助手直接读代码

把仓库、提交记录和 issue 交给模型检索,补全和重构时不用来回复制文件。

在对话里跑命令

触发构建、测试和脚本,执行结果直接回到上下文,省去切终端。

接进开发流程

把 PR、CI 状态和代码审查接进助手,减少在几个工具之间跳。

选择建议

值得选的地方

  • 只提供 2 个工具,职责集中,接入后不容易误操作。
  • 有现成的安装命令,不用自己找入口,照着跑就能起服务。
  • 公开说明写得比较完整,接入前能看清能力边界。

先想清楚的地方

  • stdio 方式要求本地装好 运行环境,换机器要重新装一遍。
  • 公开摘要偏短,具体能力和限制要回到仓库确认。
  • 第三方目录整理,版本更新和行为细节以官方仓库为准。

更适合

  • 需要在开发工具场景里让模型直接调用外部能力的人。
  • 已经在用 Claude 的用户,接入路径最短。
  • 想先快速试一下、能接受在本地跑服务的人。

不太适合

  • 完全不想在本地装环境的人。
  • 需要厂商级 SLA 和技术支持的生产环境。

同类对比

5 个同类
MCP Server工具数传输方式安装命令收录来源最后核验
BM25 Turbo Rust Python WASM CLI

MCP World · 本页

2stdio有1 个2026-05-17
Git 838e2ec1

MCP World

12stdio有2 个2026-05-17
Markitdown MCP 2c653a5f

MCP World

1stdio有1 个2026-05-17
Context7 MCP C671e75a

MCP World

0stdio有1 个2026-05-17
Context7 831acf40

MCP World

0stdio有1 个2026-05-17

按同分类和工具数量挑出最接近的几条,字段以各自详情页为准。

常见问题

5 条

BM25 Turbo Rust Python WASM CLI 怎么安装?

公开资料给出的安装命令是 pip install bm25-turbo,运行环境为 未标注。装完后按客户端要求写进 MCP 配置,重启客户端生效。

BM25 Turbo Rust Python WASM CLI 怎么在 Claude Desktop、Cursor 里配置?

它是stdio 本地进程,客户端配置里要写启动命令和参数,运行环境是 未标注;保存后完全退出客户端再打开,配置才会生效。

BM25 Turbo Rust Python WASM CLI 收费吗?

本站只整理公开资料,不代收费用,也没有标注具体价格。是否收费取决于服务本身和背后的接口额度,正式使用前按官方说明确认。

BM25 Turbo Rust Python WASM CLI 需要 API Key 吗?

公开资料标注为无需认证,装好就能连;如果实际调用时报鉴权错误,按官方文档补上凭据。

BM25 Turbo Rust Python WASM CLI 支持哪些客户端?

公开资料标注支持 Claude;其他客户端只要能配置 MCP Server,也能用同样的命令或地址接入。

来源信息

继续浏览同类 MCP