Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,81 +1,72 @@
|
|
| 1 |
import os
|
| 2 |
-
import requests
|
| 3 |
import gradio as gr
|
|
|
|
| 4 |
|
| 5 |
-
# --- إعداد API ---
|
| 6 |
-
API_KEY = os.environ.get("MISTRAL_API_KEY")
|
| 7 |
|
| 8 |
-
|
| 9 |
-
|
|
|
|
| 10 |
|
| 11 |
-
API_URL = "https://api.mistral.ai/v1/chat/completions"
|
| 12 |
|
| 13 |
-
|
| 14 |
-
# --- توليد السؤال ---
|
| 15 |
def generate_question(text):
|
| 16 |
|
| 17 |
-
if not text.strip():
|
| 18 |
-
return "يرجى إدخال نص"
|
| 19 |
-
|
| 20 |
prompt = f"""
|
| 21 |
-
|
| 22 |
|
| 23 |
-
|
| 24 |
-
Generate ONE comprehensive question that covers the main idea of the text.
|
| 25 |
|
| 26 |
-
|
| 27 |
-
- Maximum 25 words
|
| 28 |
-
- One sentence only
|
| 29 |
-
- No repetition
|
| 30 |
-
- No explanation
|
| 31 |
-
- Use clear Modern Standard Arabic
|
| 32 |
-
- The question should start with: "ما" or "كيف"
|
| 33 |
|
| 34 |
-
|
| 35 |
-
{text}
|
| 36 |
|
| 37 |
-
|
| 38 |
-
|
|
|
|
|
|
|
|
|
|
| 39 |
|
| 40 |
-
|
| 41 |
-
"Authorization": f"Bearer {API_KEY}",
|
| 42 |
-
"Content-Type": "application/json"
|
| 43 |
-
}
|
| 44 |
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
|
|
|
|
|
|
| 52 |
|
| 53 |
try:
|
| 54 |
-
response =
|
| 55 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
|
| 57 |
-
return
|
| 58 |
|
| 59 |
except Exception as e:
|
| 60 |
-
return f"
|
| 61 |
|
| 62 |
|
| 63 |
-
#
|
| 64 |
demo = gr.Interface(
|
| 65 |
fn=generate_question,
|
| 66 |
-
inputs=
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
|
|
|
| 71 |
outputs=gr.Textbox(
|
| 72 |
-
lines=
|
| 73 |
-
label="
|
| 74 |
),
|
| 75 |
-
title="
|
| 76 |
-
description="
|
| 77 |
)
|
| 78 |
|
| 79 |
-
|
| 80 |
-
if __name__ == "__main__":
|
| 81 |
-
demo.launch()
|
|
|
|
| 1 |
import os
|
|
|
|
| 2 |
import gradio as gr
|
| 3 |
+
from mistralai.client import Mistral
|
| 4 |
|
|
|
|
|
|
|
| 5 |
|
| 6 |
+
api_key = os.environ["MISTRAL_API_KEY"]
|
| 7 |
+
client = Mistral(api_key=api_key)
|
| 8 |
+
model_name = "mistral-small-latest"
|
| 9 |
|
|
|
|
| 10 |
|
|
|
|
|
|
|
| 11 |
def generate_question(text):
|
| 12 |
|
|
|
|
|
|
|
|
|
|
| 13 |
prompt = f"""
|
| 14 |
+
بصفتك خبيراً في هندسة المحتوى التعليمي، حلل النص المرفق وصغ "سؤالاً جوهرياً واحداً" يمثل الهيكل العظمي للمعلومات الواردة، بحيث يكون هو حجر الزاوية لعملية التسميع. التزم بالقواعد المنطقية التاليبصفتك خبيراً في هندسة المحتوى التعليمي، قم بتحليل النص المرفق وصياغة سؤال جوهري واحد للتسميع. اتبع الخطوات التالية بدقة:
|
| 15 |
|
| 16 |
+
الخطوة الأولى: التحليل والربط
|
|
|
|
| 17 |
|
| 18 |
+
ابحث عن المفهوم الشامل والرابط الموضوعي بين الأجزاء.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
+
حدد العلاقة بين "الماهية/البنية" (لماذا وجد؟) و"الأثر/الوظيفة" (ماذا فعل؟).
|
|
|
|
| 21 |
|
| 22 |
+
الخطوة الثانية: صياغة السؤال (بناءً على معايير صارمة)
|
| 23 |
+
|
| 24 |
+
يجب أن يمنع السؤال السرد المباشر ويحفز التركيب الذهني.
|
| 25 |
+
|
| 26 |
+
يجب أن يعمل كـ "مظلة" تغطي 90% من النص بما في ذلك الأسباب البنيوية الدقيقة.
|
| 27 |
|
| 28 |
+
الخطوة الثالثة: النقد الذاتي (قبل العرض)
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
+
راجع السؤال الناتج: هل سأضطر عند الإجابة عليه لذكر (أصغر تفصيل بنيوي) ورد في النص؟
|
| 31 |
+
|
| 32 |
+
إذا كان هناك معلومة (مثل أصبغة معينة أو مادة كيميائية) لن يضطر المتعلم لذكرها، أعد صياغة السؤال ليتضمنها.
|
| 33 |
+
|
| 34 |
+
الآن، صغ السؤال النهائي ثم اشرح لي باختصار كيف يضمن هذا السؤال استرجاع كافة تفاصيل النص.
|
| 35 |
+
إليك النص: {text}
|
| 36 |
+
التزم فقط بالحقائق الواردة في النص، ولا تطلب في السؤال تفسيرات وظيفية أو علمية ما لم تكن مذكورة صراحة في الفقرة.
|
| 37 |
+
السؤال:
|
| 38 |
+
"""
|
| 39 |
|
| 40 |
try:
|
| 41 |
+
response = client.chat.complete(
|
| 42 |
+
model=model_name,
|
| 43 |
+
messages=[
|
| 44 |
+
{"role": "user", "content": prompt}
|
| 45 |
+
],
|
| 46 |
+
temperature=0.3
|
| 47 |
+
)
|
| 48 |
|
| 49 |
+
return response.choices[0].message.content
|
| 50 |
|
| 51 |
except Exception as e:
|
| 52 |
+
return f"حدث خطأ: {e}"
|
| 53 |
|
| 54 |
|
| 55 |
+
# Gradio UI
|
| 56 |
demo = gr.Interface(
|
| 57 |
fn=generate_question,
|
| 58 |
+
inputs=[
|
| 59 |
+
gr.Textbox(
|
| 60 |
+
lines=10,
|
| 61 |
+
label="الفقرة"
|
| 62 |
+
)
|
| 63 |
+
],
|
| 64 |
outputs=gr.Textbox(
|
| 65 |
+
lines=14,
|
| 66 |
+
label="السؤال المولد"
|
| 67 |
),
|
| 68 |
+
title="مولد الأسئلة العربية باستخدام Mistral Nemo",
|
| 69 |
+
description="أدخل عنوان الدرس والفقرة وسيتم توليد سؤال شامل."
|
| 70 |
)
|
| 71 |
|
| 72 |
+
demo.launch()
|
|
|
|
|
|