Downloads · 30 days
21
21% of all-time downloads
moh-affan/indobert-reranker-asn-sumenep
indobert-reranker-asn-sumenep is a text classification model from moh-affan. Use it when you need a label for a piece of text. It is set up for transformers. The card lists the license as mit.
Fine-tuned cross-encoder reranker berbasis indobenchmark/indobert-lite-base-p1 untuk sistem tanya jawab regulasi ASN (Aparatur Sipil Negara) dalam Bahasa Indonesia, khususnya domain hukum kepegawaian pemerintah daerah.
Downloads · 30 days
21
21% of all-time downloads
All-time downloads
101
Public
Parameters
11.7M
46.7 MB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors93.5 MB · 100%
From the Hugging Face model README
Fine-tuned cross-encoder reranker berbasis indobenchmark/indobert-lite-base-p1 untuk sistem tanya jawab regulasi ASN (Aparatur Sipil Negara) dalam Bahasa Indonesia, khususnya domain hukum kepegawaian pemerintah daerah.
Dikembangkan sebagai komponen retrieval pipeline dalam tesis S2: "Sistem RAG berbasis LLM untuk Tanya Jawab Regulasi ASN di Kabupaten Sumenep"
Model ini adalah cross-encoder yang menerima pasangan (query, passage) dan
menghasilkan skor relevansi antara 0–1. Digunakan sebagai tahap reranking
setelah initial retrieval (hybrid search BM25 + vector search).
Regulasi ASN Indonesia: PP, Permenpan-RB, Perka BKN, Perbup terkait:
| Metric | Score |
|---|---|
| AUC-ROC | 0.9901 |
| Average Precision | 0.9728 |
| Accuracy | 0.9629 |
| Test Loss | 0.2096 |
| Metric | Score |
|---|---|
| NDCG@3 | 0.9919 |
| NDCG@5 | 0.9919 |
| MRR@10 | 0.9891 |
| Kandidat | Avg Latency | P95 Latency |
|---|---|---|
| 5 docs | ~45ms | ~55ms |
| 10 docs | ~90ms | ~105ms |
| 20 docs | ~180ms | ~210ms |
Dengan INT8 quantization: ~2-4× lebih cepat
| Parameter | Nilai |
|---|---|
| Base model | indobenchmark/indobert-lite-base-p1 |
| Max sequence length | 512 token |
| Batch size | 16 |
| Learning rate | 2e-5 |
| Warmup ratio | 10% |
| Epochs | 3 |
| Best epoch | 3 |
| Best val AUC-ROC | 0.9949 |
| Loss function | Weighted BCE (hard neg weight=1.5) |
| Truncation strategy | only_second (query dipertahankan utuh) |
| Split | Jumlah Examples |
|---|---|
| Train | 13652 |
| Val | 2883 |
| Test | 2935 |
Strategi pembuatan dataset:
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained("moh-affan/indobert-reranker-asn-sumenep")
model = AutoModelForSequenceClassification.from_pretrained("moh-affan/indobert-reranker-asn-sumenep")
model.eval()
query = "Apa syarat kenaikan pangkat reguler ASN golongan III/b?"
passage = "Kenaikan pangkat reguler diberikan kepada PNS yang telah memenuhi syarat..."
with torch.no_grad():
inputs = tokenizer(
query, passage,
max_length=512,
truncation="only_second",
padding=True,
return_tensors="pt",
)
logits = model(**inputs).logits
score = torch.sigmoid(logits).item()
print(f"Skor relevansi: {score:.4f}") # mendekati 1.0 = sangat relevan
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained("moh-affan/indobert-reranker-asn-sumenep")
model = AutoModelForSequenceClassification.from_pretrained("moh-affan/indobert-reranker-asn-sumenep")
model.eval()
query = "Bagaimana prosedur pengajuan cuti besar PNS?"
candidates = [
"Cuti besar diberikan kepada PNS yang telah bekerja minimal 5 tahun...",
"Tunjangan kinerja ditetapkan berdasarkan kelas jabatan dan capaian...",
"Pasal 72 menyebutkan cuti tahunan diberikan selama 12 hari kerja...",
"Permohonan cuti besar diajukan kepada pejabat yang berwenang melalui...",
]
scores = []
with torch.no_grad():
for passage in candidates:
inputs = tokenizer(
query, passage,
max_length=512, truncation="only_second",
padding=True, return_tensors="pt",
)
logit = model(**inputs).logits
scores.append(torch.sigmoid(logit).item())
# Ranking
ranked = sorted(zip(scores, candidates), reverse=True)
for score, passage in ranked:
print(f"{score:.4f} | {passage[:70]}...")
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained("moh-affan/indobert-reranker-asn-sumenep")
model = AutoModelForSequenceClassification.from_pretrained("moh-affan/indobert-reranker-asn-sumenep")
# Quantize untuk CPU
model = torch.quantization.quantize_dynamic(
model, {torch.nn.Linear}, dtype=torch.qint8
)
model.eval()
# Selanjutnya sama seperti contoh di atas
# Menggunakan class dari pipeline tesis
from integrate_llamaindex import IndoBERTReranker, build_rag_pipeline
reranker = IndoBERTReranker(
model_path="moh-affan/indobert-reranker-asn-sumenep",
top_n=3,
batch_size=8,
)
query_engine = build_rag_pipeline(
index=index, # VectorStoreIndex dari Qdrant
reranker=reranker,
retriever_top_k=10, # ambil 10 dari hybrid search → rerank → top 3
)
response = query_engine.query("Apa syarat kenaikan pangkat ASN?")
User Query
│
▼
Hybrid Search (BM25 + Vector + RRF) → top-10 kandidat
│
▼
IndoBERT Reranker (model ini) → top-3 terpilih
│
▼
LLM Generation (Gemini) → Response
Jika menggunakan model ini dalam penelitian, harap sitasi:
@mastersthesis{affan2025reranker,
title = {Sistem RAG berbasis LLM untuk Tanya Jawab Regulasi ASN
di Kabupaten Sumenep dengan Fine-tuned Reranker},
author = {Affan},
school = {BKPSDM Kabupaten Sumenep / ISTTS Surabaya},
year = {2025},
note = {Model tersedia di https://huggingface.co/moh-affan/indobert-reranker-asn-sumenep}
}