Spaces:
Sleeping
Sleeping
| import torch | |
| import gradio as gr | |
| from transformers import AutoTokenizer, AutoModelForCausalLM | |
| from peft import PeftModel | |
| # ========================= | |
| # 1) الإعدادات | |
| # ========================= | |
| BASE_MODEL = "meta-llama/Llama-3.2-1B-Instruct" | |
| ADAPTER_REPO = "Turkiii0/UT-AI-1B" # ← اسم مودلك على HF | |
| DEVICE = "cpu" # CPU مضمون لجميع Spaces المجانية | |
| # ========================= | |
| # 2) تحميل التوكنايزر | |
| # ========================= | |
| tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL, use_fast=True) | |
| if tokenizer.pad_token is None: | |
| tokenizer.pad_token = tokenizer.eos_token | |
| # ========================= | |
| # 3) تحميل Base Model + LoRA | |
| # ========================= | |
| base_model = AutoModelForCausalLM.from_pretrained( | |
| BASE_MODEL, | |
| device_map=None, # CPU فقط | |
| torch_dtype=torch.float32 | |
| ) | |
| model = PeftModel.from_pretrained( | |
| base_model, | |
| ADAPTER_REPO | |
| ) | |
| model.eval() | |
| model.to(DEVICE) | |
| print("✅ Model loaded and ready!") | |
| # ========================= | |
| # 4) نظام المساعد | |
| # ========================= | |
| SYSTEM_PROMPT = ( | |
| "أنت مرشد أكاديمي متخصص في جامعة تبوك. " | |
| "أجب باختصار شديد ودقة عالية حسب الأنظمة الأكاديمية فقط. " | |
| "لا تضيف أي شرح زائد أو معلومات خارج البيانات." | |
| ) | |
| # ========================= | |
| # 5) توليد الإجابة | |
| # ========================= | |
| def generate_answer(user_question: str): | |
| if not user_question.strip(): | |
| return "اكتب سؤالك أولاً." | |
| messages = [ | |
| {"role": "system", "content": SYSTEM_PROMPT}, | |
| {"role": "user", "content": user_question} | |
| ] | |
| prompt = tokenizer.apply_chat_template( | |
| messages, | |
| add_generation_prompt=True, | |
| tokenize=False | |
| ) | |
| inputs = tokenizer( | |
| prompt, | |
| return_tensors="pt", | |
| padding=True, | |
| truncation=True, | |
| max_length=512 | |
| ).to(DEVICE) | |
| with torch.no_grad(): | |
| outputs = model.generate( | |
| **inputs, | |
| max_new_tokens=120, | |
| do_sample=False, | |
| repetition_penalty=1.1, | |
| eos_token_id=tokenizer.eos_token_id, | |
| pad_token_id=tokenizer.pad_token_id | |
| ) | |
| gen_ids = outputs[0][inputs["input_ids"].shape[-1]:] | |
| answer = tokenizer.decode(gen_ids, skip_special_tokens=True).strip() | |
| return " ".join(answer.split()) | |
| # ========================= | |
| # 6) واجهة Gradio | |
| # ========================= | |
| def chat_fn(message, history): | |
| return generate_answer(message) | |
| chat_ui = gr.ChatInterface( | |
| fn=chat_fn, | |
| title="🎓 مرشد جامعة تبوك الأكاديمي", | |
| description="اسأل عن اسم المقرر، متطلبات المقررات، أو عدد الساعات.", | |
| examples=[ | |
| "CIT 1302", | |
| "متطلبات CIT1302", | |
| "كم عدد ساعات CS 322", | |
| "اسم مقرر CIT 1401" | |
| ] | |
| ) | |
| if __name__ == "__main__": | |
| chat_ui.launch() | |