Spaces:
Build error
Build error
File size: 3,759 Bytes
c0b2a4d 5b52fc9 da06f67 c0b2a4d 5b52fc9 e3b4042 c0b2a4d 5b52fc9 c0b2a4d 5b52fc9 6a78ac0 c0b2a4d 6a78ac0 c0b2a4d da06f67 c0b2a4d 5b52fc9 6a78ac0 c0b2a4d da06f67 c0b2a4d 6a78ac0 c0b2a4d 1c9be4e c0b2a4d 7562d5e c0b2a4d 7562d5e c0b2a4d 5b52fc9 c0b2a4d 5b52fc9 c0b2a4d f30a153 c0b2a4d 309ee8b c0b2a4d f30a153 c0b2a4d e3b4042 c0b2a4d e3b4042 c0b2a4d da06f67 c0b2a4d e3b4042 c0b2a4d da06f67 c0b2a4d |
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
import dspy, gradio as gr
import chromadb
import fitz # PyMuPDF
from sentence_transformers import SentenceTransformer
import json
from dspy import Example, MIPROv2, Evaluate, evaluate
# إعداد نموذج مفتوح المصدر
dspy.settings.configure(lm=dspy.LM("mistralai/Mistral-7B-Instruct-v0.2"))
# إعداد Chroma بطريقة حديثة
client = chromadb.PersistentClient(path="./chroma_db")
col = client.get_or_create_collection(name="arabic_docs")
# نموذج توليد embeddings يدعم العربية
embedder = SentenceTransformer("sentence-transformers/LaBSE")
# تقطيع النصوص من PDF
def process_pdf(pdf_file):
doc = fitz.open(pdf_file.name)
texts = []
for page in doc:
text = page.get_text()
for chunk in text.split("\n\n"):
if len(chunk.strip()) > 50:
texts.append(chunk.strip())
return texts
# إدخال النصوص في قاعدة Chroma
def ingest(pdf_file):
texts = process_pdf(pdf_file)
embeddings = embedder.encode(texts, show_progress_bar=True)
for i, (chunk, emb) in enumerate(zip(texts, embeddings)):
col.add(ids=[f"chunk_{i}"], embeddings=[emb.tolist()], metadatas=[{"text": chunk}])
return f"✅ تمت إضافة {len(texts)} مقطعاً."
# تعريف التوقيع باستخدام InputField و OutputField
class RagSig(dspy.Signature):
question: str = dspy.InputField()
context: str = dspy.InputField()
answer: str = dspy.OutputField()
# وحدة DSPy مع استرجاع السياق من Chroma داخل forward
class RagMod(dspy.Module):
def __init__(self):
super().__init__()
self.predictor = dspy.Predict(RagSig)
def forward(self, question):
results = col.query(question, n_results=1)
context_list = [m["text"] for m in results["metadatas"]]
context = context_list[0] if context_list else ""
return self.predictor(question=question, context=context)
model = RagMod()
# توليد إجابة
def answer(question):
out = model(question)
return out.answer
# تحميل بيانات تدريب/تقييم
def load_dataset(path):
with open(path, "r", encoding="utf-8") as f:
return [Example(**json.loads(l)).with_inputs("question") for l in f]
# تحسين النموذج باستخدام MIPROv2
def optimize(train_file, val_file):
global model
trainset = load_dataset(train_file.name)
valset = load_dataset(val_file.name)
tp = MIPROv2(metric=evaluate.answer_exact_match, auto="light", num_threads=4)
optimized = tp.compile(model, trainset=trainset, valset=valset)
model = optimized
return "✅ تم تحسين النموذج!"
# واجهة Gradio
with gr.Blocks() as demo:
gr.Markdown("## 🧠 نظام RAG عربي باستخدام DSPy + نموذج مفتوح المصدر")
with gr.Tab("📥 تحميل وتخزين"):
pdf_input = gr.File(label="ارفع ملف PDF")
ingest_btn = gr.Button("إضافة إلى قاعدة البيانات")
ingest_btn.click(ingest, inputs=pdf_input, outputs=gr.Textbox())
with gr.Tab("❓ سؤال"):
q = gr.Textbox(label="اكتب سؤالك بالعربية")
answer_btn = gr.Button("احصل على الإجابة")
out = gr.Textbox(label="الإجابة")
answer_btn.click(answer, inputs=q, outputs=out)
with gr.Tab("⚙️ تحسين النموذج"):
train_file = gr.File(label="trainset.jsonl")
val_file = gr.File(label="valset.jsonl")
opt_btn = gr.Button("ابدأ التحسين")
result = gr.Textbox(label="نتيجة التحسين")
opt_btn.click(optimize, inputs=[train_file, val_file], outputs=result)
demo.launch()
|