IR_Assignment/
├── README.md ← 本文件
├── data/
│ ├── msmarco/ ← MS MARCO 语料(6980查询,880万文档)
│ └── beir/ ← BEIR 数据集
│ ├── trec-covid/ ← 医学文献(50查询,17万文档)
│ ├── nfcorpus/ ← 营养学(323查询,3633文档)
│ └── quora/ ← 问题重复检测(1万查询,52万文档)
├── src/models/
│ ├── bm25/single.py ← BM25 单线程搜索
│ ├── bm25/threaded.py ← BM25 多线程搜索(16线程)
│ ├── bge.py ← BGE Bi-encoder 稠密检索
│ ├── colbert.py ← ColBERT(Pyserini 版)
│ └── colbert_mac.py ← ColBERT 重排序(Mac MPS 优化版)
├── results/
│ ├── msmarco/bm25/eval.txt ← MS MARCO BM25 评估
│ └── beir/
│ ├── trec-covid/ ← TREC-COVID 三模型结果
│ ├── nfcorpus/ ← nfcorpus 三模型结果
│ └── quora/ ← quora 三模型结果
├── run_msmarco.py ← MS MARCO 实验入口
└── run_beir.py ← BEIR 实验入口
全部数据集 × 三模型对比(MAP / NDCG@10)
| 数据集 | 文档数 | 查询数 | BM25 | BGE | ColBERT | SPLADE-v3 |
|:-----|:-----:|:-----:|:----:|:---:|:-------:|
| MS MARCO | 880万 | 6980 | 0.1926 / 0.2630 | 0.3257 / 0.4264 / 47min | ❌ 无索引 | 0.0568 / 0.0734 / 41s |
| TREC-COVID | 17万 | 50 | 0.1871 / 0.6695 | 0.2581 / 0.8461 | 0.0803 / 0.7601 | 0.1633 / 0.1264 |
| nfcorpus | 3633 | 323 | 0.1577 / 0.3382 | 0.1998 / 0.3757 | 0.1185 / 0.2705 | 0.4152 / 0.1772 |
| quora | 52万 | 10000 | 0.7470 / 0.8173 | 0.8568 / 0.9093 | 0.7113 / 0.7939 | 0.7778 / 0.3186 |
模型
MAP
NDCG@10
环境
耗时
BM25
0.1871
0.6695
CPU
2.5s
BGE
0.2581
0.8461
GPU (RTX 5070 Ti)
1.3s
ColBERT 初始版
0.0678
0.5477
CPU
232s
ColBERT 优化版
0.0803
0.7601
MPS (Mac M5)
28s
SPLADE-v3
0.1633
0.1264
CPU
1s
模型
MAP
NDCG@10
环境
耗时
BM25
0.1577
0.3382
CPU
15s
BGE
0.1998
0.3757
CPU
10.5s
ColBERT
0.1185
0.2705
MPS (Mac M5)
22s
SPLADE-v3
0.4152
0.1772
CPU
1s
模型
MAP
NDCG@10
环境
耗时
BM25
0.7470
0.8173
CPU(16线程)
65s
BGE
0.8568
0.9093
GPU (RTX 5070 Ti)
944s
ColBERT
0.7113
0.7939
MPS (Mac M5)
712s
SPLADE-v3
0.7778
0.3186
CPU
106s
基于 TF-IDF 的关键词匹配,稳定可靠
多线程加速有效 :MS MARCO 6980查询从 225s 降至 50s(4.5倍)
在关键词特征明显的任务(quora 重复问题检测)表现优异(MAP=0.747)
使用 BGE-base-en-v1.5 模型,将 query/doc 编码为 768 维向量
统一最优 :在所有三个数据集上 MAP 和 NDCG@10 均为最高
语义理解能力强,尤其适合需要深层语义匹配的场景
结合了 BM25 的稀疏向量形式和 BGE 的深度学习权重
MAP 极高 :nfcorpus 上 MAP=0.4152,是 BM25 的 2.6 倍
但 NDCG@10 偏低 :说明找到了更多相关文档,但前 10 的排序不够精确
速度最快 :1 秒跑完 323 查询(索引仅 1.8 MB)
本质上是高召回、低精度排序 的模型,与稠密模型互补
4. 后期交互(ColBERT / tct_colbert-v2)
使用 tct_colbert-v2(BERT-base 架构),对 BM25 top-100 结果重排序
优化过程 :mean pooling + L2 归一化 + MPS float16 混合精度 + 批量预编码
初始版 NDCG@10=0.5477 → 优化版 0.7601 (+39%)
领域迁移问题 :MS MARCO 训练的模型在医学/营养学领域效果下降
模型
显存需求
推理速度
适用场景
BM25
极低
最快
关键词搜索
BGE
中等(~2GB)
快(GPU)
语义搜索
ColBERT
高(~12GB+)
中等
精确重排序
MS MARCO BGE 索引 25GB → Windows 32GB 和 Mac 24GB 均无法完整加载
Mac M5 24GB 统一内存通过 mmap 可加载索引,但搜索速度不理想
ColBERT 重排序策略 + MPS 加速 在 Mac 上实现了最佳性能平衡
L2 归一化 :ColBERT 的 NDCG@10 从 0.55 → 0.76
混合精度 (float16) :MPS 编码速度提升 3 倍
批量预编码 :所有文档一次编码,重排序仅需 1 秒
GPU 加速 :BGE 用 5070 Ti 编码查询,比 CPU 快 10 倍
多线程搜索 :BM25 16 线程比单线程快 4.5 倍
设备
配置
用途
Windows
Ryzen 9950X, 32GB RAM, RTX 5070 Ti 12GB
BM25、BGE 主力
Mac M5
Apple Silicon M5, 24GB 统一内存
ColBERT MPS 重排序