list_altİçindekilerexpand_more
- 01LLM token nasıl üretir?
- 02Greedy Decoding: en yüksek olasılıklı token
- 03Temperature: dağılımı genişlet ya da daralt
- 04Top-K: seçenek havuzunu sabitle
- 05Top-P (Nucleus Sampling): dinamik eşik
- 06Min-P: görece yeni bir alternatif
- 07Parametreler birlikte nasıl çalışır?
- 08Seed: aynı parametrelerde tekrarlanabilirlik
- 09Hangi parametreden başlamalı?
ChatGPT’ye aynı soruyu iki kez soruyorsunuz. İlkinde “Peki, bu konuya birkaç açıdan bakabiliriz” diye başlıyor; ikincisinde farklı bir cümleyle açılıyor. Model her seferinde aynı ağırlıklarla çalışıyor, aynı bağlam penceresine bakıyor. Değişen tek şey token seçim mekanizması.
Bu mekanizmanın ismi sampling (örnekleme). Hangi parametreyi nasıl ayarladığınız, modelin yanıtlarının ne kadar tutarlı, ne kadar yaratıcı ya da ne kadar tekrarcı olacağını belirliyor.

LLM token nasıl üretir?
Büyük dil modelleri metni kelime kelime değil, token token üretir. Her adımda model, bir sonraki tokenın hangi kelime parçası olabileceğini tahmin etmek için bütün kelime dağarcığına (genellikle 32.000 ile 128.000 arasında farklı token) bir olasılık atıyor. Bu olasılık vektörüne logit dağılımı deniyor; softmax fonksiyonu logitleri toplamı 1 olan olasılıklara çeviriyor.
Örneğin “İstanbul’un havası…” cümlesini tamamlaması istendiğinde model şu logitleri üretebilir:
| Token | Olasılık |
|---|---|
| bugün | 0.35 |
| bu mevsimde | 0.20 |
| genellikle | 0.18 |
| bazen | 0.12 |
| diğerleri | 0.15 |
Soru şu: bu dağılımdan bir sonraki token nasıl seçilecek? Sampling stratejileri tam burada işe giriyor.
Bu sürece autoregressive decoding deniyor; her token bir öncekinin üzerine inşa ediliyor ve döngü bir durdurma tokenına kadar ya da maksimum uzunluk sınırına ulaşana kadar devam ediyor.
Greedy Decoding: en yüksek olasılıklı token
En basit strateji: her adımda sadece en yüksek olasılıklı tokeni seç. Buna greedy decoding deniyor.
import torch
logits = torch.tensor([2.1, 0.8, 1.5, 0.3])
next_token = torch.argmax(logits) # Her zaman en yüksek logiti seçer
Avantajı belirgin: deterministik. Aynı girdide her seferinde aynı çıktıyı alırsınız. Kod tamamlama veya matematiksel hesaplama gibi tek doğru cevabın olduğu görevlerde işe yarar.
Dezavantajı da belirgin: tekrarcı. Greedy decoding, dil modellerinin yüksek olasılıklı döngülere düşmesine yol açar. Model “gerçekten, gerçekten, gerçekten” gibi kalıpları sonsuz tekrarlayabilir, çünkü her adımda o an için mantıklı görünen şeyi seçer ama uzun vadede çeşitliliği yitirir.
Temperature: dağılımı genişlet ya da daralt
Temperature, softmax dağılımını ölçeklendiren en temel sampling parametresidir. Logitler softmax’a geçmeden önce T değerine bölünür:
p(x_i) = exp(logit_i / T) / Σ exp(logit_j / T)
T = 1.0: standart davranış, modelin eğitimden gelen dağılımı olduğu gibi kullanılır.T < 1.0(örneğin 0.2): dağılım sivrileşir, yüksek olasılıklı tokenlar daha da yüksek olasılık kazanır. Çıktı daha öngörülebilir ve tutarlı, ama daha az çeşitli.T > 1.0(örneğin 1.5): dağılım düzleşir, düşük olasılıklı tokenlar daha fazla şans kazanır. Çıktı daha yaratıcı ama aynı zamanda daha rastgele ve bazen anlamsız.
import torch
import torch.nn.functional as F
logits = torch.tensor([2.1, 0.8, 1.5, 0.3])
# Temperature = 0.5 (daha güvenli)
probs_low_temp = F.softmax(logits / 0.5, dim=0)
# Temperature = 1.5 (daha yaratıcı)
probs_high_temp = F.softmax(logits / 1.5, dim=0)
Kod üretiminde temperature genellikle 0.0-0.3 arasında tutulur. Genel sohbet için 0.7, yaratıcı yazı için 0.8-1.0 makul başlangıç noktaları. Temperature sıfıra yaklaştıkça greedy decoding’e eşdeğer bir davranış elde edilir.
Prompt engineering pratiklerini incelerken bu parametre ayarlarının gerçek çıktı kalitesine etkisini de görebilirsiniz.
Top-K: seçenek havuzunu sabitle
Top-K sampling, olasılık dağılımından en yüksek K tokeni tutar, gerisini sıfırlar, kalan K token üzerinden örnekler.
K = 50 ise, her adımda en olası 50 tokenden biri seçilir; geri kalan binlerce seçenek değerlendirme dışı kalır.
def top_k_sampling(logits, k=50):
values, indices = torch.topk(logits, k)
filtered = torch.full_like(logits, float('-inf'))
filtered.scatter_(0, indices, values)
probs = F.softmax(filtered, dim=0)
return torch.multinomial(probs, 1)
Mantıksal avantajı açık: çok düşük olasılıklı tokenları keserek modelin saçma seçimler yapma riskini azaltıyor. Sorun şu: K sabit bir sayı, oysa ideal pencere bağlama göre değişir. Dağılım düzse, yani pek çok token yakın olasılıktaysa, K = 50 fazla kısıtlayıcı olabilir. Dağılım çok keskinse, birkaç token açık ara öndeyse, K = 50 hâlâ gereksiz gürültü ekleyebilir.
Top-P (Nucleus Sampling): dinamik eşik
Top-P sampling (nucleus sampling olarak da bilinir), sabit bir sayı yerine kümülatif bir olasılık eşiği kullanır. En olası tokenları, toplamları P’ye ulaşana kadar biriktir; ardından yalnızca bu “çekirdek” set üzerinden örnekle.
P = 0.9 ise: tokenları en yüksekten en düşüğe sırala, kümülatif olasılık 0.90’ı geçtiği noktada kes, o set üzerinden örnekle.
def top_p_sampling(logits, p=0.9):
sorted_logits, sorted_indices = torch.sort(logits, descending=True)
sorted_probs = F.softmax(sorted_logits, dim=0)
cumulative_probs = torch.cumsum(sorted_probs, dim=0)
# Eşiği aşan tokenları maskele
remove_mask = cumulative_probs - sorted_probs > p
sorted_logits[remove_mask] = float('-inf')
# Orijinal sıraya döndür
logits_filtered = sorted_logits.gather(0, sorted_indices.argsort())
probs = F.softmax(logits_filtered, dim=0)
return torch.multinomial(probs, 1)
Top-P’nin Top-K’ya göre temel farkı adaptif olması. Dağılım keskinleşince (model o anki bağlamda çok emin), çekirdek küçülür. Dağılım düzleşince (model belirsiz kalıyorsa), çekirdek genişler. Bu iki uç durumu da daha doğal ele alır.
2019’da Holtzman ve arkadaşları tarafından önerilen nucleus sampling, o tarihten beri çoğu LLM API’sının varsayılan yaklaşımı konumuna geldi. OpenAI ve Anthropic API’leri top_p parametresini doğrudan destekliyor.
RLHF ile model hizalaması hakkındaki yazımızda bu parametrelerin model davranışıyla nasıl kesiştiğine de değiniliyor.
Min-P: görece yeni bir alternatif
Min-P, 2023 yılında açık kaynak topluluk tarafından geliştirilen ve LLaMA.cpp gibi çıkarım motorlarına eklenen daha yeni bir strateji. Temel fikri şu: her adımda en olası tokenun olasılığını al ve bu değerin belirli bir oranının altındaki tüm tokenleri ele.
Eğer en olası token 0.60 olasılığına sahipse ve min_p = 0.05 ise, kesim noktası 0.60 × 0.05 = 0.03 olur. Yani 0.03’ün altındaki tokenler devre dışı kalır.
Bu yaklaşımın güçlü yanı şu: kesim noktası, o anki dağılımın durumuna göre kendiliğinden ayarlanır. Model güçlü bir seçenek gördüğünde çıta yükselir; belirsiz durumlarda çıta düşer ve çeşitlilik korunur. Top-P ile pratik fark çoğu senaryoda küçük, ama Min-P uzun metin üretiminde tutarlılığı daha iyi korurken yaratıcılığı da elden bırakmaz. Açık kaynak LLM çıkarım motorları kullanıyorsanız bu parametreyi denemeye değer.
Parametreler birlikte nasıl çalışır?
Gerçek dünyada bu parametreler genellikle bir arada kullanılır:
| Kullanım Senaryosu | Temperature | Top-K | Top-P | Min-P |
|---|---|---|---|---|
| Kod tamamlama | 0.0–0.3 | — | 0.95 | — |
| Yaratıcı yazı | 0.7–1.0 | — | 0.9 | — |
| Beyin fırtınası | 1.0–1.3 | 50 | — | — |
| Sohbet botu | 0.7 | — | 0.9 | — |
| Veri çıkarma / JSON | 0.0 | — | — | — |
Top-P ile Top-K’yı aynı anda kullanmanın anlamı yok. İkisi de adayları kırpıyor; birini seçmek yeterli. Pratikte Top-P tek başına ya da temperature ile birlikte kullanmak daha yaygın.
Temperature, Top-K ve Top-P değerleri Hugging Face transformers kütüphanesi üzerinden şöyle geçilebilir:
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_name = "meta-llama/Llama-3.1-8B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16)
inputs = tokenizer("İstanbul'un havası", return_tensors="pt")
outputs = model.generate(
**inputs,
max_new_tokens=50,
temperature=0.7,
top_p=0.9,
do_sample=True, # sampling'i aktif et; False ise greedy
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
do_sample=False ayarlandığında temperature ve top_p devre dışı kalır, greedy decoding çalışır.
Seed: aynı parametrelerde tekrarlanabilirlik
Sampling rastgele, ama bu rastgelelik kontrol altına alınabiliyor. Çoğu LLM API’si ve kütüphanesi bir seed parametresi sunuyor. Aynı seed, aynı temperature ve aynı girdi verildiğinde her seferinde aynı çıktıyı üretirsiniz.
İki durumda özellikle işe yarıyor:
- Hata ayıklama: bir prompting hatasını yeniden üretmek istiyorsunuz.
- A/B testi: farklı sistem promptlarını karşılaştırırken çıktı değişkenliğini izole etmek istiyorsunuz.
import torch
torch.manual_seed(42)
outputs = model.generate(**inputs, temperature=0.8, do_sample=True)
OpenAI API’sinde seed parametresi 2023-11 sürümüyle geldi. Anthropic’in Claude API’sinde tutarlılık, belirli bir model sürümüyle birlikte system_fingerprint mekanizmasıyla ilişkili.
Akıl yürüten AI modelleri üzerine yazımızda bu modellerin neden çoğunlukla düşük temperature ya da greedy decoding tercih ettiği de açıklanıyor; o modeller reasoning adımlarını tutarlı tutmak için rastgeleliği olabildiğince kısıyor.
Hangi parametreden başlamalı?
Önce temperature’ı ayarlayın. Bu en temel kontrol. Kod ya da yapılandırılmış çıktı için 0.0-0.3, genel sohbet için 0.7, yaratıcı içerik için 0.8-1.0.
Sonra Top-P ekleyin. Temperature’ı ayarladıktan sonra top_p=0.9 iyi bir başlangıç; olası tokenlar arasındaki dengeyi tutuyor.
Top-K veya Min-P’yi yalnızca yukarıdaki ikili yetmiyorsa deneyin. Uzun metin üretiminde kalıpların kırılması için yardımcı olabilirler.
Geliştirme sırasında seed sabitleyin, üretime geçerken kaldırın ya da kullanıcı tercihine bırakın.
Structured outputs veya JSON çıkarma yapıyorsanız temperature’ı sıfıra çekmek format hatalarını önemli ölçüde azaltır. Aynı kural chain-of-thought prompting için de geçerli; akıl yürütme adımlarının tutarlı kalması için düşük temperature tercih edilir.



