Skip to content

RAG end-to-end (tiếng Việt)

Pipeline đầy đủ: tài liệu → chunk → embed → retrieve → rerank → trả lời. Local-first (không cần API thuê bao), chạy trên RTX 3060 mobile lên RTX 3090. Mặc định router qua Ollama + LLM cục bộ.

TL;DR — gợi ý của chúng tôi

bash
pip install "nom-vn[chat]"
ollama pull qwen3:8b   # hoặc qwen3:1.7b cho máy yếu
nom serve              # http://localhost:8080

Kéo-thả PDF / DOCX vào giao diện; truy vấn bằng tiếng Việt; câu trả lời trích nguồn theo từng span.

Pipeline

StageModule / mô hìnhĐo
Chunknom.chunking (rule + sentence-aware)~10 ms / 10 K chars
Embedbkai-foundation-models/vietnamese-bi-encoder280 ms / batch=32
Dense retrievalSQLite + numpy IP< 5 ms / query trên 60K docs
BM25 hybridbm25s (Lucene formula)0.7 ms / query
RerankBAAI/bge-reranker-v2-m350 ms / top-20
LLMqwen3:8b qua Ollama800 ms - 3 s / câu trả lời

End-to-end p50: ~1.5 s / câu hỏi trên RTX 3090.

Bức tranh công khai

Frame so sánh: pipeline VN local-first hỗ trợ kéo-thả tài liệu + trích nguồn theo span.

ProjectLicenseLocal-firstVN-tuned componentsKết luận
nom serve (chúng tôi)Apache 2.0bkai + bge-v2-m3 + Ollamashipped
LangChain + ChromaMITpartialkhôngquá lớp, kéo dep heavy
LlamaIndex + PostgresMITpartialkhôngtương tự
Verba (Weaviate)BSD-3❌ (yêu cầu Weaviate cluster)khôngserver-based, vi phạm local-first

Một quan sát ngách: không có hệ thống RAG VN-tuned local-first nào đáng kể hơn vào 2026 Q2 — đó là khoảng trống nom serve lấp.

Bench — đã đo

Đo trên Zalo Legal QA 5K + 50 queries, end-to-end retrieval R@1 (sau rerank). LLM stage không scored — chất lượng câu trả lời cuối phụ thuộc LLM. R@1 đo retrieval-only signal.

PipelineR@1p50 latency
bkai → bge-v2-m3 → qwen3:8b86.3 %~1.5 s
dangvantuan → bge-v2-m3 → qwen3:8b73.5 %~1.5 s
BM25 only → qwen3:8b76.2 %~0.8 s
Hybrid (bkai + BM25) → bge-v2-m3 → qwen3:8b86.5 %~1.6 s

Hybrid (RRF fusion) thắng dense-only +0.2 pp R@1 trên cùng eval — biên độ thực sự nhỏ. Cho production: dùng bkai → bge-v2-m3 thuần. Hybrid chỉ đáng khi corpus có nhiều legal-VN nguyên (BM25 mạnh trên keyword-heavy queries).

LLM cục bộ — gợi ý

Mô hìnhDiskVRAMVN diacritic word accKhi nào chọn
qwen3:8b Q4_K_M4.7 GB6 GB87.26 %mặc định, máy laptop discrete GPU
gemma3:4b Q4_K_M3.3 GB4 GB87.90 %máy yếu hơn (Apple Silicon, integrated GPU)
qwen3:1.7b Q4_K_M1.4 GB2 GB16.60 %rất yếu (dưới rule baseline 41 %); chỉ chạy được ở embedded device, không khuyến nghị cho VN
phi4 (14B) Q48.4 GB12 GBchưa đocó VRAM thoải mái; cần pull qua Ollama trước khi đo

Adapter nom.llm.Ollama mặc định think=False — bắt buộc cho Qwen3 (CoT của nó emit vào field thinking riêng, để content trống → trông như mô hình câm).

Tái lập

bash
nom serve --in-memory      # ephemeral test
python scripts/seed_demo.py  # populate demo corpus
# Truy cập http://localhost:8080
bash
# Bench end-to-end
python benchmarks/rag/bench_rag_vn.py \
    --fixture benchmarks/rag/fixtures/vn_legal_zalo_5k.json

Tham khảo