Spaces:
Sleeping
Sleeping
| from app.service.memory import contextualize_user_query, add_message_to_history | |
| from app.service.router import logical_router | |
| from app.service.retriever import hybrid_retrieval, apply_post_retrieval_rerank | |
| from app.service.generator import generate_answer | |
| from app.core.config import get_llm | |
| def run_rag_pipeline(question: str, session_id: str = "eval_session") -> dict: | |
| """ | |
| Chạy toàn bộ pipeline RAG và trả về answer + contexts. | |
| Args: | |
| question: Câu hỏi của người dùng. | |
| session_id: ID phiên để quản lý memory. | |
| Returns: | |
| dict với các key: | |
| - question (str): Câu hỏi gốc | |
| - answer (str): Câu trả lời từ RAG pipeline | |
| - contexts (list[str]): Danh sách các đoạn context đã retrieve được | |
| """ | |
| llm = get_llm() | |
| # Bước 1: Contextualize query với lịch sử hội thoại | |
| full_query = contextualize_user_query(question, session_id) | |
| # Bước 2: Router phân loại độ phức tạp và nguồn dữ liệu | |
| routing_res = logical_router(full_query) | |
| # Bước 3: Retrieve tài liệu liên quan | |
| raw_docs = hybrid_retrieval(routing_res) | |
| # Bước 4: Rerank để lấy các context tốt nhất | |
| final_context_str = apply_post_retrieval_rerank(full_query, raw_docs) | |
| # Tách chuỗi context thành danh sách | |
| contexts = [ | |
| c.strip() | |
| for c in final_context_str.split("\n\n---\n\n") | |
| if c.strip() | |
| ] | |
| # Bước 5: Sinh câu trả lời | |
| answer = generate_answer(full_query, final_context_str, llm) | |
| # Lưu vào memory | |
| add_message_to_history(session_id, "user", question) | |
| add_message_to_history(session_id, "ai", answer) | |
| return { | |
| "question": question, | |
| "answer": answer, | |
| "contexts": contexts if contexts else ["Không tìm thấy ngữ cảnh phù hợp."], | |
| } | |