Kembali ke blog

MemulaiPanduan

Chat multi-turn dengan API: kirim ulang array messages

Model tidak mengingat apa pun di antara permintaan. Bangun loop chat Python yang mengirim ulang array messages dan lihat bagaimana token input bertambah.

Oleh CheapTokens TeamDiterbitkan 5 menit baca

Sampul: daftar messages dengan entri system, user dan assistant dikirim lagi dengan setiap permintaan
Di halaman ini
  1. Mengapa pertanyaan kedua mendapat tatapan kosong
  2. Loop chat dalam beberapa baris
  3. Bagaimana daftar terlihat setelah dua giliran
  4. Apa yang terjadi pada token input saat chat bertambah panjang
  5. Menjaga chat panjang tetap terkendali

Pertanyaan kedua Anda mendapat jawaban aneh karena API tidak pernah melihat pertanyaan pertama. Model tidak menyimpan apa pun di antara permintaan, jadi percakapan adalah sesuatu yang Anda bangun: setelah setiap balasan Anda menambahkannya ke daftar bernama messages dan mengirim seluruh daftar itu lagi. Itulah seluruh triknya, dan di bawah ini ada loop Python yang berfungsi untuk itu terhadap API kompatibel OpenAI dari CheapTokens.

Dua dokumentasi resmi menjelaskan hal yang sama. Referensi Messages API Anthropic (diperiksa 30 Oktober 2026) menyebut API ini stateless dan multi-turn: giliran sebelumnya dikirim dalam parameter messages. Panduan text-generation OpenAI (diperiksa 30 Oktober 2026) menyarankan menyimpan konteks dengan mengirim giliran sebelumnya sebagai pesan bertanda peran dan menambahkan setiap balasan sebelum permintaan berikutnya.

Mengapa pertanyaan kedua mendapat tatapan kosong#

Katakanlah Anda mengetik What is a token?, membaca jawabannya, lalu mengetik Explain it shorter. Bagi Anda, "itu" jelas. Bagi API, permintaan nomor dua adalah pesan satu baris dari orang asing: tidak ada "itu", tidak ada yang perlu dipersingkat. Anda akan mendapat tebakan atau pertanyaan balik, bukan penjelasan yang lebih singkat.

Solusinya adalah membuat permintaan kedua membawa semua yang dimiliki permintaan pertama, ditambah balasan, ditambah pertanyaan baru. Bandingkan kedua payload:

Bandingkan

Permintaan 2, dengan dan tanpa riwayat

Tanpa riwayat

python
messages = [
    {"role": "user", "content": "Explain it shorter"},
]

Model tidak tahu apa itu "itu".

Dengan riwayat

python
messages = [
    {"role": "user", "content": "What is a token?"},
    {"role": "assistant", "content": "<the first answer>"},
    {"role": "user", "content": "Explain it shorter"},
]

Sekarang "itu" menunjuk ke jawaban pertama.

Tiga peran melakukan semua pekerjaan. system menetapkan aturan sekali (nada, panjang, untuk apa bot ini). user adalah yang diketik orang. assistant adalah yang dikatakan model sebelumnya. Model membaca daftar dari atas ke bawah dan menulis pesan assistant berikutnya.

Loop chat dalam beberapa baris#

Pasang SDK dengan pip install openai dan simpan kunci Anda di variabel lingkungan, seperti di cara menyimpan kunci API dengan aman. Base URL dan id model berasal dari dokumentasi CheapTokens dan GET /v1/models (lebih lanjut di mendaftar model untuk menemukan id yang tepat). Untuk loop pembelajaran, GLM-5.3-Flash cocok: konteks 390K dan hingga 8.192 token output per jawaban.

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)
MODEL = "zai-org/GLM-5.3-Flash"

messages = [
    {"role": "system", "content": "You are a patient tutor. Keep answers under 80 words."},
]

while True:
    question = input("you> ").strip()
    if question in ("", "exit"):
        break
    messages.append({"role": "user", "content": question})

    response = client.chat.completions.create(
        model=MODEL,
        messages=messages,
        max_tokens=400,
    )
    answer = response.choices[0].message.content
    messages.append({"role": "assistant", "content": answer})

    print(answer)
    print(f"[input tokens this turn: {response.usage.prompt_tokens}]")

Jalankan, tanyakan What is a token?, lalu Explain it shorter. Jawaban kedua sekarang merujuk ke yang pertama. Baris terakhir mencetak usage.prompt_tokens, sisi input dari tagihan untuk giliran itu; perhatikan angkanya naik dengan setiap pertanyaan.

Urutan di dalam loop itu penting, dan inilah bagian yang paling sering salah dilakukan pemula:

Urutkan

Urutkan satu giliran loop

  1. Tambahkan pertanyaan pengguna ke messages
  2. Kirim seluruh daftar messages
  3. Baca balasan dari respons
  4. Tambahkan balasan sebagai pesan assistant

