test_rerank.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import os
  2. import pytest
  3. from core.model_runtime.entities.rerank_entities import RerankDocument, RerankResult
  4. from core.model_runtime.entities.text_embedding_entities import TextEmbeddingResult
  5. from core.model_runtime.errors.validate import CredentialsValidateFailedError
  6. from core.model_runtime.model_providers.huggingface_tei.rerank.rerank import (
  7. HuggingfaceTeiRerankModel,
  8. )
  9. from core.model_runtime.model_providers.huggingface_tei.text_embedding.text_embedding import TeiHelper
  10. from tests.integration_tests.model_runtime.__mock.huggingface_tei import MockTEIClass
  11. MOCK = os.getenv('MOCK_SWITCH', 'false').lower() == 'true'
  12. @pytest.fixture
  13. def setup_tei_mock(request, monkeypatch: pytest.MonkeyPatch):
  14. if MOCK:
  15. monkeypatch.setattr(TeiHelper, 'get_tei_extra_parameter', MockTEIClass.get_tei_extra_parameter)
  16. monkeypatch.setattr(TeiHelper, 'invoke_tokenize', MockTEIClass.invoke_tokenize)
  17. monkeypatch.setattr(TeiHelper, 'invoke_embeddings', MockTEIClass.invoke_embeddings)
  18. monkeypatch.setattr(TeiHelper, 'invoke_rerank', MockTEIClass.invoke_rerank)
  19. yield
  20. if MOCK:
  21. monkeypatch.undo()
  22. @pytest.mark.parametrize('setup_tei_mock', [['none']], indirect=True)
  23. def test_validate_credentials(setup_tei_mock):
  24. model = HuggingfaceTeiRerankModel()
  25. # model name is only used in mock
  26. model_name = 'reranker'
  27. if MOCK:
  28. # TEI Provider will check model type by API endpoint, at real server, the model type is correct.
  29. # So we dont need to check model type here. Only check in mock
  30. with pytest.raises(CredentialsValidateFailedError):
  31. model.validate_credentials(
  32. model='embedding',
  33. credentials={
  34. 'server_url': os.environ.get('TEI_RERANK_SERVER_URL'),
  35. }
  36. )
  37. model.validate_credentials(
  38. model=model_name,
  39. credentials={
  40. 'server_url': os.environ.get('TEI_RERANK_SERVER_URL'),
  41. }
  42. )
  43. @pytest.mark.parametrize('setup_tei_mock', [['none']], indirect=True)
  44. def test_invoke_model(setup_tei_mock):
  45. model = HuggingfaceTeiRerankModel()
  46. # model name is only used in mock
  47. model_name = 'reranker'
  48. result = model.invoke(
  49. model=model_name,
  50. credentials={
  51. 'server_url': os.environ.get('TEI_RERANK_SERVER_URL'),
  52. },
  53. query="Who is Kasumi?",
  54. docs=[
  55. "Kasumi is a girl's name of Japanese origin meaning \"mist\".",
  56. "Her music is a kawaii bass, a mix of future bass, pop, and kawaii music ",
  57. "and she leads a team named PopiParty."
  58. ],
  59. score_threshold=0.8
  60. )
  61. assert isinstance(result, RerankResult)
  62. assert len(result.docs) == 1
  63. assert result.docs[0].index == 0
  64. assert result.docs[0].score >= 0.8