Baktabek's picture
Upload folder using huggingface_hub
409c17a verified
"""
Domain Layer - Retriever Interface
Defines contract for document retrieval implementations.
"""
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import List, Optional
@dataclass
class RetrievalResult:
"""Single retrieval result"""
content: str
score: float
document_id: str
chunk_index: int
metadata: dict
class IRetriever(ABC):
"""Interface for document retrieval"""
@abstractmethod
async def search(
self,
query: str,
top_k: int = 10,
filters: Optional[dict] = None,
min_score: float = 0.0,
) -> List[RetrievalResult]:
"""Search for relevant documents"""
pass
@abstractmethod
async def hybrid_search(
self,
query: str,
top_k: int = 10,
alpha: float = 0.5,
filters: Optional[dict] = None,
) -> List[RetrievalResult]:
"""Hybrid search (semantic + keyword)"""
pass
class IReranker(ABC):
"""Interface for result reranking"""
@abstractmethod
async def rerank(
self, query: str, results: List[RetrievalResult], top_k: int = 10
) -> List[RetrievalResult]:
"""Rerank retrieval results"""
pass
class IEmbedder(ABC):
"""Interface for text embedding"""
@abstractmethod
async def embed_text(self, text: str) -> List[float]:
"""Generate embedding for single text"""
pass
@abstractmethod
async def embed_texts(self, texts: List[str]) -> List[List[float]]:
"""Generate embeddings for multiple texts"""
pass
@abstractmethod
def get_dimension(self) -> int:
"""Get embedding dimension"""
pass