rerank_model.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from typing import Optional
  2. from core.model_manager import ModelInstance
  3. from core.rag.models.document import Document
  4. class RerankModelRunner:
  5. def __init__(self, rerank_model_instance: ModelInstance) -> None:
  6. self.rerank_model_instance = rerank_model_instance
  7. def run(
  8. self,
  9. query: str,
  10. documents: list[Document],
  11. score_threshold: Optional[float] = None,
  12. top_n: Optional[int] = None,
  13. user: Optional[str] = None,
  14. ) -> list[Document]:
  15. """
  16. Run rerank model
  17. :param query: search query
  18. :param documents: documents for reranking
  19. :param score_threshold: score threshold
  20. :param top_n: top n
  21. :param user: unique user id if needed
  22. :return:
  23. """
  24. docs = []
  25. doc_id = []
  26. unique_documents = []
  27. dify_documents = [item for item in documents if item.provider == "dify"]
  28. external_documents = [item for item in documents if item.provider == "external"]
  29. for document in dify_documents:
  30. if document.metadata["doc_id"] not in doc_id:
  31. doc_id.append(document.metadata["doc_id"])
  32. docs.append(document.page_content)
  33. unique_documents.append(document)
  34. for document in external_documents:
  35. docs.append(document.page_content)
  36. unique_documents.append(document)
  37. documents = unique_documents
  38. rerank_result = self.rerank_model_instance.invoke_rerank(
  39. query=query, docs=docs, score_threshold=score_threshold, top_n=top_n, user=user
  40. )
  41. rerank_documents = []
  42. for result in rerank_result.docs:
  43. # format document
  44. rerank_document = Document(
  45. page_content=result.text,
  46. metadata=documents[result.index].metadata,
  47. provider=documents[result.index].provider,
  48. )
  49. rerank_document.metadata["score"] = result.score
  50. rerank_documents.append(rerank_document)
  51. return rerank_documents