ViRanker Fine-tuned on dermatology Vietnam FAQ
Model Cross-Encoder (Reranker) được fine-tune từ namdp-ptit/ViRanker trên tập dữ liệu FAQ của dermatology Việt Nam.
Model này đánh giá mức độ liên quan giữa câu hỏi và câu trả lời, trả về điểm số từ 0-1 (càng cao càng relevant).
🎯 Công dụng
- Reranking: Sắp xếp lại kết quả tìm kiếm theo mức độ liên quan
- FAQ Chatbot: Tìm câu trả lời phù hợp nhất cho câu hỏi người dùng
- RAG System: Chọn context tốt nhất cho Large Language Model
- Semantic Matching: Đánh giá độ tương đồng giữa query và document
🚀 Cách sử dụng
Option 1: FlagEmbedding (Khuyến nghị - Đơn giản nhất)
pip install -U FlagEmbedding
from FlagEmbedding import FlagReranker
# Load model
reranker = FlagReranker('NamCr17/viranker-faq-finetuned', use_fp16=True)
# Tính điểm cho 1 cặp
score = reranker.compute_score(
['Giá trị cốt lõi của dermatology Việt Nam?',
'5 giá trị cốt lõi: TÂM, CHIẾN LƯỢC, TRÍ, TÍN, NHANH'],
normalize=True
)
print(f"Score: {score}") # Output: 0.9999... (rất relevant)
# Rerank nhiều documents
query = "Liên hệ với dermatology như thế nào?"
documents = [
"Hotline: 0243 789 4110, Email: dermatologyvietnam@gmail.com",
"5 giá trị cốt lõi: TÂM, CHIẾN LƯỢC, TRÍ, TÍN, NHANH",
"Sản phẩm chăm sóc da chuyên nghiệp"
]
# Tạo pairs
pairs = [[query, doc] for doc in documents]
scores = reranker.compute_score(pairs, normalize=True)
# Sắp xếp theo điểm
ranked = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True)
for doc, score in ranked:
print(f"{score:.4f}: {doc}")
Option 2: Transformers (Chi tiết hơn)
pip install -U transformers torch
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# Load model
tokenizer = AutoTokenizer.from_pretrained('NamCr17/viranker-faq-finetuned')
model = AutoModelForSequenceClassification.from_pretrained('NamCr17/viranker-faq-finetuned')
model.eval()
# Prepare input
pairs = [
['Liên hệ dermatology?', 'Hotline: 0243 789 4110'],
['Liên hệ dermatology?', 'Sản phẩm chăm sóc da']
]
# Inference
with torch.no_grad():
inputs = tokenizer(
pairs,
padding=True,
truncation=True,
return_tensors='pt',
max_length=512
)
logits = model(**inputs).logits.view(-1,).float()
scores = torch.sigmoid(logits) # Normalize to [0,1]
print(scores) # tensor([0.9999, 0.0234])
💡 Use Cases
1. FAQ Chatbot
from FlagEmbedding import FlagReranker
import json
# Load FAQ database
with open('faq_database.json', 'r', encoding='utf-8') as f:
faq_db = json.load(f)
reranker = FlagReranker('NamCr17/viranker-faq-finetuned', use_fp16=True)
def find_answer(user_question, top_k=3):
# Tạo pairs với tất cả câu trả lời
pairs = [[user_question, item['answer']] for item in faq_db]
# Tính scores
scores = reranker.compute_score(pairs, normalize=True)
# Lấy top k
ranked = sorted(zip(faq_db, scores), key=lambda x: x[1], reverse=True)[:top_k]
return ranked
# Sử dụng
results = find_answer("Làm thế nào để liên hệ với dermatology?")
for faq, score in results:
print(f"
Score: {score:.4f}")
print(f"Q: {faq['question']}")
print(f"A: {faq['answer']}")
2. Two-stage Retrieval (Retriever + Reranker)
from sentence_transformers import SentenceTransformer
from FlagEmbedding import FlagReranker
from sklearn.metrics.pairwise import cosine_similarity
# Stage 1: Fast retrieval với bi-encoder
embedder = SentenceTransformer('keepitreal/vietnamese-sbert')
query_emb = embedder.encode(user_question)
doc_embs = embedder.encode([item['answer'] for item in faq_db])
# Lấy top 20 candidates
similarities = cosine_similarity([query_emb], doc_embs)[0]
top_20_idx = similarities.argsort()[-20:][::-1]
# Stage 2: Rerank với cross-encoder (chính xác hơn)
reranker = FlagReranker('NamCr17/viranker-faq-finetuned', use_fp16=True)
candidates = [faq_db[i] for i in top_20_idx]
pairs = [[user_question, item['answer']] for item in candidates]
scores = reranker.compute_score(pairs, normalize=True)
# Lấy top 3 final
final = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)[:3]
📊 Training Details
Dataset
- Domain: dermatology Vietnam FAQ (Sản phẩm chăm sóc da & Dịch vụ)
- Size: ~100 cặp câu hỏi-trả lời
- Format:
{"question": "...", "answer": "..."} - Train/Val Split: 80/20
- Negative Sampling: 5 random negatives per positive
Configuration
- Base Model: namdp-ptit/ViRanker (XLM-RoBERTa)
- Max Length: 512 tokens
- Epochs: 1
- Batch Size: 8 (train), 16 (eval)
- Learning Rate: Default AdamW
- Loss Function: Binary Cross-Entropy
- Optimizer: AdamW with weight decay 0.01
- Precision: FP16 (Mixed Precision)
Hardware
- GPU: NVIDIA Tesla (Kaggle)
- Training Time: ~10-15 minutes
🔬 Model Architecture
Input: [CLS] question [SEP] answer [SEP]
↓
XLM-RoBERTa Encoder (280M parameters)
↓
Classification Head
↓
Logit → Sigmoid → Score [0,1]
⚠️ Limitations
- Model được fine-tune đặc biệt cho domain dermatology Vietnam FAQ
- Performance có thể giảm trên domain khác (y tế, pháp luật, công nghệ, ...)
- Cần ít nhất 2 documents để so sánh (không phù hợp cho single document scoring)
- Chậm hơn bi-encoder (phải inference từng pair)
- Không tạo embeddings có thể cache (phải recompute mỗi lần query mới)
💡 Tips
- Khi nào dùng Reranker: Khi bạn cần độ chính xác cao (top 1-5 results)
- Khi nào dùng Bi-encoder: Khi bạn cần tốc độ (search trong hàng triệu documents)
- Best practice: Kết hợp cả 2 (retrieval với bi-encoder → rerank với cross-encoder)
📈 Comparison
| Model Type | Speed | Accuracy | Use Case |
|---|---|---|---|
| Bi-Encoder (Embedding) | ⚡⚡⚡ Fast | ⭐⭐ Good | Initial retrieval (1M+ docs) |
| Cross-Encoder (Reranker) | ⚡ Slow | ⭐⭐⭐ Excellent | Final reranking (top 10-100) |
🙏 Acknowledgments
- Base model: namdp-ptit/ViRanker
- Training framework: Hugging Face Transformers
- Inference library: FlagEmbedding
📄 License
Apache 2.0
📧 Contact
For questions or feedback, please open an issue on the model's discussion page.
Citation
@misc{viranker-faq-dermatology,
title={ViRanker Fine-tuned on dermatology Vietnam FAQ},
author={NamCr17},
year={2025},
publisher={Hugging Face},
url={https://huggingface.co/NamCr17/viranker-faq-finetuned}
}
- Downloads last month
- -