| 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 |
|
|
| |
| |
| |
|
|
| rewritten_query = rewrite_query(original_query) |
|
|
| |
| |
| |
|
|
| results = retriever.retrieve( |
| session_id=session_id, |
| query=rewritten_query, |
| top_k=5, |
| documents=request.documents, |
| ) |
|
|
| |
| |
| |
|
|
| if not results: |
|
|
| return { |
| "query": original_query, |
| "rewritten_query": rewritten_query, |
| "message": ("The uploaded material " "does not cover this topic."), |
| } |
|
|
| |
| |
| |
|
|
| answer = generate_answer(context_chunks=results, question=rewritten_query) |
|
|
| |
| |
| |
|
|
| 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}) |
|
|
| |
| |
| |
|
|
| return { |
| "query": original_query, |
| "rewritten_query": rewritten_query, |
| "answer": answer, |
| "citations": citations, |
| } |
|
|