Kembali ke blog

AI untuk pemulaPanduan

Mengapa jawaban AI berhenti di tengah kalimat? max_tokens, context window dan finish_reason dijelaskan

Jawaban AI yang berhenti di tengah kalimat mencapai sebuah batas. Baca finish_reason, bedakan max_tokens dari context window yang penuh dan periksa batas output setiap model.

Oleh CheapTokens TeamDiterbitkan Diperbarui 6 menit baca

Sampul gelap dengan logo cheaptokens: kata max_tokens, finish_reason dan length dalam kotak, serta judul “Answer cut off mid-sentence?”
Di halaman ini
  1. Tiga batas yang memotong jawaban
  2. Baca finish_reason terlebih dahulu
  3. Perbaikan 1: naikkan max_tokens
  4. Perbaikan 2: saat context window penuh
  5. Perbaikan 3: dapatkan jawaban panjang dalam beberapa bagian
  6. Saat finish_reason bernilai stop
  7. Memilih model berdasarkan panjang jawaban

Balasan yang berhenti di tengah kalimat hampir selalu terpotong oleh sebuah batas. Model tidak kehilangan alur pikirannya; permintaan kehabisan ruang. Responsnya menyebutkan batas mana yang berlaku: baca finish_reason. length berarti sebuah batas tercapai. stop berarti model selesai dengan sendirinya.

Tiga hal menentukan seberapa panjang sebuah jawaban. Begitu Anda tahu mana yang menjadi penyebabnya, perbaikannya hanya butuh satu menit.

Tiga batas yang memotong jawaban#

  • max_tokens adalah batas yang Anda tetapkan dalam permintaan. Saat jawaban mencapainya, generasi berhenti, bahkan di tengah kata. Referensi API DeepSeek mendefinisikannya sebagai jumlah maksimum token yang dihasilkan dalam completion.
  • Batas output model adalah plafon untuk satu jawaban dari model tersebut. Batas ini milik model, jadi jaga max_tokens agar sama dengan atau di bawahnya. Angka untuk model kami ada di tabel di bawah.
  • Context window adalah ruang untuk seluruh percakapan: input Anda dan jawaban bersama-sama. Referensi DeepSeek menyebutkan bahwa token input dan token yang dihasilkan bersama-sama dibatasi oleh panjang konteks model.

Jika token masih terasa samar, mulailah dengan What is a token in AI?. Halaman ini mengasumsikan Anda sudah tahu apa itu token.

Baca finish_reason terlebih dahulu#

Setiap choice dalam respons chat membawa finish_reason. Di sebelahnya, usage memberi tahu Anda berapa banyak token yang masuk dan keluar.

Berikut tampilan jawaban yang terpotong di samping jawaban yang selesai. Permintaan meminta "In one short sentence, what is a token?", pertama dengan max_tokens diatur ke 16, lalu dengan 200.

Contoh ilustratif, bukan respons yang direkam: jumlah dan field tambahan Anda akan berbeda.

json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usu" },
      "finish_reason": "length"
    }
  ],
  "usage": { "prompt_tokens": 21, "completion_tokens": 16, "total_tokens": 37 }
}
json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usually a word or part of a word." },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 21, "completion_tokens": 24, "total_tokens": 45 }
}

Pada respons pertama completion_tokens adalah 16, tepat sama dengan batas, dan teksnya berakhir dengan "usu". Pada respons kedua model berhenti di 24 token, jauh di bawah batas 200, karena sudah selesai.

Untuk mengetahui apa yang terjadi, lakukan ini secara berurutan:

  1. Perhatikan finish_reason. Jika nilainya stop, jawaban sudah lengkap. Model memilih untuk berhenti, atau mencapai stop sequence yang Anda tetapkan. Jika nilainya length, sebuah batas memotong jawaban, dan langkah berikutnya memberi tahu Anda batas mana. Ada nilai lain, seperti content_filter dan tool_calls; keduanya bukan masalah panjang.
  2. Bandingkan completion_tokens dengan max_tokens yang Anda kirim. Jika keduanya sama atau hampir sama, Anda mencapai max_tokens.
  3. Jika completion_tokens jauh di bawah max_tokens dan prompt_tokens besar, kemungkinan besar context window sudah penuh. Referensi DeepSeek menggunakan length untuk kedua kasus, jadi field itu saja tidak bisa membedakannya; perbandingan pada langkah 2 adalah cara Anda mengetahuinya. Dokumentasi Anthropic dan Z.ai menyebut kasus kedua secara terpisah, sebagai model_context_window_exceeded. Periksa field pada respons Anda sendiri untuk melihat nama mana yang Anda dapatkan.

