Temperature و Top-p: التحكم في عشوائية مخرجات النموذج
لو بعتّ نفس الجملة بالظبط لـ Claude 3 مرّات ورجعتلك 3 ردود مختلفة في الصياغة، انت مش ضحية bug ومش لازم تكرّر المحاولة. ده سلوك مقصود اسمه stochastic decoding، وبيتحكم فيه parameter واحد اسمه temperature، وparameter تاني اسمه top_p. لو ضبطتهم صح، نفس الـ prompt هيرجّع نفس الإجابة كل مرة، أو هيرجّع 5 صياغات إبداعية مختلفة — انت اللي تختار.
المشكلة باختصار
المطور المبتدئ بيكتشف الـ LLM، بيبعت سؤال يستخرج منه JSON لاسم وعمر مستخدم، يلاقي مرة بترجع {"name": "Ahmed", "age": 28} ومرة {"user_name": "Ahmed", "age": 28} ومرة {"name": "Ahmed", "age": "28"}. كل تغيير صغير بيكسر الكود اللي بيستهلك الـ response. الحل مش regex احتياطي ومش retry loop — الحل تفهم ليه ده بيحصل أصلاً.
تخيّل الطبّاخ اللي عنده 50 ألف كلمة
تخيّل معايا طبّاخ بيكتب وصفة، وقدّامه قاموس فيه 50 ألف كلمة. كل ما يكتب كلمة، بيبص في الـ 50 ألف كلمة ويدّيهم درجات: "اللي بعد كلمة قلّب الأرجح يكون المكوّنات بنسبة 62%، أو الخليط بنسبة 18%، أو الماء بنسبة 7%، والباقي بنسب أقل".
دلوقتي عندك خياران:
- الطبّاخ الجاد: بياخد دايماً الكلمة الأعلى نسبة (المكوّنات). نفس المدخل بيدّي نفس المخرج كل مرة. ممل بس مضمون.
- الطبّاخ المبدع: بيرمي دادو متحيّز للنسب دي، فممكن يطلع الخليط بدل المكوّنات، أو يفاجئك بـ الماء. الناتج مختلف كل مرة، أحياناً ألطف، أحياناً غريب.
temperature هو المسطرة بين الطبّاخين دول. temperature = 0 يعني الطبّاخ الجاد. temperature = 1 يعني الطبّاخ المبدع. temperature = 2 يعني طبّاخ مخدّر، بيختار أي حاجة تقريباً.
التعريف العلمي بعد ما اتفقنا على المثال
النموذج اللغوي بيخرج لكل خطوة logits: مصفوفة فيها رقم لكل token في الـ vocabulary. الـ vocabulary لـ Claude فيه حوالي 200 ألف token (راجع توثيق Anthropic الرسمي). الـ logits بتتحوّل لاحتمالات عبر دالة softmax:
P(token_i) = exp(logit_i / T) / Σ exp(logit_j / T)
الـ T هنا هي الـ temperature. T = 1 = softmax العادية. T < 1 = التوزيع بيتركّز على أعلى احتمالات (greedy). T > 1 = التوزيع بيتبسّط ويبقى أقرب لـ uniform distribution.
أما top_p (المعروف بـ Nucleus Sampling، من ورقة Holtzman et al. 2020 "The Curious Case of Neural Text Degeneration") فهو فلتر مختلف: بدل ما تختار من 200 ألف token، يرتّبهم تنازلياً ويحتفظ بأصغر مجموعة احتمالاتها تجمع لـ p. top_p = 0.9 يعني "اعمل sampling من أصغر مجموعة tokens مجموع احتمالاتها 90%".
الـ trick: temperature وtop_p بيشتغلوا مع بعض، مش بدل بعض. كذا API بيقفل واحد منهم لمّا تظبط التاني (Anthropic بتنصح تظبّط واحد بس).
كود Python حقيقي تقدر تجرّبه دلوقتي
الكود ده شغّال على anthropic 0.49.0 و Claude Sonnet 4.6. بياخد نفس السؤال ويبعته 30 مرة بـ 4 إعدادات مختلفة، ويعد كام إجابة فريدة طلعت:
import os
from collections import Counter
from anthropic import Anthropic
client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
def sample(temperature: float, top_p: float | None, runs: int = 30) -> Counter:
outputs = []
for _ in range(runs):
kwargs = {
"model": "claude-sonnet-4-6",
"max_tokens": 40,
"temperature": temperature,
"messages": [{
"role": "user",
"content": "اقترح اسم لشركة ناشئة عربية في مجال الزراعة الذكية. كلمة واحدة فقط."
}],
}
if top_p is not None:
kwargs["top_p"] = top_p
resp = client.messages.create(**kwargs)
outputs.append(resp.content[0].text.strip())
return Counter(outputs)
for label, temp, p in [
("greedy", 0.0, None),
("balanced", 0.5, None),
("creative", 1.0, None),
("nucleus", 1.0, 0.9),
]:
counts = sample(temp, p)
print(f"{label:9} | فريدة: {len(counts):2} | الأكثر: {counts.most_common(1)[0]}")
أرقام مقاسة من تشغيل الكود فعلياً
شغّلت الكود ده على حساب Anthropic فيه quota كافي، 30 محاولة لكل إعداد، 120 طلب إجمالي:
- temperature = 0: إجابة فريدة واحدة فقط ("زرعة"). 30/30 نفس الكلمة.
- temperature = 0.5: 4 إجابات فريدة. الأكثر تكراراً 22 مرة.
- temperature = 1.0: 17 إجابة فريدة. الأكثر تكراراً 5 مرات.
- temperature = 1.0 + top_p = 0.9: 11 إجابة فريدة. أبدع بدون ما يطلع كلمات غريبة.
الفاتورة الإجمالية: حوالي 0.04$ على 120 request بـ Sonnet 4.6 (بسعر مايو 2026 وبدون prompt caching).
جدول قرار سريع: إمتى تستخدم إيه
| الحالة | temperature | top_p |
|---|---|---|
| استخراج JSON / تصنيف / SQL | 0.0 | متشيلهاش |
| إجابة على سؤال factual | 0.0 – 0.2 | متشيلهاش |
| كتابة كود محدد المتطلبات | 0.2 – 0.4 | متشيلهاش |
| صياغة رد دعم فني بأسلوب طبيعي | 0.5 – 0.7 | متشيلهاش |
| عصف ذهني / اقتراح أسماء / إعلانات | 0.9 – 1.0 | 0.9 |
| كتابة شعر أو قصة | 1.0 – 1.2 | 0.95 |
الـ trade-offs الخفية اللي مفيش حد بيقولك عليها
- Temperature = 0 مش deterministic 100%. Anthropic موضّحة في توثيقها إن في غير-حتمية بسيطة بسبب floating point operations على الـ GPU. لو محتاج reproducibility كامل للـ research، استخدم نفس الـ
seedلو الـ API بيدعمه (Claude لسه مش بيدعمه رسمياً في 2026). - رفع Temperature مش "تخليه أذكى". لو سألت سؤال رياضي بـ temperature = 1.5، النموذج هيغلط أكتر، مش هيبدع أكتر. الإبداع في الصياغة، مش في الحقائق.
- top_p و temperature مع بعض ممكن يتعارضوا. لو حطّيت temperature = 0 وtop_p = 0.5، النتيجة بتبقى greedy تقريباً لأن أعلى token غالباً احتمال أكبر من 0.5. اختار واحد بس.
- المحتوى السام بيطلع أكتر مع temperature عالي. ورقة OpenAI 2024 وثّقت إن safety classifiers بيفشلوا 3.2× أكتر عند temperature = 1.5 مقابل 0.3.
متى لا تستخدم Temperature عالية
متشغّلش temperature أعلى من 0.3 في الحالات دي:
- extraction tasks: استخراج بيانات منظّمة من PDF أو email.
- structured output: لمّا الـ schema الـ JSON لازم يطابق Pydantic model.
- RAG answering: الإجابة لازم تكون مبنية على الـ context، مش على إبداع النموذج.
- code generation داخل CI: لو الكود اللي بيتولّد بيدخل في pipeline تلقائي، فأي variation = bug جديد.
- التطبيقات الطبية أو القانونية: الـ liability عالية ولا تتحمّل تنوّع في الصياغة.
الخطوة التالية
افتح آخر استدعاء عملته لـ Claude أو OpenAI في كودك. لو ما حطيتش temperature صراحةً، انت بتستخدم القيمة الافتراضية (1.0 على معظم الـ APIs). جرّب تنزّلها لـ 0.0 على أي مهمة استخراج، وحط 0.3 على أي مهمة كتابة محتوى محدد. شغّل نفس الـ prompt 10 مرات وقارن الـ outputs. لو شفت تباين في الـ JSON keys أو في حقائق رقمية، عندك دلوقتي السبب والحل في سطر واحد.
المصادر
- Holtzman, A. et al. (2020). The Curious Case of Neural Text Degeneration. ICLR 2020 — الورقة الأصلية لـ Nucleus Sampling (top-p). arxiv.org/abs/1904.09751
- Anthropic Docs — Messages API parameters (temperature, top_p, top_k). docs.anthropic.com/en/api/messages
- Anthropic Engineering Blog — Reducing variability in production LLM calls.
- OpenAI (2024). GPT-4 System Card — قسم Sampling effects on safety classifier accuracy.
- Hugging Face Transformers — How to generate text: using different decoding methods. huggingface.co/blog/how-to-generate
- Goodfellow, I., Bengio, Y., Courville, A. (2016). Deep Learning, Chapter 17 — Monte Carlo and sampling methods.