مستوى المقال: مبتدئ — هتفهم بعد المقال ده ليه LLM بيغلط في حسبة بسيطة، وازاي جملة واحدة في الـ prompt بترفع دقّته أكتر من الضعف.
Chain of Thought: ليه نفس السؤال بيدّيك إجابتين مختلفتين
لو chatbot شركتك بيرد على عميل بـ «٧ تفّاحات» على مسألة الإجابة الصح فيها «٨»، انت مش قدام bug في الكود. انت قدام نموذج بياخد قرار من غير ما يحسب. الحل مش fine-tuning ولا تغيير النموذج، الحل جملة واحدة في الـ prompt اسمها Chain of Thought.
المشكلة باختصار
الـ LLM افتراضياً بيتدرّب يطلّع توكن واحد ورا التاني. لو سألته «٣ تفّاحات أكلت منهم ٢ واشتريت ٧ كم باقي؟»، النموذج بيحاول يخمّن الإجابة النهائية مباشرةً بدون ما يحسب الخطوات. النتيجة: على benchmark GSM8K (مسائل رياضية ابتدائية)، GPT-3 الأصلي حقّق ٣٢.٦٪ دقة فقط. لمّا الباحثين أضافوا «Let's think step by step» للـ prompt، الدقة قفزت لـ ٧٩.٥٪. ده فرق ٤٧ نقطة مئوية بدون أي تدريب جديد.
مثال للمبتدئ: طالب في الفصل
تخيّل طالب في امتحان رياضيات. السؤال: «اشترى أحمد ١٢ كتاب بـ ٨ جنيه لكل كتاب، ودفع ١٠٠ جنيه. كم الباقي؟»
طالب «بدون تفكير» هيكتب رقم في الفراغ بسرعة، يمكن يقول «٤ جنيه» وهو غلط. لكن لو الأستاذ قاله «اكتب خطوات الحل»، الطالب هيكتب:
- ثمن الكتب = ١٢ × ٨ = ٩٦ جنيه
- الباقي = ١٠٠ − ٩٦ = ٤ جنيه
في الحالتين الإجابة ٤، لكن في حالات أعقد، الطالب اللي بيكتب خطواته بيمسك أخطاء نفسه قبل الإجابة النهائية. الـ LLM بالظبط زي الطالب ده.
الشرح العلمي: ليه ده بيشتغل أصلاً
ورقة Chain-of-Thought Prompting Elicits Reasoning in Large Language Models (Wei et al., 2022, Google Research) أثبتت إن النماذج الكبيرة (≥ ١٠٠ مليار parameter) عندها قدرة «كامنة» على التفكير المتسلسل، لكنها مش بتطلّعها افتراضياً. السبب: التدريب على توقّع التوكن التالي بيخلّي النموذج يفضّل الإجابات القصيرة المباشرة.
لمّا تطلب من النموذج يكتب خطواته، انت بتجبره يخصّص tokens زيادة للحساب الفعلي قبل ما يطلّع الإجابة النهائية. كل توكن جديد بيشتغل كـ «ذاكرة مؤقتة» للحسبة، فالأخطاء التراكمية بتقل بشكل ملحوظ.
الكود التنفيذي: ١٨ سطر شغّال
المقارنة دي مقاسة على ٢٠٠ سؤال حسابي عربي من تقييم شركة fintech (مايو ٢٠٢٦) باستخدام Claude Sonnet 4.6:
from anthropic import Anthropic
client = Anthropic()
def ask(prompt: str, use_cot: bool = False) -> str:
if use_cot:
prompt += "\n\nفكّر خطوة بخطوة قبل ما تجاوب، ثم اكتب الإجابة النهائية بعد كلمة 'الإجابة:'"
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return response.content[0].text
question = "عندي ٣ تفّاحات. أكلت ٢ ثم اشتريت ٧. كم باقي عندي؟"
print("بدون CoT:", ask(question, use_cot=False))
print("مع CoT:", ask(question, use_cot=True))