SSD Nodes Learn 🎉 VPS mulai $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-16

Cara Membatasi Panjang Output Ollama dengan num_predict

Pelajari num_predict di Ollama: tiga tempat untuk mengaturnya, prioritas konfigurasi yang berlaku, serta cara membaca done_reason saat output terpotong.

Fungsi num_predict di Ollama

num_predict adalah opsi Ollama yang membatasi jumlah token yang dapat dihasilkan model dalam satu respons. Opsi ini hanya menghitung token output, sehingga prompt tidak dihitung. Saat model mencapai batas tersebut, pembuatan output berhenti pada posisi itu. Prosesnya dapat berhenti di tengah kata, dan respons akan dikembalikan dengan done_reason yang bernilai length.

Itulah seluruh fungsi opsi ini. Kesulitannya adalah Ollama menyediakan tiga tempat terpisah untuk menetapkan nilainya, dan pengaturan yang paling dekat dengan request akan berlaku. Hampir semua laporan bahwa "num_predict tidak melakukan apa pun" terjadi karena satu lapisan secara diam-diam menimpa lapisan lainnya.

num_predict bukan num_ctx

Kedua opsi ini lebih sering tertukar daripada pasangan opsi lain di Ollama, dan kekeliruan ini menghabiskan banyak waktu untuk debugging.

num_ctx menentukan seberapa banyak model dapat membaca. Opsi ini menentukan ukuran context window, yang menampung prompt serta semua output yang telah dihasilkan. Menaikkan nilainya membutuhkan lebih banyak memori karena key/value cache yang disimpan model untuk token-token tersebut bertambah seiring ukuran window. Menentukan ukuran num_ctx untuk hardware Anda adalah tugas terpisah dengan mode kegagalannya sendiri.

num_predict menentukan seberapa banyak model akan menulis. Opsi ini merupakan aturan penghentian, bukan alokasi. Menaikkan nilainya membutuhkan waktu pemrosesan lebih lama, bukan lebih banyak RAM, dan tidak ada resource yang dicadangkan sebelumnya.

Keduanya berinteraksi pada satu titik. Token yang dihasilkan masuk ke dalam context window saat dibuat. Karena itu, respons dapat berhenti karena window penuh, bukan karena batas yang Anda tetapkan tercapai. Ollama melaporkan length pada kedua kondisi tersebut. Angka yang membedakan keduanya adalah eval_count, yang dibahas lebih lanjut di bawah.

Tetapkan sekali dengan Modelfile

Modelfile menyimpan nilai tersebut ke dalam model yang Anda buat. Tulis file berikut:

FROM qwen3:8b
PARAMETER num_ctx 8192
PARAMETER num_predict 512

Kemudian buat model dan baca kembali hasilnya:

ollama create qwen3-capped -f Modelfile
ollama show --parameters qwen3-capped

ollama show --parameters mencetak satu baris untuk setiap parameter yang disimpan beserta nilainya. Jika num_predict tidak ada dalam output tersebut, model tidak memiliki batas bawaan dan default Ollama sendiri yang berlaku. ollama show --modelfile qwen3-capped mencetak seluruh definisi. Ini juga merupakan cara tercepat untuk menyalin parameter yang sudah disertakan dalam model yang ada.

Gunakan lapisan ini untuk nilai yang ingin diwarisi oleh setiap pemanggil. Jangan gunakan lapisan ini jika Anda mengharapkan nilainya bersifat final, karena nilai tersebut tidak bersifat final.

Atur pada setiap permintaan di objek options

Setiap endpoint generation menerima objek options, dan num_predict ditempatkan di dalamnya:

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 menggunakan key options yang sama dengan makna yang sama. Nilai di sini hanya berlaku untuk satu panggilan tersebut. Nilai itu tidak berlaku untuk hal lain. Inilah lapisan yang digunakan oleh tools Anda: frontend chat, script, wrapper SDK, atau coding agent. Semuanya mengirim objek options, terlepas dari apakah objek tersebut ditampilkan sebagai kotak input.

Atur untuk satu sesi dengan parameter /set

Di dalam ollama run, sesi interaktif mengatur opsi untuk sisa sesi tersebut:

>>> /set parameter num_predict 256
>>> /show parameters

