مستوى المقال: مبتدئ
التعلّم من الأمثلة (Few-Shot): علّم الذكاء الاصطناعي مهمة جديدة بلا تدريب
تقدر تخلّي نموذج زي ChatGPT يتقن مهمة جديدة من غير ما تدرّبه ولا تدفع تكلفة تدريب. الحكاية إنك تديله كام مثال جوّه رسالتك، فيمسك النمط ويكمّل بنفس الطريقة. الاسم العلمي للحكاية دي Few-Shot Learning.
المشكلة باختصار
لو عندك 5000 تذكرة دعم فني كل يوم، وعايز كل واحدة تتصنّف: شكوى، استفسار، أو شكر. تسأل النموذج مباشرة "صنّف النص ده" من غير أمثلة، فبيرجّعلك مرة "شكوى"، ومرة "هذه رسالة سلبية"، ومرة فقرة كاملة. الشكل مش ثابت، فمش عارف تبني عليه أوتوميشن. المشكلة مش في النموذج، المشكلة إنك ما وريتهوش النمط اللي انت عايزه بالظبط.
الفكرة بمثال بسيط قبل أي مصطلحات
تخيّل طفل عمره أربع سنين ماشافش القوائم دي قبل كده. تورّيه ثلاث بطاقات: تفاحة مكتوب جنبها "فاكهة"، جزر مكتوب جنبها "خضار"، موزة مكتوب جنبها "فاكهة". بعدين تديله بطاقة خيار من غير إجابة، فيقول لك "خضار". هو ما أخدش درس ولا حفظ قاعدة. مسك النمط من الثلاث أمثلة بس وطبّقه.
النموذج بيعمل نفس الحاجة بالظبط. الأمثلة اللي بتحطها في رسالتك بتلعب دور البطاقات، والنموذج بيستنتج القاعدة منها لوحده.
يعني إيه Few-Shot علميًا
المصطلح الدقيق هو "التعلّم داخل السياق" (In-Context Learning). الأمثلة بتتحوّل لتوكنز وبتدخل في السياق اللحظي للنموذج. ركز في نقطة مهمة: النموذج هنا ما بيتعلّمش بمعنى إنه يغيّر أوزانه الداخلية (weights). هو بس بيستنتج النمط من النص اللي قدامه في اللحظة دي، وبعد ما الرسالة تخلص بينسى كل حاجة.
في ثلاث حالات حسب عدد الأمثلة: Zero-shot يعني بلا أمثلة، One-shot يعني مثال واحد، وFew-shot يعني من مثالين لخمسة أو أكتر. كل ما وريته أمثلة أوضح وأكثر تنوّعًا، كل ما مسك النمط أحسن.
مثال كود تجرّبه بنفسك
ده برومبت Few-Shot لتصنيف مشاعر جملة. لاحظ إن الأمثلة نفسها جوّه الرسالة، من غير أي تدريب:
from openai import OpenAI
client = OpenAI()
prompt = """صنّف مشاعر الجملة بكلمة واحدة: إيجابي، سلبي، أو محايد.
الجملة: المنتج وصل بسرعة والجودة ممتازة.
التصنيف: إيجابي
الجملة: التطبيق بيقفل معايا كل شوية.
التصنيف: سلبي
الجملة: الطلب اتسلّم الساعة خمسة.
التصنيف: محايد
الجملة: خدمة العملاء ردّت متأخر جدًا وحلّت المشكلة.
التصنيف:"""
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0,
)
print(resp.choices[0].message.content) # المتوقّع: سلبي