commit
Browse files
app.py
CHANGED
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import FastAPI, HTTPException
|
2 |
+
from pydantic import BaseModel
|
3 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM
|
4 |
+
import torch
|
5 |
+
|
6 |
+
app = FastAPI()
|
7 |
+
|
8 |
+
# Load your fine-tuned model and tokenizer
|
9 |
+
MODEL_NAME = "'aubmindlab/aragpt2-medium'"
|
10 |
+
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
|
11 |
+
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
|
12 |
+
|
13 |
+
# Define the general prompt template
|
14 |
+
general_prompt_template = """
|
15 |
+
أنت الآن نموذج لغة مخصص لتوليد نصوص عربية تعليمية بناءً على المادة والمستوى التعليمي. سيتم إعطاؤك مادة تعليمية ومستوى تعليمي، وعليك إنشاء نص مناسب بناءً على ذلك. النص يجب أن يكون:
|
16 |
+
1. واضحًا وسهل الفهم.
|
17 |
+
2. مناسبًا للمستوى التعليمي المحدد.
|
18 |
+
3. مرتبطًا بالمادة التعليمية المطلوبة.
|
19 |
+
4. قصيرًا ومباشرًا.
|
20 |
+
|
21 |
+
### أمثلة:
|
22 |
+
1. المادة: العلوم
|
23 |
+
المستوى: الابتدائي
|
24 |
+
النص: النباتات كائنات حية تحتاج إلى الماء والهواء وضوء الشمس لتنمو. بعض النباتات تنتج أزهارًا وفواكه. النباتات تساعدنا في الحصول على الأكسجين.
|
25 |
+
|
26 |
+
2. المادة: التاريخ
|
27 |
+
المستوى: المتوسط
|
28 |
+
النص: التاريخ هو دراسة الماضي وأحداثه المهمة. من خلال التاريخ، نتعلم عن الحضارات القديمة مثل الحضارة الفرعونية والحضارة الإسلامية. التاريخ يساعدنا على فهم تطور البشرية.
|
29 |
+
|
30 |
+
3. المادة: الجغرافيا
|
31 |
+
المستوى: المتوسط
|
32 |
+
النص: الجغرافيا هي دراسة الأرض وخصائصها. نتعلم عن القارات والمحيطات والجبال. الجغرافيا تساعدنا على فهم العالم من حولنا.
|
33 |
+
|
34 |
+
---
|
35 |
+
|
36 |
+
المادة: {المادة}
|
37 |
+
المستوى: {المستوى}
|
38 |
+
|
39 |
+
اكتب نصًا مناسبًا بناءً على المادة والمستوى المحددين. ركّز على جعل النص بسيطًا وواضحًا للمستوى المطلوب.
|
40 |
+
"""
|
41 |
+
|
42 |
+
class GenerateRequest(BaseModel):
|
43 |
+
المادة: str
|
44 |
+
المستوى: str
|
45 |
+
|
46 |
+
@app.post("/generate")
|
47 |
+
def generate_text(request: GenerateRequest):
|
48 |
+
المادة = request.المادة
|
49 |
+
المستوى = request.المستوى
|
50 |
+
|
51 |
+
if not المادة or not المستوى:
|
52 |
+
raise HTTPException(status_code=400, detail="المادة والمستوى مطلوبان.")
|
53 |
+
|
54 |
+
# Format the prompt with user inputs
|
55 |
+
arabic_prompt = general_prompt_template.format(المادة=المادة, المستوى=المستوى)
|
56 |
+
|
57 |
+
# Tokenize the prompt
|
58 |
+
inputs = tokenizer(arabic_prompt, return_tensors="pt", max_length=512, truncation=True)
|
59 |
+
|
60 |
+
# Generate text
|
61 |
+
with torch.no_grad():
|
62 |
+
outputs = model.generate(
|
63 |
+
inputs.input_ids,
|
64 |
+
max_length=300, # Adjust as needed
|
65 |
+
num_return_sequences=1,
|
66 |
+
temperature=0.1, # Adjust for creativity
|
67 |
+
top_p=0.9, # Adjust for diversity
|
68 |
+
do_sample=True,
|
69 |
+
)
|
70 |
+
|
71 |
+
# Decode the generated text
|
72 |
+
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
73 |
+
|
74 |
+
# Remove the prompt from the generated text
|
75 |
+
generated_text = generated_text.replace(arabic_prompt, "").strip()
|
76 |
+
|
77 |
+
return {"generated_text": generated_text}
|
78 |
+
|
79 |
+
@app.get("/")
|
80 |
+
def read_root():
|
81 |
+
return {"message": "Welcome to the Arabic Text Generation API!"}
|