الاتساق الذاتي (self-consistency prompting) يعني أن تطرح على النموذج سؤال الاستدلال نفسه عدة مرات وتحتفظ بالإجابة الأكثر تكرارًا. كل تشغيل يكتب استدلاله الخاص، كما في سلسلة التفكير، ولأن النموذج يختار كلماته بقدر من العشوائية، تسلك التشغيلات مسارات مختلفة. المسارات الصحيحة تميل إلى الوصول إلى الإجابة نفسها، والأخطاء تميل إلى التبعثر بين إجابات خاطئة مختلفة. وتصويت الأغلبية يستغل هذا الفرق.
تأتي التقنية من بحث Wang وزملائه عام 2022، "Self-Consistency Improves Chain of Thought Reasoning in Language Models". قارن البحث بين أخذ مسارات استدلال كثيرة والتصويت بينها وبين أخذ إجابة جشعة واحدة، ووجد أن التصويت حسّن الدقة في اختبارات الحساب والاستدلال بالفهم العام.
يعرض المثال التالي ثلاثة تشغيلات للموجّه نفسه. كل تبويب تشغيل واحد برده الخاص. تشغيلان يعدّان بشكل صحيح، والثالث يقع في زلة يسهل الوقوع فيها. سطر الإجابة يبقى بالكلمة الإنجليزية Answer: لأن كود Python لاحقًا في هذه الصفحة يبحث عنها.
لنعدّ السبعات حسب المنزلة.
- منزلة الآحاد: 7، 17، 27، 37، 47، 57، 67، 77، 87، 97. هذه 10 سبعات.
- منزلة العشرات: من 70 إلى 79. هذه 10 سبعات أخرى.
- منزلة المئات: العدد 100 وحده من ثلاث خانات، ولا يحتوي 7.
العدد 77 يظهر في القائمتين، وهذا صحيح، لأنه يحتوي على سبعتين.
Answer: 20
أجاب التشغيل 2 عن سؤال مختلف قليلًا: كم عددًا يحتوي على 7، لا كم مرة يظهر الرقم. استدلاله يبدو واثقًا مثل الآخرَين تمامًا، ولو رأيته وحده لما وجدت سببًا للشك فيه. وعبر ثلاثة تشغيلات، التصويت هو 20، 19، 20، وإجابة الأغلبية هي الصحيحة.
كيف يعمل الاتساق الذاتي
- اكتب موجّه سلسلة تفكير بسطر إجابة ثابت. اطلب الاستدلال أولًا والإجابة النهائية أخيرًا، بشكل يمكنك إيجاده، مثل "Answer: N". من دون سطر ثابت، ستضطر إلى قراءة كل تشغيل لتجد إجابته.
- ولّد عدة تشغيلات مع تفعيل العشوائية. يحتاج كل تشغيل إلى حرية سلوك مسار مختلف. في واجهة API، تحقق ذلك درجة حرارة أعلى من 0. عند درجة الحرارة 0 ستكرر معظم التشغيلات الاستدلال نفسه، وتكرار الخطأ خمس مرات ليس دليلًا.
- استخرج الإجابة النهائية من كل تشغيل. تجاهل الاستدلال في هذه المرحلة. تشغيلان وصلا إلى 20 بطريقين مختلفين يُحسبان صوتين لـ 20.
- خذ الإجابة الأكثر تكرارًا. وحّد الصيغ قبل العدّ، حتى تُحسب "20" و"20." و"عشرون" إجابة واحدة.
الاتفاق نفسه معلومة مفيدة. عندما تتفق التشغيلات الخمسة، تكون الزلة العشوائية غير مرجّحة. وعندما تنقسم الأصوات على ثلاث إجابات، يكون السؤال صعبًا على النموذج، وهذه إشارة لتتحقق من الإجابة بنفسك أو تعيد كتابة الموجّه. وأفاد البحث أيضًا بأن الأسئلة التي زاد فيها الاتفاق بين العينات كانت إجابتها صحيحة على الأرجح.
الاتساق الذاتي يدويًا
يمكنك تطبيق التقنية في أي تطبيق محادثة. أرسل الموجّه، ودوّن السطر الأخير، ثم احصل على تشغيل مستقل آخر: اضغط إعادة التوليد، أو الصق الموجّه نفسه في محادثة جديدة. كرر حتى تحصل على ثلاث إجابات أو خمس.
لا تسأل مجددًا في المحادثة نفسها بعبارة "هل أنت متأكد؟" أو "حاول مرة أخرى". النموذج يرى رده السابق، فلا تكون الإجابة الجديدة مستقلة: فهو يميل إما إلى تكرار الإجابة الأولى أو إلى تغييرها لمجرد أنك بدوت متشككًا. ولا هذا ولا ذاك تصويت.
هذا الموجّه جاهز للتصويت. ضع سؤالك وصيغة إجابتك، ثم شغّله عدة مرات.
12 قلمًا تساوي 12 ÷ 3 = 4 عبوات.
4 عبوات تكلّف 4 × 2.
الباقي من 10 ناقص 8.
Answer: $2
جزء الصيغة هو ما يجعل التصويت ممكنًا. أوقفه وستميل التشغيلات إلى صياغة إجاباتها بطرق مختلفة، وكثيرًا ما تكون في منتصف النص، فيتحول العدّ البسيط إلى قراءة متأنية.
الاتساق الذاتي في الكود
في الكود، الحلقة قصيرة: شغّل الموجّه نفسه N مرة، واستخرج أسطر الإجابة، وعُدّها. تستخدم هذه النسخة مكتبة Python من OpenAI، وأي واجهة API تتيح ضبط درجة الحرارة تعمل بالطريقة نفسها.
import re
from collections import Counter
from openai import OpenAI
client = OpenAI()
MODEL = "your-model-id" # e.g. from your provider's model list
PROMPT = (
"How many times does the digit 7 appear when you write out all the whole "
"numbers from 1 to 100? Think it through step by step, then give the final "
'answer on the last line in the form "Answer: N".'
)
def final_answer(text):
# Also matches "**Answer: 20**", since chat models often bold the last line.
lines = re.findall(r"^\**Answer:\**\s*(.+)$", text, re.MULTILINE)
return lines[-1].strip(" *.") if lines else None
answers = []
for _ in range(5):
response = client.chat.completions.create(
model=MODEL,
temperature=0.8,
messages=[{"role": "user", "content": PROMPT}],
)
answers.append(final_answer(response.choices[0].message.content))
votes = Counter(a for a in answers if a is not None)
if votes:
best, count = votes.most_common(1)[0]
print(f"{best} ({count} of {len(answers)} runs agree)")
else:
print("No run gave an answer line.")
إذا كتبت موجّهك بالعربية واستبدلت بسطر الإجابة كلمة مثل "الإجابة:"، فغيّر Answer: في التعبير النمطي داخل final_answer لتطابقها. التشغيلات مستقلة، لذا في بيئة الإنتاج ترسلها بالتوازي بدلًا من إرسالها واحدًا بعد الآخر. وبعض نماذج الاستدلال لا تقبل إلا درجة حرارتها الافتراضية وتُرجع خطأ إذا ضبطت قيمة، فاحذف temperature معها. ستظل تشغيلاتها تتنوع، لأن القيمة الافتراضية تتضمن عشوائية أصلًا.
متى تستخدمه، وكم يكلّف
يستحق الاتساق الذاتي العناء عندما تتحقق ثلاثة أمور: الإجابة قصيرة وقابلة للمقارنة (رقم، أو تصنيف، أو اختيار)، والإجابة الخاطئة تكلّف أكثر من بضعة استدعاءات إضافية، والنموذج ليس موثوقًا أصلًا في المهمة. المسائل الرياضية الكلامية، والتصنيف ذو الحالات الحدّية المربكة، وأسئلة الاختيار من متعدد تناسبه جيدًا.
يكلّف تقريبًا N ضعف توكنات الإجابة الواحدة، ولا يفيد عندما يشترك النموذج في التصور الخاطئ نفسه في كل تشغيل. إذا ارتكبت التشغيلات الخمسة الخطأ نفسه، فالتصويت بالإجماع وخاطئ. التصويت يقلل الزلات العشوائية، لا الأخطاء المنهجية، فهو لا يغني عن مقارنة الإجابات بنتيجة معروفة من حين لآخر.
النماذج التي تستدل داخليًا قبل أن تجيب تعمل على المسألة مطولًا في كل تشغيل أصلًا، وهذا يميل إلى تقليص مكسب التصويت. لكنه قد يظل مجديًا في الأسئلة الصعبة التي تختلف فيها تشغيلاتها.
الاتساق الذاتي يصوّت على الإجابات المكتملة فقط. أما شجرة الأفكار فتذهب خطوة أبعد وتقارن الاستدلال الجزئي أثناء حل المسألة، فتُبقي الفروع الواعدة وتُسقط الضعيفة قبل أن تصل إلى إجابة.
الأسئلة الشائعة
ما هو الاتساق الذاتي في كتابة الموجّهات؟
الاتساق الذاتي تقنية من بحث Wang وزملائه (2022). ترسل موجّه سلسلة التفكير نفسه عدة مرات مع تفعيل العشوائية، فيستدل كل تشغيل في مسار مختلف، ثم تأخذ الإجابة النهائية الأكثر ظهورًا. إنه يستبدل الثقة بسلسلة استدلال واحدة بتصويت بين عدة سلاسل.
كم عينة أستخدم في الاتساق الذاتي؟
في الاستخدام اليومي، تكفي ثلاثة إلى خمسة تشغيلات لتغلب زلة عارضة، والعدد الفردي يتجنب التعادل بين إجابتين. البحث الأصلي أخذ مسارات أكثر بكثير لكل سؤال، ووجد أن الدقة ظلت ترتفع مع زيادة العينات لكن بمكاسب أصغر في كل مرة. استخدم تشغيلات أكثر عندما تكون الإجابة الخاطئة مكلفة، وأقل عندما تهم التكلفة أو السرعة.
ما الفرق بين الاتساق الذاتي وسلسلة التفكير؟
سلسلة التفكير تشغيل واحد يكتب فيه النموذج استدلاله قبل الإجابة. والاتساق الذاتي يبني عليها: يشغّل سلسلة التفكير عدة مرات ويصوّت على الإجابات النهائية. سلسلة التفكير تغيّر الموجّه، والاتساق الذاتي يغيّر عدد الإجابات التي تجمعها وطريقة اختيار واحدة منها.
هل ينجح الاتساق الذاتي مع المقالات أو الإجابات المفتوحة؟
ليس مباشرة، لأن التصويت يحتاج إلى إجابات يمكن مقارنتها بالتساوي: رقم، أو تصنيف، أو حرف اختيار من متعدد، أو حقيقة قصيرة. للنصوص المفتوحة، الحل الشائع أن تولّد عدة نسخ وتسأل النموذج أيها يتفق أكثر مع البقية، لكن هذا حكم، لا عدّ.
هل يمكنني استخدام الاتساق الذاتي في ChatGPT أو Claude؟
نعم، يدويًا. أرسل الموجّه في عدة محادثات جديدة، أو أعد توليد الرد عدة مرات، واكتب الإجابة النهائية من كل تشغيل. استخدم محادثة جديدة أو زر إعادة التوليد بدلًا من السؤال مجددًا في المحادثة نفسها، لأن النموذج الذي يرى إجابته السابقة يميل إلى تكرارها.