from typing import Optional from core.model_manager import ModelInstance from core.rag.models.document import Document class RerankRunner: def __init__(self, rerank_model_instance: ModelInstance) -> None: self.rerank_model_instance = rerank_model_instance def run(self, query: str, documents: list[Document], score_threshold: Optional[float] = None, top_n: Optional[int] = None, user: Optional[str] = None) -> list[Document]: """ Run rerank model :param query: search query :param documents: documents for reranking :param score_threshold: score threshold :param top_n: top n :param user: unique user id if needed :return: """ docs = [] doc_id = [] unique_documents = [] for document in documents: if document.metadata['doc_id'] not in doc_id: doc_id.append(document.metadata['doc_id']) docs.append(document.page_content) unique_documents.append(document) documents = unique_documents rerank_result = self.rerank_model_instance.invoke_rerank( query=query, docs=docs, score_threshold=score_threshold, top_n=top_n, user=user ) rerank_documents = [] for result in rerank_result.docs: # format document rerank_document = Document( page_content=result.text, metadata={ "doc_id": documents[result.index].metadata['doc_id'], "doc_hash": documents[result.index].metadata['doc_hash'], "document_id": documents[result.index].metadata['document_id'], "dataset_id": documents[result.index].metadata['dataset_id'], 'score': result.score } ) rerank_documents.append(rerank_document) return rerank_documents