Mô Hình Tái Xếp Hạng Cross-Encoder Reranker và Tỉa Top-K
1. Giai đoạn 1 (Bi-Encoder / Retrieval): Tìm kiếm nhanh top 50 tài liệu ứng viên bằng Vector Index hoặc BM25 trong vài mili-giây.
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: vector-cosine-similarity-stable.
Nội dung đề bài
Mục tiêu kiến thức
- Hiểu kiến trúc 2 giai đoạn (Two-Stage Retrieval):
- Giai đoạn 1 (Bi-Encoder / Retrieval): Tìm kiếm nhanh top 50 tài liệu ứng viên bằng Vector Index hoặc BM25 trong vài mili-giây.
- Giai đoạn 2 (Cross-Encoder / Reranker): Nối cặp
(Query, Document)và truyền qua mô hình chú ý chéo (Cross-Attention) để tính điểm tương quan sâu sắc giữa từng từ của truy vấn và từng từ của tài liệu. - Chuyển đổi điểm số:
- Nếu đầu ra của Reranker là Logits z ∈ R, chuẩn hóa về xác suất bằng hàm Sigmoid: s = 11 + e-z.
- Tỉa bớt (Pruning):
- Lọc bỏ các tài liệu có điểm số thấp hơn ngưỡng
min_score. - Giữ lại tối đa
top_ktài liệu có điểm cao nhất.
Yêu cầu
Viết hàm rerank_and_prune(query: str, candidate_docs: list[dict[str, Any]], scorer_fn: Any, min_score: float = 0.5, top_k: int = 3) -> list[dict[str, Any]]:
candidate_docs: Danh sách các dictionary chứa tài liệu, mỗi phần tử có key"id"và"text".scorer_fn(pairs: list[tuple[str, str]]) -> list[float]: Hàm mô phỏng Cross-Encoder nhận danh sách các cặp(query, text)và trả về danh sách điểm số tương quan (hoặc logits).- Quy trình:
- Tạo danh sách các cặp
[(query, doc["text"]) for doc in candidate_docs]. - Gọi
scorer_fnđể lấy điểm số thô. - Áp dụng Sigmoid nếu điểm số nằm ngoài khoảng [0, 1] (ví dụ có giá trị < 0 hoặc > 1).
- Lọc các tài liệu có
score >= min_score. - Sắp xếp giảm dần theo điểm số và trả về tối đa
top_ktài liệu đã được bổ sung key"rerank_score": float.
Input
- Hàm
rerank_and_prune(query,candidate_docs,scorer_fn,min_score,top_k): Các tham số đầu vào chứa dữ liệu Tensor/mảng NumPy hoặc giá trị siêu tham số tương ứng.
Output
- Hàm
rerank_and_prune: Trả về kết quả kiểulist[dict[str, Any]]theo đúng đặc tả kỹ thuật và kích thước quy định.
Ràng buộc
- Thời gian chạy tối đa: 2000ms.
- Giới hạn bộ nhớ: 256MB.
- Dữ liệu đầu vào hợp lệ theo đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
docs = [{'id': 'doc1', 'text': 'Học máy cơ bản'}, {'id': 'doc2', 'text': 'Học sâu chuyên sâu'}, {'id': 'doc3', 'text': 'Nấu ăn ngon'}]
def mock_scorer(pairs):
return [0.5, 2.0, -3.0]
results = rerank_and_prune('học sâu', docs, mock_scorer, min_score=0.6, top_k=2)Output
[{'id': 'doc2', 'text': 'Học sâu chuyên sâu', 'rerank_score': 0.8807970779778823}, {'id': 'doc1', 'text': 'Học máy cơ bản', 'rerank_score': 0.6224593312018546}]Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Ví dụ 2
Input
docs = [{'id': str(i), 'text': f'text {i}'} for i in range(10)]
def mock_scorer(pairs):
return [0.9 - i * 0.05 for i in range(len(pairs))]
results = rerank_and_prune('query', docs, mock_scorer, min_score=0.1, top_k=3)Output
[{'id': '0', 'text': 'text 0', 'rerank_score': 0.9}, {'id': '1', 'text': 'text 1', 'rerank_score': 0.85}, {'id': '2', 'text': 'text 2', 'rerank_score': 0.8}]Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
