ishaq101's picture
[KM-438][KM-439] Improve Retrieval and Querying feature (#15)
c93ec90
"""Public retrieval API — thin wrapper around RetrievalRouter."""
from sqlalchemy.ext.asyncio import AsyncSession
from src.middlewares.logging import get_logger
from src.rag.base import RetrievalResult
from src.rag.retrievers.document import document_retriever
from src.rag.retrievers.schema import schema_retriever
from src.rag.router import RetrievalRouter, SourceHint
logger = get_logger("retriever")
class RetrieverService:
"""Public retrieval service used by chat.py and search tools.
Delegates to RetrievalRouter which dispatches based on source_hint.
Returns RetrievalResult objects directly so downstream consumers
(db_executor, tabular_executor) can be fed without lossy dict
conversion. The `db` parameter is accepted for call-site compatibility
but currently unused — retrieval reads PGVector via _pgvector_engine
inside each retriever.
"""
def __init__(self):
self._router = RetrievalRouter(
schema_retriever=schema_retriever,
document_retriever=document_retriever,
)
async def retrieve(
self,
query: str,
user_id: str,
db: AsyncSession,
k: int = 5,
source_hint: SourceHint = "both",
) -> list[RetrievalResult]:
try:
return await self._router.retrieve(query, user_id, source_hint, k)
except Exception as e:
logger.error("retrieval failed", error=str(e))
return []
retriever = RetrieverService()