| 8 | |
| 9 | |
| 10 | def reciprocal_rank_fusion(results: list[list], k=60): |
| 11 | fused_scores = {} |
| 12 | for docs in results: |
| 13 | # Assumes the docs are returned in sorted order of relevance |
| 14 | for rank, doc in enumerate(docs): |
| 15 | doc_str = dumps(doc) |
| 16 | if doc_str not in fused_scores: |
| 17 | fused_scores[doc_str] = 0 |
| 18 | fused_scores[doc_str] += 1 / (rank + k) |
| 19 | |
| 20 | reranked_results = [ |
| 21 | (loads(doc), score) |
| 22 | for doc, score in sorted(fused_scores.items(), key=lambda x: x[1], reverse=True) |
| 23 | ] |
| 24 | return reranked_results |
| 25 | |
| 26 | |
| 27 | prompt = hub.pull("langchain-ai/rag-fusion-query-generation") |