For an Information Retrieval course assignment, I built cross-lingual retrieval and reranking pipelines over 3,194,510 documents and placed 4th on the class Kaggle leaderboard. The task required finding relevant passages when queries and documents could be in different languages.
Experiments
I compared ten submitted configurations, starting with BM25 and feature-based LightGBM reranking, then trying multilingual neural rerankers. Hybrid experiments combined BM25 and multilingual-e5 candidates through Reciprocal Rank Fusion. BGE-M3 dense retrieval with a FAISS HNSW index gave a stronger candidate pool than those earlier configurations.
For the highest-scoring pipeline, I fine-tuned BGE-reranker-v2-m3 using hard negatives from dense retrieval, then reranked the top 100 candidates into a top-10 result list.
Quality and runtime
The submitted report records these results. Runtimes refer to the reported test-inference runs, not a controlled serving benchmark.
| Configuration | Validation NDCG@10 | Public leaderboard NDCG@10 | Reported test inference |
|---|---|---|---|
| BGE-M3 dense retrieval, top 10 | 0.4778 | 0.43807 | 35 seconds |
| BGE-M3 top 100 + fine-tuned BGE reranker | 0.6153 | 0.56333 | 13,524 seconds |
Dense-only retrieval offered the faster option. Adding the fine-tuned reranker produced the best reported score, but at a much higher inference cost. The experiments showed how much the initial candidate pool matters: a reranker cannot recover a relevant passage that the retriever never returns.
To work within Kaggle compute and storage limits, I used checkpointed embedding shards, FP16 storage, cached indexes, and reusable Hugging Face artifacts. The 4th-place result refers to the course’s class leaderboard, not a global Kaggle ranking.