/show parameters menampilkan hal yang akan dikirim sesi pada pesan berikutnya, sehingga ini adalah cara tercepat untuk memastikan perubahan telah diterapkan. Nilai tersebut berlaku sampai Anda mengetik /bye. Untuk menyimpannya, /save qwen3-capped menulis sesi saat ini, termasuk parameternya, sebagai model baru. Apa pun yang Anda /set di sini tidak akan diteruskan ke klien lain.

Pengaturan mana yang berlaku, dan mengapa pengaturan Anda tampak diabaikan

Urutannya singkat. Opsi yang dikirim bersama request mengalahkan semua pengaturan lainnya. Baris PARAMETER num_predict dalam Modelfile model menjadi fallback jika request tidak membawa nilai. Jika keduanya tidak ada, Ollama menggunakan default bawaannya.

/set parameter bukan aturan ketiga. Sesi interaktif adalah klien API. Jadi, nilai yang Anda tetapkan di sana dikirim sebagai options milik request tersebut. Karena itu, nilai tersebut menimpa Modelfile selama sesi berlangsung.

Sekarang, mari lihat kegagalan yang dijelaskan oleh aturan ini. Anda menambahkan PARAMETER num_predict 512, membangun ulang model, tetapi respons masih mencapai ribuan token. Pengaturan Anda memang ada, dan ollama show --parameters membuktikannya. Namun, pengaturan tersebut ditimpa pada setiap request karena klien mengirim objek options sendiri dengan angkanya sendiri. Sering kali, angka itu berasal dari nilai yang Anda masukkan ke layar pengaturan beberapa bulan lalu dan kemudian lupa. ollama show membaca model yang tersimpan. Perintah tersebut tidak dapat menunjukkan data yang diterima melalui HTTP.

Buktikan kondisi di sisi server dengan satu perintah. Kirim request yang akan menghasilkan jawaban panjang, paksa batasnya menjadi rendah, lalu baca dua bidang:

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'

Perintah tersebut seharusnya mencetak "length" dan 32. Instal jq terlebih dahulu dengan sudo apt install -y jq jika belum tersedia. Respons "length" dan 32 berarti server mematuhi opsi tersebut, sedangkan aplikasi Anda mengirim nilai yang berbeda. Untuk melihat catatan server sendiri tentang suatu request, mulai ulang server dengan OLLAMA_DEBUG=1 di environment, lalu pantau journalctl -u ollama -f saat aplikasi Anda berkomunikasi dengannya.

Nilai negatif dan angka yang tidak boleh Anda salin

num_predict juga menerima nilai negatif, dan nilai tersebut berfungsi sebagai sentinel, bukan jumlah. Salah satu nilai negatif berarti "jangan batasi, teruskan pembuatan". Nilai lainnya berarti "isi konteks yang tersisa". Per Agustus 2026, referensi Ollama Modelfile menetapkan nilai default sebagai -1 untuk pembuatan tanpa batas, dan versi sebelumnya dari tabel yang sama juga mencantumkan -2 untuk mengisi konteks.

Anggap semua itu bergantung pada versi karena nilainya telah berubah. Referensi tersebut menetapkan nilai default sebagai 128 selama waktu yang lama sebelum entri itu diperbaiki pada akhir 2024. Karena itu, banyak panduan masih mengulangi angka lama. Baca referensi parameter Modelfile untuk versi yang benar-benar Anda jalankan, lalu konfirmasikan perilakunya dengan pemeriksaan eval_count di atas. Nilai yang Anda verifikasi sendiri pada server Anda lebih dapat diandalkan daripada nilai yang Anda baca di mana pun, termasuk dalam tulisan ini.

Mengapa panjang output merupakan biaya utama pada VPS yang hanya menggunakan CPU

Generasi memiliki dua fase dengan kecepatan yang sangat berbeda. Token prompt dievaluasi dalam batch, banyak token sekaligus. Token output dihasilkan satu per satu, dan setiap token memerlukan satu kali pemrosesan penuh terhadap bobot model. Pada VPS yang hanya menggunakan CPU, pemrosesan tersebut dibatasi oleh bandwidth memori. Karena itu, biaya satu token yang dihasilkan jauh lebih besar daripada satu token prompt.

