feat(benchmarking): add query pipeline with logging and tracing

Why:
- Need query pipeline to ask questions against chunked documents
- Need comprehensive logging for debugging

Changes:
- Query service: embed question → vector search → LLM answer
- Query routes: POST /queries, GET /queries/{id}
- Query models: QueryRequest, QueryResponse, RetrievedChunk
- Added QueryError exception class
- Added STEP 1-6 logging for full traceability
This commit is contained in:
2026-07-26 12:06:04 +03:30
parent b75fde8185
commit 496a58c62a
5 changed files with 466 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
"""Query API routes.
Endpoints:
POST /queries Ask a question against a strategy
GET /queries/{id} Retrieve a past query
"""
from fastapi import APIRouter
from src.core.exceptions import QueryError
from src.core.models import StrategyName
from src.benchmarking import query_service
from src.benchmarking.models import (
QueryRequest,
QueryResponse,
QueryDetailResponse,
RetrievedChunk,
)
router = APIRouter()
@router.post("/queries", response_model=QueryResponse, status_code=201)
async def create_query(request: QueryRequest):
"""Ask a question against a document using a specific chunking strategy.
Pipeline: embed question → vector search → generate answer → store result.
"""
result = query_service.run_query(
document_id=request.document_id,
strategy_name=request.strategy,
question=request.question,
top_k=request.top_k,
)
return QueryResponse(
query_id=result["query_id"],
document_id=result["document_id"],
strategy=result["strategy"],
question=result["question"],
answer=result["answer"],
retrieved_chunks=[
RetrievedChunk(**chunk) for chunk in result["retrieved_chunks"]
],
latency_breakdown=result["latency_breakdown"],
token_usage=result["token_usage"],
created_at=result["created_at"],
)
@router.get("/queries/{query_id}", response_model=QueryDetailResponse)
async def get_query(query_id: str):
"""Retrieve a past query by ID."""
result = query_service.get_query(query_id)
if result is None:
raise QueryError(f"Query not found: {query_id}")
return QueryDetailResponse(
id=result["id"],
document_id=result["document_id"],
strategy_name=result["strategy_name"],
question=result["question"],
answer=result["answer"],
retrieved_chunks=result["retrieved_chunks"],
latency_breakdown=result["latency_breakdown"],
token_usage=result["token_usage"],
created_at=result["created_at"],
)