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. from core.rag.rerank.rerank_base import BaseRerankRunner
  5. class RerankModelRunner(BaseRerankRunner):
  6. def __init__(self, rerank_model_instance: ModelInstance) -> None:
  7. self.rerank_model_instance = rerank_model_instance
  8. def run(
  9. self,
  10. query: str,
  11. documents: list[Document],
  12. score_threshold: Optional[float] = None,
  13. top_n: Optional[int] = None,
  14. user: Optional[str] = None,
  15. ) -> list[Document]:
  16. """
  17. Run rerank model
  18. :param query: search query
  19. :param documents: documents for reranking
  20. :param score_threshold: score threshold
  21. :param top_n: top n
  22. :param user: unique user id if needed
  23. :return:
  24. """
  25. docs = []
  26. doc_ids = set()
  27. unique_documents = []
  28. for document in documents:
  29. if document.provider == "dify" and document.metadata["doc_id"] not in doc_ids:
  30. doc_ids.add(document.metadata["doc_id"])
  31. docs.append(document.page_content)
  32. unique_documents.append(document)
  33. elif document.provider == "external":
  34. if document not in unique_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