المستوى: مبتدئ — لو بتستخدم ChatGPT أو Claude ومش فاهم يعني إيه Temperature و Top-p، المقال ده ليك.
Temperature و Top-p: ليه نفس السؤال بيرد عليه الـ AI كل مرة بإجابة مختلفة
لو سألت نفس النموذج نفس السؤال 3 مرات وطلعت 3 إجابات مختلفة، ده مش عطل. ده إعداد اسمه Temperature بتقدر تتحكم فيه. بعد المقال ده هتعرف تخلّي النموذج «ثابت ودقيق» أو «متنوّع ومبدع»، وامتى تختار كل واحد.
المشكلة باختصار
النموذج اللغوي مش بيختار الكلمة التالية مرة واحدة وخلاص. هو بيحسب احتمال لكل كلمة ممكنة، وبعدين بيسحب واحدة من التوزيع ده. لو السحب فيه عشوائية، الإجابة بتختلف كل مرة. الإعدادين اللي بيتحكموا في العشوائية دي هما Temperature و Top-p.
الـ Temperature بمثال الراديو
تخيّل راديو قديم بزرّ صوت. لو نزّلت الصوت لأقصى حد، بتسمع المحطة الأقوى بس وكل اللي تحتها بيختفي. لو علّيت الصوت، المحطات الضعيفة بتبان ومعاها تشويش. الـ Temperature هو زرّ الصوت ده بالظبط: بيقرّر قد إيه النموذج «يسمع» الكلمات ضعيفة الاحتمال.
دلوقتي بالتعريف الدقيق: النموذج بيطلّع لكل كلمة رقم اسمه logit. دالة اسمها softmax بتحوّل الأرقام دي لاحتمالات مجموعها 100%. الـ Temperature بيتقسّم على الـ logits قبل الـ softmax. قيمة قليلة (0.3 مثلاً) بتكبّر الفرق بين الكلمات، فالأقوى تاخد نصيب أكبر. قيمة عالية (1.8) بتقرّب الكلمات من بعضها، فالعشوائية بتزيد.
import math
def softmax(logits, temperature):
scaled = [x / temperature for x in logits]
m = max(scaled)
exps = [math.exp(x - m) for x in scaled]
total = sum(exps)
return [e / total for e in exps]
logits = [4.2, 3.6, 2.9, 2.2, 1.7, 1.1, 0.6, 0.2]
for t in (0.3, 1.0, 1.8):
probs = softmax(logits, t)
print(f"T={t}: أعلى كلمة تاخد {probs[0]*100:.0f}%")
# T=0.3: أعلى كلمة تاخد 87%
# T=1.0: أعلى كلمة تاخد 47%
# T=1.8: أعلى كلمة تاخد 31%
نفس الأرقام بالظبط، غيّرنا الـ Temperature بس. الكلمة الأقوى نزلت من 87% لـ 31%، يعني الكلمات التانية بقى ليها فرصة أكبر إنها تتختار.
Top-p (Nucleus Sampling): نقص الذيل
الـ Temperature بيتحكم في شكل التوزيع. الـ Top-p بيتحكم في عدد المرشحين. الفكرة بمثال بسيط: عندك ممكن 50 ألف كلمة محتملة، أغلبها احتمالها شبه صفر — دي اسمها «الذيل». إنك تسيب الذيل ده مفتوح ممكن يطلّع كلمة غريبة فجأة وسط كلام سليم.
بالتعريف العلمي: Top-p (أو Nucleus Sampling، من ورقة Holtzman وزملائه سنة 2020) بترتّب الكلمات من الأعلى احتمالاً للأقل، وتجمع احتمالاتها لحد ما توصل للنسبة اللي إنت حددتها. لو top_p = 0.9، النموذج بياخد أقل عدد كلمات مجموع احتمالها 90% ويرمي الباقي. العدد ده بيتغيّر من خطوة لخطوة: ساعات 3 كلمات، وساعات 200.
def nucleus(probs, p=0.9):
ranked = sorted(enumerate(probs), key=lambda kv: kv[1], reverse=True)
keep, cum = [], 0.0
for idx, prob in ranked:
keep.append(idx)
cum += prob
if cum >= p:
break
return keep # الكلمات اللي مجموع احتمالها وصل 90%
سيناريو واقعي + أرقام
افرض عندك شات بوت خدمة عملاء بيرد على أسئلة عن مواعيد الشحن. هنا إنت عايز ردود ثابتة ودقيقة، مش إبداع. خلّي temperature = 0.2. النتيجة العملية: لو 100 عميل سألوا نفس السؤال، هتاخد ردود شبه متطابقة، وبتقل فرصة إن النموذج «يخترع» معلومة غلط.
بالعكس، لو بتولّد 10 أفكار لأسماء منتج، خلّي temperature = 0.9. هتاخد تنوّع أكبر بدل ما الـ 10 أسماء تطلع كلها متشابهة.
الـ trade-offs
Temperature عالي: بتكسب تنوّع وإبداع، بتخسر ثبات ودقة، وبتزيد فرصة الهلوسة. Temperature واطي: بتكسب دقة وثبات، بتخسر تنوّع، والنص ممكن يبقى ممل ومتكرر.
الافتراض المهم هنا: التوثيق الرسمي لـ Anthropic و OpenAI بينصح تعدّل Temperature أو Top-p، مش الاتنين مع بعض. لو لخبطت في الاتنين، بيبقى صعب تتوقّع النتيجة وتعيد إنتاجها.
متى متغيّرش الإعدادات دي
لو شغلك كله أسئلة ليها إجابة واحدة صح (استخراج بيانات، تصنيف، توليد كود)، سيب Temperature واطي وخلاص ومتلعبش في Top-p. الافتراض هنا إنك عايز أعلى دقة ممكنة. اللعب في الإعدادات في الحالة دي بيضيّع وقتك من غير مكسب واضح.
الخطوة التالية
افتح آخر استدعاء API عملته، وجرّب نفس الـ prompt مرتين: مرة بـ temperature=0.2 ومرة بـ temperature=1.0. قارن الردود. لو الفرق واضح، يبقى فهمت الإعداد عملياً. ده الكود الأساسي:
from anthropic import Anthropic
client = Anthropic()
resp = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=200,
temperature=0.2, # رد ثابت ودقيق
messages=[{"role": "user", "content": "اكتب وصف قصير لقميص قطني"}],
)
print(resp.content[0].text)
المصادر
- Holtzman et al., «The Curious Case of Neural Text Degeneration», ICLR 2020 — arxiv.org/abs/1904.09751
- Anthropic Messages API (temperature, top_p) — docs.anthropic.com/en/api/messages
- OpenAI API Reference (temperature, top_p) — platform.openai.com/docs/api-reference
- Hugging Face — Text generation strategies — huggingface.co/docs/transformers