Pengambilan Sampel Top-k
Membatasi pilihan pada k token yang paling mungkin dan memahami pengaruhnya terhadap keragaman output.
Pengambilan Sampel Top-k adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 3 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-k Sampling?
Top-k sampling membatasi model agar melakukan sampling hanya dari k token yang paling mungkin pada setiap langkah. Semua token di luar top-k diberi probabilitas nol dan tidak dapat dipilih.
k=1 adalah dekode greedy (hanya satu token yang paling mungkin). k=50 merupakan rentang kreatif yang umum. k=vocabulary_size setara dengan sampling tanpa pembatasan.
Algoritme Top-k
Algoritmanya lebih sederhana daripada top-p:
- Hitung probabilitas softmax di seluruh kosakata
- Urutkan token berdasarkan probabilitas secara menurun
- Pertahankan hanya k token teratas; atur semua token lainnya menjadi 0
- Normalisasikan ulang probabilitas top-k agar jumlahnya menjadi 1
- Lakukan sampling dari distribusi yang telah dinormalisasikan ulang
import numpy as np
def softmax(logits, temperature=1.0):
scaled = logits / temperature
e = np.exp(scaled - np.max(scaled))
return e / e.sum()
def top_k_sample(logits, k=50, temperature=1.0):
probs = softmax(logits, temperature)
# Find top-k indices
top_k_indices = np.argsort(probs)[::-1][:k]
top_k_probs = probs[top_k_indices]
# Renormalize
top_k_probs = top_k_probs / top_k_probs.sum()
# Sample
chosen = np.random.choice(top_k_indices, p=top_k_probs)
return chosen
# With a 10-token vocabulary:
logits = np.random.randn(10)
print('Chosen token:', top_k_sample(logits, k=3))k=1: Dekode Greedy
Saat k=1, hanya satu token yang paling mungkin yang berada dalam kumpulan kandidat. Sampling dari kumpulan berukuran 1 bersifat deterministik — model selalu memilih token tersebut. Ini identik dengan dekode greedy (temperature=0).
logits = np.array([3.0, 2.0, 1.0, 0.5, -1.0])
# k=1: greedy
top_1 = top_k_sample(logits, k=1)
print(f'k=1 always picks: {np.argmax(logits)}') # index 0, the highest logit
print(f'top_k_sample result: {top_1}') # always 0
# Multiple runs
for _ in range(5):
print(top_k_sample(logits, k=1), end=' ')
# Output: 0 0 0 0 0 — perfectly deterministicRentang Kreatif Umum: k=50
k=50 merupakan nilai bawaan yang umum untuk pembuatan teks kreatif. Nilai ini memungkinkan eksplorasi 50 token pada setiap langkah sekaligus mencegah model memilih token yang tingkat keyakinannya sangat rendah.
Dengan kosakata yang terdiri dari 50.000 token, k=50 berarti model hanya mempertimbangkan 0,1% token teratas pada setiap langkah. Ini merupakan pembatasan yang signifikan — sebagian besar kosakata dikeluarkan.
import openai
client = openai.OpenAI(api_key='sk-...')
# Note: OpenAI API does not expose top_k directly in chat completions.
# Top-k is primarily a parameter in Hugging Face Transformers and Anthropic's API.
# Hugging Face example:
from transformers import pipeline
generator = pipeline('text-generation', model='gpt2')
output = generator(
'Once upon a time',
max_new_tokens=100,
do_sample=True,
top_k=50,
temperature=1.0
)
print(output[0]['generated_text'])Top-k dalam API Claude dari Anthropic
API Claude dari Anthropic menyediakan top_k sebagai parameter langsung. Dengan demikian, Anda dapat dengan mudah bereksperimen dengan dampak pemangkasan kosakata tetap terhadap output Claude.
import anthropic
claude = anthropic.Anthropic(api_key='sk-ant-...')
# top_k limits the number of tokens considered
message = claude.messages.create(
model='claude-opus-4-5',
max_tokens=256,
temperature=1.0,
top_k=50, # sample from top 50 most probable tokens
messages=[{
'role': 'user',
'content': 'Write a short poem about debugging code.'
}]
)
print(message.content[0].text)Masalah k Tetap
Keterbatasan mendasar top-k: k tetap, terlepas dari tingkat keyakinan model pada langkah tersebut.
Saat model sangat yakin (satu token memiliki probabilitas 95%), k=50 tetap menyertakan 49 token yang sebagian besar tidak relevan. Saat model sangat tidak yakin (50 token masing-masing memiliki probabilitas sekitar 2%), k=50 mungkin memang sesuai.
Masalahnya: k=50 dapat sekaligus terlalu membatasi dan terlalu longgar, bergantung pada konteks. Top-p mengatasi hal ini dengan ukuran nukleus yang dinamis.
# Illustrating the fixed-k problem
logits_confident = np.array([5.0] + [0.1] * 9) # model is very sure
logits_uncertain = np.array([1.0] * 10) # model has no idea
probs_conf = softmax(logits_confident)
probs_unc = softmax(logits_uncertain)
print('Confident — top 3 tokens cover:', np.sort(probs_conf)[::-1][:3].sum().round(3))
# ~0.998 — k=50 is extremely wasteful, includes near-zero probability tokens
print('Uncertain — top 3 tokens cover:', np.sort(probs_unc)[::-1][:3].sum().round(3))
# ~0.30 — k=50 may actually be needed to cover a reasonable nucleusTop-k pada Ekor Distribusi
Top-k dan top-p paling berbeda secara signifikan pada ekor distribusi:
- Dengan top-k=50, token ke-50 mungkin memiliki probabilitas 0,001% (sangat kecil kemungkinannya, tetapi tetap berada dalam kumpulan kandidat)
- Dengan top-p=0.9, setiap token di luar nukleus 90% dikeluarkan — termasuk token yang mungkin berada dalam top-k
Top-p menangani perilaku ekor secara lebih berlandaskan prinsip: token yang kecil kemungkinannya dikeluarkan berdasarkan probabilitas, bukan posisinya dalam peringkat.
# Tail behavior comparison
import numpy as np
# Highly skewed distribution (one dominant token)
skewed_logits = np.array([4.0, 2.0, 1.5, 1.0, 0.5,
0.1, 0.0, -0.1, -0.5, -1.0])
probs = softmax(skewed_logits)
print('Probability of tokens 6-9 (tail):')
for i in range(6, 10):
print(f' Token {i}: {probs[i]:.4%}')
# These tokens are very unlikely but are included in top-k=10
# Top-p=0.9 would exclude them entirelyMenggabungkan Top-k dan Top-p
Beberapa implementasi menerapkan top-k dan top-p sekaligus: pertama memangkas menjadi top-k, lalu menerapkan top-p nucleus sampling di dalam kumpulan tersebut. Cara ini memberikan batas keras pada ukuran kosakata (top-k) sekaligus menerapkan penyaringan berbasis probabilitas (top-p).
def top_k_top_p_sample(logits, k=50, p=0.9, temperature=1.0):
probs = softmax(logits, temperature)
# First apply top-k
top_k_indices = np.argsort(probs)[::-1][:k]
top_k_probs = probs[top_k_indices]
# Then apply top-p within top-k
sorted_k = np.sort(top_k_probs)[::-1]
cumulative = np.cumsum(sorted_k)
nucleus_size = np.searchsorted(cumulative, p) + 1
final_indices = top_k_indices[:nucleus_size]
final_probs = top_k_probs[:nucleus_size]
final_probs = final_probs / final_probs.sum()
return np.random.choice(final_indices, p=final_probs)Kapan Top-k Lebih Dipilih daripada Top-p
Meskipun top-p memiliki keunggulan teoretis, top-k lebih dipilih dalam beberapa situasi:
- Tugas dengan kosakata terbatas: saat model hanya boleh menghasilkan output dari kumpulan tetap (misalnya, pilihan ganda A/B/C/D), top-k kecil (4) secara langsung menegakkan batasan ini
- Reproduktibilitas: perilaku top-k lebih mudah dipahami — 'selalu pertimbangkan tepat 50 token'
- Implementasi yang dioptimalkan untuk perangkat keras: beberapa mesin inferensi menerapkan top-k dengan lebih efisien daripada top-p
# Constrained output with top-k=4
# For a multiple choice task (A, B, C, D)
# If A/B/C/D tokens have indices 32, 33, 34, 35
# top-k=4 with those as the top-4 logits forces selection from those 4 only
multiple_choice_prompt = (
'Answer with only A, B, C, or D.\n'
'What is the capital of France?\n'
'A) Berlin\n'
'B) Paris\n'
'C) Rome\n'
'D) Madrid\n'
'Answer:'
)
# With temperature=0, top_k=1: always picks the highest logit tokenPanduan Praktis Top-k
Kapan menggunakan top-k dan nilai yang harus dipilih:
- k=1: tugas greedy / faktual
- k=5–20: tugas kreatif yang terfokus, variasi minimal
- k=40–100: rentang kreatif standar pada sebagian besar model bahasa
- k=500+: eksplorasi yang sangat terbuka (jarang diperlukan; gunakan top-p sebagai gantinya)
Pada sebagian besar API LLM modern, top-p merupakan parameter yang lebih disukai. Gunakan top-k saat Anda memerlukan batas keras pada kosakata atau saat API menyediakan top-k tetapi tidak menyediakan top-p.
TOP_K_GUIDELINES = {
'factual_qa': 1, # greedy
'code_generation': 10, # near-greedy, correct syntax
'summarization': 20, # slightly varied but focused
'chat': 50, # natural variation
'creative_writing': 100, # wider vocabulary exploration
'poetry': 200, # unusual word choices encouraged
}
def call_with_top_k(task, prompt, model='claude-opus-4-5'):
k = TOP_K_GUIDELINES.get(task, 50)
claude = anthropic.Anthropic(api_key='sk-ant-...')
return claude.messages.create(
model=model,
max_tokens=512,
top_k=k,
messages=[{'role': 'user', 'content': prompt}]
)Top-k dan Suhu Secara Bersamaan
Top-k dan suhu diterapkan secara berurutan: suhu terlebih dahulu membentuk ulang distribusi logit, lalu top-k memangkasnya menjadi k token yang paling mungkin. Penggunaan keduanya secara bersamaan umum dilakukan dalam pipeline Hugging Face Transformers.
Kombinasi yang umum: temperature=0.9 (keragaman sedang) + top_k=50 (batas kosakata yang tegas). Ini menghindari keluaran yang terlalu datar akibat suhu tinggi saja maupun masalah pengambilan sampel dari ekor distribusi.
from transformers import pipeline
generator = pipeline('text-generation', model='gpt2')
# Combined top-k + temperature
output = generator(
'The future of AI is',
max_new_tokens=80,
do_sample=True,
top_k=50,
temperature=0.9
)
print(output[0]['generated_text'])
# Compare: top-k=1 (greedy)
greedy_output = generator(
'The future of AI is',
max_new_tokens=80,
do_sample=False # greedy, equivalent to top_k=1
)
print(greedy_output[0]['generated_text'])Uji Pengetahuan
Dalam pengambilan sampel top-k, jika k=1 ditetapkan, perilaku apa yang ditunjukkan model?
Rekap: Pengambilan Sampel Top-k
Pengambilan sampel top-k memangkas kosakata menjadi k token yang paling mungkin sebelum pengambilan sampel:
- k=1: dekode rakus — deterministik, selalu memilih token teratas
- k=50: rentang kreatif yang umum — keragaman dan koherensi yang seimbang
- Keterbatasan utama: k tetap, terlepas dari tingkat keyakinan model — dapat terlalu longgar atau terlalu ketat
- Dibandingkan dengan top-p: inti dinamis top-p menyesuaikan diri dengan tingkat keyakinan; top-k tidak
Gunakan top-k ketika Anda memerlukan batas kosakata yang tegas. Untuk sebagian besar aplikasi produksi, prioritaskan top-p. Pelajaran berikutnya: memilih parameter untuk kasus penggunaan khusus Anda.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengambilan Sampel Top-k” gratis?
Ya — teks lengkap “Pengambilan Sampel Top-k” 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 Top-k”?
Membatasi pilihan pada k token yang paling mungkin dan memahami pengaruhnya terhadap keragaman output. 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 3 dari 4.
Berapa lama pelajaran “Pengambilan Sampel Top-k” 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