AI Atlas
Orta · ~2 dk okuma #repeat_penalty #sampling #inference

repeat_penalty

Tekrar cezası ve repeat_last_n

Son N token içinde geçmiş token'ların tekrar seçilme şansını düşüren sampling cezası. Ollama ve llama.cpp'de `repeat_last_n` bu pencerenin boyunu belirler.

SON N TOKEN İÇİNDE TEKRAR EDENLER CEZALANIR...sonrakapıyıaçtı.Sonrakapıyıaçtı.Sonra?repeat_last_nREPEAT_PENALTY = 1.20"açtı" önce4.00sonra ÷ 1.23.33"ve" önce-1.00sonra × 1.2-1.20PRESENCE / FREQUENCYlogit −= count×freq + (count>0)×prespresence: bir kez geçti mi? → sabit cezafrequency: kaç kez geçti? → artan cezarepeat_penalty: kaç kez olursa olsun aynıOllama / llama.cpp default: 1.0 · 64 · 0 · 0Pozitif logit bölünür, negatif çarpılır: ikisi de daha az olası olur (değerler temsilî)
Tanım

Küçük ve quantize edilmiş modeller bazen aynı cümleyi ya da kelimeyi döngü hâlinde tekrarlar. Tekrar cezaları, yakın zamanda üretilmiş token'ların logit'ini düşürerek bunu frenler.

İki parça birlikte çalışır:

  • repeat_penalty: cezanın şiddeti. 1.0 = kapalı, 1.1 hafif, 1.3+ sert.
  • repeat_last_n: geriye doğru kaç token'a bakılacağı. 0 = kapalı.

llama.cpp'nin uyguladığı formül (Ollama da GGUF modelleri llama.cpp sunucusu üzerinden çalıştırır): pencerede geçen her token için logit pozitifse penalty'ye bölünür, negatifse penalty ile çarpılır. Token pencerede 1 kez de geçse 10 kez de geçse ceza aynıdır.

OpenAI tarzı API'lerdeki iki ceza ise toplamsal çalışır:

logit -= count × frequency_penalty + (count > 0) × presence_penalty

  • presence_penalty: token bir kez bile geçtiyse sabit ceza → yeni konulara itme.
  • frequency_penalty: geçiş sayısıyla büyüyen ceza → aynı kelimeyi sürekli kullanmayı azaltma.

Default değerler (Ekim 2026 itibarıyla):

Motorrepeat_penaltyrepeat_last_npresence / frequency
Ollama1.0 (kapalı)640.0 / 0.0
llama.cpp1.0 (kapalı)640.0 / 0.0
vLLMrepetition_penalty 1.0—0.0 / 0.0
OpenAI APIyok—0 / 0 (aralık -2.0 … 2.0)

llama.cpp'de flag'ler: --repeat-penalty, --repeat-last-n, --presence-penalty, --frequency-penalty.

Benzetme

Bir konuşmacıya "son 64 kelimede kullandığın kelimeleri tekrar söylersen puan kaybedersin" demek. repeat_penalty puan kaybının ne kadar acıtacağı, repeat_last_n ise hafızanın ne kadar geriye gittiği. Pencere çok kısaysa konuşmacı aynı paragrafı bir sayfa sonra yine anlatır; ceza çok sertse "ve", "bir" gibi kelimelerden bile kaçmaya başlar.

Gerçek dünyadan örnek

Küçük bir model hikâye yazarken döngüye giriyor:

`` ...ve sonra kapıyı açtı. Sonra kapıyı açtı. Sonra kapıyı açtı... ``

"açtı" token'ının logit'i 4.0 olsun. repeat_penalty 1.2 ile: 4.0 / 1.2 ≈ 3.33. Logit'i -1.0 olan bir token ise -1.0 × 1.2 = -1.2 olur; ikisi de daha az olası hâle gelir.

Ollama Modelfile: `` FROM llama3.2 PARAMETER repeat_penalty 1.15 PARAMETER repeat_last_n 256 ``

256 token'lık pencere, paragraf ölçeğindeki tekrarları da yakalar. Default 64 token ancak birkaç cümleyi kapsar.

Kod örnekleri
Ollama API · tekrar cezası ile istek bash
curl http://localhost:11434/api/chat -d '{
  "model": "llama3.2",
  "messages": [{"role": "user", "content": "Uzun bir masal anlat."}],
  "options": {
    "repeat_penalty": 1.15,
    "repeat_last_n": 256,
    "presence_penalty": 0.3
  }
}'
llama.cpp · aynı ayarlar CLI flag'leriyle bash
# Yeni kurulum (llama.app): llama cli
# Eski binary adıyla: llama-cli
llama cli -hf ggml-org/Qwen3.5-0.8B-GGUF \
  --repeat-penalty 1.15 \
  --repeat-last-n 256 \
  --presence-penalty 0.3
Ne zaman kullan
  • Küçük (1-3B) ya da agresif quantize edilmiş modellerde döngüye girme
  • Uzun yaratıcı metin — 1.05-1.15 arası hafif ceza
  • Liste ya da fikir üretirken aynı maddelerin dönmesi — presence_penalty
  • Aynı sıfatı tekrar tekrar kullanan çıktılar — frequency_penalty
Ne zaman kullanma
  • Kod ve JSON — parantez, tırnak, değişken adları tekrar etmek zorunda; ceza sözdizimini bozar
  • Uzun özel isimler, teknik terimler, çeviri — doğru kelimeyi tekrar kullanmak gerekir
  • Büyük, iyi eğitilmiş modellerde — çoğu zaman gerek yok, default kapalı olmasının sebebi bu
Sık yapılan hatalar

Cezayı çok yüksek tutmak

1.3-1.5 civarında model sık kullanılan kelimelerden ve noktalama işaretlerinden kaçmaya başlar; garip eş anlamlılar, bozuk dilbilgisi ve yarım cümleler çıkar. Küçük adımlarla artır.

Sadece pencere boyunu unutmak

repeat_last_n 64 ise ceza yalnızca son 64 token'ı görür. Paragraf ölçeğinde tekrar varsa cezayı artırmak yerine pencereyi büyüt. Ollama dokümanı -1'i 'num_ctx kadar' olarak tanımlar; upstream llama.cpp sunucusu ise negatif değeri kabul etmez, açık bir sayı vermek daha güvenli.

Dokümanlar arası çelişki

llama.cpp sunucu README'si /completion için repeat_penalty default'unu 1.1 yazıyor, koddaki default ise 1.0 (kapalı). Davranıştan emin olmak için değeri isteğe açıkça yaz.