Downloads · 30 days
0
hoailebads/Qwen3-Embedding-0.6B-Zalo-Legal-Retrieval-LoRA
Qwen3-Embedding-0.6B-Zalo-Legal-Retrieval-LoRA is a feature extraction model from hoailebads. Use it when you need embeddings to search or compare text. It is set up for peft. The card lists the license as apache-2.0.
Bi-encoder truy hồi điều luật tiếng Việt trên corpus Zalo Legal Text Retrieval. Kiến trúc dual-LoRA: hai adapter LoRA riêng biệt dùng chung một base model đóng băng — queryadapter mã hoá câu hỏi, passageadapter mã hoá…
Downloads · 30 days
0
Access
Public
Updated Aug 20, 2026
Repo size
80.8 MB
Likes
0
Public
Click a slice to open those files.
.safetensors80.8 MB · 100%
From the Hugging Face model README
Bi-encoder truy hồi điều luật tiếng Việt trên corpus Zalo Legal Text Retrieval.
Kiến trúc dual-LoRA: hai adapter LoRA riêng biệt dùng chung một base model đóng băng —
query_adapter mã hoá câu hỏi, passage_adapter mã hoá điều luật.
Đây là checkpoint Zalo tốt nhất đã đo (zalo_synthetic_hoi_dap/checkpoint-12), thuộc cùng
pipeline với hoaileba/Qwen-Retrieval-Tuning.
Tập eval: 637 câu hỏi (zalo_valset.json).
Corpus: 61,031 điều luật (gộp từ 972,327 dòng legal_corpus_splitted.csv, group theo
law_title|article_id). FAISS inner-product, dedup theo aid.
| K | Recall@K | Precision@K | Hit@K |
|---|---|---|---|
| 1 | 65.70 | 66.41 | 66.41 |
| 3 | 83.75 | 28.41 | 84.62 |
| 5 | 87.83 | 17.93 | 88.70 |
| 10 | 92.39 | 9.45 | 93.09 |
| 100 | 97.25 | 1.00 | 97.65 |
| Run | R@1 | R@10 | R@100 |
|---|---|---|---|
zalo_synthetic_hoi_dap/checkpoint-12 ← model này | 65.70 | 92.39 | 97.25 |
train_zalo_dual (checkpoint cha, dual-adapter) | 64.68 | 91.37 | 97.25 |
train_zalo_single (single-adapter) | 58.32 | 88.30 | 96.39 |
Dual-adapter hơn single-adapter +7.4 R@1 — khoảng cách lớn hơn nhiều so với trên VLSP (+4.8), và là kết quả rõ ràng nhất trong toàn bộ thí nghiệm. Augment synthetic dạng hỏi–đáp cộng thêm +1.0 R@1 lên trên checkpoint cha.
Số đo đầy đủ: eval_results.json.
Model gồm hai adapter nên không load thẳng bằng AutoModel được — phải nạp cả hai và
chuyển adapter theo loại text. File modeling_dual_lora.py trong repo
này làm sẵn việc đó:
from modeling_dual_lora import DualLoRAEncoder
import numpy as np
enc = DualLoRAEncoder.from_pretrained("hoailebads/Qwen3-Embedding-0.6B-Zalo-Legal-Retrieval-LoRA")
questions = ["Người điều khiển xe máy không đội mũ bảo hiểm bị phạt bao nhiêu tiền?"]
articles = ["Điều 6. Xử phạt người điều khiển xe mô tô, xe gắn máy ... "]
q = enc.encode(questions, is_query=True) # (1, 1024), đã L2-normalize
d = enc.encode(articles, is_query=False) # (N, 1024)
scores = q @ d.T # inner product == cosine
top = np.argsort(-scores[0])[:10]
Hoặc tự nạp bằng PEFT:
from transformers import AutoModel, AutoTokenizer
from peft import PeftModel
import torch
base = AutoModel.from_pretrained("Qwen/Qwen3-Embedding-0.6B",
torch_dtype=torch.bfloat16, trust_remote_code=True)
model = PeftModel.from_pretrained(base, "<repo>/query_adapter", adapter_name="query_adapter")
model.load_adapter("<repo>/passage_adapter", adapter_name="passage_adapter")
model.set_adapter("query_adapter") # trước khi encode câu hỏi
model.set_adapter("passage_adapter") # trước khi encode điều luật
"Instruct: ..." sẽ lệch phân bố.max_length = 1024, truncation bên phải (mặc định của tokenizer).article_title + "\n" + content (content = nối các khoản/điểm của cùng điều).passage_adapter (hoặc ngược lại) làm hỏng kết quả — đây là lỗi dễ mắc
nhất khi dùng model này.| Base model | Qwen/Qwen3-Embedding-0.6B (đóng băng) |
| LoRA | r=16, alpha=32, dropout=0.05, target = q,k,v,o,gate,up,down_proj |
| Trainable | 20,185,088 / 615,961,600 params (3.28%), ×2 adapter |
| Loss | fast_cached_mnrl_dual — cached multiple-negatives ranking, temperature=0.05 |
| Hard negatives | 1/query (mine từ chính checkpoint cha) |
| Batch size | 256 (cached mini-batch 16) |
| Checkpoint chọn | step 12 = epoch 2/5 (train chạy đủ 30 step, epoch 2 là điểm eval tốt nhất) |
| Precision | bf16 + Flash Attention 2, 2×GPU torchrun |
| Resume từ | output/train_zalo_dual |
| Train loss | epoch 1: 1.2065 → epoch 2: 1.0016 → epoch 5: 0.6327 |
| Dataset | 2,666 sample — Zalo gốc + câu hỏi synthetic biến thể hỏi–đáp |
Loss vẫn giảm mạnh sau epoch 2 (1.00 → 0.63) nhưng recall không cải thiện — train loss ở đây không phải tín hiệu chọn checkpoint; các epoch sau là overfit trên synthetic question. Đó là lý do checkpoint được chọn là step 12 chứ không phải step 30.
hoailebads/Qwen3-Embedding-0.6B-VLSP-Legal-Retrieval-LoRA — bản retrieval cho corpus VLSPhoailebads/Qwen3-Reranker-8B-VLSP-Legal-LoRA — rerankerhoailebads/Qwen3-Reranker-0.6B-VLSP-Legal-LoRA — reranker bản nhẹCode + số đo đầy đủ: hoaileba/Qwen-Retrieval-Tuning
aid, cách chunk). Model này train và đo
trên Zalo; dùng chéo sang VLSP chưa được đo.zalo_valset.json (637 câu). Một tập nhỏ hơn (zalo_eval.json, 198 câu)
cho số cao hơn — hai tập không so sánh trực tiếp với nhau được.Apache-2.0, theo base model Qwen/Qwen3-Embedding-0.6B.