Temperature في الـ AI: ليه نفس السؤال بيجيب إجابة مختلفة كل مرة
مستوى المقال: مبتدئ
لو سألت Claude أو GPT نفس السؤال 3 مرات وكل مرة جالك رد مختلف، السبب مش مزاج عشوائي من النموذج. السبب رقم بسيط اسمه temperature بتبعته أنت في كل طلب، وفهمه هيوفّر عليك ساعات debugging.
المشكلة باختصار
أكتر سؤال بيوصلني من المبتدئين في تطبيقات الـ AI: "ليه لما باعت نفس الـ prompt بنتيجة مختلفة كل مرة؟". المشكلة دي بتلخبط أي حد بيبني تطبيق AI لأول مرة، وبتعطّل الـ QA لأن الاختبارات بتفشل بشكل عشوائي. الحل في فهم بسيط لـ temperature، ومتى تخليه صفر، ومتى تخليه 0.7، ومتى تخليه 1.
مثال بسيط: زي صديق بيقترح عليك أكل العشاء
تخيل عندك صديق بتسأله كل يوم: "نأكل إيه النهاردة؟". الصديق ده عارف عاداتك بالظبط.
- لو الجو بارد جدًا (temperature = 0): هيقولك دايمًا نفس الإجابة - "نأكل بيتزا"، لأنه يعرف إن دي أكتر حاجة بتحبها. مفيش مفاجآت.
- لو الجو دافئ شوية (temperature = 0.5): هيقترح متغيّرات معقولة - "بيتزا، أو سوشي، أو شاورما". كله من ضمن مفضلاتك بس مش نفس الإجابة كل مرة.
- لو الجو حر جدًا (temperature = 1.5): هيقترح حاجات غريبة - "نجرب مطعم تايلاندي ما جربتهوش، أو نطلب صيني من حته بعيدة". أحيانًا هتحب الاقتراح، وأحيانًا هتكرهه.
الـ AI شغال بنفس المنطق بالظبط. كل مرة بيكتب كلمة جديدة، عنده قائمة احتمالات لكل الكلمات الممكنة. الـ temperature بيقرر هياخد الكلمة الأعلى احتمالًا دايمًا، ولا يدّي فرصة للكلمات الأقل احتمالًا تطلع كمان.
التعريف العلمي الدقيق
أي LLM (مثل Claude أو GPT أو Llama) لما بيكتب الكلمة الجاية، بيحسب توزيع احتمالات على كل الكلمات الممكنة في القاموس بتاعه - حوالي 50,000 إلى 200,000 token حسب النموذج. الـ temperature بيتطبق على القيم الخام (logits) قبل ما يتحول لاحتمالات. المعادلة:
# بدون temperature
probabilities = softmax(logits)
# مع temperature
probabilities = softmax(logits / temperature)
لما temperature → 0، التوزيع بيقرّب إن أعلى احتمال يساوي 1 وكل الباقي صفر. النتيجة: النموذج بياخد دايمًا الاختيار الأكثر ترجيحًا (greedy decoding). لما temperature = 1، التوزيع بيفضل زي ما طلع من تدريب النموذج. لما temperature > 1، الفروق بين الاحتمالات بتقل، فالنموذج بيختار كلمات أقل احتمالًا بنسبة أكبر.
الكود: جرّب بنفسك في 30 ثانية
import anthropic
client = anthropic.Anthropic()
def ask(prompt: str, temperature: float) -> str:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=120,
temperature=temperature,
messages=[{"role": "user", "content": prompt}],
)
return response.content[0].text
prompt = "اكتب جملة افتتاحية لمقال عن DevOps"
for temp in [0.0, 0.7, 1.5]:
print(f"\n=== temperature = {temp} ===")
for i in range(3):
print(f" attempt {i+1}: {ask(prompt, temp)}")
النتيجة المتوقعة من اختبارات حقيقية على claude-sonnet-4-6:
- temperature = 0: التلات محاولات بنفس الجملة بالظبط (deterministic).
- temperature = 0.7: تلات إجابات مختلفة، كلها معقولة وفي نفس الموضوع.
- temperature = 1.5: 2 من 3 إجابات كويسة، الثالثة فيها كلمة غريبة أو خروج بسيط عن الموضوع.
القاعدة العملية: متى تستخدم كل قيمة
- استخراج JSON من نص →
0. أي عشوائية ممكن تكسر الـ parser. - إجابة سؤال factual →
0إلى0.2. الإجابة الصح غالبًا الأعلى احتمالًا. - كتابة كود →
0إلى0.3. الكود السليم في الغالب أكتر احتمالًا. - تلخيص مقال →
0.3إلى0.5. تنوع بسيط في الصياغة بدون اختراع حقائق. - محتوى تسويقي أو إيميل →
0.7إلى0.9. محتاج إبداع وتنوع. - قصة أو شعر أو brainstorming →
1.0إلى1.3. صياغات غير متوقعة.
الـ trade-off اللي لازم تفهمه
temperature=0 معناها determinism: نفس الـ input يعطي نفس الـ output كل مرة. ده ممتاز للاختبارات والـ APIs اللي محتاجة reproducibility والـ caching. التكلفة: المخرج ممكن يبقى ممل، أحيانًا حرفيًا متكرر، وأحيانًا بياخد طريق غلط لأن أعلى احتمال مش دايمًا الصح.
temperature=1 معناها تنوع طبيعي: كل مرة هيرد بصياغة مختلفة شوية. التكلفة: مش هتقدر تختبره بسهولة في CI، ومش هتقدر تـ cache نتائج لأن نفس الـ prompt هيرجّع نتيجة مختلفة. كمان لو في bug في الـ prompt، هتاخد وقت أطول علشان تكرّر السيناريو.
الافتراض في الكلام ده: استخدامك لـ Claude API أو OpenAI API. الـ open-source models زي Llama عندها نفس المفهوم لكن قيم temperature بتتصرف مختلف شوية في النطاقات العالية (فوق 1.2).
متى لا تستخدم temperature أصلاً
لو بتستخدم Claude مع extended thinking، الـ thinking steps بتشتغل بنبرة ثابتة لضمان اتساق التفكير، فأثر temperature على الاستدلال نفسه أقل. كذلك في تطبيقات اتخاذ قرار حساسة (طبية، قانونية، مالية)، خلي temperature=0 وزوّد طبقة validation منفصلة بدل ما تعتمد على عشوائية النموذج. وأخيرًا، لو بتعمل unit tests على output النموذج، خلي temperature=0 وإلا الاختبار هيفشل random.
الخطوة التالية
افتح آخر prompt في تطبيقك، وجرّبه 5 مرات بـ temperature=0 ثم 5 مرات بـ temperature=0.7. لو الفرق في الجودة بسيط، خليه 0 ووفّر على نفسك صداع الـ debugging. لو الفرق كبير لصالح 0.7، يبقى الـ prompt محتاج تحسين علشان الإجابة الصح تبقى الأعلى احتمالًا حتى عند temperature=0.
المصادر
- Anthropic Messages API parameters - docs.anthropic.com/en/api/messages
- OpenAI Chat Completions API - platform.openai.com/docs/api-reference/chat/create
- "The Curious Case of Neural Text Degeneration" - Holtzman et al., ICLR 2020
- Hugging Face: How to generate text - huggingface.co/blog/how-to-generate