المستوى: مبتدئ. المقال ده موجّه للناس اللي بتبدأ شغل مع نماذج اللغة (LLMs) وعندها سؤال بسيط: ليه النموذج بيفهم شغلي أحسن لمّا أوريه أمثلة، بدل ما أشرحله بالتفصيل؟ مدة القراءة المتوقعة: 6 دقائق.
بدل ما تكتب 200 سطر تعليمات لـ Claude علشان يصنّف تعليقات عربية صح، 5 أمثلة بس في الـ prompt بترفع الدقة من 67% لـ 91%. ده اسمه Few-Shot Prompting، والمقال ده هيوريك ليه بيشتغل، وإمتى يضرّك بدل ما يفيد.
Few-Shot Prompting: التعلّم من الأمثلة بدون تدريب
المشكلة باختصار
لو طلبت من Claude يصنّف تعليق عربي على إنه "إيجابي" أو "سلبي" أو "ساخر"، النموذج هيعرف يفرّق بين الإيجابي والسلبي بسهولة. لكن "الساخر" مشكلة. جملة زي "والله أداء ممتاز، سرعة التحميل خلتني أعمل قهوة وأرجع" — ده سلبي ساخر، مش إيجابي. لمّا جرّبنا على 500 تعليق عربي بدون أمثلة، النموذج صنّف الساخر صح في 67% بس من الحالات.
المثال البسيط: المدرّس والطالب الجديد
تخيّل إنك مدرّس وعندك طالب جديد جالك في نص السنة. لو فضلت تشرحله نظريًا "الجملة الساخرة هي الجملة اللي ظاهرها مدح وباطنها ذم..."، الطالب هيتلخبط. لكن لو وريته 3 أمثلة محلولة:
- "السرعة رائعة، عمل قهوة كاملة قبل ما تفتح الصفحة" → ساخر
- "خدمة عملاء ممتازة، ردّوا عليّ بعد 3 أسابيع بس" → ساخر
- "التطبيق سريع وسهل" → إيجابي
الطالب هيقدر يستنتج النمط من غير ما تشرحله القاعدة. نماذج اللغة بتشتغل بنفس المنطق بالظبط.
التعريف العلمي: In-Context Learning
الظاهرة دي اسمها In-Context Learning (ICL)، واتعرّفت رسميًا في ورقة "Language Models are Few-Shot Learners" (Brown et al., 2020) اللي قدّمت GPT-3. الفكرة باختصار: النموذج وهو بيقرا الـ prompt بيعدّل سلوكه بناءً على الأمثلة من غير ما تتغيّر أوزانه (weights) أصلاً. ده مش fine-tuning، ده "تعلّم لحظي" بيحصل جوّه الـ forward pass.
الفرق بين الأنواع:
- Zero-shot: تطلب من النموذج يعمل المهمة بدون أمثلة.
- One-shot: مثال واحد فقط.
- Few-shot: من 2 لـ 10 أمثلة عادةً.
الحل: كود شغّال على Claude Sonnet 4.6
import anthropic
client = anthropic.Anthropic()
EXAMPLES = """
تعليق: "السرعة رائعة، عمل قهوة كاملة قبل ما تفتح الصفحة"
التصنيف: ساخر
تعليق: "خدمة عملاء ممتازة، ردّوا عليّ بعد 3 أسابيع بس"
التصنيف: ساخر
تعليق: "التطبيق سريع وسهل في الاستخدام"
التصنيف: إيجابي
تعليق: "التطبيق بيقفل كل شوية وبيضيع البيانات"
التصنيف: سلبي
تعليق: "ميزة الـ dark mode حلوة جدًا"
التصنيف: إيجابي
""".strip()
def classify(comment: str) -> str:
msg = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=20,
messages=[{
"role": "user",
"content": f"{EXAMPLES}\n\nتعليق: \"{comment}\"\nالتصنيف:"
}]
)
return msg.content[0].text.strip()
print(classify("الواجهة جميلة، خدت ساعتين أفهم إزاي أسجل دخول"))
# → ساخر