| --- |
| language: |
| - en |
| - ms |
| tags: |
| - cross-encoder |
| - reranker |
| - retrieval |
| - rag |
| - malaysian |
| - manglish |
| - multilingual |
| license: mit |
| base_model: BAAI/bge-reranker-v2-m3 |
| --- |
| |
| # Aranda-Reranker-v1 |
|
|
| Cross-encoder reranker specialized for **Malaysian text**, designed to work as Stage 2 after [Aranda-v1](https://huggingface.co/rekabytes/Aranda-v1) dense retrieval. |
|
|
| ## Pipeline |
|
|
| ``` |
| Query → Aranda-v1 (retrieve top-25) → Aranda-Reranker-v1 (rerank) → top-5 results |
| ``` |
|
|
| Aranda-v1 is fast but encodes query and documents separately. Aranda-Reranker-v1 processes query+document **together** with cross-attention, catching subtle mismatches the bi-encoder misses. |
|
|
| ## Evaluation (4,149 queries, BM + Manglish + English + Cross-lingual) |
|
|
| ### Overall Pipeline vs Aranda-v1 Alone |
|
|
| | Metric | Aranda-v1 alone | + Aranda-Reranker-v1 | Improvement | |
| |---|---:|---:|---:| |
| | Recall@1 | 0.8891 | **0.9311** | **+4.2** | |
| | Recall@5 | 0.9961 | 0.9867 | -0.9 | |
| | Recall@10 | 0.9998 | 0.9971 | -0.3 | |
| | MRR | 0.9364 | **0.9563** | **+2.0** | |
|
|
| ### Per-Language Recall@1 |
|
|
| | Language | Aranda-v1 alone | + Aranda-Reranker-v1 | Improvement | |
| |---|---:|---:|---:| |
| | BM | 0.8431 | **0.8874** | **+4.4** | |
| | Cross-lingual | 0.8500 | **0.9833** | **+13.3** | |
| | English | 0.8792 | **0.8940** | **+1.5** | |
| | Manglish | 0.9290 | **0.9656** | **+3.7** | |
|
|
| The reranker improves Recall@1 on **all four languages**, with a dramatic +13.3 point gain on cross-lingual (BM↔English) retrieval. |
|
|
| ## Training |
|
|
| Fine-tuned from `BAAI/bge-reranker-v2-m3` on 30,925 Malaysian hard-negative triplets: |
| - 20K social media (Lowyat, Twitter, Facebook) |
| - 5.6K formal BM QA (mesolitica common-crawl-qa) |
| - 3.5K English + cross-lingual anchors (up-sampled) |
| - 1.8K holdout + negation pairs |
|
|
| Only top 4 of 24 transformer layers were fine-tuned (9.1% of parameters). Contrastive ranking loss. LR=2e-5, bf16. |
|
|
| ## Usage |
|
|
| ```python |
| from sentence_transformers import SentenceTransformer, CrossEncoder |
| |
| # Stage 1: Dense retrieval with Aranda-v1 |
| retriever = SentenceTransformer("rekabytes/Aranda-v1") |
| query_emb = retriever.encode([query], normalize_embeddings=True) |
| doc_embs = retrieaver.encode(documents, normalize_embeddings=True) |
| scores = query_emb @ doc_embs.T |
| top_25 = scores.argsort()[0][-25:][::-1] |
| |
| # Stage 2: Rerank with Aranda-Reranker-v1 |
| reranker = CrossEncoder("rekabytes/Aranda-Reranker-v1") |
| candidates = [documents[i] for i in top_25] |
| pairs = [[query, doc] for doc in candidates] |
| rerank_scores = reranker.predict(pairs) |
| final_order = rerank_scores.argsort()[::-1] |
| top_5 = [candidates[i] for i in final_order[:5]] |
| ``` |
|
|
| ## Model Details |
|
|
| - **Architecture:** XLM-RoBERTa (24 layers, 1024 hidden) with sequence classification head |
| - **Base model:** BAAI/bge-reranker-v2-m3 |
| - **Max sequence length:** 512 tokens (query + document) |
| - **Input:** `[CLS] query [SEP] document [SEP]` |
| - **Output:** Single relevance score (higher = more relevant) |
| - **Latency:** ~2ms per (query, document) pair on GPU |
|
|