SYSTEM_PROMPT = """أنت خبير في الشعر النبطي السعودي، تفهم اللهجة والثقافة البدوية بعمق. مهمتك: شرح الأبيات النبطية بدقة ووضوح. قواعد صارمة:1. استخدم القاموس المرجعي لشرح المفردات الصعبة.2. لا تخترع معلومات غير موجودة في البيت أو القاموس.3. لا تذكر أسماء أماكن/قبائل/أحداث إلا إذا وردت صراحة في البيت أو القاموس.4. اتبع هذا الترتيب بدقة تامة: [المفردات] كلمة: معناها. [تحليل البيت] فكك البيت خطوة بخطوة. [السياق الثقافي] معلومة ثقافية عامة صحيحة. [الشرح] إعادة صياغة معنى البيت. [الوصف] English visual description.5. اكتب بالعربية الفصحى فقط، ما عدا [الوصف] فبالإنجليزية.6. إذا لم تكن متأكداً من معلومة، اكتب: "(غير مؤكد)".""" STOPWORDS = { 'في','من','على','إلى','مع','عن','هذا','هذه','اللي','كان', 'ما','لا','أن','إن','هو','هي','هم','ثم','أو','و','ف','ب','ل', 'يا','قد','كل','بعض','غير','بين','عند','اذا','لم','لن', 'له','لها','لهم','به','بها','بهم','منه','منها','منهم', 'هنا','هناك','الا','لكن','حتى','اليا'} def extract_terms(verse, dictionary, max_terms=20): verse_words = set(re.findall(r'\b[\u0600-\u06FF]+\b', verse)) found = {} for term, meaning in dictionary.items(): if term in STOPWORDS or len(term) < 3: continue term_base = term.replace('ال', '', 1) if term.startswith('ال') else term if term in verse_words or term_base in verse_words: found[term] = meaning if len(found) >= max_terms: break return found def build_prompt(verse): verse_clean = verse.replace('اشرح هذا البيت:', '').strip() terms = extract_terms(verse_clean, DICTIONARY) context = "\n".join([f"- {k}: {v}" for k, v in terms.items()]) if terms else "(لا توجد مصطلحات نبطية صعبة في هذا البيت)" return f"""[القاموس المرجعي]{context} [المهمة]اشرح هذا البيت: {verse_clean} [التعليمات]- ارجع للقاموس أعلاه لشرح المفردات.- لا تخترع معلومات.- اتبع الصيغة: [المفردات] [تحليل البيت] [السياق الثقافي] [الشرح] [الوصف]""" def explain_verse(verse, max_tokens=500): if not verse or not verse.strip(): return "⚠️ الرجاء إدخال بيت شعري" user_prompt = build_prompt(verse) messages = [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_prompt}, ] prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=2048).to("cuda") with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=max_tokens, temperature=0.3, top_p=0.9, repetition_penalty=1.15, do_sample=True, pad_token_id=tokenizer.pad_token_id, eos_token_id=tokenizer.eos_token_id, ) return tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True).strip() print("✅ كل الدوال جاهزة")