Spaces:
Sleeping
Sleeping
import os | |
import gradio as gr | |
from langchain_community.vectorstores import Chroma | |
from langchain_community.embeddings import HuggingFaceEmbeddings | |
from langchain_community.llms import CTransformers | |
from langchain_community.document_loaders import PyPDFLoader | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
from langchain.chains import RetrievalQA | |
# مسار النموذج المحلي (يمكن تحميله مسبقًا ووضعه في هذا المسار) | |
MODEL_PATH = "TheBloke/Mistral-7B-Instruct-v0.2-GGUF" # استخدم gguf فقط | |
MODEL_FILE = "mistral-7b-instruct-v0.2.Q4_K_M.gguf" | |
def process_pdf_and_answer(pdf_path, question): | |
# تحميل ملف PDF | |
loader = PyPDFLoader(pdf_path) | |
pages = loader.load() | |
# تقسيم النصوص | |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) | |
texts = text_splitter.split_documents(pages) | |
# التضمين باستخدام نموذج مجاني | |
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2") | |
vectorstore = Chroma.from_documents(texts, embedding=embeddings) | |
# إعداد LLM محلي عبر ctransformers | |
llm = CTransformers( | |
model=MODEL_FILE, | |
model_path=MODEL_PATH, | |
model_type="mistral", | |
config={ | |
"max_new_tokens": 512, | |
"temperature": 0.1 | |
} | |
) | |
# بناء سلسلة RAG | |
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=vectorstore.as_retriever(), return_source_documents=True) | |
# الإجابة على السؤال | |
result = qa_chain({"query": question}) | |
return result["result"] | |
# واجهة Gradio | |
with gr.Blocks() as demo: | |
gr.Markdown("## 📄🤖 مساعد PDF الذكي - بدون API") | |
with gr.Row(): | |
file_input = gr.File(label="📥 ملف PDF", type="filepath", file_types=[".pdf"]) | |
question_input = gr.Textbox(label="❓ سؤالك", placeholder="ما هو موضوع الصفحة الأولى؟") | |
output = gr.Textbox(label="📝 الإجابة", lines=10) | |
submit_btn = gr.Button("🔎 استخرج الإجابة") | |
def handle_submit(file, question): | |
if file is None or question.strip() == "": | |
return "يرجى رفع ملف PDF وكتابة سؤال." | |
return process_pdf_and_answer(file, question) | |
submit_btn.click(handle_submit, inputs=[file_input, question_input], outputs=output) | |
# تشغيل التطبيق | |
if __name__ == "__main__": | |
demo.launch() | |