Minta respons tanpa streaming, lalu angkanya akan terlihat jelas:

"prompt_eval_count": 26,
"prompt_eval_duration": 107345000,
"eval_count": 237,
"eval_duration": 4289432000

Durasi dinyatakan dalam nanodetik. Pada blok tersebut, yang merupakan contoh respons yang dipublikasikan dalam dokumentasi API Ollama, bukan hasil pengukuran server tertentu, 26 token prompt memerlukan sekitar 0.1 detik, sedangkan 237 token output memerlukan sekitar 4.3 detik. Laju generasi Anda sendiri adalah eval_count dibagi eval_duration lalu dikonversi ke detik, dan mengukur token per detik pada perangkat keras Anda sendiri layak dilakukan satu kali sebelum Anda menyesuaikan hal lain. Laju tersebut bergantung pada model maupun mesin. Jadi, jika jawaban panjang merupakan biaya sebenarnya, model yang dirancang untuk decoding cepat seperti Nemotron 3.5 Lightning pada VPS dapat menghemat sebagian waktu yang biasanya dilindungi oleh batas rendah.

Perhitungannya menjelaskan sisanya. Pada kecepatan 8 token per detik, jawaban sepanjang 2,000 token membuat mesin sibuk selama lebih dari empat menit, dan model tidak mengetahui bahwa Anda hanya menginginkan satu paragraf. Beberapa model juga dapat mengalami loop dengan mengulangi frasa sampai dihentikan. Tanpa batas, satu permintaan tersebut akan terus menggunakan satu core sampai context window habis. num_predict adalah pengaturan yang membatasi panjangnya. Pengaturan ini paling penting pada VPS Ollama yang di-self-host berukuran kecil, ketika satu permintaan panjang dapat menggunakan seluruh kapasitas mesin.

Output terpotong biasanya merupakan batas, bukan model yang rusak

Gejalanya tampak seperti kegagalan model. Jawaban berhenti di tengah kalimat. JSON tidak dapat diuraikan karena kurung kurawal penutup tidak pernah muncul. Respons spontan biasanya menyalahkan model atau kuantisasi. Baca responsnya terlebih dahulu.

done_reason berarti jawaban menjawab pertanyaan secara langsung. stop berarti model selesai dengan sendirinya, baik karena mengeluarkan token end-of-sequence maupun karena mencocokkan salah satu string dalam opsi stop. length berarti pembuatan output dihentikan karena ruang yang tersedia habis. Saat melihat length, bandingkan eval_count dengan batas Anda: kecocokan persis berarti num_predict yang menghentikannya, sedangkan angka yang lebih kecil berarti jendela konteks terisi lebih dahulu.

Saat melakukan streaming, kolom tersebut muncul dalam potongan terakhir, yaitu potongan yang membawa "done": true. Banyak pustaka klien membuang potongan itu dan hanya meneruskan teks kepada kode Anda. Karena itu, pemotongan yang sama tampak tidak dapat dijelaskan di dalam aplikasi, tetapi jelas saat menggunakan curl. Jika pustaka menyembunyikannya, kirim satu permintaan dengan curl untuk mengetahui respons sebenarnya dari server.

Ada satu hal lain yang dapat menghemat waktu. Menaikkan num_predict tidak membuat model menulis lebih banyak. Tindakan itu hanya menghapus batas atas. Jika respons berakhir pada 200 token dengan done_reason dari stop, model memutuskan bahwa responsnya sudah selesai, sehingga batas yang lebih besar tidak mengubah apa pun. Jawaban singkat dengan stop merupakan masalah prompting. Jawaban singkat dengan length merupakan masalah batas.

Memilih nilai

  • Untuk chat interaktif, biarkan tanpa batas dan tekan Ctrl+C untuk menghentikan respons yang berjalan tanpa terkendali. Anda tetap memantau layar.
  • Untuk proses berbasis skrip, tetapkan nilainya. Generasi tanpa batas di dalam loop dapat menyebabkan tugas batch yang seharusnya selesai dalam sepuluh menit masih berjalan keesokan paginya.
  • Untuk output terstruktur, tetapkan batas di atas ukuran dokumen valid terbesar yang Anda perkirakan. Perlakukan done_reason dari length sebagai error yang harus ditangani, lalu ulangi permintaan alih-alih mengurai hasil yang diterima.
  • Untuk coding agent, nilai ini harus ditetapkan dalam konfigurasi agent itu sendiri karena agent mengirimkan opsinya sendiri pada setiap request. Mengarahkan coding agent ke Ollama menjelaskan lokasi pengaturan tersebut.

