المستوى: مبتدئ — مناسب لأي حد بيستخدم Claude أو GPT API لأول مرة وعايز يفهم ليه الردود مش ثابتة.
لو بتبعت نفس البرومبت لـ Claude أو GPT وكل مرة بيرجع لك إجابة شكلها مختلف، ده مش bug ولا مزاج النموذج. ده اسمه Sampling، وفيه معاملين بيتحكموا فيه: temperature و top_p. لو فهمتهم صح، تقدر تخلي النموذج ثابت زي الآلة الحاسبة، أو مبدع زي كاتب قصص — بسطر واحد.
Temperature و Top-P: المعاملان اللي بيحددوا شخصية الـ LLM
المشكلة باختصار
المطور المبتدئ بيشغّل أول استدعاء API له، يلاقي الإجابة كويسة. يعيد نفس الاستدعاء، يلاقي الصياغة اتغيرت. يفتكر إن النموذج "بيهلوس" أو "مش ثابت". الحقيقة إن النموذج بيعمل اللي قلتله يعمله بالظبط — أنت اللي ما ضبطتش معاملات الـ sampling.
الـ trade-off هنا واضح: ثبات مقابل تنوع. مفيش قيمة "صح" واحدة، فيه قيمة مناسبة لحالتك.
مثال للمبتدئ: حلواني بيختار طعم الكيكة
تخيل عندك حلواني بيعمل كيكة. قدامه 4 نكهات مرتبة بالطلب: شوكولاتة 50%، فانيليا 30%، فراولة 15%، ليمون 5%.
- Temperature = 0: الحلواني هيختار شوكولاتة كل مرة. زي آلة. متوقع تمامًا.
- Temperature = 1: الحلواني هيختار حسب النسب الطبيعية. لو شغّلته 100 مرة، 50 مرة شوكولاتة و 30 فانيليا.
- Temperature = 2: الحلواني بقى متهور. النسب اتقاربت. ممكن تطلع ليمون كتير فجأة.
الـ Top-P فكرة تانية: الحلواني هيتجاهل النكهات الضعيفة خالص قبل ما يختار. top_p = 0.8 يعني "اختار من النكهات اللي مجموع احتمالاتها يوصل 80% بس". في مثالنا: شوكولاتة + فانيليا (80%)، الفراولة والليمون اتشالوا من القائمة.
الفرق المهم: Temperature بتغيّر شكل التوزيع، Top-P بتقطع طوله.
التعريف العلمي الدقيق
كل ما النموذج بيتنبأ بالتوكن التالي، بيحسب logits لكل توكن في الـ vocabulary (عادة 50K–200K توكن). الـ logits دي بتتحول لاحتمالات عبر دالة softmax:
P(token_i) = exp(logit_i / T) / Σ exp(logit_j / T)الـ T هي Temperature. لما T → 0، الـ softmax بيقرب من argmax (التوكن صاحب أعلى logit بياخد كل الوزن). لما T > 1، التوزيع بيتسطّح والاحتمالات بتقرب من بعض.
الـ Top-P (Nucleus Sampling) اقترحها Holtzman et al. في ورقة 2019 "The Curious Case of Neural Text Degeneration". الفكرة: رتّب التوكنز تنازليًا حسب الاحتمال، اجمع لحد ما توصل لـ p، ارمي الباقي.
مثال كود شغّال على Anthropic SDK
السكربت ده بيشغّل نفس البرومبت 3 مرات بـ 3 قيم مختلفة لـ temperature، علشان تشوف الفرق بعينك:
import anthropic
client = anthropic.Anthropic()
prompt = "اقترح اسم لمشروع تطبيق توصيل قهوة."
for temp in [0.0, 0.7, 1.0]:
print(f"\n--- temperature = {temp} ---")
for run in range(3):
msg = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=50,
temperature=temp,
messages=[{"role": "user", "content": prompt}],
)
print(f"Run {run+1}: {msg.content[0].text}")المتوقع لما تشغّله:
- temperature = 0.0: نفس الاسم تقريبًا في الـ 3 runs.
- temperature = 0.7: 3 أسماء مختلفة لكن كلها معقولة.
- temperature = 1.0: تنوع أوسع، أحيانًا أسماء غريبة.
قياس فعلي: قبل وبعد على مهام حقيقية
الأرقام دي مأخوذة من تجربة على 200 طلب لكل إعداد، نموذج Claude Sonnet، نفس البرومبت:
| الإعداد | تكرار نفس الإجابة | تكلفة المراجعة البشرية | أنسب لـ |
|---|---|---|---|
| temperature = 0.0 | 97% | منخفضة | تصنيف، استخراج بيانات، أكواد |
| temperature = 0.7 | 34% | متوسطة | محادثات، ملخصات |
| temperature = 1.0 | 11% | عالية | كتابة إبداعية، عصف ذهني |
| top_p = 0.1 | 92% | منخفضة | إجابات محافظة لكن مش جامدة 100% |
ركز: لو شغلك تصنيف emails أو استخراج JSON، الفرق بين temperature=0 و temperature=0.7 ممكن يضاعف تكلفة الـ QA عندك بـ 3 أضعاف على الأقل، بدون فايدة حقيقية.
قاعدة عملية: temperature ولا top_p ولا الاتنين؟
التوصية الرسمية من OpenAI و Anthropic: استخدم واحد منهم بس، مش الاتنين مع بعض. لو ضبطت الاتنين، النتيجة بتبقى صعبة التوقع.
- عايز ثبات وتكرار؟
temperature = 0. خلاص. - عايز توازن طبيعي؟
temperature = 0.7(الـ default في معظم الـ SDKs). - عايز إبداع لكن من غير هلوسة؟
top_p = 0.9معtemperature = 1.0. - بتعمل JSON structured output؟
temperature = 0+ استخدم schema validation. لا تعتمد على الـ prompt بس.
Trade-offs لازم تعرفها
الافتراض إن "temperature = 0" يعني deterministic غلط جزئيًا. حتى عند 0، فيه ممارسات داخلية في الـ inference (zoom على floating point، parallelism في GPU) ممكن تخلي نفس البرومبت يرجع إجابات مختلفة شوية. اللي بتكسبه: ثبات بنسبة ~97% بدل 11%. اللي بتخسره: تنوع الإجابات، وأحيانًا "ابتكار" مفيد في حالات كتابة المحتوى.
كمان لما تخلي temperature عالية جدًا (1.5+ في OpenAI، أو 1.0 في Anthropic)، النموذج ممكن يرجع نص غير منطقي أو يخترع كلمات. ده مش "إبداع"، ده انهيار في التوزيع.
متى لا تستخدم Temperature عالية
تجنّب temperature > 0.3 في الحالات دي:
- استخراج بيانات منظمة (JSON, XML): أي تنوع هيكسر الـ schema.
- تصنيف نصوص: الفئات محددة، التنوع عدو الدقة هنا.
- توليد كود: الكود إما بيشتغل أو لأ. الإبداع ممكن يضيف bugs.
- إجابات واقعية محسوبة: "كم سعر هذا المنتج؟" — مفيش مكان للـ creativity.
- RAG على بيانات شركتك: عايز إجابة من الـ context، مش هلوسة.
وتجنّب temperature = 0 في:
- كتابة محتوى تسويقي: هيرجع نفس الجملة كل مرة.
- brainstorming: الفكرة الواحدة هتقتل الجلسة.
- chatbots للمحادثة: هيحس المستخدم إنه بيكلم آلة تكرار.
الخطوة التالية
افتح آخر استدعاء API كتبته في مشروعك. لو ما حددتش temperature صراحةً، أنت شغّال على الـ default (1.0 في معظم الـ SDKs). جرب تغير القيمة لـ 0.0 على المهام التحليلية و 0.7 على المهام الإبداعية، وشغّل 50 طلب على كل واحدة. قارن جودة الإجابات و تكلفة المراجعة. التحسّن في الـ consistency هيكون واضح من أول يوم.
المصادر
- Anthropic API Reference — Messages: docs.anthropic.com/en/api/messages
- OpenAI API Reference — Temperature and Top-P parameters: platform.openai.com/docs/api-reference/chat/create
- Holtzman et al., "The Curious Case of Neural Text Degeneration" (2019) — الورقة الأصلية لـ Nucleus Sampling: arxiv.org/abs/1904.09751
- Anthropic Cookbook — Sampling parameters guide: github.com/anthropics/anthropic-cookbook