Ketiga deskripsi berasal dari dokumentasi para pengembang, diperiksa pada 20 Oktober 2026: DeepSeek, Anthropic dan Z.ai.

Yang Anda lihat finish_reason Penyebab Yang harus dilakukan
Terpotong, completion_tokens sama dengan max_tokens length max_tokens tercapai Naikkan max_tokens, atau minta jawaban dalam beberapa bagian
Terpotong, completion_tokens jauh di bawah max_tokens, input panjang length (atau model_context_window_exceeded di beberapa API) Context window penuh Perpendek input atau riwayat, atau pilih model dengan window lebih besar
Lengkap tetapi lebih pendek dari yang Anda inginkan stop Model selesai, atau stop sequence terpicu Minta lebih detail; periksa parameter stop
Tidak ada teks, atau penolakan content_filter Respons difilter Ubah frasa permintaan
Tidak ada teks, melainkan permintaan tool tool_calls Model ingin memanggil tool Jalankan tool dan kirim hasilnya kembali

Perbaikan 1: naikkan max_tokens#

Penyebab paling umum juga paling mudah diperbaiki. Tetapkan max_tokens sendiri, agar Anda tahu batas mana yang berlaku. Jangan mengandalkan nilai default.

python
from openai import OpenAI

client = OpenAI(base_url="https://api.cheaptokens.dev/v1", api_key="YOUR_API_KEY")

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[{"role": "user", "content": "Write a detailed guide to setting up a home network."}],
    max_tokens=16000,  # example value: stay at or below the model's output limit
)

choice = resp.choices[0]
print(choice.finish_reason, resp.usage.completion_tokens)

Ini menunjukkan bentuk pemanggilannya. Key dimasukkan sebagai YOUR_API_KEY di sini; jangan sertakan key asli dalam kode yang Anda bagikan.

Menaikkan angka hanya membantu sampai batas model itu sendiri. Berikut batas pada CheapTokens, diperiksa pada 20 Oktober 2026 terhadap daftar model CheapTokens:

Model Model ID Output maks per jawaban Konteks
DeepSeek-V4-Flash (0731) deepseek-ai/DeepSeek-V4-Flash-0731 32.768 token 380K
GLM-5.3-Flash zai-org/GLM-5.3-Flash 8.192 token 390K
MiniMax-M2.7 MiniMaxAI/MiniMax-M2.7 8.192 token 200K

Para pengembang menerbitkan batas mereka sendiri untuk API mereka sendiri. Z.ai, misalnya, mencantumkan output hingga 128K untuk seri GLM-5. Itu bukan batas GLM-5.3-Flash di CheapTokens, yaitu 8.192 token per jawaban. Untuk apa pun yang Anda bangun di CheapTokens, gunakan tabel di atas.

Perbaikan 2: saat context window penuh#

Dalam chat, seluruh riwayat dikirim ulang dengan setiap pesan, sehingga input bertambah setiap giliran. Context window harus menampung riwayat itu ditambah jawaban baru. Jika riwayat saja hampir menghabiskan seluruhnya, hampir tidak ada ruang tersisa untuk balasan.

Window ini besar, dan satu pertanyaan singkat tidak akan memenuhinya. Chat panjang dan dokumen yang ditempel akan memenuhinya. Yang membantu:

  • Mulai chat baru untuk tugas baru alih-alih melanjutkan yang lama.
  • Minta model merangkum percakapan sejauh ini, dan bawa hanya ringkasannya ke depan.
  • Hapus pesan lama dan lampiran yang tidak lagi Anda butuhkan.
  • Jika input itu sendiri sangat besar, pilih model dengan window terbesar. Di antara model kami, itu GLM-5.3-Flash dengan 390K. Batas outputnya 8.192 token, jadi minta hasil panjang dalam beberapa bagian.

