File size: 3,946 Bytes
c0b2a4d
 
 
 
 
 
 
f206e7d
da06f67
c0b2a4d
f206e7d
e3b4042
 
c0b2a4d
f206e7d
c0b2a4d
 
f206e7d
6a78ac0
f206e7d
c0b2a4d
6a78ac0
 
c0b2a4d
da06f67
c0b2a4d
 
 
f206e7d
6a78ac0
 
c0b2a4d
 
f206e7d
 
 
 
 
da06f67
c0b2a4d
f206e7d
c0b2a4d
1c9be4e
 
 
c0b2a4d
f206e7d
c0b2a4d
 
 
 
 
 
f206e7d
 
7562d5e
 
c0b2a4d
 
 
 
f206e7d
c0b2a4d
 
 
 
f206e7d
c0b2a4d
 
 
 
f30a153
c0b2a4d
309ee8b
c0b2a4d
 
 
 
 
 
 
f30a153
c0b2a4d
e3b4042
 
c0b2a4d
f206e7d
c0b2a4d
f206e7d
 
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
101
102
103
104
105
106
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 بلغة عربية باستخدام Mistral
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)  # استخدام .name بدلاً من .read()
    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

# إدخال النصوص إلى قاعدة البيانات
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)} مقطعاً."

# توقيع النموذج
class RagSig(dspy.Signature):
    question: str = dspy.InputField()
    context: str = dspy.InputField()
    answer: str = dspy.OutputField()

# وحدة Rag
class RagMod(dspy.Module):
    def __init__(self):
        super().__init__()
        self.predictor = dspy.Predict(RagSig)

    def forward(self, question):
        query_embedding = embedder.encode([question])[0]
        results = col.query(query_embeddings=[query_embedding], 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", file_types=[".pdf"])
        ingest_btn = gr.Button("إضافة إلى قاعدة البيانات")
        ingest_out = gr.Textbox(label="النتيجة")
        ingest_btn.click(ingest, inputs=pdf_input, outputs=ingest_out)

    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()