Când combinăm rezultatele dintr-un motor lexical (BM25, unde scorurile pot varia între 0 și 40) cu rezultatele unui motor vectorial (similitudine cosinus, între 0.0 și 1.0), normalizarea simplă a scorurilor eșuează adesea din cauza scalelor incomparabile. Reciprocal Rank Fusion (RRF) rezolvă elegant această problemă bazându-se strict pe poziția (rangul) documentului în fiecare clasament.
Formula matematică RRF pentru fiecare document d:
RRF_Score(d) = Σ [ 1 / (k + rank(d, m)) ]
unde constanta standard k = 60 atenuează impactul diferențelor dintre primele poziții.
def reciprocal_rank_fusion(rankings, k=60):
rrf_scores = {}
for rank_list in rankings:
for rank, doc_id in enumerate(rank_list, start=1):
if doc_id not in rrf_scores:
rrf_scores[doc_id] = 0.0
rrf_scores[doc_id] += 1.0 / (k + rank)
# Sortare descrescătoare după scorul combinat RRF
return sorted(rrf_scores.items(), key=lambda x: x[1], reverse=True)
bm25_res = ["doc_A", "doc_B", "doc_C"]
vector_res = ["doc_B", "doc_A", "doc_D"]
print("Clasament final RRF:", reciprocal_rank_fusion([bm25_res, vector_res]))
RRF este nativ implementat în Elasticsearch, OpenSearch, Weaviate și Qdrant, devenind standardul de facto în căutarea hibridă de întreprindere.
Întrebări & Exemple practice:
Algoritmul Reciprocal Rank Fusion (RRF): Matematică și ImplementareAi o întrebare despre Algoritmul Reciprocal Rank Fusion (RRF): Matematică și Implementare sau ai descoperit un truc, prompt sau fragment de cod util? Distribuie-l cu ceilalți membri ai comunității!
Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau resurse pentru această pagină. Dacă ai testat un prompt sau ai un snippet util, adaugă-l mai jos pentru comunitate.