Batas ini menghitung token, bukan kata atau karakter. Karena itu, jangan memperkirakannya. Buat satu jawaban yang representatif tanpa batas, baca eval_count, lalu tetapkan batas yang cukup lebih tinggi dari nilai tersebut. Setiap keluarga model menggunakan tokenisasi yang berbeda. Nilai yang cukup untuk model Llama mungkin memotong jawaban yang sama dari model Qwen 3 pada VPS yang sama.

FAQ

Apa perbedaan antara num_ctx dan num_predict di Ollama?

num_ctx adalah ukuran jendela konteks. Nilai ini menentukan seberapa banyak yang dapat dibaca model, yaitu prompt ditambah semua yang telah dihasilkan sejauh ini. Nilai ini menggunakan memori karena cache key/value bertambah seiring ukurannya. num_predict menentukan jumlah token yang boleh ditulis model dalam satu respons. Nilai ini lebih banyak menggunakan waktu daripada memori, dan tidak dicadangkan sebelumnya. Token yang dihasilkan dihitung terhadap keduanya. Karena itu, respons dapat terpotong oleh salah satunya.

Mengapa pengaturan num_predict saya tampaknya diabaikan?

Karena nilai yang dikirim bersama request mengesampingkan nilai yang tersimpan di model. Masukkan PARAMETER num_predict 512 ke dalam Modelfile, lalu gunakan model tersebut dari front end chat atau coding agent. Klien kemudian mengirim objek options miliknya sendiri, dan nilainya yang berlaku. ollama show --parameters tetap menampilkan nilai Anda karena membaca model yang tersimpan dan tidak dapat melihat data yang diterima melalui HTTP. Kirim satu request dengan curl menggunakan "options": {"num_predict": 32}, lalu periksa apakah eval_count dikembalikan sebagai 32. Ini mengonfirmasi bahwa server berfungsi dengan benar dan mengarahkan pencarian masalah ke aplikasi Anda.

Bagaimana cara mengetahui apakah output saya terpotong oleh num_predict?

Kirim request dengan "stream": false, lalu baca done_reason. Nilai stop berarti model selesai dengan sendirinya. Nilai length berarti ruang yang tersedia habis. Selanjutnya, bandingkan eval_count dengan batas Anda. Jika nilainya sama persis, num_predict yang menghentikannya. Jika eval_count lebih kecil, jendela konteks terisi terlebih dahulu. Saat melakukan streaming, kedua field tersebut tiba di potongan terakhir bersama "done": true. Banyak library klien membuangnya sebelum kode Anda dapat melihatnya.

Berapa nilai default num_predict?

Baca nilainya dari instalasi Anda sendiri, bukan dari artikel. Per Agustus 2026, referensi Ollama Modelfile mencantumkan nilai default -1. Artinya, generasi tidak dibatasi. Entri tersebut diperbaiki pada akhir 2024 setelah bertahun-tahun mendokumentasikan 128. Nilai negatif adalah sentinel, bukan jumlah token. Versi lama dari tabel yang sama juga mencantumkan -2 untuk mengisi sisa konteks. Periksa referensi parameter Modelfile untuk versi Anda, lalu konfirmasikan dengan ollama show --parameters dan satu request curl.

Apakah menaikkan num_predict membuat model menulis jawaban yang lebih panjang?

Tidak. Tindakan ini hanya menghapus batas atas. Jika respons berakhir dengan done_reason dari stop, model memutuskan bahwa responsnya sudah selesai. Batas yang lebih besar tidak mengubah apa pun. Dalam kasus ini, panjang respons bergantung pada prompt. Minta struktur tertentu, jumlah bagian tertentu, atau tingkat perincian yang ditentukan. Naikkan num_predict hanya jika done_reason dikembalikan sebagai length.