Bloga dön

Maliyet optimizasyonuKılavuz

Maliyeti düşürmek için sohbet geçmişini kırpın: kayan pencere mi özet mi

Her turda yeniden gönderdiğiniz miktarı sınırlayın: son birkaç mesajı veya kısa bir özeti tutun. 50 turluk bir sohbet için token hesabı ve bir Python yardımcısı.

Yazan: CheapTokens TeamYayınlanma tarihi: 5 dk okuma

Kapak: trim_history yardımcısıyla uzun bir sohbeti ucuz tutun
Bu sayfada
  1. 50. turda gerçekte ne gönderilir
  2. Seçenek 1: kayan pencere
  3. Seçenek 2: eski turların özeti
  4. Üç kurulumun maliyeti
  5. Hangisini seçmeli

Destek botunuz 50 tur boyunca sohbet ediyor ve her yeni mesaj bir öncekinden daha pahalıya mal oluyor. API hiçbir şeyi hatırlamaz, bu yüzden kodunuz her seferinde tüm konuşmayı yeniden gönderir. Çözüm, gönderdiğiniz miktarı sınırlamaktır: sistem istemini ve son birkaç turu tutun (kayan pencere) veya eski turları kısa bir özetle değiştirin. Aşağıda 50 turluk bir sohbet için hesaplama ve kopyalayabileceğiniz bir yardımcı fonksiyon var.

DeepSeek'in çok turlu sohbet kılavuzu (api-docs.deepseek.com, 1 Kasım 2026'da kontrol edildi) açıkça söylüyor: sunucu önceki isteklerin bağlamını kaydetmez, bu yüzden istemci her çağrıda tam messages listesini gönderir. CheapTokens üzerindeki OpenAI uyumlu format da aynı şekilde çalışır. Bu sizin için yeni bir konuysa, uzun bir sohbetin neden daha pahalı olduğu ve messages dizisinin nasıl çalıştığı ile başlayın.

50. turda gerçekte ne gönderilir#

400 token'lık bir sistem istemiyle çalışan bir destek botunuz olduğunu varsayalım. Tipik bir turda kullanıcı yaklaşık 60 token yazar ve bot yaklaşık 190 token ile yanıt verir. Bir tam tur, geçmişe 250 token ekler. Bunlar varsayımlardır: bunları kendi yanıtlarınızın usage alanındaki sayılarla değiştirin.

50. turda istek, sistem istemini, 49 önceki turu ve yeni mesajı taşır: 190 token'lık bir yanıt almak için 400 + 49 × 250 + 60 = 12,710 giriş token'ı. Tüm sohbeti toplayın. Sistem istemi ve yeni mesaj her seferinde gönderilir: 50 × 460 = 23,000. Tekrarlanan geçmiş 250 × 1,225 = 306,250 ekler. Toplamda: 50 × 190 = 9,500 çıkış token'ına karşılık 23,000 + 306,250 = 329,250 giriş token'ı.

Her istekteki geçmiş bir tur büyür, bu yüzden toplam, sohbet uzunluğunun karesiyle büyür. 50'den 100 tura çıkın ve tekrarlanan geçmiş kısmı kabaca dört katına çıkar.

Kendin deneDeneyin: yalnızca sistem istemini, son 4 turu ve yeni mesajı gönderseydiniz, 50. tur kaç giriş token'ı taşırdı?Cevabı göster

Tam geçmişle 12.710'a karşılık 1.460 (400 + 4 × 250 + 60). Aynı soru, aynı yanıt uzunluğu, girişin çok küçük bir kısmı.

Seçenek 1: kayan pencere#

Fikir şu: her zaman sistem istemini gönderin, son N tur dışındaki her şeyi bırakın. Tam geçmişi kendi depolamanızda tutun ve yalnızca gönderdiğiniz kopyayı kırpın.

python
def trim_history(messages, keep_pairs=4):
    """System prompt + the last keep_pairs turns + the new user message."""
    system = [m for m in messages if m["role"] == "system"]
    rest = [m for m in messages if m["role"] != "system"]
    return system + rest[-(keep_pairs * 2 + 1):]

