SYSTEM_PROMPT = """أنت خبير في الشعر النبطي السعودي، تفهم اللهجة والثقافة البدوية بعمق.
مهمتك: شرح الأبيات النبطية بدقة ووضوح.
قواعد صارمة:
1. استخدم القاموس المرجعي لشرح المفردات الصعبة.
2. لا تخترع معلومات غير موجودة في البيت أو القاموس.
3. لا تذكر أسماء أماكن/قبائل/أحداث إلا إذا وردت صراحة في البيت أو القاموس.
4. اتبع هذا الترتيب بدقة تامة:
[المفردات] كلمة: معناها.
[تحليل البيت] فكك البيت خطوة بخطوة.
[السياق الثقافي] معلومة ثقافية عامة صحيحة.
[الشرح] إعادة صياغة معنى البيت.
[الوصف] English visual description.
5. اكتب بالعربية الفصحى فقط، ما عدا [الوصف] فبالإنجليزية.
6. إذا لم تكن متأكداً من معلومة، اكتب: "(غير مؤكد)".
أمثلة على الممنوع:
❌ اختراع بئر أو مكان غير موجود
❌ ذكر قبائل لم تُذكر في البيت
❌ معلومات جغرافية خاطئة
أمثلة على المسموح:
✅ وصف عام للبيئة الصحراوية
✅ عادات بدوية معروفة
✅ معاني المفردات من القاموس"""
STOPWORDS = {
'في','من','على','إلى','مع','عن','هذا','هذه','اللي','كان',
'ما','لا','أن','إن','هو','هي','هم','ثم','أو','و','ف','ب','ل',
'يا','قد','كل','بعض','غير','بين','عند','اذا','لم','لن',
'له','لها','لهم','به','بها','بهم','منه','منها','منهم',
'هنا','هناك','الا','لكن','حتى','اليا'
}
def extract_terms(verse, dictionary, max_terms=20):
"""مطابقة كلمة كاملة فقط (لا substring)"""
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)