Bloga dön

BaşlarkenKılavuz

Bir API ile çok turlu sohbet: messages dizisini yeniden gönderin

Model istekler arasında hiçbir şey hatırlamaz. messages dizisini yeniden gönderen bir Python sohbet döngüsü kurun ve giriş token'larının nasıl büyüdüğünü görün.

Yazan: CheapTokens TeamYayınlanma tarihi: 5 dk okuma

Kapak: system, user ve assistant girdileri olan bir messages listesinin her istekte yeniden gönderilmesi
Bu sayfada
  1. İkinci soru neden boş bir bakışla karşılanır
  2. Birkaç satırda sohbet döngüsü
  3. Liste iki turdan sonra nasıl görünür
  4. Sohbet büyüdükçe giriş token'larına ne olur
  5. Uzun bir sohbeti kontrol altında tutmak

İkinci sorunuza garip bir yanıt alırsınız çünkü API ilk sorunuzu hiç görmedi. Model istekler arasında hiçbir şey tutmaz, yani sohbet sizin kurduğunuz bir şeydir: her yanıttan sonra onu messages adlı bir listeye eklersiniz ve tüm listeyi tekrar gönderirsiniz. Bütün hile bundan ibaret ve aşağıda CheapTokens'in OpenAI uyumlu API'sine karşı çalışan bir Python döngüsü var.

İki resmi doküman aynı şeyi anlatır. Anthropic'in Messages API referansı (30 Ekim 2026'da kontrol edildi) API'yi durumsuz ve çok turlu olarak adlandırır: önceki turlar messages parametresinde gider. OpenAI'nin metin üretimi kılavuzu (30 Ekim 2026'da kontrol edildi) bağlamı korumak için önceki turları rol etiketli mesajlar olarak göndermenizi ve her yanıtı bir sonraki istekten önce eklemenizi söyler.

İkinci soru neden boş bir bakışla karşılanır#

Diyelim ki What is a token? yazdınız, yanıtı okudunuz ve sonra Explain it shorter yazdınız. Size göre "o" apaçıktır. API'ye göre ikinci istek bir yabancının tek satırlık mesajıdır: ortada "o" yok, kısaltılacak bir şey yok. Kısa bir açıklama değil, bir tahmin ya da bir soru alırsınız.

Çözüm, ikinci isteğin birinci istekteki her şeyi, artı yanıtı, artı yeni soruyu taşımasını sağlamaktır. İki yükü karşılaştırın:

Karşılaştır

İstek 2, geçmişli ve geçmişsiz

Geçmişsiz

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

Modelin "o"nun ne olduğuna dair hiçbir fikri yoktur.

Geçmişli

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

Artık "o" ilk yanıta işaret eder.

Bütün işi üç rol yapar. system kuralları bir kez belirler (ton, uzunluk, botun ne için olduğu). user kişinin yazdığıdır. assistant modelin daha önce söylediğidir. Model listeyi baştan sona okur ve bir sonraki assistant mesajını yazar.

Birkaç satırda sohbet döngüsü#

SDK'yı pip install openai ile kurun ve anahtarınızı bir ortam değişkeninde tutun, tıpkı bir API anahtarı nasıl güvenle saklanır yazısındaki gibi. Temel URL ve model kimliği CheapTokens dokümanlarından ve GET /v1/models'ten gelir (daha fazlası tam kimliği bulmak için modelleri listeleme yazısında). Bir öğrenme döngüsü için GLM-5.3-Flash iyi bir seçimdir: 390K bağlam ve yanıt başına 8.192'ye kadar çıktı token'ı.

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}]")

Çalıştırın, What is a token? sorun, sonra Explain it shorter. İkinci yanıt artık birinciye atıfta bulunur. Son satır usage.prompt_tokens yazdırır, yani o tur için faturanın giriş tarafını; her soruyla birlikte yükseldiğini izleyin.

Döngü içindeki sıra önemlidir ve yeni başlayanların en sık yanlış yaptığı kısım budur:

Sıraya koy

Döngünün bir turunu sıraya koyun

  1. Kullanıcının sorusunu messages'a ekle
  2. Tüm messages listesini gönder
  3. Yanıtı yanıttan oku
  4. Yanıtı bir assistant mesajı olarak ekle

4. adımı atlarsanız model kendi yanıtlarını unutur, böylece "daha kısa açıkla" bir kez çalışır ve üçüncü soruda yine bozulur.

Liste iki turdan sonra nasıl görünür#

