| | |
| | |
| |
|
| | import gradio as gr |
| | from rag_pipeline import RAGPipeline |
| | from utils import process_documents |
| |
|
| | rag = RAGPipeline() |
| |
|
| | def log_message(msg, logs): |
| | logs = logs + msg + "\n" |
| | return logs |
| |
|
| | def upload_and_prepare(files, logs): |
| | logs = log_message("[RAG] بدء معالجة الملفات...", logs) |
| | all_chunks = [] |
| | for file in files: |
| | logs = log_message(f"[RAG] معالجة الملف: {file.name}", logs) |
| | chunks = process_documents(file.name) |
| | all_chunks.extend(chunks) |
| | logs = log_message(f"[RAG] تم استخراج {len(chunks)} مقطع من {file.name}", logs) |
| |
|
| | rag.build_index(all_chunks) |
| | logs = log_message(f"[RAG] تم بناء الفهرس بـ {len(all_chunks)} مقطع.", logs) |
| | return all_chunks, logs, gr.update(visible=True), gr.update(visible=True), gr.update(visible=True) |
| |
|
| | def store_question(q): |
| | return q |
| |
|
| | def retrieve_passages(question, chunks, logs): |
| | passages = rag.retrieve_passages(question) |
| | passages_text = "\n---\n".join(passages) |
| | logs = log_message(f"[RAG] تم العثور على {len(passages)} مقطع مرتبط بالسؤال.", logs) |
| | return passages, passages_text, logs |
| |
|
| | def generate_summary_only(passages_text, logs): |
| | summary = rag.summarize_text(passages_text) |
| | if not summary.strip(): |
| | logs = log_message("[RAG] ⚠️ لم يتم توليد ملخص. تحقق من محتوى المقاطع.", logs) |
| | else: |
| | logs = log_message("[RAG] تم توليد الملخص بنجاح.\n📌 الملخص:\n" + summary, logs) |
| | return summary, logs |
| |
|
| | def generate_final_answer(question, summary_text, logs): |
| | answer, _ = rag.generate_answer_from_passages(question, summary_text) |
| | if not answer.strip(): |
| | logs = log_message("[RAG] ⚠️ لم يتم توليد إجابة. ربما النص طويل أو النموذج فشل.", logs) |
| | else: |
| | logs = log_message("[RAG] ✅ تم توليد الإجابة النهائية.", logs) |
| | return answer, logs |
| |
|
| | with gr.Blocks() as demo: |
| | logs = gr.State("") |
| | chunks = gr.State([]) |
| | question_state = gr.State("") |
| | retrieved_passages = gr.State([]) |
| |
|
| | gr.Markdown("# 🕌 نظام استرجاع المعرفة - مراحل متسلسلة") |
| |
|
| | with gr.Row(): |
| | files_input = gr.File(file_types=[".pdf", ".docx", ".txt"], file_count="multiple") |
| | upload_btn = gr.Button("⬆️ رفع وتجهيز المقاطع") |
| |
|
| | with gr.Row(): |
| | question_input = gr.Textbox(label="❓ اكتب سؤالك") |
| | store_question_btn = gr.Button("📥 تخزين السؤال") |
| |
|
| | find_btn = gr.Button("🔍 بحث عن المقاطع المرتبطة") |
| | summarize_btn = gr.Button("📝 توليد الملخص") |
| | answer_btn = gr.Button("✍️ توليد الإجابة النهائية") |
| |
|
| | passage_output = gr.Textbox(label="📄 المقاطع المرتبطة", lines=8) |
| | summary_output = gr.Textbox(label="📌 الملخص المستخدم", lines=5) |
| | answer_output = gr.Textbox(label="✅ الإجابة النهائية", lines=5) |
| | logs_output = gr.Textbox(label="📜 سجل العمليات", lines=10, interactive=False) |
| |
|
| | upload_btn.click(upload_and_prepare, inputs=[files_input, logs], outputs=[chunks, logs_output, store_question_btn, find_btn, summarize_btn]) |
| | store_question_btn.click(store_question, inputs=question_input, outputs=question_state) |
| | find_btn.click(retrieve_passages, inputs=[question_state, chunks, logs], outputs=[retrieved_passages, passage_output, logs_output]) |
| | summarize_btn.click(generate_summary_only, inputs=[passage_output, logs], outputs=[summary_output, logs_output]) |
| | answer_btn.click(generate_final_answer, inputs=[question_state, summary_output, logs], outputs=[answer_output, logs_output]) |
| |
|
| | demo.launch() |
| |
|