rag / src /api /query.py
Ren1703's picture
debugging
3813085
Raw
History Blame Contribute Delete
1.93 kB
from fastapi import APIRouter
from src.schemas.models import QueryRequest
from src.services.retrieval import Retriever
from src.services.generator import generate_answer
from src.services.query_rewriter import rewrite_query
router = APIRouter()
retriever = Retriever()
@router.post("/query")
async def query_documents(request: QueryRequest):
original_query = request.query
session_id = request.session_id
# -----------------------------
# QUERY REWRITING
# -----------------------------
rewritten_query = rewrite_query(original_query)
# -----------------------------
# RETRIEVAL
# -----------------------------
results = retriever.retrieve(
session_id=session_id,
query=rewritten_query,
top_k=5,
documents=request.documents,
)
# -----------------------------
# OUT-OF-SYLLABUS REJECTION
# -----------------------------
if not results:
return {
"query": original_query,
"rewritten_query": rewritten_query,
"message": ("The uploaded material " "does not cover this topic."),
}
# -----------------------------
# GENERATION
# -----------------------------
answer = generate_answer(context_chunks=results, question=rewritten_query)
# -----------------------------
# CITATIONS
# -----------------------------
citations = []
seen = set()
for result in results:
chunk = result["chunk"]
key = (chunk.doc_name, chunk.page)
if key in seen:
continue
seen.add(key)
citations.append({"document": chunk.doc_name, "page": chunk.page})
# -----------------------------
# FINAL RESPONSE
# -----------------------------
return {
"query": original_query,
"rewritten_query": rewritten_query,
"answer": answer,
"citations": citations,
}