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:
68
src/benchmarking/routes.py
Normal file
68
src/benchmarking/routes.py
Normal 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"],
|
||||
)
|
||||
Reference in New Issue
Block a user