أخذ عينات النواة Top-p
كيف يقيّد top-p أخذ العينات بمجموعة الرموز الأكثر احتمالًا
أخذ عينات النواة Top-p درس مجاني في AI Prompt Engineering على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Prompt Engineering، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
ما المقصود بأخذ العينات باستخدام top-p؟
أخذ العينات باستخدام top-p (ويُسمى أيضًا أخذ عينات النواة) هو أسلوب يقيّد أخذ العينات بمجموعة فرعية ديناميكية من المفردات. فبدلًا من أخذ العينات من جميع الرموز، لا يأخذ النموذج في الحسبان إلا أصغر مجموعة من الرموز التي يكون احتمالها التراكمي مساويًا لـ p على الأقل.
اقتُرح هذا الأسلوب في ورقة «الحالة الغريبة لتدهور النصوص العصبية» (Holtzman وآخرون، 2019)، وقد تفوق على تغيير مقياس درجة الحرارة البسيط في التوليد المتنوع والمتماسك.
كيف يعمل top-p خطوة بخطوة
الخوارزمية:
- احسب احتمالات softmax على كامل المفردات
- رتّب الرموز حسب الاحتمال، من الأعلى إلى الأدنى
- تقدّم في القائمة المرتبة مع تجميع الاحتمالات حتى يصل المجموع التراكمي إلى p
- تُسمى مجموعة الرموز هذه النواة
- خذ العينات من النواة فقط، مع إعادة تطبيع الاحتمالات ليكون مجموعها 1
import numpy as np
def top_p_sample(logits, p=0.9):
probs = softmax(logits, temperature=1.0)
# Sort by probability descending
sorted_indices = np.argsort(probs)[::-1]
sorted_probs = probs[sorted_indices]
# Find nucleus: smallest set with cumulative prob >= p
cumulative = np.cumsum(sorted_probs)
nucleus_size = np.searchsorted(cumulative, p) + 1
nucleus_indices = sorted_indices[:nucleus_size]
nucleus_probs = sorted_probs[:nucleus_size]
# Renormalize
nucleus_probs = nucleus_probs / nucleus_probs.sum()
# Sample
chosen = np.random.choice(nucleus_indices, p=nucleus_probs)
return chosen
token = top_p_sample(logits, p=0.9)النواة الديناميكية
الفكرة الأساسية في top-p هي أن حجم النواة ديناميكي. فعندما يكون النموذج واثقًا جدًا (إذ يهيمن رمز واحد باحتمال قدره 0.95)، لا تحتوي النواة إلا على رمز واحد. وعندما يكون النموذج غير متأكد (إذ تملك رموز كثيرة احتمالات متقاربة)، تتوسع النواة لتشمل رموزًا أكثر.
يتكيف هذا تلقائيًا مع درجة ثقة النموذج: ثقة مرتفعة ← حجم مفردات صغير ← مخرجات مركزة. ثقة منخفضة ← مفردات أكبر ← استكشاف أوسع.
# High-confidence situation: model strongly prefers 'the'
high_confidence_logits = np.array([5.0, 1.0, 0.5, 0.1, -0.5])
hc_probs = softmax(high_confidence_logits)
print('High confidence probs:', np.round(hc_probs, 3))
# [0.974, 0.018, 0.011, 0.007, 0.004]
# Top-p=0.9 nucleus: just 1 token (cumulative after token 0 = 97.4% > 90%)
# Low-confidence situation: model unsure
low_confidence_logits = np.array([1.1, 1.0, 0.9, 0.8, 0.7])
lc_probs = softmax(low_confidence_logits)
print('Low confidence probs:', np.round(lc_probs, 3))
# [0.218, 0.208, 0.199, 0.190, 0.181]
# Top-p=0.9 nucleus: all 5 tokens (need all to reach 90%)top-p في OpenAI API
اضبط top_p في استدعاء API. يتراوح النطاق الصالح بين 0.0 و1.0. والقيمة الافتراضية هي 1.0 (المفردات الكاملة بلا تقييد للنواة).
توصي OpenAI بما يلي: إذا غيّرت top_p، فاترك درجة الحرارة عند 1.0، والعكس صحيح. فتعديل كليهما في الوقت نفسه يجعل سلوك أخذ العينات الفعلي صعب التنبؤ.
import openai
client = openai.OpenAI(api_key='sk-...')
# Nucleus sampling: top 90% of probability mass
resp = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Tell me an interesting fact about the ocean.'}],
temperature=1.0, # leave temperature at default
top_p=0.9 # sample from top 90% nucleus
)
print(resp.choices[0].message.content)p=1.0: أخذ عينات بلا قيود
عندما تكون top_p=1.0، تضم النواة جميع الرموز، أي المفردات الكاملة. وهذا يعادل أخذ العينات باستخدام درجة الحرارة فقط من دون تقييد top-p. ويملك كل رمز، مهما كان ضعيف الاحتمال، فرصة غير صفرية للاختيار.
استخدم p=1.0 عندما تريد أقصى قدر من التنوع. عند p=1.0، تتحكم درجة الحرارة وحدها في شكل التوزيع.
# p=1.0: all tokens in nucleus
resp_full = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Generate a creative story opening.'}],
temperature=1.0,
top_p=1.0 # no nucleus restriction
)
# p=0.5: very focused nucleus
resp_focused = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Generate a creative story opening.'}],
temperature=1.0,
top_p=0.5 # only top 50% probability mass
)المفاضلة: top-p مقابل درجة الحرارة
يتحكم كلا المعاملين في تنوع المخرجات، لكن بطريقة مختلفة:
- درجة الحرارة تعيد تشكيل التوزيع بالكامل، فتتغير احتمالية الرمز النسبية مقارنةً بجميع الرموز الأخرى
- top-p يقتطع التوزيع، فيُستبعد الرمز ببساطة إذا كان خارج النواة، بغض النظر عن احتماله النسبي
يمنع top-p مشكلة «أخذ العينات من الذيل»: فعند ارتفاع درجة الحرارة، قد تُختار أحيانًا رموز ضعيفة الاحتمال جدًا (كلام غير مفهوم أو كلمات غير ذات صلة). أما top-p فيزيل هذه الرموز من نطاق الاختيار تمامًا.
# The tail problem with temperature alone
high_temp_logits = np.array([3.0, 2.0, 1.0, 0.0, -1.0, -5.0, -10.0])
probs_high_temp = softmax(high_temp_logits, temperature=2.0)
print('High temp probs:', np.round(probs_high_temp, 4))
# The last token (logit=-10) still has a small probability
# With many tokens in a real vocab, these rare tokens accumulate
# and occasionally get sampled, producing incoherent output
# Top-p=0.9 cuts these off entirely
# ensuring only tokens contributing to the top 90% are consideredالجمع بين درجة الحرارة وtop-p
عند الجمع بين المعاملين، تُطبّق درجة الحرارة أولًا (فتعيد تشكيل التوزيع)، ثم يُطبّق top-p على الاحتمالات الناتجة (فيقتطعها إلى النواة).
إعدادات شائعة في بيئة الإنتاج:
- الكتابة الإبداعية: temp=1.0, top_p=0.95
- المحادثة: temp=0.8, top_p=0.9
- البرمجة: temp=0.2, top_p=1.0 (لا يكون top-p مقيّدًا عند درجة حرارة منخفضة)
def combined_sample(logits, temperature=1.0, top_p=0.9):
# Step 1: apply temperature
probs = softmax(logits, temperature=temperature)
# Step 2: apply top-p nucleus
sorted_idx = np.argsort(probs)[::-1]
sorted_probs = probs[sorted_idx]
cumulative = np.cumsum(sorted_probs)
nucleus_size = np.searchsorted(cumulative, top_p) + 1
nucleus_idx = sorted_idx[:nucleus_size]
nucleus_probs = probs[nucleus_idx]
nucleus_probs = nucleus_probs / nucleus_probs.sum()
return np.random.choice(nucleus_idx, p=nucleus_probs)top-p والتكرار
قد تؤدي قيم top-p المنخفضة إلى التكرار. فعندما تكون النواة صغيرة جدًا (مثل p=0.5)، يأخذ النموذج العينات مرارًا من مجموعة صغيرة جدًا من الرموز. فتصبح المخرجات متكررة وقابلة للتنبؤ، أي عكس التأثير الإبداعي المقصود.
راقب التكرار بوصفه مؤشرًا على أن top-p مضبوط على قيمة منخفضة جدًا بالنسبة إلى المهمة. ومن وسائل التشخيص المفيدة: إذا كرر النموذج العبارات نفسها في حلقة، فارفع top-p أو درجة الحرارة.
def detect_repetition(text, window=20):
words = text.split()
if len(words) < window * 2:
return False
# Check if any window of words repeats within the text
for i in range(len(words) - window):
phrase = ' '.join(words[i:i + window])
rest = ' '.join(words[i + window:])
if phrase in rest:
return True
return False
response = call_llm(prompt)
if detect_repetition(response):
print('Warning: repetition detected — consider increasing top_p or temperature')top-p مقابل top-k: لمحة تمهيدية
يقتطع كل من top-p وtop-k المفردات قبل أخذ العينات، لكن بطريقة مختلفة:
- top-p: حجم نواة ديناميكي — يتوسع عندما يكون النموذج غير متأكد، وينكمش عندما يكون واثقًا
- top-k: حجم نواة ثابت — يأخذ دائمًا في الحسبان k من الرموز بالضبط، بغض النظر عن درجة الثقة
يُفضَّل top-p عمومًا لأنه يتكيف مع درجة ثقة النموذج. وسيتناول الدرس التالي top-k بالتفصيل.
# Top-k equivalent for comparison
def top_k_sample(logits, k=50):
probs = softmax(logits)
# Keep only top-k tokens
top_k_indices = np.argsort(probs)[::-1][:k]
top_k_probs = probs[top_k_indices]
top_k_probs = top_k_probs / top_k_probs.sum()
return np.random.choice(top_k_indices, p=top_k_probs)
# Key difference: k is always 50, regardless of model confidence
# Top-p nucleus size varies from 1 to thousands depending on confidenceالقيم الافتراضية ومتى ينبغي تغييرها
القيم الافتراضية في API: top_p = 1.0 (لا تقييد للنواة). متى ينبغي تغييرها؟
- خفض top_p (من 0.7 إلى 0.9): عندما تبدو المخرجات غير مترابطة أو تحتوي على كلمات بلا معنى، بسبب الإفراط في أخذ العينات من الذيل
- الإبقاء على القيمة 1.0: عندما تكون درجة الحرارة منخفضة أصلًا، إذ يكون التوزيع حادًا بالفعل عند درجة الحرارة المنخفضة، ولا يكون top-p مقيّدًا على أي حال
- لا تخفض القيمة إلى أقل من 0.5: لأن ذلك يسبب التكرار وفقدان التنوع
# Guidance: what to adjust based on symptoms
TROUBLESHOOTING = {
'output is incoherent or contains random words': {
'fix': 'lower top_p to 0.9 or 0.85',
'or': 'lower temperature'
},
'output is repetitive and looping': {
'fix': 'increase top_p or temperature',
'also': 'try adding frequency_penalty or presence_penalty'
},
'output is too predictable and boring': {
'fix': 'increase temperature to 0.9-1.2',
'keep': 'top_p at 0.95'
},
'output needs to be deterministic': {
'fix': 'set temperature=0, top_p=1.0'
}
}top-p في Anthropic Claude
تتيح واجهة Claude API من Anthropic أيضًا استخدام top_p بوصفه معاملًا. والسلوك متطابق: يبني النموذج نواة من أصغر مجموعة من الرموز التي يحقق احتمالها التراكمي العتبة p، ثم يأخذ العينات من تلك النواة.
اجمعه مع درجة الحرارة للتحكم الدقيق: استخدم درجة الحرارة لتشكيل التوزيع، وtop_p لتحديد الرموز التي يمكن اختيارها من ذلك التوزيع.
import anthropic
claude = anthropic.Anthropic(api_key='sk-ant-...')
# Creative writing with nucleus sampling
message = claude.messages.create(
model='claude-opus-4-5',
max_tokens=256,
temperature=1.0,
top_p=0.95,
messages=[{
'role': 'user',
'content': 'Write a short poem about the ocean.'
}]
)
print(message.content[0].text)اختبار المعرفة
ما الميزة الأساسية لأخذ عينات top-p (النواة) مقارنةً بأخذ عينات top-k؟
مراجعة: أخذ عينات النواة باستخدام top-p
يبني أخذ العينات باستخدام top-p نواة ديناميكية، أي أصغر مجموعة من الرموز التي تغطي p على الأقل من إجمالي الاحتمال:
- p=1.0: المفردات الكاملة، بلا قيود
- p=0.9: أعلى 90% من كتلة الاحتمال، وهو إعداد إبداعي شائع
- p=0.5: تركيز شديد، مع خطر التكرار
تتوسع النواة عندما يكون النموذج غير متأكد، وتنكمش عندما يكون واثقًا. ويمنع ذلك أخذ العينات من الذيل (أي الكلام غير المفهوم الناتج عن الرموز ضعيفة الاحتمال) مع الحفاظ على التنوع. الدرس التالي: أخذ عينات top-k وكيف يختلف عن top-p.
تعلم AI Prompt Engineering مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 53
- الدروس
- 199
الأسئلة الشائعة
هل درس «أخذ عينات النواة Top-p» مجاني؟
نعم — نص درس «أخذ عينات النواة Top-p» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Prompt Engineering، انتقل إلى CoddyKit PRO. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
ماذا ستتعلم في «أخذ عينات النواة Top-p»؟
كيف يقيّد top-p أخذ العينات بمجموعة الرموز الأكثر احتمالًا تتمرن على AI Prompt Engineering مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Prompt Engineering؟
لا تُشترط خبرة سابقة. AI Prompt Engineering على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «أخذ عينات النواة Top-p»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Prompt Engineering هذا؟
نعم. كل درس في AI Prompt Engineering يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما درجة الحرارة في LLMs؟
- أخذ عينات النواة Top-p
- أخذ عينات Top-k
- اختيار المعلمات لحالة الاستخدام