| from langchain.retrievers.document_compressors import CrossEncoderReranker |
| from langchain_community.cross_encoders import HuggingFaceCrossEncoder |
| from langchain.retrievers import ContextualCompressionRetriever |
| from retriever import get_hybrid_retriever |
|
|
| _cross_encoder = None |
|
|
| def get_cross_encoder(): |
| global _cross_encoder |
| if _cross_encoder is None: |
| print("Loading Cross-Encoder model into memory...") |
| _cross_encoder = HuggingFaceCrossEncoder(model_name="cross-encoder/ms-marco-MiniLM-L-6-v2") |
| return _cross_encoder |
|
|
| def get_reranking_retriever(): |
| """ |
| Wraps the Hybrid Retriever with a CrossEncoder to re-score and re-rank |
| the retrieved documents based on exact semantic relevance to the query. |
| """ |
| print("Initializing Cross-Encoder Re-ranker...") |
| |
| |
| model = get_cross_encoder() |
| |
| |
| compressor = CrossEncoderReranker(model=model, top_n=3) |
| |
| hybrid_retriever = get_hybrid_retriever() |
| |
| |
| |
| compression_retriever = ContextualCompressionRetriever( |
| base_compressor=compressor, |
| base_retriever=hybrid_retriever |
| ) |
| |
| return compression_retriever |
|
|