ai-043Đọc toàn bộ đề miễn phí

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.

AITrung bình35 phút

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ủ đề

ragrerankingcross-encoderbi-encoderrelevance-scoresigmoid

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_k tà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_k tà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ểu list[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ế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.