Aranda-Reranker-v1

Cross-encoder reranker specialized for Malaysian text, designed to work as Stage 2 after 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

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
Downloads last month
14
Safetensors
Model size
0.6B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for rekabytes/Aranda-Reranker-v1

Finetuned
(93)
this model