Ollama num_predict ile çıktı uzunluğu nasıl sınırlanır
Ollama num_predict parametresi ile modelin üreteceği token sayısını nasıl kısıtlayacağınızı öğrenin. Ayarların hiyerarşisi, done_reason takibi ve hata çözüm yolları.
Ollama içerisinde num_predict ne işe yarar
num_predict, bir modelin tek bir yanıtta üretebileceği token sayısını sınırlayan Ollama seçeneğidir. Yalnızca çıktı tokenlarını sayar; bu nedenle istem (prompt), bu sınıra dahil edilmez. Model sınıra ulaştığında üretim olduğu yerde durur, bazen kelime ortasında kesilir ve yanıt done_reason değeri length olarak ayarlanmış şekilde döner.
Özelliğin tamamı bundan ibarettir. Zorluk, Ollama'nın bu değeri ayarlamanız için size üç ayrı yer sunması ve isteğe en yakın olan ayarın geçerli olmasıdır. "num_predict hiçbir işe yaramıyor" şeklindeki neredeyse tüm bildirimler, bir katmanın diğerini sessizce geçersiz kılması nedeniyle yaşanmaktadır.
num_predict, num_ctx ile aynı şey değildir
Ollama içerisinde en çok karıştırılan iki ayar bunlardır ve bu karışıklık ciddi hata ayıklama sürelerinin kaybına neden olur.
num_ctx, modelin ne kadar okuyabileceğini belirler. Bu, istemi ve şimdiye kadar üretilen her şeyi barındıran bağlam penceresinin (context window) boyutudur. Bu değeri artırmak bellek maliyeti doğurur; çünkü modelin bu belirteçler (tokens) için tuttuğu anahtar/değer önbelleği, pencere boyutuyla birlikte büyür. Donanımınız için num_ctx boyutlandırma işlemi, kendine has hata modları olan ayrı bir görevdir.
num_predict, modelin ne kadar yazacağını belirler. Bu bir bellek ayırma işlemi değil, bir durdurma kuralıdır. Bu değeri artırmak RAM yerine işlem süresi maliyeti doğurur ve önceden ayrılan herhangi bir kaynak yoktur.
Bu iki ayar tek bir noktada kesişir. Üretilen belirteçler, oluşturuldukları anda bağlam penceresinin içine yerleşir; bu nedenle bir yanıt, belirlediğiniz sınıra ulaşıldığı için değil, pencere dolduğu için de durabilir. Ollama her iki durumda da length raporu verir, bu yüzden onları birbirinden ayıran değer aşağıda detaylandırılan eval_count'dir.
Bir Modelfile ile tek seferde ayarlama
Bir Modelfile, değeri oluşturduğunuz bir modele kalıcı olarak işler. Dosyayı şu şekilde yazın:
FROM qwen3:8b
PARAMETER num_ctx 8192
PARAMETER num_predict 512Ardından modeli derleyin ve oluşturduğunuz içeriği kontrol edin:
ollama create qwen3-capped -f Modelfile
ollama show --parameters qwen3-cappedollama show --parameters, depolanan her parametreyi değeriyle birlikte satır satır yazdırır. Eğer num_predict bu çıktıda yer almıyorsa, modelin içinde gömülü bir sınır yoktur ve Ollama'nın kendi varsayılan değeri geçerli olur. ollama show --modelfile qwen3-capped, tüm tanımı yazdırır; bu yöntem, mevcut bir modelin halihazırda sahip olduğu parametreleri kopyalamanın en hızlı yoludur. Bu şekilde sınırlı bir model oluşturmak neredeyse hiç ek disk alanı kaplamaz; çünkü yeni girdi, temel modelin zaten indirdiği ağırlık blob'larını kopyalamak yerine yeniden kullanır. Ollama'nın bu blob'ları nerede tuttuğunu bilmek, bir VPS root diski dolmadan önce faydalıdır.
Bu katman, her çağrıcının devralmasını istediğiniz bir değer için doğru yerdir. Eğer değerin nihai olmasını bekliyorsanız, bu katman yanlış seçimdir çünkü değer nihai değildir.
Seçenekler nesnesi içinde istek başına ayarlayın
Her üretim uç noktası bir options nesnesi alır ve num_predict bunun içine yerleştirilir:
curl http://localhost:11434/api/generate -d '{
"model": "qwen3:8b",
"prompt": "Explain what a reverse proxy does.",
"stream": false,
"options": { "num_predict": 128 }
}'/api/chat, aynı anlama gelen aynı options anahtarını kullanır. Buradaki bir değer, yalnızca o çağrı için geçerlidir ve başka hiçbir şeyi etkilemez. Bu, araçlarınızın kullandığı katmandır: bir sohbet arayüzü, bir betik, bir SDK sarmalayıcı veya bir kodlama ajanı. Bunların hepsi, size bunun için bir kutu gösterseler de göstermeseler de bir options nesnesi gönderir.
/set parametresi ile tek oturumluk ayar yapma
ollama run içerisinde, etkileşimli oturum, seçenekleri oturumun geri kalanı için belirler:
>>> /set parameter num_predict 256
>>> /show parameters/show parameters, bir sonraki mesajınızla neyin gönderileceğini yazdırır; bu, bir değişikliğin etkili olduğunu doğrulamanın en hızlı yoludur. Değer, /bye yazana kadar geçerliliğini korur. Ayarı kalıcı hale getirmek için /save qwen3-capped, mevcut oturumu ve parametreleri yeni bir model olarak kaydeder. Burada /set yaptığınız hiçbir şey başka bir istemciye ulaşmaz.
Hangi ayar geçerlidir ve ayarlarınız neden yok sayılıyor gibi görünür
Sıralama kısadır. İstekle birlikte gönderilen seçenekler her şeyin önüne geçer. Modelfile içindeki bir PARAMETER num_predict satırı, istekte herhangi bir değer bulunmadığında kullanılan yedek ayardır. İkisinin de olmadığı durumda, Ollama'nın yerleşik varsayılanı uygulanır.
/set parameter üçüncü bir kural değildir. Etkileşimli oturum bir API istemcisidir; bu nedenle orada ayarladığınız her şey, o isteğin options değeri olarak gönderilir. Modelfile ayarını oturum için geçersiz kılmasının nedeni tam olarak budur.
Şimdi bu durumun açıkladığı hataya bakalım. PARAMETER num_predict 512 ekleyip modeli yeniden oluşturuyorsunuz ancak yanıtlar hala binlerce token uzunluğunda oluyor. Ayarınız mevcut ve ollama show --parameters bunu kanıtlıyor. Ayarınız her istekte geçersiz kılınıyor çünkü istemci, kendi içinde kendi sayısını taşıyan bir options nesnesi gönderiyor; bu genellikle aylar önce bir ayarlar ekranına yazdığınız ve unuttuğunuz bir sayıdır. ollama show kayıtlı modeli okur. HTTP üzerinden gelen veriyi size gösteremez.
Sunucu tarafını tek bir komutla doğrulayın. Uzun bir yanıt üretecek bir istek gönderin, sınırı düşük tutmaya zorlayın ve iki alanı okuyun:
curl -s http://localhost:11434/api/generate -d '{
"model": "qwen3-capped",
"prompt": "Describe the Linux boot process in detail.",
"stream": false,
"options": { "num_predict": 32 }
}' | jq '.done_reason, .eval_count'Bu komut "length" ve 32 değerlerini yazdırmalıdır. Eğer eksikse, sudo apt install -y jq kullanarak önce jq paketini yükleyin. "length" ve 32 yanıtı, sunucunun seçeneği dikkate aldığını ve uygulamanızın farklı bir değer gönderdiğini gösterir. Bir isteğe dair sunucunun kendi kayıtlarını görmek için, ortam değişkenlerine OLLAMA_DEBUG=1 ekleyerek sunucuyu yeniden başlatın ve uygulamanız sunucuyla iletişim kurarken journalctl -u ollama -f çıktısını izleyin.
Negatif değerler ve kopyalanmaması gereken sayılar
num_predict negatif değerleri de kabul eder; bunlar birer sayaç değil, işaretçi (sentinel) değerleridir. Bir negatif değer "sınırlandırma, üretmeye devam et" anlamına gelir. Bir diğeri ise "kalan bağlamı doldur" anlamında kullanılmıştır. Ağustos 2026 itibarıyla Ollama Modelfile referansı varsayılan değeri -1, yani sonsuz üretim olarak belirtmektedir; aynı tablonun önceki sürümlerinde ise bağlamı doldurmak için -2 değeri listelenmiştir.
Tüm bunları sürüm bağımlı olarak değerlendirin, çünkü bu değerler zamanla değişmiştir. Referans dokümanı, 2024 yılı sonunda düzeltilene kadar uzun süre varsayılan değeri 128 olarak göstermiştir; bu nedenle birçok kılavuz hala eski sayıyı tekrarlamaktadır. Çalıştırdığınız sürüm için Modelfile parametre referansını okuyun ve ardından yukarıdaki eval_count kontrolü ile davranışı doğrulayın. Kendi sunucunuzda doğruladığınız bir değer, bu yazı dahil olmak üzere herhangi bir yerde okuduğunuz değerden daha güvenilirdir.
CPU tabanlı bir VPS üzerinde çıktı uzunluğunun temel maliyet kalemi olmasının nedeni
Üretim süreci, hızları birbirinden çok farklı iki aşamadan oluşur. İstemi (prompt) oluşturan belirteçler (token) gruplar halinde, aynı anda birçok işlemle değerlendirilir. Çıktı belirteçleri ise tek tek üretilir ve her biri model ağırlıkları üzerinde tam bir geçiş gerektirir. Sadece CPU kullanılan bir VPS üzerinde bu geçiş, bellek bant genişliği ile sınırlıdır; bu nedenle üretilen bir belirteç, bir istem belirtecinin maliyetinden çok daha fazlasına mal olur. Bu geçiş her bir ağırlığı okumak zorunda olduğundan, her bir ağırlığın kapladığı bayt miktarı belirteç hızınızın üst sınırını belirler; q4 yapısının aynı modelin q8 veya fp16 sürümlerinden daha hızlı kod çözmesinin nedeni budur.
Yanıtı akış (streaming) olmadan isterseniz rakamlar doğrudan karşınıza çıkar:
"prompt_eval_count": 26,
"prompt_eval_duration": 107345000,
"eval_count": 237,
"eval_duration": 4289432000Süreler nanosaniye cinsindendir. Herhangi bir sunucunun ölçümü yerine Ollama API dokümantasyonunda yayınlanan örnek yanıtı içeren bu blokta, 26 istem belirteci yaklaşık 0.1 saniye sürerken, 237 çıktı belirteci yaklaşık 4.3 saniye sürmüştür. Kendi üretim hızınız eval_count değerinin eval_duration değerine bölünüp saniyeye çevrilmesiyle bulunur ve kendi donanımınızda saniyedeki belirteç sayısını ölçmek, başka herhangi bir ayar yapmadan önce yapılması gereken bir işlemdir. Bu hız, makine kadar modele de bağlıdır; bu nedenle uzun yanıtlar gerçek maliyeti oluşturuyorsa, VPS üzerinde Nemotron 3.5 Lightning gibi hızlı kod çözme için oluşturulmuş bir model, düşük bir sınırın aksi takdirde koruyacağı sürenin bir kısmını geri kazandırır.
Geriye kalan kısım aritmetikten ibarettir. Saniyede 8 belirteç hızında, 2.000 belirteçlik bir yanıt makineyi dört dakikadan fazla meşgul eder ve model sizin bir paragraf istediğinizden habersizdir. Bir akıl yürütme modeli, sizden gelen bir kelimeyi yazmadan önce bu bütçenin bir kısmını düşünmeye harcar ve bu düşünme süreci de tıpkı diğer her şey gibi tek tek üretilir; bu nedenle talep ettiğiniz akıl yürütme çabası, aynı faturadaki bir diğer etkendir. Bazı modeller ayrıca döngüye girerek bir ifadeyi durdurulana kadar tekrarlar. Bir sınır olmadığında, bu tek istek bağlam penceresi dolana kadar bir çekirdeği meşgul eder. num_predict, bu durumu sınırlayan ayardır ve tek bir uzun isteğin tüm makineyi kilitlediği küçük bir self-hosted Ollama VPS üzerinde büyük önem taşır.
Kesilen çıktı genellikle sınırdır, bozuk bir model değildir
Belirtiler model hatası gibi görünür. Cümlenin ortasında duran bir yanıt. Kapanış parantezi gelmediği için ayrıştırılamayan bir JSON. İlk refleks modeli veya kuantizasyonu suçlamaktır. Ancak önce yanıtı okuyun.
done_reason soruyu doğrudan yanıtlar. stop, modelin kendi kendine bittiği anlamına gelir; bu durum ya dizi sonu belirtecini (end-of-sequence token) yayarak ya da stop seçeneğinizdeki dizelerden biriyle eşleşerek gerçekleşir. length, üretim sürecinin yer kalmadığı için kesildiği anlamına gelir. length değerini gördüğünüzde, eval_count ile sınırınızı karşılaştırın: tam bir eşleşme num_predict tarafından durdurulduğunu, daha küçük bir sayı ise bağlam penceresinin (context window) önce dolduğunu gösterir.
Akış (streaming) sırasında bu alanlar, "done": true taşıyan son parçada gelir. Birçok istemci kütüphanesi bu parçayı atar ve kodunuza yalnızca metni iletir; bu nedenle aynı kesilme bir uygulama içinde açıklanamaz görünürken, curl altında bariz hale gelir. Eğer bir kütüphane bunu gizliyorsa, sunucunun gerçekte ne dediğini öğrenmek için curl ile tek bir istek gönderin.
Bir nokta daha, boşa harcanan bir öğleden sonrayı kurtarır. num_predict değerini yükseltmek, modelin daha fazla yazmasını sağlamaz. Sadece bir tavanı kaldırır. Eğer bir yanıt done_reason / stop ile 200 belirteçte (token) bitiyorsa, model işinin bittiğine karar vermiştir ve daha büyük bir sınır hiçbir şeyi değiştirmez. stop ile kısa yanıtlar bir istem (prompt) sorunudur. length ile kısa yanıtlar ise bir sınır sorunudur.
Bir değer seçimi
- Etkileşimli sohbetler için sınırı kaldırıp, kontrolsüz bir yanıtı durdurmak için Ctrl+C tuşlarını kullanın. Zaten ekranı izliyor olacaksınız.
- Betik ile çalıştırılan işlemler için mutlaka bir sınır belirleyin. Döngü içindeki sınırsız bir üretim, on dakika sürmesi gereken bir toplu işin ertesi sabah hala çalışıyor olmasına neden olur.
- Yapılandırılmış çıktı için sınırı, beklediğiniz en büyük geçerli belgeden daha yüksek bir değere ayarlayın; ardından
done_reasonilelengthdurumunu bir hata olarak değerlendirip gelen veriyi ayrıştırmak yerine yeniden deneyin. - Kodlama aracısı için bu değer, aracının kendi yapılandırmasında yer almalıdır çünkü aracı her istekte kendi seçeneklerini gönderir. Bir kodlama aracısını Ollama'ya yönlendirme bölümü bu ayarların nerede bulunduğunu açıklar.
Sınır, kelimeleri veya karakterleri değil token'ları sayar; bu yüzden tahmin yürütmeyin. Sınır olmadan temsili bir yanıt oluşturun, eval_count değerini okuyun ve sınırı bunun rahatça üzerinde bir değere ayarlayın. Model aileleri farklı şekilde token'lama yapar; bu nedenle bir Llama modeline uygun olan değer, aynı VPS üzerindeki bir Qwen 3 modeli tarafından üretilen aynı yanıtı kesebilir.
FAQ
Ollama'da num_ctx ve num_predict arasındaki fark nedir?
num_ctx, bağlam penceresinin boyutudur; dolayısıyla modelin ne kadar okuyabileceğini belirler: istem ve şimdiye kadar üretilen her şey. Bu değer bellek tüketir, çünkü anahtar/değer önbelleği (key/value cache) bu boyuta göre büyür. num_predict ise modelin tek bir yanıtta kaç adet token yazabileceğini belirler. Bu değer bellekten ziyade zaman tüketir ve önceden herhangi bir kaynak ayrılmaz. Üretilen token'lar her iki sınıra da dahil edilir, bu nedenle bir yanıt her iki sınırdan biri nedeniyle kesilebilir.
num_predict ayarım neden yok sayılıyor gibi görünüyor?
Çünkü istek ile gönderilen bir değer, modelde saklanan değeri geçersiz kılar. Bir Modelfile içine PARAMETER num_predict 512 ekleyip ardından bu modeli bir sohbet arayüzü veya kodlama aracından çalıştırırsanız, istemci kendi options nesnesini gönderir ve bu değer öncelik kazanır. ollama show --parameters yine de sizin değerinizi yazdırır, çünkü sadece saklanan modeli okur ve HTTP üzerinden gelen veriyi göremez. "options": {"num_predict": 32} kullanarak curl ile bir istek gönderin ve eval_count değerinin 32 olarak döndüğünü doğrulayın; bu, sunucunun doğru çalıştığını kanıtlar ve sorunun uygulamanızda olduğunu gösterir.
Çıktımın num_predict tarafından kesilip kesilmediğini nasıl anlarım?
İsteği "stream": false ile gönderin ve done_reason değerini okuyun. stop değeri, modelin kendi kendine tamamlandığı anlamına gelir. length değeri ise modelin alanının tükendiğini gösterir. Ardından eval_count değerini sınırınızla karşılaştırın: eğer tam olarak eşleşiyorlarsa num_predict işlemi durdurmuştur; eğer eval_count daha küçükse, önce bağlam penceresi dolmuştur. Akış (streaming) sırasında her iki alan da son parçada "done": true ile birlikte gelir; birçok istemci kütüphanesi kodunuz görmeden önce bu veriyi atar.
num_predict değerinin varsayılanı nedir?
Bunu bir makaleden değil, kendi kurulumunuzdan okuyun. Ağustos 2026 itibarıyla Ollama Modelfile referansı varsayılan değeri -1 olarak belirtmektedir; bu, üretimin sınırsız olduğu anlamına gelir. Bu giriş, yıllarca 128 olarak belgelendikten sonra 2024 sonunda düzeltilmiştir. Negatif değerler sayı değil, işaretçi (sentinel) değerleridir; aynı tablonun eski sürümleri, kalan bağlamı doldurmak için -2 değerini de listelemiştir. Sürümünüz için Modelfile parametre referansını kontrol edin ve ardından ollama show --parameters ile bir curl isteği yaparak bunu doğrulayın.
num_predict değerini artırmak modelin daha uzun yanıtlar yazmasını sağlar mı?
Hayır. Sadece bir tavan sınırını kaldırır. Eğer bir yanıt stop üzerinden done_reason ile bitiyorsa, model işinin bittiğine karar vermiştir ve daha yüksek bir sınır hiçbir şeyi değiştirmez. Bu durumda uzunluk bir istem (prompt) meselesidir: belirli bir yapı, bölüm sayısı veya belirtilen düzeyde ayrıntı isteyin. num_predict değerini yalnızca done_reason değeri length olarak döndüğünde artırın.