Pengambilan Sampel Nukleus Top-p
Pelajari cara top-p membatasi pengambilan sampel pada kumpulan token yang paling mungkin.
Pengambilan Sampel Nukleus Top-p adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Apa Itu Top-p Sampling?
Top-p sampling (juga disebut nucleus sampling) adalah teknik yang membatasi sampling pada subset kosakata yang dinamis. Alih-alih melakukan sampling dari semua token, model hanya mempertimbangkan kumpulan token terkecil yang probabilitas kumulatifnya setidaknya sebesar p.
Teknik ini diperkenalkan dalam makalah 'The Curious Case of Neural Text Degeneration' (Holtzman et al., 2019), dan mengungguli penskalaan temperature sederhana untuk menghasilkan teks yang beragam sekaligus koheren.
Cara Kerja Top-p Langkah demi Langkah
Algoritmanya:
- Hitung probabilitas softmax di seluruh kosakata
- Urutkan token berdasarkan probabilitas (tertinggi di awal)
- Telusuri daftar yang telah diurutkan sambil mengakumulasikan probabilitas hingga jumlah kumulatif mencapai p
- Kumpulan token ini disebut nukleus
- Lakukan sampling hanya dari nukleus (normalisasikan ulang probabilitas agar jumlahnya menjadi 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)Nukleus yang Dinamis
Gagasan utama top-p: ukuran nukleus bersifat dinamis. Saat model sangat yakin (satu token mendominasi dengan probabilitas 0.95), nukleus hanya berisi 1 token. Saat model tidak yakin (banyak token memiliki probabilitas yang serupa), nukleus meluas untuk mencakup lebih banyak token.
Hal ini menyesuaikan diri dengan tingkat keyakinan model — keyakinan tinggi → ukuran kosakata kecil → output terfokus. Keyakinan rendah → kosakata lebih besar → eksplorasi lebih banyak.
# 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 dalam API OpenAI
Atur top_p dalam pemanggilan API Anda. Rentang yang valid adalah 0.0–1.0. Nilai bawaannya adalah 1.0 (kosakata lengkap, tanpa pembatasan nukleus).
OpenAI merekomendasikan: jika Anda mengubah top_p, biarkan temperature pada 1.0, dan sebaliknya. Menyesuaikan keduanya secara bersamaan membuat perilaku sampling efektif sulit diprediksi.
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: Sampling Tanpa Pembatasan
Saat top_p=1.0, nukleus mencakup semua token — seluruh kosakata. Ini setara dengan sampling temperature murni tanpa pembatasan top-p. Setiap token, seberapa pun kecil kemungkinannya, memiliki peluang nonnol untuk dipilih.
Gunakan p=1.0 saat Anda menginginkan keberagaman maksimum. Pada p=1.0, hanya temperature yang mengendalikan bentuk distribusi.
# 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
)Pertukaran: Top-p vs Temperature
Kedua parameter mengendalikan keberagaman output, tetapi dengan cara yang berbeda:
- Temperature membentuk ulang seluruh distribusi — probabilitas relatif suatu token terhadap semua token lainnya berubah
- Top-p memangkas distribusi — suatu token langsung dikeluarkan jika berada di luar nukleus, terlepas dari probabilitas relatifnya
Top-p mencegah masalah 'sampling ekor': dengan temperature tinggi, token yang sangat kecil kemungkinannya (teks tidak bermakna atau kata yang tidak berkaitan) sesekali terpilih. Top-p menghapus token-token tersebut sepenuhnya dari pertimbangan.
# 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 consideredMenggabungkan Temperature dan Top-p
Saat kedua parameter digabungkan, temperature diterapkan terlebih dahulu (membentuk ulang distribusi), lalu top-p diterapkan pada probabilitas yang dihasilkan (memangkasnya menjadi nukleus).
Konfigurasi produksi yang umum:
- Penulisan kreatif: temp=1.0, top_p=0.95
- Obrolan: temp=0.8, top_p=0.9
- Kode: temp=0.2, top_p=1.0 (top-p tidak membatasi pada temperature rendah)
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 dan Pengulangan
Nilai top-p yang rendah dapat menyebabkan pengulangan. Saat nukleus sangat kecil (misalnya, p=0.5), model berulang kali melakukan sampling dari kumpulan token yang sangat sedikit. Output menjadi berulang dan mudah diprediksi — berlawanan dengan efek kreatif yang diharapkan.
Perhatikan pengulangan sebagai tanda bahwa top-p terlalu rendah untuk tugas tersebut. Diagnosis yang berguna: jika model terus mengulang frasa yang sama, naikkan top-p atau temperature.
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 vs Top-k: Pratinjau
Top-p dan top-k sama-sama memangkas kosakata sebelum sampling, tetapi dengan cara yang berbeda:
- Top-p: ukuran nukleus dinamis — meluas saat model tidak yakin dan menyusut saat model yakin
- Top-k: ukuran nukleus tetap — selalu mempertimbangkan tepat k token terlepas dari tingkat keyakinan
Top-p umumnya lebih disukai karena menyesuaikan diri dengan tingkat keyakinan model. Top-k dibahas secara mendetail dalam pelajaran berikutnya.
# 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 confidenceNilai Bawaan dan Kapan Mengubahnya
Nilai bawaan API: top_p = 1.0 (tanpa pembatasan nukleus). Kapan Anda harus mengubahnya?
- Turunkan top_p (0.7–0.9): saat output terasa tidak koheren atau berisi kata-kata yang tidak masuk akal — terlalu banyak sampling dari ekor distribusi
- Pertahankan pada 1.0: saat temperature sudah rendah — pada temperature rendah, distribusi sudah tajam dan top-p juga tidak membatasi
- Jangan turunkan di bawah 0.5: dapat menyebabkan pengulangan dan hilangnya keberagaman
# 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 dalam Anthropic Claude
API Claude dari Anthropic juga menyediakan top_p sebagai parameter. Perilakunya identik: model membentuk nukleus dari kumpulan token terkecil yang probabilitas kumulatifnya memenuhi ambang p, lalu melakukan sampling dari nukleus tersebut.
Gabungkan dengan temperature untuk mendapatkan kendali yang lebih halus: gunakan temperature untuk membentuk distribusi, dan top_p untuk membatasi token yang dapat dipilih dari distribusi tersebut.
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)Uji Pemahaman
Apa keunggulan utama top-p (nucleus) sampling dibandingkan top-k sampling?
Ringkasan: Top-p Nucleus Sampling
Top-p sampling membentuk nukleus dinamis — kumpulan token terkecil yang mencakup setidaknya p dari total probabilitas:
- p=1.0: kosakata lengkap, tanpa pembatasan
- p=0.9: massa probabilitas 90% teratas — pengaturan kreatif yang umum
- p=0.5: sangat terfokus — berisiko menyebabkan pengulangan
Nukleus meluas saat model tidak yakin dan menyusut saat model yakin. Hal ini mencegah sampling dari ekor distribusi (teks tidak bermakna dari token yang kecil kemungkinannya) sekaligus mempertahankan keberagaman. Pelajaran berikutnya: top-k sampling dan perbedaannya dari top-p.
Belajar AI Prompt Engineering dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 53
- Pelajaran
- 199
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengambilan Sampel Nukleus Top-p” gratis?
Ya — teks lengkap “Pengambilan Sampel Nukleus Top-p” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengambilan Sampel Nukleus Top-p”?
Pelajari cara top-p membatasi pengambilan sampel pada kumpulan token yang paling mungkin. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?
Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Pengambilan Sampel Nukleus Top-p” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?
Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Apa Itu Temperature pada LLM?
- Pengambilan Sampel Nukleus Top-p
- Pengambilan Sampel Top-k
- Memilih Parameter untuk Kasus Penggunaan Anda