Kullanıcının yeni mesajını ekledikten sonra çağırın. keep_pairs=4 ile bu, 4 kullanıcı/asistan çifti artı yeni mesaj, yani 9 mesajdır ve dilim her zaman bir kullanıcı mesajıyla başlar. İşte gerçek bir çağrıya bağlanmış hali:

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)
MODEL = "deepseek-ai/DeepSeek-V4-Flash-0731"

history = [{"role": "system", "content": "You are a concise support assistant."}]

def ask(text):
    history.append({"role": "user", "content": text})
    resp = client.chat.completions.create(
        model=MODEL,
        messages=trim_history(history),
        max_tokens=500,
    )
    answer = resp.choices[0].message.content
    history.append({"role": "assistant", "content": answer})
    print(resp.usage.prompt_tokens, resp.usage.completion_tokens)
    return answer

print satırı işe yarayan satırdır: ilk sayıyı izleyin. Kırpma olmadan her turda yükselir. Pencereyle, sohbet 4. turu geçtiğinde büyümeyi durdurur.

Python yardımcısı trim_history: sistem istemi, son 4 tur, yeni mesaj
Bu makaledeki kırpma yardımcısı

Sayılarla: 5. turdan itibaren her istek 400 + 4 × 250 + 60 = 1,460 giriş token'ıdır. İlk dört tur normal şekilde büyümeye devam eder ve toplamda 3.340 eder. Tüm sohbet: 3,340 + 46 × 1,460 = 70,500 giriş token'ı, tam geçmişle gönderdiğiniz 329.250'nin yaklaşık beşte biri. Çıkış 50 × 190 = 9,500 olarak kalır.

50. tur isteği: tam geçmiş ile 4 turluk pencere karşılaştırması
Yukarıdaki varsayımlara göre 50. tur isteğinin token parçaları

Kodda, tüm değişiklik çağrıdaki tek bir argümandır:

Karşılaştır

Tek satırlık değişiklik

Önce

python
messages=history

Sonra

python
messages=trim_history(history)

İşin püf noktası: bir pencere unutur. Kullanıcı 40. turda "sipariş numaram neydi?" diye sorarsa ve numara 3. turda geçtiyse, model onu hiç görmemiştir. İki ucuz çözüm var. Kalıcı bilgileri (ad, sipariş numarası, plan) kendi kodunuzda sohbetten çıkarın ve pencere tarafından asla kesilmeyen sistem istemine ekleyin. Ya da bir özet ekleyin, ki bu bir sonraki seçenektir.

Seçenek 2: eski turların özeti#

Eski turları bırakmak yerine onları sıkıştırırsınız. Birkaç turda bir, pencereden yeni çıkan turları ve mevcut özeti modele gönderin ve yeni, kısa bir özet isteyin. Sonra bu özeti sistem mesajına koyun.

python
def summarize(summary, old_messages):
    transcript = "\n".join(f"{m['role']}: {m['content']}" for m in old_messages)
    prompt = (
        f"Summary so far:\n{summary}\n\nNew turns:\n{transcript}\n\n"
        "Rewrite the summary in under 200 words. "
        "Keep names, numbers, decisions and open questions."
    )
    resp = client.chat.completions.create(
        model=MODEL,
        messages=[{"role": "user", "content": prompt}],
        max_tokens=400,
    )
    return resp.choices[0].message.content

def build_messages(history, summary, keep_pairs=4):
    system = history[0]["content"]
    if summary:
        system += "\n\nEarlier in this chat: " + summary
    recent = history[1:][-(keep_pairs * 2 + 1):]
    return [{"role": "system", "content": system}] + recent

Özet ücretsiz değildir: ekstra bir model çağrısıdır. Yaklaşık 300 token'lık bir özetin her 5 turda bir (50 turda 9 kez) yenilendiğini, her yenilemenin yaklaşık 1.600 token okuduğunu (eski özet artı beş tur artı talimat) ve 300 yazdığını varsayalım. Güvenli tarafta kalmak için, 5. turdan itibaren her istekte özeti sayın (gerçekte ilk yenilemeden sonra görünür, yani bu hafif bir fazla tahmindir): 400 + 300 + 4 × 250 + 60 = 1,760 giriş token'ı.

