File size: 4,843 Bytes
5f2fd70
 
 
 
3263bed
8df3bfc
6805517
5f2fd70
8df3bfc
 
 
25b7ae1
68394e4
6805517
5f2fd70
 
448c445
 
 
8df3bfc
448c445
8df3bfc
 
448c445
 
5f2fd70
25b7ae1
 
 
68394e4
 
25b7ae1
8df3bfc
25b7ae1
5f2fd70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9c4411c
5f2fd70
 
 
 
8df3bfc
 
25b7ae1
8df3bfc
25b7ae1
 
 
 
 
8df3bfc
5f2fd70
25b7ae1
9c4411c
5f2fd70
25b7ae1
 
 
 
 
 
 
 
 
 
5f2fd70
25b7ae1
 
8df3bfc
5f2fd70
25b7ae1
 
5f2fd70
25b7ae1
5f2fd70
25b7ae1
8df3bfc
25b7ae1
5f2fd70
1a24301
5f2fd70
 
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
107
108
109
110
111
112
113
114
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
from fastapi.middleware.cors import CORSMiddleware
import logging
from huggingface_hub import HfFolder

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)



app = FastAPI()

# Enable CORS
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Allow all origins (replace with your frontend URL in production)
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Load your fine-tuned model and tokenizer
MODEL_NAME = "aubmindlab/aragpt2-medium"

try:
    tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
    model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
except Exception as e:
    logger.error(f"Failed to load model or tokenizer: {str(e)}")
    raise RuntimeError(f"Failed to load model or tokenizer: {str(e)}")

# Define the general prompt template
general_prompt_template = """
أنت الآن نموذج لغة مخصص لتوليد نصوص عربية تعليمية بناءً على المادة والمستوى التعليمي. سيتم إعطاؤك مادة تعليمية ومستوى تعليمي، وعليك إنشاء نص مناسب بناءً على ذلك. النص يجب أن يكون:
1. واضحًا وسهل الفهم.
2. مناسبًا للمستوى التعليمي المحدد.
3. مرتبطًا بالمادة التعليمية المطلوبة.
4. قصيرًا ومباشرًا.

### أمثلة:
1. المادة: العلوم
   المستوى: الابتدائي
   النص: النباتات كائنات حية تحتاج إلى الماء والهواء وضوء الشمس لتنمو. بعض النباتات تنتج أزهارًا وفواكه. النباتات تساعدنا في الحصول على الأكسجين.

2. المادة: التاريخ
   المستوى: المتوسط
   النص: التاريخ هو دراسة الماضي وأحداثه المهمة. من خلال التاريخ، نتعلم عن الحضارات القديمة مثل الحضارة الفرعونية والحضارة الإسلامية. التاريخ يساعدنا على فهم تطور البشرية.

3. المادة: الجغرافيا
   المستوى: المتوسط
   النص: الجغرافيا هي دراسة الأرض وخصائصها. نتعلم عن القارات والمحيطات والجبال. الجغرافيا تساعدنا على فهم العالم من حولنا.

---

المادة: {المادة}
المستوى: {المستوى}

اكتب نصًا مناسبًا بناءً على المادة والمستوى المحددين. ركّز على جعل النص بسيطًا وواضحًا للمستوى المطلوب.
"""

class GenerateRequest(BaseModel):
    المادة: str
    المستوى: str

@app.post("/generate")
def generate_text(request: GenerateRequest):
    المادة = request.المادة
    المستوى = request.المستوى

    logger.info(f"Received request: المادة={المادة}, المستوى={المستوى}")

    if not المادة or not المستوى or not isinstance(المادة, str) or not isinstance(المستوى, str):
        logger.error("المادة والمستوى مطلوبان ويجب أن يكونا نصًا.")
        raise HTTPException(status_code=400, detail="المادة والمستوى مطلوبان ويجب أن يكونا نصًا.")

    try:
        # Format the prompt with user inputs
        arabic_prompt = general_prompt_template.format(المادة=المادة, المستوى=المستوى)
        logger.info(f"Formatted prompt: {arabic_prompt}")

        # Tokenize the prompt
        inputs = tokenizer(arabic_prompt, return_tensors="pt", max_length=1024, truncation=True)

        # Generate text
        with torch.no_grad():
            outputs = model.generate(
                inputs.input_ids,
                max_length=300,
                num_return_sequences=1,
                temperature=0.1,
                top_p=0.9,
                do_sample=True,
            )

        # Decode the generated text
        generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
        logger.info(f"Generated text: {generated_text}")

        # Remove the prompt from the generated text
        generated_text = generated_text.replace(arabic_prompt, "").strip()

        return {"generated_text": generated_text}

    except Exception as e:
        logger.error(f"Error during text generation: {str(e)}")
        raise HTTPException(status_code=500, detail=f"Error during text generation: {str(e)}")

@app.post("/")
def read_root():
    return {"message": "Welcome to the Arabic Text Generation API!"}