File size: 2,544 Bytes
a503e7e
 
 
 
b22c352
a503e7e
 
 
 
b22c352
 
 
a503e7e
 
 
 
 
 
 
 
 
 
b22c352
a503e7e
 
 
b22c352
 
 
 
 
 
 
 
 
 
a503e7e
b22c352
a503e7e
 
b22c352
a503e7e
b22c352
a503e7e
 
 
b22c352
 
a503e7e
b22c352
 
a503e7e
b22c352
a503e7e
 
 
 
 
 
 
 
b22c352
a503e7e
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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()