Sohbet için toplamlar: ana istekler 3,340 + 46 × 1,760 = 84,300 giriş token'ı, özet çağrıları 9 × 1,600 = 14,400 giriş ve 9 × 300 = 2,700 çıkış. Hep birlikte 84,300 + 14,400 = 98,700 giriş ve 9,500 + 2,700 = 12,200 çıkış token'ı.

Özet, yalın pencereden biraz daha pahalıdır ve karşılığında model 3. turda ne olduğunu hâlâ bilir.

Üç kurulumun maliyeti#

İşte aynı 50 turluk sohbet, DeepSeek-V4-Flash üzerinde, yukarıdaki toplamlardan canlı olarak fiyatlandırılmış:

DeepSeek-V4-Flash üzerinde bir 50 turluk sohbet
  • Tam geçmiş (329.250 giriş, 9.500 çıkış)$0.0059
  • Pencere artı özet (98.700 giriş, 12.200 çıkış)$0.0027
  • Kayan pencere, 4 tur (70.500 giriş, 9.500 çıkış)$0.002

Fiyatlar canlı fiyat listesinden gelir, bu yüzden tarife değiştiğinde sayılar güncellenir. Sıralama değişmez: pencere en azını gönderir, özet ortada yer alır, tam geçmiş en pahalıdır.

Bunun gibi bir sohbet için başlangıç yapılacak CheapTokens modeli DeepSeek-V4-Flash'tir. 380K bağlam penceresi vardır (50 turluk bir sohbet kırpılmadan bile sığar), yanıt başına 32.768'e kadar çıkış token'ı, günün her saatinde tek sabit fiyat ve toplamda, giriş ve çıkış birlikte sayıldığında, OpenRouter'dan daha ucuzdur. Model kimliği deepseek-ai/DeepSeek-V4-Flash-0731. Modelleri pencere kurulumunda karşılaştırmak isterseniz (istek başına ortalama 1.410 giriş token'ı, 190 çıkış, 50 istek), işte canlı tablo:

Model İstek başına 50 istek OpenRouter, 50 istek
GLM-5.3-Flash $0.000036 $0.0018 $0.0032
DeepSeek-V4-Flash $0.00004 $0.002 $0.0063
MiniMax-M2.7 $0.000099 $0.005 $0.0594

İstek başına 1.410 giriş ve 190 çı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.

GLM-5.3-Flash 390K bağlama ve MiniMax-M2.7 180K'ya sahiptir, bu da kırpılmış bir sohbet için yeterlidir. Güncel fiyatlar fiyatlandırma sayfasında ve dokümanlar ilk isteğin nasıl gönderileceğini gösterir.

Hangisini seçmeli#

Pencere varsayılandır: üç satır kod, ekstra çağrı yok, ekstra hata modu yok. Destek botları, eğitmenler ve rol yapma için kullanın; burada son birkaç tur konuşmayı ve sistem istemi kuralları taşır. Kullanıcılar uzun zaman önce söylenen şeylere geri döndüğünde özeti ekleyin, örneğin hiç bitmeyen tek bir konuşması olan kişisel bir asistan gibi. Pencereyi modelin yakın bağlamı hâlâ göreceği kadar küçük, tam bir soru-cevap alışverişini tutacak kadar büyük tutun. Neyin sığdığı ayrı bir sınırdır ve bağlam penceresinin ne olduğu konusunda ele alınmıştır.

Hızlı kontrol

Kullanıcı 40. turda, 3. turda verilen bir sipariş numarasını sorar. Özet olmadan 4 turluk bir pencere kullanıyorsunuz. Ne olur?

Cevabı göster

Cevap: Model onu göremez, çünkü 3. tur istekten çıkarılmıştır

API durumsuzdur. Model yalnızca istekte olanı görür, bu yüzden hâlâ ihtiyaç duyduğunuz bilgiler sistem isteminde veya bir özette kalmalıdır.