th1nhng0/vietnamese-legal-documents
Viewer • Updated • 2.27M • 4.03k • 30
How to use mainguyen9/vietlegal-e5 with sentence-transformers:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("mainguyen9/vietlegal-e5")
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]A Vietnamese legal domain embedding model fine-tuned from intfloat/multilingual-e5-large (560M params, 1024-dim).
Achieves NDCG@10 = 0.7229 on the Zalo AI Legal Text Retrieval benchmark, outperforming all baselines including microsoft/harrier-oss-v1-0.6b.
Evaluated on MTEB ZacLegalTextRetrieval (61.4K corpus documents, 818 test queries).
| Model | Params | Dim | NDCG@10 |
|---|---|---|---|
| mainguyen9/vietlegal-e5 | 560M | 1024 | 0.7229 |
| mainguyen9/vietlegal-e5 | 560M | 512 | 0.7208 |
| mainguyen9/vietlegal-e5 | 560M | 256 | 0.7058 |
| mainguyen9/vietlegal-e5 | 560M | 128 | 0.7073 |
| microsoft/harrier-oss-v1-0.6b | 600M | 1024 | 0.7210 |
| intfloat/multilingual-e5-large | 560M | 1024 | 0.6660 |
| bkai-foundation-models/vietnamese-bi-encoder | 135M | 768 | 0.6160 |
| intfloat/multilingual-e5-base | 278M | 768 | 0.6030 |
| contextboxai/halong_embedding | 278M | 768 | 0.6009 |
Key highlights:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("mainguyen9/vietlegal-e5")
# Important: E5 models require "query: " and "passage: " prefixes
queries = ["query: Thủ tục đăng ký kinh doanh gồm những bước nào?"]
passages = ["passage: Điều 27. Trình tự, thủ tục đăng ký doanh nghiệp..."]
q_emb = model.encode(queries)
p_emb = model.encode(passages)
# Matryoshka: truncate to smaller dimension
model.truncate_dim = 256
q_emb_256 = model.encode(queries)
SentenceTransformer(
(0): Transformer({'max_seq_length': 512, 'do_lower_case': False}) with Transformer model: XLMRobertaModel
(1): Pooling({'word_embedding_dimension': 1024, 'pooling_mode_mean_tokens': True})
(2): Normalize()
)
Stage 1: Data Preparation
│ 518K docs → ~500K chunks (article-aware segmentation)
│
Stage 2: Contrastive Fine-tuning
│ MatryoshkaLoss(MultipleNegativesRankingLoss)
│
Stage 3: Hard Negative Mining
│ FAISS retrieval → mine rank 50-100 as hard negatives
│
Stage 4: Multi-task Blending
│ 70% retrieval + 20% classification + 10% STS
│ → Final model (NDCG@10 = 0.7229)
@misc{vietlegal-e5,
title={VietLegal-E5: Vietnamese Legal Domain Embedding Model},
author={Nguyen, Mai},
year={2026},
url={https://huggingface.co/mainguyen9/vietlegal-e5}
}
Base model
intfloat/multilingual-e5-large