anhkhoiphan/rag-project-reranker
Reranker Service
Service FastAPI độc lập dùng để rerank các candidate chunks sau khi backend đã retrieve từ Qdrant.
Service này không biết về Qdrant, LangGraph, Redis, ingestion hay frontend. Nó chỉ nhận query + danh sách documents, chấm điểm lại và trả về thứ tự tốt hơn.
Vai Trò Trong Hệ Thống
Luồng retrieval của backend:
User query
-> Qdrant hybrid search lấy candidate child chunks
-> backend gửi candidate chunks sang reranker service
-> reranker service trả về rerank_score và rank_after
-> backend map kết quả về child chunks
-> nếu bật parent retrieval, backend group child chunks lên parent documentsReranker hiện chạy ở cấp child chunk, không rerank full parent document.
Cấu Hình
Các biến môi trường chính:
RERANK_SERVICE_MODEL=BAAI/bge-reranker-base
RERANK_SERVICE_DEVICE=cpu
RERANK_SERVICE_MAX_LENGTH=512
RERANK_SERVICE_LAZY_LOAD=trueModel mặc định:
BAAI/bge-reranker-baseModel này nhẹ hơn các bản multilingual lớn, phù hợp hơn cho máy CPU hoặc máy có RAM hạn chế. Nếu triển khai trên server mạnh hơn, có thể cân nhắc model reranker khác.
Cài Dependencies
Chạy từ project root:
.venv\Scripts\python.exe -m pip install -r services\reranker\requirements.txtHoặc:
pip install -r services/reranker/requirements.txtChạy Service
Windows PowerShell:
.venv\Scripts\python.exe -m uvicorn services.reranker.app:app --host 127.0.0.1 --port 8090Bash:
python -m uvicorn services.reranker.app:app --host 127.0.0.1 --port 8090Health Check
curl http://127.0.0.1:8090/healthResponse mẫu:
{
"status": "ok",
"model": "BAAI/bge-reranker-base",
"device": "cpu",
"provider": "reranker_service",
"loaded": false
}loaded=false là bình thường nếu RERANK_SERVICE_LAZY_LOAD=true và chưa có request /rerank nào.
Rerank Endpoint
Endpoint:
POST /rerankRequest:
{
"query": "chính sách thúc đẩy bán ô tô điện",
"documents": [
{
"id": "chunk_001",
"text": "Nội dung candidate chunk",
"metadata": {
"doc_id": "policy"
},
"retrieval_score": 0.72,
"rank_before": 1
}
],
"top_n": 5,
"max_length": 512
}Response:
{
"model": "BAAI/bge-reranker-base",
"results": [
{
"id": "chunk_001",
"rerank_score": 0.91,
"rank_before": 1,
"rank_after": 1
}
]
}Service trả compact result, không trả lại toàn bộ text document. Backend chịu trách nhiệm map id về candidate chunk ban đầu.
Test Trực Tiếp Bằng PowerShell
$body = @{
query = "chính sách thúc đẩy bán ô tô điện"
documents = @(
@{
id = "test-1"
text = "Chính sách thúc đẩy bán ô tô điện VinFast áp dụng cho các dòng xe điện."
metadata = @{}
retrieval_score = 0.5
rank_before = 1
}
)
top_n = 1
max_length = 512
} | ConvertTo-Json -Depth 5
Invoke-RestMethod `
-Uri "http://127.0.0.1:8090/rerank" `
-Method Post `
-ContentType "application/json" `
-Body $bodyLần đầu có thể chậm vì service phải load model.
Cấu Hình Backend Để Gọi Reranker
Trong .env của backend:
RERANK_ENABLED=true
RERANK_PROVIDER=remote_api
RERANK_TOP_K=10
RERANK_TOP_N=5
RERANK_API_URL=http://127.0.0.1:8090
RERANK_API_TIMEOUT=60
RERANK_FALLBACK_ON_ERROR=trueNếu backend log có:
Remote reranker failed. Falling back to retrieval orderthì chat không bị crash. Backend sẽ dùng thứ tự retrieval ban đầu nếu RERANK_FALLBACK_ON_ERROR=true.
Benchmark
Chạy từ project root:
.venv\Scripts\python.exe scripts\benchmark_rerank.py --provider remote_api --api-url http://127.0.0.1:8090Benchmark sẽ so sánh:
child-only retrieval
reranked child retrieval
parent document retrievalTests
.venv\Scripts\python.exe -m pytest testsDeploy Lên HuggingFace Spaces
Cấu Trúc Space
Tạo một Docker Space mới trên HuggingFace và upload các file sau từ thư mục services/reranker/ trong monorepo:
Space repo/
├── Dockerfile
├── README.md ← file này (có YAML frontmatter ở đầu)
├── __init__.py
├── app.py
├── model.py
├── schemas.py
└── requirements.txtTạo Space
- Vào huggingface.co/new-space
- Chọn Docker làm SDK
- Chọn hardware phù hợp (CPU Basic đủ cho
BAAI/bge-reranker-base) - Upload các file trên vào repo của Space
Biến Môi Trường (tuỳ chọn)
Có thể cấu hình qua Settings → Variables trong Space:
Model mặc định (BAAI/bge-reranker-base) được pre-download vào image lúc build. Nếu đổi model qua biến môi trường, lần khởi động đầu sẽ tải model từ Hub.Build Argument
Để bake model khác vào image ngay lúc build (tránh download khi khởi động):
RERANK_SERVICE_MODEL=BAAI/bge-reranker-v2-m3Đặt giá trị này trong Settings → Build arguments của Space.
Kết Nối Backend
Sau khi Space deploy xong, lấy URL của Space (dạng https://<username>-<space-name>.hf.space) và cập nhật .env của backend:
RERANK_ENABLED=true
RERANK_PROVIDER=remote_api
RERANK_API_URL=https://<username>-<space-name>.hf.space
RERANK_API_TIMEOUT=60
RERANK_FALLBACK_ON_ERROR=trueTăng RERANK_API_TIMEOUT lên 60s vì cold-start của Space có thể chậm.
Health Check
curl https://<username>-<space-name>.hf.space/healthGhi Chú
- Reranker service nên chạy trước backend nếu
RERANK_ENABLED=true. - Nếu chạy CPU, tăng
RERANK_API_TIMEOUTđể tránh timeout ở lần load đầu. - Nếu muốn test baseline không rerank, set
RERANK_ENABLED=falsetrong backend.
