rerank_model.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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 (
  30. document.provider == "dify"
  31. and document.metadata is not None
  32. and document.metadata["doc_id"] not in doc_ids
  33. ):
  34. doc_ids.add(document.metadata["doc_id"])
  35. docs.append(document.page_content)
  36. unique_documents.append(document)
  37. elif document.provider == "external":
  38. if document not in unique_documents:
  39. docs.append(document.page_content)
  40. unique_documents.append(document)
  41. documents = unique_documents
  42. rerank_result = self.rerank_model_instance.invoke_rerank(
  43. query=query, docs=docs, score_threshold=score_threshold, top_n=top_n, user=user
  44. )
  45. rerank_documents = []
  46. for result in rerank_result.docs:
  47. # format document
  48. rerank_document = Document(
  49. page_content=result.text,
  50. metadata=documents[result.index].metadata,
  51. provider=documents[result.index].provider,
  52. )
  53. if rerank_document.metadata is not None:
  54. rerank_document.metadata["score"] = result.score
  55. rerank_documents.append(rerank_document)
  56. return rerank_documents