Kembali ke blog

Optimasi biayaPanduan

Potong token output: panjang jawaban, max_tokens, urutan stop

Perpendek jawaban AI secara desain: minta format terbatas, pertahankan max_tokens sebagai batas, gunakan urutan stop, lalu lihat biaya 1.000 permintaan.

Oleh CheapTokens TeamDiterbitkan 5 menit baca

Sampul: potong token output dengan format prompt, max_tokens dan urutan stop
Di halaman ini
  1. Mulai dari prompt, bukan dari batas
  2. max_tokens adalah sabuk pengaman
  3. Urutan stop mengakhiri jawaban pada penanda
  4. Permintaan yang dapat Anda jalankan dan ukur
  5. Apa yang dihemat pada 1.000 permintaan
  6. Urutan yang akan saya terapkan

Bot Anda menjawab dengan 400 token padahal 100 sudah cukup, dan Anda membayar untuk setiap tokennya. Perbaikannya sebagian besar ada di prompt: minta format yang terbatas, pertahankan max_tokens sebagai batas pengaman alih-alih pengatur panjang, dan periksa usage.completion_tokens untuk melihat apa yang sebenarnya dikembalikan.

Ini penting karena output adalah sisi yang lebih mahal pada setiap model yang kami tawarkan: lihat harga langsung di halaman harga. Pertanyaan sama, jawaban lebih pendek, tagihan lebih kecil.

Mulai dari prompt, bukan dari batas#

Misalkan Anda menjalankan bot dukungan dengan 2.000 tiket sehari. Setiap tiket membutuhkan kategori dan satu kalimat alasan. Model, jika dibiarkan, menulis paragraf ramah, daftar peringatan, dan tawaran bantuan lebih lanjut. Di situlah 400 token pergi.

Bandingkan

Tiket sama, dua prompt

Terbuka

System: Anda adalah asisten dukungan yang membantu. User: Beri tahu saya jenis tiket ini: "Kartu saya ditagih dua kali untuk pesanan 1182." Jawaban: paragraf dengan sapaan, penjelasan, dan tawaran bantuan (sekitar 400 token).

Terbatas

System: Balas dengan tepat dua baris. Baris 1: kategori, salah satu dari billing, bug, other. Baris 2: alasan dalam maksimal 15 kata. Tanpa sapaan. User: tiket yang sama. Jawaban: billing dan satu alasan singkat (sekitar 100 token atau kurang).

Triknya adalah Anda mendeskripsikan bentuk jawaban: jumlah baris, daftar label tertutup, batas kata. "Singkat saja" bekerja lebih buruk daripada "dua baris, 15 kata", karena model memiliki sesuatu yang konkret untuk dihitung. Jika Anda hanya membutuhkan label, minta labelnya saja. Pengklasifikasi yang harus mengembalikan billing tidak boleh diizinkan menjelaskan dirinya sendiri.

Hal yang sama berlaku untuk ekstraksi JSON. Ketika model membungkus JSON Anda dalam prosa, prosa itu adalah output yang Anda bayar lalu buang. Letakkan "Kembalikan hanya objek JSON, tanpa teks sebelum atau sesudahnya" di pesan sistem. Untuk mengurai apa yang dikembalikan, lihat cara mengekstrak JSON dari balasan LLM.

max_tokens adalah sabuk pengaman#

Menggoda untuk mengatur max_tokens: 100 dan menganggapnya selesai. Jangan berharap jawaban pendek darinya. Referensi API DeepSeek (diperiksa 2 November 2026) mendeskripsikan max_tokens sebagai jumlah maksimum token yang dapat dihasilkan dalam completion, dengan input ditambah output dibatasi oleh panjang konteks model. Ini menghentikan generasi. Ini tidak membuat model merencanakan jawaban yang lebih pendek.

Jadi model yang ingin menulis 400 token dan mendapat 100 memberi Anda kalimat yang berakhir di tengah, finish_reason diatur ke length, dan tagihan untuk semua 100 token. Anda membayar untuk jawaban yang tidak dapat digunakan. Mengapa itu terjadi dan cara memperbaikinya dibahas di mengapa jawaban AI berhenti di tengah kalimat dan perbaikan finish_reason "length". Saya tidak akan mengulanginya di sini.

Pembagian yang berfungsi sederhana:

  • prompt menentukan seberapa panjang jawaban yang baik;
  • max_tokens berada sedikit di atas jawaban baik terpanjang, sehingga balasan yang lepas kendali dipotong alih-alih tumbuh hingga batas output model (hingga 32.768 token pada DeepSeek-V4-Flash).

Untuk jawaban tiket dua baris, 150 sudah cukup. Untuk label satu kata, 20.

Prompt menetapkan panjang, max_tokens memotong yang lepas kendali
Siapa yang mengontrol apa: prompt membentuk jawaban, max_tokens dan stop mengakhirinya

Urutan stop mengakhiri jawaban pada penanda#

Dalam referensi DeepSeek, stop menerima hingga 16 urutan, dan generasi berhenti ketika model akan menghasilkan salah satunya. Ketika itu terjadi, finish_reason adalah stop, sama seperti akhir alami. Ini berguna ketika format Anda memiliki penanda akhir. Minta jawabannya, lalu baris dengan END, dan letakkan END di stop. Uji sekali pada pengaturan Anda sendiri: lakukan satu panggilan dan periksa bahwa finish_reason adalah stop dan teks berakhir sebelum penanda.

