الوحدة 4 — سلسلة التفكير وتفكيك الخطوات
انتهت الوحدة السابقة إلى تعليمة few-shot صلبة تُنتج JSON مقبولًا. لكن في المهامّ التي تستوجب استنتاجًا في عدّة خطوات — تصنيف رسالة مركّبة، أو حساب استعجال من عدّة إشارات متضاربة — يظلّ النموذج يخطئ في نحو 6% من الحالات. تفتح هذه الوحدة أداة تُصلح كثيرًا من هذه الأخطاء، وأخرى لا يجب استعمالها في كلّ مكان.
سلسلة التفكير: الفكرة والصياغة الأصلية
سلسلة التفكير (chain-of-thought) هي أن نطلب من النموذج أن يكتب استدلاله المتوسّط قبل أن يعطي الجواب. الحدس هو أنّ توليد الجَتونات المتوسّطة يعمل عمل «فسحة حسابية» للنموذج: كلّ جَتون مُنتَج يصير مُدخَلًا للجَتون التالي، فتُتاح فرصة للتصحيح في الوقت الحقيقي.
الصياغة الأصلية التي نشرها Wei وزملاؤه سنة 2022 بسيطة إلى حدّ صادم:
prompt = """المُدخَل: عمر ليلى نصف عمر أحمد، وأحمد أكبر بعشر سنوات من ياسمين
البالغة 12 سنة. كم عمر ليلى؟
دعنا نُفكِّر خطوة خطوة.
"""
الجملة السحرية الأخيرة كافية في كثير من الحالات لتحويل نموذج يخطئ في المسألة إلى نموذج يحلّها بنجاح. النموذج يكتب: «ياسمين 12، إذن أحمد 22، إذن ليلى 11»، ويصل إلى الإجابة الصحيحة.
متى تنفع فعلًا ومتى لا
سلسلة التفكير ليست دواءً عامًّا. البحث المنهجي أظهر أنّها تُساعد على المهامّ الاستدلالية: حساب، ومسائل منطقيّة، وبرامج قصيرة، ومهامّ تحوي عدّة خطوات ترابطية. أمّا في المهامّ الاستذكارية أو التصنيفية البسيطة — «ما عاصمة اليابان؟»، «هذه الرسالة استعجالية أم لا؟» — فقد تُنقص الدقّة لأنّها تفتح الباب لهلوسة استدلال زائف يُبرِّر جوابًا خاطئًا.
القاعدة العملية: لا تُضِف سلسلة التفكير إلّا حين يكون في المهمّة استنتاج فعلي. وحين تشكّ، قِس. الوحدة 9 ستُعلِّمك كيف تُقارن نسختين من التعليمة على نفس جملة الاختبار.
الاستخراج المنظَّم مع سلسلة التفكير: مشكلة الشكل
في الفيل الأحمر، نريد JSON صافيًا. لكن إن قلنا للنموذج «فكِّر خطوة خطوة»، سيكتب فقرات من الاستدلال ثمّ JSON، ويكسر التحليل الآلي. الحلّ الأصلي هو حقل مُتوسِّط في JSON نفسه:
from openai import OpenAI
import json
client = OpenAI()
SYSTEME = """أنت مساعد استخراج بيانات لخدمة عملاء تجارة إلكترونية.
تُعيد JSON بالحقول: reasoning, sujet, produit, urgence, action.
- reasoning: جملة أو جملتان تشرحان كيف استنتجتَ الحقول (بالعربية).
- sujet ∈ {retard, defaut, facture, autre}
- urgence ∈ {faible, moyenne, haute}
- produit: نصّ أو null
- action: جملة قصيرة أو null
قِس الاستعجال من إشارتين: كلمات صريحة (عاجل، فورًا، اليوم)
وقيود زمنية (قبل الجمعة، منذ أسبوعين).
"""
def extraire(email: str) -> dict:
r = client.chat.completions.create(
model="gpt-4o-mini",
temperature=0,
response_format={"type": "json_object"},
messages=[
{"role": "system", "content": SYSTEME},
{"role": "user", "content": email},
],
)
return json.loads(r.choices[0].message.content)
حقل reasoning هو سلسلة التفكير مُنظَّمة داخل JSON. النموذج يستخدمه أوّلًا (لأنّه يظهر أوّلًا في القائمة، فيُولَّد أوّلًا)، ثمّ يعتمد على استدلاله لملء بقيّة الحقول. الحقل نفسه يمكن تجاهله لاحقًا، أو تسجيله في السجلّات لمراجعة الأخطاء.
الذاتيّة المتّسقة: عدّة سلاسل ثمّ التصويت
الفكرة الطبيعية التالية: إن كانت سلسلة تفكير تُعطينا احتمالًا للجواب الصحيح، لماذا لا نُطلق عدّة سلاسل مستقلّة ثمّ نأخذ الأغلبيّة؟ هذا هو مبدأ الذاتيّة المتّسقة (self-consistency).
عمليًا: ضع temperature بين 0.7 و1.0 لتوليد استدلالات مختلفة، أطلق النداء خمس أو سبع مرّات، ثمّ صوِّت على الجواب النهائي.
from collections import Counter
def extraire_self_consistency(email: str, k: int = 5) -> dict:
resultats = []
for _ in range(k):
r = client.chat.completions.create(
model="gpt-4o-mini",
temperature=0.9,
response_format={"type": "json_object"},
messages=[
{"role": "system", "content": SYSTEME},
{"role": "user", "content": email},
],
)
resultats.append(json.loads(r.choices[0].message.content)["sujet"])
return Counter(resultats).most_common(1)[0][0]
هذه التقنية ترفع الدقّة بمقدار ملحوظ في المهامّ الصعبة، بكلفة k أضعاف. تُستَخدَم في القرارات المهمّة حيث الخطأ مكلف، لا في كلّ نداء.
التفكيك إلى نداءات فرعية
سلسلة التفكير تحدث داخل نداء واحد. البديل الأقوى هو تفكيك المهمّة إلى عدّة نداءات متتابعة، لكلٍّ منها هدف واحد وواضح. مثال: بدل نداء واحد يُخرج الحقول الأربعة، ندعو أوّلًا نداءً يُصنِّف السبب، ثمّ نداءً يستخرج المنتَج معتمدًا على السبب المُصنَّف، ثمّ نداءً ثالثًا يُقدّر الاستعجال.
المزايا حقيقية: كلّ نداء أبسط، ويمكن اختباره منفصلًا، والأخطاء تُعزَل. المزايا العملية: يمكن استخدام نموذج أرخص للخطوات السهلة، ونموذج أكبر للخطوات الحرجة. أمّا العيب فهو التأخّر الكلّي الذي يتراكم على النداءات، والكلفة التي قد تفوق نداءً واحدًا مُصمَّمًا جيّدًا.
القاعدة: التفكيك يستحقّ الاعتماد حين تحوي المهمّة قرارات مستقلّة لا تحتاج إلى الاعتماد على السياق الكامل. وحين تكون الحقول مترابطة، فالحلّ الجامع أفضل.
نماذج ذات تفكير مُدمَج
منذ 2024 ظهرت جيلٌ من النماذج مثل o1 وo3 وgemini-2.5-pro يُطلق عليها «نماذج التفكير» (reasoning models). هذه النماذج تُنتج داخليًّا سلسلة تفكير طويلة قبل الجواب، دون أن نطلبها. المستخدم يرى الجواب النهائي وحده، لكنّه يدفع بالجَتونات على التفكير الداخلي.
هذا يُغيِّر قواعد اللعبة. مع هذه النماذج، لا تُضِف «فكِّر خطوة خطوة»؛ فالنموذج يفعل ذلك أصلًا، وإضافتها قد تربكه أو تُضاعف كلفت ه. اكتب تعليمة صافية تصف المهمّة والقيود، ودع النموذج يُدير استدلاله. وأمّا النماذج التقليدية (gpt-4o، claude 3.5 sonnet، mistral large) فتستفيد من سلسلة التفكير المكتوبة يدويًّا.
الوسائط الفائقة: temperature وtop_p
مبدآن قصيران يتّصلان بهذه الوحدة. temperature يتحكّم في «حرارة» التوزيع: عند 0، النموذج شبه حتمي؛ وعند 1، متنوّع؛ وعند 2، جامح. top_p يقصّ التوزيع إلى الجَتونات التي تُشكِّل مجموعها الاحتمالي p (مثلًا 0.9)، فيُلغي الذيل بعيد الاحتمال.
للاستخراج المنظَّم، ضع temperature=0 دائمًا. للتوليد الإبداعي أو للذاتيّة المتّسقة، ارفعها. لا تُغيِّر الاثنين في الوقت نفسه؛ استقرّ على أحدهما (temperature عادةً) لتفهم أثر تغييراتك.
النموذج قد يكتب استدلالًا جميلًا ويصل إلى إجابة خاطئة، أو استدلالًا خاطئًا يصل إلى إجابة صحيحة. الأبحاث الحديثة أظهرت أنّ الاستدلال المكتوب ليس دائمًا الاستدلال الفعلي الذي أدّى إلى الجواب. اقرأه بحذر: أخطاء منطقيّة صريحة فيه علامة على مشكلة، لكنّ استدلالًا سليمًا ظاهريًّا لا يضمن جوابًا سليمًا.
الإغراء بإضافة سلسلة تفكير وطول أمثلة وتفكيك إلى نداءات فرعية عالٍ. كلّ إضافة تكلف: جَتونات، وتأخّرًا، وتعقيدًا. قِس أثر كلّ إضافة على جملة اختبارك، واحتفظ بها فقط إن كان أثرها موجبًا ومعنويًّا.
في الخلاصة
- سلسلة التفكير تُضيف فسحة حسابية عبر جَتونات متوسّطة؛ تنفع في الاستنتاج وتضرّ في التصنيف البسيط.
- ضَع سلسلة التفكير في حقل
reasoningداخل JSON لعدم كسر الشكل المنظَّم. - الذاتيّة المتّسقة تُطلق
kسلاسل مستقلّة ثمّ تُصوِّت؛ ترفع الدقّة بكلفةkأضعاف. - نماذج التفكير المُدمَج تُلغي الحاجة إلى «فكِّر خطوة خطوة»؛ اكتب تعليمة صافية ودَعها تدير استدلالها.
الوحدة التالية: كيف نُثبِّت شكل المُخرَج بمُخطَّط JSON، ونصادق عليه، ونُعيد المحاولة بذكاء عند الفشل.