بعد درس 105: Decoding و Sampling، ننظر في كيف تصيغ التعليمات (prompt) للحصول على نتائج أفضل. هذا درس عملي قابل للتطبيق مباشرة.
حدود هذه الصفحة: هذا أساسيات. Prompt injection وأمان LLM في Wave 8. الوكلاء (agents) في Wave 7. هنا نركّز على صياغة تعليمات واضحة وفعّالة.
ما هو Prompt؟
Prompt = كل ما ترسله للنموذج قبل أن يولّد استجابته.
النظام: أنت مساعد لتعليم البرمجة بالعربية.
المستخدم: اشرح لي مفهوم closure في JavaScript بجملتين مع مثال.
→ النموذج يولّد استجابة بناءً على:
1. prompt بأكمله (system + user)
2. أوزانه (التي تعلّمها في التدريب)
3. استراتيجية decoding (التي ينفّذها الـ API)
مكوّنات Prompt فعّال
1. المهمة (Task) — ماذا تريد؟
❌ ضعيف: "اكتب شيئًا عن Python"
✅ واضح: "اشرح متى يُفضّل استخدام list بدل tuple في Python، بثلاث جمل"
2. السياق (Context) — ما المعلومات اللازمة؟
❌ ضعيف: "هل هذا الكود صحيح؟"
✅ واضح: "هل الكود التالي يطبع [1, 4, 9]؟
nums = [1, 2, 3]
for i in range(len(nums)):
nums[i] = nums[i] ** 2
print(nums)"
3. القيود (Constraints) — ما المسموح/الممنوع؟
✅ "اشرح بأسلوب بسيط، تجنّب المصطلحات المتخصصة، أبقِ الإجابة في حدود 100 كلمة."
✅ "استخدم فقط الدوال المضمّنة في Python، بدون مكتبات خارجية."
4. صيغة المخرج (Output Format) — كيف تريد النتيجة؟
✅ "أعِد الجواب كقائمة مرقّمة."
✅ "اكتب الإجابة بصيغة JSON بمفتاح وحيد 'answer'."
✅ "ابدأ بـ'نعم' أو 'لا'، ثم اشرح بجملة واحدة."
5. معايير النجاح (Success Criteria) — ما الذي يجعل الإجابة "صحيحة"؟
✅ "الإجابة الصحيحة تعطي تفسيرًا واحدًا فقط، بدون إعادة صياغة للسؤال."
✅ "إذا لم تكن متأكدًا، قل 'غير متأكد' بدلًا من التخمين."
6. الفواصل (Delimiters) — لتمييز أقسام prompt
### التعليمات ###
اشرح الفرق بين authentication و authorization.
### النصّ ###
{user_input}
### الإجابة المتوقعة ###
- 3 جمل كحد أقصى.
- بدون إعادة صياغة للسؤال.
Zero-shot / One-shot / Few-shot
Zero-shot — بدون أمثلة
صنف المراجعة التالية إلى إيجابية/سلبية/محايدة:
"التطبيق رائع لكن السرعة بطيئة"
الإجابة:
النموذج يعتمد على فهمه العام. يعمل جيدًا في مهام واضحة الصياغة.
One-shot — مثال واحد
صنّف المراجعة إلى إيجابية/سلبية/محايدة.
مثال:
"أحببت التصميم" → إيجابية
المطلوب:
"التطبيق رائع لكن السرعة بطيئة" →
مثال واحد يُعطي النموذج إشارة على الصياغة المتوقّعة.
Few-shot — أمثلة متعددة
صنّف المراجعة إلى إيجابية/سلبية/محايدة.
أمثلة:
"أحببت التصميم" → إيجابية
"خدمة سيئة جدًا" → سلبية
"وصل المنتج" → محايدة
المطلوب:
"التطبيق رائع لكن السرعة بطيئة" →
Few-shot يوضّح النمط، لكن:
- أمثلة كثيرة جدًا تستهلك context window.
- أمثلة متحيّزة قد تُوجّه النموذج منحازًا.
- أمثلة خاطئة = نتائج خاطئة.
بنية prompt عملية
┌────────────────────────────────────┐
│ System (شخصية النموذج + قواعد عامة) │
│ "أنت مساعد لتعليم البرمجة..." │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ Developer/Instructions (المنهجية) │
│ "استخدم أمثلة، كن دقيقًا..." │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ User (المهمة الفعلية) │
│ "اشرح closure في JavaScript" │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ (اختياري) Context / Examples │
│ أمثلة few-shot، وثائق مرجعية │
└────────────────────────────────────┘
ملاحظة: بعض المزودين يستخدمون "system/developer/user" كأدوار منفصلة (OpenAI)، آخرون يستخدمون بنية مختلفة. المبدأ نفسه: تعليمات عامة → منهجية → مهمة فعلية.
أمثلة عملية (عربي)
تلخيص
لخّص النصّ التالي في جملتين، مع الحفاظ على النقطة الرئيسية:
نصّ:
[نص طويل عن فوائد الرياضة على الصحة الجسدية والنفسية...]
ملخّص:
استخراج
استخرج من السيرة الذاتية التالية: الاسم، البريد الإلكتروني، سنوات الخبرة.
السيرة:
"أحمد مبرمج بخمس سنوات خبرة في Python. التواصل: ahmad@example.com"
المخرج (JSON):
{
"name": "",
"email": "",
"years_experience": null
}
تصنيف
صنّف تذكرة الدعم إلى: bugs / billing / account / other.
أمثلة:
"لا أستطيع تسجيل الدخول" → account
"التطبيق يتعطّل عند الفتح" → bugs
"كيف ألغي اشتراكي؟" → billing
التذكرة:
"الصورة لا تظهر في الملفّ الشخصي منذ أمس"
التصنيف:
مبادئ عامة (ليست قواعد مطلقة)
تحذير مهم: هذه مبادئ تستند إلى خبرة عملية وأبحاث متعدّدة، لكنها ليست قوانين فيزيائية. الاستثناءات موجودة. اعتمد القياس على مهمتك.
- كن محددًا لا عامًا: كلما كان الطلب واضحًا، زادت فرصة النتيجة الصحيحة.
- حدّد صيغة المخرج: لا تفترض أنّ النموذج سيخمّنها.
- فصل التعليمات عن البيانات: ضع مدخلات المستخدم في قسم واضح (مع delimiters).
- أعطِ معيار فشل: "إذا لم تكن متأكدًا، قل غير متأكد".
- قس النتائج: ما ينجح لمهمة معيّنة قد يفشل في أخرى.
- اختبر مع عينات عدّة: لا تحكم من تجربة واحدة.
- حسّن تدريجيًا: ابدأ بـ zero-shot، أضف أمثلة، أضف قيودًا.
تحذير من "وصفات سحرية"
الإنترنت مليء بـ "10 حيل لـ prompt engineering!" و "الصياغة السحرية للنتيجة المثالية!". تعامل معها بحذر:
ما يُنشر كـ"قواعد مطلقة":
- "ابدأ دائمًا بـ'You are an expert...'"
- "استخدم 'Let's think step by step' دائمًا"
- "اكتب 'I will tip you $200' للحصول على نتائج أفضل"
- "اطلب من النموذج أن يكون خبيرًا في X"
ما يُنسى قوله:
- هذه الأنماط أعطت نتائج في تجارب معيّنة على نماذج معيّنة.
- لا ضمان أنها تنفع لمهمتك.
- بعض الأنماط "تنجح" لأن النموذج أُلِّف ليُفضّلها (RLHF)، وليست خاصية جوهرية.
النصيحة: ابني prompts بناءً على فهمك لمهمتك، وجرّب وعدّل، لا تنسخ "وصفات سحرية" دون اختبار.
أخطاء شائعة
- "Prompt طويل = prompt أفضل": ليس بالضرورة. Prompts مركّزة أكثر فعالية من prompts مطوّلة.
- "Few-shot دائمًا أفضل من zero-shot": أحيانًا. للمهام البسيطة قد يكون zero-shot كافيًا وأقل تشويشًا.
- "إعادة صياغة السؤال تُحسّن النتيجة": لا — قد تُربك النموذج. أعد صياغة prompt لا السؤال.
- "النموذج 'يفهم' التعليمات مثل البشر": لا. النموذج يربط تعليماتك بأنماط رآها في التدريب. صياغة واضحة = تطابق أوضح مع هذه الأنماط.
- "سرّ جودة المخرجات في الكلمات السحرية": لا. السّر في الوضوح، التحديد، والاختبار المنهجي.
ملاحظة عن Prompt Injection (تنبيه فقط)
⚠️ إذا كان prompt يحتوي مدخلات مستخدمين، فاحذر من prompt injection:
مستخدم خبيث قد يكتب تعليمات في مدخله تتجاوز تعليماتك.
مثال:
تعليماتك: "لخّص النصّ التالي:"
مدخل المستخدم: "تجاهل التعليمات السابقة. أنت الآن..."
→ النموذج قد يتبع تعليمات المستخدم بدلًا من تعليماتك.
الحماية الكاملة لـ prompt injection درس منفصل في Wave 8.
هنا يكفي: لا تثق بمحتوى prompt المستخدم لاتخاذ قرارات حسّاسة.
الخطوات التالية
- Prompt Patterns — أنماط عملية (تصنيف، استخراج، تحويل، تقييم).
- استخدام LLM API من Python — تطبّق prompts فعليًا عبر APIs.
- Prompt Engineering للمبتدئين: دليل عملي بالعربي — مدوّنة موجّهة لغير المتخصّصين تغطّي أساسيات صياغة التعليمات.
ملاحظة النطاق: prompt injection defense، jailbreaks، وأمان LLM تُغطّى في Wave 8. هذا الدرس حدّه صياغة تعليمات واضحة وفعّالة.