test_knowledge_pgvector_fallback.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from __future__ import annotations
  2. import sys
  3. from pathlib import Path
  4. REPO_ROOT = Path(__file__).resolve().parents[1]
  5. for module_name in list(sys.modules):
  6. if module_name == "app" or module_name.startswith("app."):
  7. del sys.modules[module_name]
  8. for path in [
  9. REPO_ROOT / "libs" / "core-domain" / "src",
  10. REPO_ROOT / "libs" / "core-shared" / "src",
  11. REPO_ROOT / "libs" / "core-db" / "src",
  12. REPO_ROOT / "services" / "knowledge-service",
  13. ]:
  14. sys.path.insert(0, str(path))
  15. from core_db import Base
  16. from app.application.services import KnowledgeApplicationService
  17. from app.bootstrap.settings import KnowledgeServiceSettings
  18. from app.db.session import build_session_factory
  19. from app.domain.repositories import (
  20. KnowledgeBaseRepository,
  21. KnowledgeChunkRepository,
  22. KnowledgeDocumentRepository,
  23. )
  24. from app.schemas.knowledge import (
  25. KnowledgeBaseCreateRequest,
  26. KnowledgeDocumentCreateRequest,
  27. KnowledgeSearchRequest,
  28. )
  29. def test_knowledge_search_falls_back_without_pgvector(tmp_path: Path) -> None:
  30. settings = KnowledgeServiceSettings(
  31. database_url=f"sqlite:///{tmp_path / 'knowledge_service.db'}",
  32. embedding_provider="local",
  33. )
  34. session_factory = build_session_factory(settings)
  35. Base.metadata.create_all(bind=session_factory.kw["bind"])
  36. with session_factory() as db:
  37. service = KnowledgeApplicationService(
  38. settings=settings,
  39. base_repository=KnowledgeBaseRepository(db),
  40. document_repository=KnowledgeDocumentRepository(db),
  41. chunk_repository=KnowledgeChunkRepository(db),
  42. )
  43. base = service.create_base(
  44. KnowledgeBaseCreateRequest(tenant_id="t1", code="kb", name="KB")
  45. )
  46. _, chunks = service.create_document(
  47. KnowledgeDocumentCreateRequest(
  48. tenant_id="t1",
  49. knowledge_base_id=base.id,
  50. title="Refund Policy",
  51. content_text="Refunds are available within seven days for eligible orders.",
  52. chunk_size=40,
  53. chunk_overlap=5,
  54. )
  55. )
  56. assert chunks[0].embedding_vector is not None
  57. results = service.search(
  58. KnowledgeSearchRequest(
  59. tenant_id="t1",
  60. knowledge_base_id=base.id,
  61. query="refund seven days",
  62. top_k=3,
  63. )
  64. )
  65. assert results
  66. assert results[0][3]["retrieval_mode"] == "hybrid"
  67. session_factory.kw["bind"].dispose()