Satu aturan: teks stop harus sesuatu yang tidak dapat muncul di dalam jawaban yang baik. Stop pada \n\n memotong jawaban dua paragraf setelah paragraf pertama.

Permintaan yang dapat Anda jalankan dan ukur#

Berikut adalah panggilan tiket terbatas. ID model adalah gateway_id lengkap dari dokumentasi CheapTokens, dan URL dasar adalah https://api.cheaptokens.dev/v1. Dokumentasi menunjukkan cara membuat kunci; letakkan di variabel lingkungan.

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "max_tokens": 150,
    "messages": [
      {"role": "system", "content": "Reply with exactly two lines. Line 1: the category, one of billing, bug, other. Line 2: a reason in at most 15 words. No greeting."},
      {"role": "user", "content": "My card was charged twice for order 1182."}
    ]
  }'

Dalam respons, dua hal penting: choices[0].finish_reason dan objek usage dengan prompt_tokens dan completion_tokens. Dalam Python dengan paket openai tampilannya seperti ini:

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

r = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    max_tokens=150,
    messages=[
        {"role": "system", "content": "Reply with exactly two lines. Line 1: the category, one of billing, bug, other. Line 2: a reason in at most 15 words. No greeting."},
        {"role": "user", "content": "My card was charged twice for order 1182."},
    ],
)

print(r.choices[0].message.content)
print(r.choices[0].finish_reason, r.usage.completion_tokens)

Jalankan pada sepuluh tiket nyata sebelum Anda mempercayai formatnya. Jika completion_tokens tetap kecil dan finish_reason selalu stop, prompt melakukan tugasnya. Jika Anda melihat length, batas Anda di bawah kebutuhan jawaban yang baik: naikkan atau perketat prompt, jangan keduanya secara buta.

Cocokkan pasangan

Apa yang dikatakan bidang-bidang itu

  • lengthBatas max_tokens tercapai
  • stopTitik stop alami atau urutan stop
  • usage.completion_tokensToken dalam jawaban, sisi output tagihan Anda

Jika finish_reason bukan stop, lihat batasnya terlebih dahulu.

Apa yang dihemat pada 1.000 permintaan#

Sekarang tagihannya. Asumsikan tiket plus instruksi adalah 300 token input, jawaban terbuka adalah 400 token output dan yang terbatas adalah 100. Ini adalah asumsi untuk contoh; ganti dengan angka dari usage Anda sendiri. Selama 1.000 permintaan, itu adalah 300 × 1.000 = 300.000 token input dalam kedua kasus, dan 400 × 1.000 = 400.000 token output versus 100 × 1.000 = 100.000.

Jawaban terbuka, 1.000 permintaan:

Model Per permintaan 1.000 permintaan OpenRouter, 1.000 permintaan
GLM-5.3-Flash $0.000022 $0.022 $0.0433
DeepSeek-V4-Flash $0.000045 $0.0445 $0.077
MiniMax-M2.7 $0.000075 $0.075 $0.90

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

Jawaban terbatas, 1.000 permintaan:

Model Per permintaan 1.000 permintaan OpenRouter, 1.000 permintaan
GLM-5.3-Flash $0.00001 $0.01 $0.0184
DeepSeek-V4-Flash $0.000015 $0.0145 $0.035
MiniMax-M2.7 $0.00003 $0.03 $0.36

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

Sisi input tidak bergerak, dan itulah intinya: hanya bagian yang Anda perpendek yang menjadi lebih murah, dan itu adalah bagian dengan harga lebih tinggi. Per model, 1.000 tiket yang sama biayanya $0.0445 terbuka dan $0.0145 terbatas pada DeepSeek-V4-Flash. Secara total, dengan input dan output dihitung bersama, ketiga model dalam tabel menjadi lebih murah daripada harga referensi OpenRouter. Untuk jawaban pendek, pilih model dari tabel di atas: bandingkan baris untuk input dan output Anda sendiri. GLM-5.3-Flash ($0.04 per 1 juta token output) cocok di mana jawaban tetap lebih panjang, hingga 8.192 token; halaman DeepSeek memiliki sisanya.

Urutan yang akan saya terapkan#

Urutkan

Letakkan langkah-langkah dalam urutan yang masuk akal

  1. Tulis format jawaban ke dalam prompt
  2. Atur max_tokens sedikit di atas jawaban baik terpanjang
  3. Jika API menerima stop dan format memiliki penanda akhir, tambahkan urutan stop
  4. Catat completion_tokens dan finish_reason untuk setiap panggilan
  5. Bandingkan biaya batch 1.000 permintaan sebelum dan sesudah

Langkah 4 adalah yang dilewatkan orang. Tanpa itu Anda tidak tahu apakah perubahan prompt berhasil atau apakah beberapa jawaban panjang menyeret rata-rata naik. Jika Anda sudah melacak pengeluaran, pendekatan penghitungan token dalam Python dan token input vs output adalah tempat yang baik untuk melanjutkan.