test_tablestore.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import os
  2. import uuid
  3. import tablestore
  4. from _pytest.python_api import approx
  5. from core.rag.datasource.vdb.tablestore.tablestore_vector import (
  6. TableStoreConfig,
  7. TableStoreVector,
  8. )
  9. from tests.integration_tests.vdb.test_vector_store import (
  10. AbstractVectorTest,
  11. get_example_document,
  12. get_example_text,
  13. setup_mock_redis,
  14. )
  15. class TableStoreVectorTest(AbstractVectorTest):
  16. def __init__(self, normalize_full_text_score: bool = False):
  17. super().__init__()
  18. self.vector = TableStoreVector(
  19. collection_name=self.collection_name,
  20. config=TableStoreConfig(
  21. endpoint=os.getenv("TABLESTORE_ENDPOINT"),
  22. instance_name=os.getenv("TABLESTORE_INSTANCE_NAME"),
  23. access_key_id=os.getenv("TABLESTORE_ACCESS_KEY_ID"),
  24. access_key_secret=os.getenv("TABLESTORE_ACCESS_KEY_SECRET"),
  25. normalize_full_text_bm25_score=normalize_full_text_score,
  26. ),
  27. )
  28. def get_ids_by_metadata_field(self):
  29. ids = self.vector.get_ids_by_metadata_field(key="doc_id", value=self.example_doc_id)
  30. assert ids is not None
  31. assert len(ids) == 1
  32. assert ids[0] == self.example_doc_id
  33. def create_vector(self):
  34. self.vector.create(
  35. texts=[get_example_document(doc_id=self.example_doc_id)],
  36. embeddings=[self.example_embedding],
  37. )
  38. while True:
  39. search_response = self.vector._tablestore_client.search(
  40. table_name=self.vector._table_name,
  41. index_name=self.vector._index_name,
  42. search_query=tablestore.SearchQuery(query=tablestore.MatchAllQuery(), get_total_count=True, limit=0),
  43. columns_to_get=tablestore.ColumnsToGet(return_type=tablestore.ColumnReturnType.ALL_FROM_INDEX),
  44. )
  45. if search_response.total_count == 1:
  46. break
  47. def search_by_vector(self):
  48. super().search_by_vector()
  49. docs = self.vector.search_by_vector(self.example_embedding, document_ids_filter=[self.example_doc_id])
  50. assert len(docs) == 1
  51. assert docs[0].metadata["doc_id"] == self.example_doc_id
  52. assert docs[0].metadata["score"] > 0
  53. docs = self.vector.search_by_vector(self.example_embedding, document_ids_filter=[str(uuid.uuid4())])
  54. assert len(docs) == 0
  55. def search_by_full_text(self):
  56. super().search_by_full_text()
  57. docs = self.vector.search_by_full_text(get_example_text(), document_ids_filter=[self.example_doc_id])
  58. assert len(docs) == 1
  59. assert docs[0].metadata["doc_id"] == self.example_doc_id
  60. if self.vector._config.normalize_full_text_bm25_score:
  61. assert docs[0].metadata["score"] == approx(0.1214, abs=1e-3)
  62. else:
  63. assert docs[0].metadata.get("score") is None
  64. # return none if normalize_full_text_score=true and score_threshold > 0
  65. docs = self.vector.search_by_full_text(
  66. get_example_text(), document_ids_filter=[self.example_doc_id], score_threshold=0.5
  67. )
  68. if self.vector._config.normalize_full_text_bm25_score:
  69. assert len(docs) == 0
  70. else:
  71. assert len(docs) == 1
  72. assert docs[0].metadata["doc_id"] == self.example_doc_id
  73. assert docs[0].metadata.get("score") is None
  74. docs = self.vector.search_by_full_text(get_example_text(), document_ids_filter=[str(uuid.uuid4())])
  75. assert len(docs) == 0
  76. def run_all_tests(self):
  77. try:
  78. self.vector.delete()
  79. except Exception:
  80. pass
  81. return super().run_all_tests()
  82. def test_tablestore_vector(setup_mock_redis):
  83. TableStoreVectorTest().run_all_tests()
  84. TableStoreVectorTest(normalize_full_text_score=True).run_all_tests()
  85. TableStoreVectorTest(normalize_full_text_score=False).run_all_tests()