Spaces:
Sleeping
Sleeping
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()
|