Hợp Nhất Thứ Hạng Tương Hỗ (Reciprocal Rank Fusion - RRF) Cho Hybrid Search
RRF_Score(d) = ∑m ∈ M 1k + rm(d)
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: bm25-retrieval-from-scratch, dense-embedding-cosine-index.
Nội dung đề bài
Mục tiêu kiến thức
- Hiểu bài toán Hybrid Search: Điểm số của BM25 (thường từ 0 đến 50+) và Cosine Similarity (từ -1 đến 1) nằm trên hai thang đo hoàn toàn khác nhau. Cộng trực tiếp điểm số sẽ gây méo mó kết quả.
- Thuật toán RRF (Cormack et al., 2009): Thay vì cộng điểm số thô, ta chỉ dựa trên vị trí thứ hạng (rank r ≥ 1):
RRF_Score(d) = ∑m ∈ M 1k + rm(d) Trong đó:
- M là tập hợp các hệ thống xếp hạng (ví dụ: [BM25, Dense Vector]).
- rm(d) ∈ {1, 2, …} là thứ hạng của tài liệu d trong danh sách m (1-indexed).
- k là hằng số làm mượt (mặc định k = 60).
Yêu cầu
Viết hàm reciprocal_rank_fusion(ranked_lists: list[list[str]], k: int = 60, top_n: int = 5) -> list[tuple[str, float]]:
ranked_lists: Danh sách các bảng xếp hạng doc_id (mỗi bảng làlist[str]xếp theo thứ tự giảm dần của hệ thống đó).k: Hằng số làm mượt k ≥ 1.top_n: Số lượng tài liệu hợp nhất cần lấy.- Trả về: Danh sách top
top_ncặp(doc_id, rrf_score)sắp xếp giảm dần theo điểm RRF (nếu hòa điểm, sắp xếp theo thứ tự từ điển tăng dần của doc_id).
Input
- Hàm
reciprocal_rank_fusion(ranked_lists,k,top_n): 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
reciprocal_rank_fusion: Trả về kết quả kiểulist[tuple[str, float]]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
bm25 = ['docA', 'docB', 'docC']
dense = ['docB', 'docA', 'docD']
fused = reciprocal_rank_fusion([bm25, dense], k=60, top_n=3)Output
[('docA', 0.03252247488101534), ('docB', 0.03252247488101534), ('docC', 0.015873015873015872)]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
ranked = [['X', 'Y']]
k = 10
fused = reciprocal_rank_fusion(ranked, k=k, top_n=2)Output
[('X', 0.09090909090909091), ('Y', 0.08333333333333333)]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.