Perbaikan 3: dapatkan jawaban panjang dalam beberapa bagian#

Ketika jawaban yang Anda inginkan lebih panjang dari batas output model, tidak ada pengaturan yang bisa memasukkannya ke dalam satu balasan. Mintalah dalam potongan: ketika finish_reason bernilai length, kirim kembali jawaban parsial dan minta model melanjutkannya.

python
messages = [{"role": "user", "content": "Write a detailed guide to setting up a home network."}]
parts = []

for _ in range(4):  # example limit: at most 4 rounds
    resp = client.chat.completions.create(
        model="zai-org/GLM-5.3-Flash",
        messages=messages,
        max_tokens=8000,  # example value: below this model's output limit
    )
    choice = resp.choices[0]
    parts.append(choice.message.content)
    if choice.finish_reason != "length":
        break
    messages.append({"role": "assistant", "content": choice.message.content})
    messages.append({"role": "user", "content": "Continue exactly where you stopped. Don't repeat anything."})

text = "".join(parts)

Peringatan yang sama: contoh pola, bukan eksekusi yang direkam. Perhatikan sambungan antar bagian. Model terkadang mengulang sebuah kalimat atau memulai ulang daftar di titik sambung.

Setiap putaran mengirim ulang semua yang sudah ada sebagai input, dan setiap token output ditagih. Jawaban panjang lebih mahal daripada jawaban pendek. Berikut jawaban delapan ribu token dengan input 2.000 token, yang muat di semua model dalam tabel:

Model Biaya OpenRouter
GLM-5.3-Flash $0.00036 $0.00069
DeepSeek-V4-Flash $0.00083 $0.0013
MiniMax-M2.7 $0.0013 $0.0102

Total 2.000 token input dan 8.000 token output. Harga per 1 juta token adalah harga saat ini dan berubah seiring tarif kami; kolom OpenRouter menunjukkan harga referensi untuk beban kerja yang sama.

Saat finish_reason bernilai stop#

stop berarti model mengakhiri jawaban. Jika berakhir lebih cepat dari yang Anda inginkan, itu bukan masalah batas dan max_tokens yang lebih besar tidak mengubah apa pun. Sebutkan apa yang Anda inginkan: panjangnya, bagian-bagiannya, tingkat detailnya. Periksa juga apakah permintaan menetapkan parameter stop; stop sequence yang muncul dalam jawaban mengakhirinya saat itu juga.

Memilih model berdasarkan panjang jawaban#

Mulailah dari jawaban yang Anda butuhkan. Jika muat dalam 8.192 token, MiniMax-M2.7 (MiniMaxAI/MiniMax-M2.7) menanganinya di CheapTokens. Outputnya lebih murah daripada harga referensi OpenRouter, dan ditagih sebesar $0.15 (per 1 juta token output). Harganya sama di jam berapa pun, tidak ada jam sibuk, dan API-nya kompatibel dengan OpenAI dan Anthropic.

Berikut daftar harga terkini untuk setiap model:

Model Konteks Input $/1Jt Output $/1Jt OpenRouter in OpenRouter out
GLM-5.3-Flash reasoning 390K $0.02 $0.04 $0.0413 $0.0758
DeepSeek-V4-Flash 380K $0.015 $0.10 $0.0475 $0.1568
MiniMax-M2.7 180K $0.05 $0.15 $0.30 $1.20

Harga dalam USD per 1 juta token. Angka OpenRouter ditampilkan sebagai perbandingan dan dapat berubah sewaktu-waktu.

Jika Anda belum mengirim permintaan, Your first API request with CheapTokens memandu Anda melakukannya. Untuk penjelasan apa itu token dan mengapa input dan output dihitung terpisah, lihat What is a token in AI?.

Endpoint, model id dan batas untuk setiap model ada di CheapTokens docs.