Lewati langkah 4 dan model melupakan jawabannya sendiri, jadi "jelaskan lebih singkat" berhasil sekali lalu rusak lagi pada pertanyaan ketiga.

Bagaimana daftar terlihat setelah dua giliran#

Setelah What is a token? dan Explain it shorter, daftar yang dipegang kode Anda memiliki lima entri: aturan sistem, pertanyaan pertama, jawaban pertama, pertanyaan kedua, jawaban kedua. Permintaan berikutnya akan mengirim kelima entri itu plus pertanyaan ketiga.

Daftar messages setelah dua giliran: system, user, assistant, user, assistant
Daftar messages yang dikirim loop Anda dengan pertanyaan ketiga

Pesan sistem dikirim setiap kali. API tidak "menyimpannya" di sisinya; itu hanya item pertama dalam daftar. Panduan OpenAI (diperiksa 30 Oktober 2026) mencatat bahwa instruksi hanya berlaku untuk permintaan saat ini, yang merupakan ide yang sama dari arah sebaliknya. Jika Anda ingin menyetel pesan pertama itu, lihat system prompt dan temperature dijelaskan.

Apa yang terjadi pada token input saat chat bertambah panjang#

Setiap permintaan membayar seluruh daftar lagi sebagai input. Giliran 1 mengirim aturan sistem dan satu pertanyaan; giliran 10 mengirim aturan, sembilan pasangan pertanyaan-jawaban sebelumnya dan pertanyaan baru. Jadi input bertambah dengan setiap giliran, bahkan jika setiap pesan Anda pendek.

Katakanlah chat 10 giliran dengan asumsi ini: aturan sistem sekitar 50 token, setiap pertanyaan sekitar 150, setiap balasan sekitar 250. Giliran 1 mengirim 50 + 150 = 200 token input. Setiap giliran berikutnya menambah satu pasangan 400 token lagi (150 + 250 = 400), jadi total input selama sepuluh giliran adalah 200 × 10 + 400 × 45 = 20.000 token, di mana 45 adalah 0 + 1 + … + 9. Outputnya adalah 250 × 10 = 2.500 token. Sepuluh pesan dari Anda, dan inputnya delapan kali output.

Daftar yang sama bertambah: setiap permintaan membawa semua giliran sebelumnya
Setiap permintaan membawa semua yang dikatakan sebelumnya

Berikut seluruh chat itu dihargai dengan tarif langsung, 20.000 token masuk dan 2.500 keluar:

Model Biaya OpenRouter
GLM-5.3-Flash $0.0005 $0.001
DeepSeek-V4-Flash $0.00055 $0.0013
MiniMax-M2.7 $0.0014 $0.009

Total 20.000 token input dan 2.500 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.

Dalam total, dengan input dan output dihitung bersama, GLM-5.3-Flash dan DeepSeek-V4-Flash lebih murah di sini daripada di OpenRouter, dan keduanya mempertahankan satu harga pada jam berapa pun. Jika Anda ingin jawaban lebih panjang dari 8.192 token dalam loop chat yang sama, DeepSeek-V4-Flash mengizinkan hingga 32.768 token output per jawaban dengan konteks 380K; ganti id model menjadi deepseek-ai/DeepSeek-V4-Flash-0731 dan tidak ada hal lain di loop yang berubah.

Cerita biaya yang lebih mendalam ada di mengapa chat AI yang panjang lebih mahal; token input vs output menjelaskan mengapa kedua sisi dihargai terpisah.

Cek cepat

Chat Anda berada di giliran 8. Apa isi permintaan untuk giliran 8?

Tampilkan jawaban

Jawaban: Pesan sistem dan setiap pertanyaan dan jawaban sebelumnya, plus pertanyaan terbaru

API tidak mengingat apa pun, jadi daftar lengkap dikirim setiap kali. Itu juga sebabnya token input naik giliran demi giliran.

Menjaga chat panjang tetap terkendali#

Daftar tidak bisa tumbuh selamanya: daftar harus muat dalam jendela konteks model (lihat apa itu jendela konteks), dan setiap giliran tambahan memakan biaya input. Dua kebiasaan menjaganya tetap wajar untuk prototipe:

  • Pangkas giliran tertua. Pertahankan pesan sistem dan beberapa pasangan terakhir, misalnya messages = messages[:1] + messages[-8:] sebelum setiap permintaan. Buang pasangan secara bersamaan agar pertanyaan tidak pernah kehilangan jawabannya.
  • Mulai daftar baru untuk topik baru. Tugas baru tidak memerlukan riwayat tugas lama.

Bot dukungan dengan set aturan berumur panjang adalah loop yang sama: pesan sistem menetapkan aturan sekali, setiap giliran pengguna dan balasan ditambahkan, dan Anda memangkas saat daftar menjadi berat. Untuk permintaan pertama itu sendiri, lihat permintaan API pertama Anda dengan CheapTokens; daftar model dan harga ada di halaman harga.