What is a token? ve Explain it shorter sonrasında kodunuzun tuttuğu listede beş girdi vardır: sistem kuralı, ilk soru, ilk yanıt, ikinci soru, ikinci yanıt. Bir sonraki istek bu beşinin tamamını artı üçüncü soruyu gönderecektir.

İki turdan sonra messages listesi: system, user, assistant, user, assistant
Döngünüzün üçüncü soruyla birlikte gönderdiği messages listesi

Sistem mesajı her seferinde gönderilir. API onu kendi tarafında "tutmaz"; o yalnızca listenin ilk öğesidir. OpenAI'nin kılavuzu (30 Ekim 2026'da kontrol edildi) talimatların yalnızca geçerli istek için geçerli olduğunu belirtir, bu da aynı fikrin diğer yönden ifadesidir. Bu ilk mesajı ayarlamak isterseniz system prompt ve temperature açıklaması yazısına bakın.

Sohbet büyüdükçe giriş token'larına ne olur#

Her istek tüm liste için giriş olarak tekrar öder. 1. tur sistem kuralını ve bir soruyu gönderir; 10. tur kuralı, dokuz önceki soru-cevap çiftini ve yeni soruyu gönderir. Yani mesajlarınızın her biri kısa olsa bile giriş her turda büyür.

Bu varsayımlarla 10 turluk bir sohbet düşünün: sistem kuralı yaklaşık 50 token, her soru yaklaşık 150, her yanıt yaklaşık 250. 1. tur 50 + 150 = 200 giriş token'ı gönderir. Sonraki her tur bir 400 token'lık çift daha ekler (150 + 250 = 400), böylece on tur boyunca toplam giriş 200 × 10 + 400 × 45 = 20.000 token olur, burada 45 = 0 + 1 + … + 9'dur. Çıktı 250 × 10 = 2.500 token'dır. Sizden on mesaj ve giriş, çıktının sekiz katı.

Aynı liste büyür: her istek önceki tüm turları taşır
Her istek kendinden önce söylenen her şeyi taşır

İşte bu sohbetin tamamı canlı fiyatlarla, 20.000 token giriş ve 2.500 çıkış:

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

Toplamda 20.000 giriş ve 2.500 çıkış token'ı. 1M token başına fiyatlar günceldir ve tarifelerimizle birlikte değişir; OpenRouter sütunu aynı iş yükü için referans fiyatları gösterir.

Giriş ve çıktı birlikte sayıldığında toplamda GLM-5.3-Flash ve DeepSeek-V4-Flash burada OpenRouter'dakinden daha ucuza gelir ve ikisi de her saatte tek fiyat korur. Aynı sohbet döngüsünde 8.192 token'dan uzun yanıtlar istiyorsanız DeepSeek-V4-Flash, 380K bağlamla yanıt başına 32.768'e kadar çıktı token'ına izin verir; model kimliğini deepseek-ai/DeepSeek-V4-Flash-0731 ile değiştirin, döngüde başka hiçbir şey değişmez.

Maliyetin daha derin hikâyesi uzun bir AI sohbeti neden daha pahalıdır yazısında; giriş ve çıktı token'ları iki tarafın neden ayrı fiyatlandırıldığını açıklar.

Hızlı kontrol

Sohbetiniz 8. turda. 8. tur için istek ne içerir?

Cevabı göster

Cevap: Sistem mesajı ve önceki tüm soru ve yanıtlar, artı en yeni soru

API hiçbir şey hatırlamaz, bu yüzden her seferinde tam liste gönderilir. Giriş token'larının turdan tura yükselmesinin nedeni de budur.

Uzun bir sohbeti kontrol altında tutmak#

Liste sonsuza kadar büyüyemez: modelin bağlam penceresine sığmalıdır (bağlam penceresi nedir yazısına bakın) ve her ek tur giriş maliyeti getirir. Bir prototip için iki alışkanlık bunu makul tutar:

  • En eski turları kırpın. Sistem mesajını ve son birkaç çifti tutun, örneğin her istekten önce messages = messages[:1] + messages[-8:]. Çiftleri birlikte atın ki bir soru asla yanıtını kaybetmesin.
  • Yeni bir konu için yeni bir liste başlatın. Yeni bir görev, eskisinin geçmişine ihtiyaç duymaz.

Uzun ömürlü bir kural setine sahip bir destek botu da aynı döngüdür: sistem mesajı kuralları bir kez belirler, her kullanıcı turu ve yanıtı eklenir ve liste ağırlaştığında kırpma yaparsınız. İlk isteğin kendisi için CheapTokens ile ilk API isteğiniz yazısına bakın; model listesi ve fiyatlar fiyatlandırma sayfasında.