project1 / app.py
ramysaidagieb's picture
Update app.py
f400870 verified
raw
history blame
3.64 kB
import gradio as gr
import os
import tempfile
import shutil
import pdfminer.high_level
import docx
import faiss
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from sentence_transformers import SentenceTransformer
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
device = "cuda" if torch.cuda.is_available() else "cpu"
# تحميل النماذج
embedding_model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2', device=device)
qa_model_name = "aubmindlab/aragpt2-base"
qa_tokenizer = AutoTokenizer.from_pretrained(qa_model_name)
qa_model = AutoModelForCausalLM.from_pretrained(qa_model_name).to(device)
# إعداد قاعدة البيانات
index = None
docs = []
def extract_text(file_path):
if file_path.endswith('.pdf'):
with open(file_path, 'rb') as f:
return pdfminer.high_level.extract_text(f)
elif file_path.endswith('.docx') or file_path.endswith('.doc'):
doc = docx.Document(file_path)
return "\n".join([para.text for para in doc.paragraphs])
else:
raise ValueError("صيغة ملف غير مدعومة")
def process_files(files):
global index, docs
all_text = ""
for file in files:
text = extract_text(file.name)
all_text += text + "\n"
# تقسيم النص إلى مقاطع
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = text_splitter.split_text(all_text)
# إنشاء المتجهات
embeddings = embedding_model.encode(texts, show_progress_bar=True, convert_to_tensor=True)
index = faiss.IndexFlatL2(embeddings.shape[1])
index.add(embeddings.cpu().numpy())
docs = texts
return "✅ تم تحميل الكتب واستيعاب الأفكار! النظام جاهز للإجابة."
def generate_answer(question):
global index, docs
if index is None:
return "❌ الرجاء رفع الكتب أولاً."
q_emb = embedding_model.encode([question])
D, I = index.search(q_emb, k=3)
context = "\n".join([docs[i] for i in I[0]])
# تجهيز الإدخال للنموذج
prompt = f"سؤال: {question}\n\nمحتوى ذو صلة:\n{context}\n\nالإجابة:"
inputs = qa_tokenizer(prompt, return_tensors='pt').to(device)
outputs = qa_model.generate(**inputs, max_new_tokens=300, pad_token_id=qa_tokenizer.eos_token_id)
answer = qa_tokenizer.decode(outputs[0], skip_special_tokens=True)
return answer.split("الإجابة:")[-1].strip()
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# 🚀 أهلاً بك في محاكاة عقل المؤلف
ارفع كتبك واستعد للانطلاق في رحلة استكشاف الأفكار العميقة!
""")
with gr.Tab("📚 رفع الكتب للتدريب"):
upload = gr.File(file_types=['.pdf', '.docx', '.doc'], file_count='multiple')
train_button = gr.Button("🚀 ابدأ التدريب!")
train_output = gr.Textbox(label="🔵 حالة التدريب", interactive=False)
with gr.Tab("❓ اسأل الكتاب"):
question = gr.Textbox(label="اكتب سؤالك هنا...")
answer = gr.Textbox(label="الإجابة", interactive=False)
ask_button = gr.Button("✉️ أرسل السؤال!")
train_button.click(process_files, inputs=[upload], outputs=[train_output])
ask_button.click(generate_answer, inputs=[question], outputs=[answer])
demo.launch()