Instructions to use rekabytes/Aranda-v1 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- sentence-transformers
How to use rekabytes/Aranda-v1 with sentence-transformers:
from sentence_transformers import SentenceTransformer model = SentenceTransformer("rekabytes/Aranda-v1") sentences = [ "The weather is lovely today.", "It's so sunny outside!", "He drove to the stadium." ] embeddings = model.encode(sentences) similarities = model.similarity(embeddings, embeddings) print(similarities.shape) # [3, 3] - Notebooks
- Google Colab
- Kaggle
Aranda-v1
Aranda-v1 is a sentence embedding model specialized for Malaysian text retrieval, including Bahasa Malaysia, Manglish (Malaysian English code-switching), and cross-lingual BM↔English matching. It outperforms all tested baselines on overall retrieval Recall@1, Recall@5, Recall@10, and MRR, and is the best model on every individual language category (BM, Manglish, English, Cross-lingual).
Training
Two-phase contrastive curriculum:
Phase 1 — Breadth: MultipleNegativesRankingLoss on 1M Malaysian positive pairs (paraphrases, social media, news, QA). LR=1e-5, 1000 steps.
Phase 2 — Discrimination: Fine-tuned on 58K diverse hard-negative triplets (Lowyat, Twitter, Facebook, formal BM QA, English anchors, cross-lingual pairs) with explicit mined hard negatives. LR=2e-6, 2000 steps.
Base model: paraphrase-multilingual-mpnet-base-v2
Evaluation
Tested on 4,149 retrieval queries (BM, Manglish, English, Cross-lingual) with ~25 candidates per query, plus 4 additional eval sets (heuristic similarity, mined holdout, Mesolitica reranker, English STS).
Overall Retrieval (4,149 queries)
| Model | Recall@1 | Recall@5 | Recall@10 | MRR | Precision@10 |
|---|---|---|---|---|---|
| mpnet-base | 0.8631 | 0.9937 | 0.9973 | 0.9200 | 0.1785 |
| multilingual-e5-base | 0.8470 | 0.9940 | 0.9988 | 0.9091 | 0.1792 |
| labse | 0.8009 | 0.9882 | 0.9986 | 0.8821 | 0.1780 |
| distilbert-multilingual-quora | 0.7973 | 0.9636 | 0.9858 | 0.8719 | 0.1728 |
| Aranda-v1 | 0.8891 | 0.9961 | 0.9998 | 0.9364 | 0.1788 |
Per-Language Recall@1
| Model | BM | Manglish | English | Cross-lingual |
|---|---|---|---|---|
| mpnet-base | 0.8200 | 0.8988 | 0.8577 | 0.8267 |
| multilingual-e5-base | 0.7938 | 0.9104 | 0.8658 | 0.6167 |
| labse | 0.7354 | 0.8993 | 0.6872 | 0.7300 |
| distilbert-multilingual-quora | 0.7584 | 0.8320 | 0.7866 | 0.7633 |
| Aranda-v1 | 0.8431 | 0.9290 | 0.8792 | 0.8500 |
Heuristic Similarity 2K (per-language Spearman)
| Model | Overall | BM | Manglish |
|---|---|---|---|
| mpnet-base | 0.4799 | 0.5535 | 0.3937 |
| multilingual-e5-base | 0.3582 | 0.2714 | 0.4680 |
| labse | 0.3249 | 0.2866 | 0.4397 |
| distilbert-multilingual-quora | 0.4585 | 0.4857 | 0.4682 |
| Aranda-v1 | 0.4532 | 0.4915 | 0.4536 |
Mined Holdout 2K (positive vs negative margins)
| Model | pos>neg % | mean margin | mean pos sim | mean neg sim |
|---|---|---|---|---|
| mpnet-base | 98.1% | 0.4880 | 0.6576 | 0.1696 |
| multilingual-e5-base | 98.15% | 0.1129 | 0.8805 | 0.7676 |
| labse | 98.3% | 0.4193 | 0.5960 | 0.1768 |
| distilbert-multilingual-quora | 94.6% | 0.1041 | 0.9336 | 0.8295 |
| Aranda-v1 | 98.2% | 0.4318 | 0.7334 | 0.3016 |
Mesolitica Reranker Test (NDCG@10)
| Model | Overall NDCG@10 |
|---|---|
| mpnet-base | 0.4699 |
| multilingual-e5-base | 0.4705 |
| labse | 0.4695 |
| distilbert-multilingual-quora | 0.4690 |
| Aranda-v1 | 0.4706 |
English STS (mteb/stsbenchmark-sts)
| Model | Spearman |
|---|---|
| mpnet-base | 0.8682 |
| multilingual-e5-base | 0.8420 |
| labse | 0.7225 |
| distilbert-multilingual-quora | 0.7866 |
| Aranda-v1 | 0.8369 |
Usage
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("rekabytes/Aranda-v1")
# Encode texts
embeddings = model.encode([
"macam mana nak renew lesen memandu",
"how to renew driving license",
"saya nak makan nasi lemak"
], normalize_embeddings=True)
# Cosine similarity
similarities = embeddings @ embeddings.T
print(similarities)
With RAG / vector search
# Encode your document corpus (do this once)
doc_embeddings = model.encode(documents, normalize_embeddings=True)
# At query time
query_embedding = model.encode([query], normalize_embeddings=True)
scores = query_embedding @ doc_embeddings.T
top_k = scores.argsort()[0][-5:][::-1]
Intended Use
- RAG context retrieval for Malaysian applications
- Semantic search over BM/Manglish/English document corpora
- Cross-lingual matching (BM ↔ English)
- Dense retrieval in hybrid search pipelines (paired with BM25)
Limitations
- English STS performance is below the base mpnet model (0.8369 vs 0.8682) — the model specialized for Malaysian text
- Not a reranker — use a cross-encoder for second-stage reranking
- Tested on Malaysian web data; performance may vary on other Southeast Asian languages
Model Details
- Architecture: XLM-RoBERTa (base)
- Embedding dimension: 768
- Max sequence length: 128
- Pooling: Mean
- Normalization: L2
- Downloads last month
- -