import re SYSTEM_PROMPT = """أنت خبير في الشعر النبطي السعودي. قواعد:1. استخدم القاموس لشرح المفردات الصعبة.2. لا تخترع معلومات غير موجودة في البيت أو القاموس.3. اتبع الترتيب بدقة: [المفردات] كلمة: معناها. [تحليل البيت] فكك البيت خطوة بخطوة. [السياق الثقافي] معلومة ثقافية عامة صحيحة. [الشرح] إعادة صياغة معنى البيت. [الوصف] English visual description.4. اكتب بالعربية فقط، ما عدا [الوصف] فبالإنجليزية.""" 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): 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() # مثالresult = explain_verse("مع صحصح كنه قفا الترس مقلوب")print(result)