Token Tasarrufu Yöntemleri
LLM kullanırken token maliyetini düşürmenin pratik yolları — prompt sıkıştırma, caching, structured output, akıllı RAG ve daha fazlası.
Neden token tasarrufu?
LLM kullanan her ürün, ölçeklendikçe token faturasıyla karşılaşır. Üstelik token sadece para değil — daha çok token = daha yavaş yanıt + daha fazla bağlam yorgunluğu (model uzun prompt'ların ortasını "atlar"). Tasarruf hem cüzdanı, hem kaliteyi korur.
Bu rehber yedi pratik tekniği örnekleriyle anlatıyor. Hepsini birden uygulamak zorunda değilsin; en yüksek ROI'liden başla.
1. Prompt cache kullan
Anthropic, OpenAI ve diğer büyük sağlayıcılar prompt caching sunuyor. Aynı prefix'i (system prompt, sabit talimatlar, alıcı şablonu) tekrar tekrar gönderiyorsan, cache fiyatı 10x'e kadar düşürür.
from anthropic import Anthropic
client = Anthropic()
# Sabit, uzun system prompt'u cache'le
SYSTEM_PROMPT = """[5000 token ürün dokümanı + ayrıntılı kurallar...]"""
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{
"type": "text",
"text": SYSTEM_PROMPT,
"cache_control": {"type": "ephemeral"},
}
],
messages=[{"role": "user", "content": "Müşteri sorusu..."}],
)
# İkinci ve sonraki çağrılarda system prompt cache'ten okunur,
# normal fiyatın küçük bir kısmı ödenir.Önemli: cache TTL (5 dakika) içinde tekrar çağırmazsan kaybolur. Yüksek trafiği olan endpoint'lerde çok değerli; nadir endpoint'lerde anlamsız.
2. Structured output kullan
JSON şeması belirleyerek modelin gereksiz nezaket cümleleri ("Tabii ki, işte yanıtınız:") üretmesini engelle. Çıktı kısalır, parse güvenli.
# Yanlış: serbest metin → uzun, parse zor
prompt = "Bu yorumun duygusunu söyle."
# Çıktı: "Tabii ki, bu yorum oldukça pozitif görünüyor çünkü..." → 80 token
# Doğru: structured output
import json
response = client.messages.create(
model="claude-haiku-4-5-20251001",
system='Reply with JSON only. Schema: {"sentiment": "pos"|"neg"|"neu"}',
messages=[{"role": "user", "content": yorum}],
max_tokens=20, # << kısa cevap zorla
)
result = json.loads(response.content[0].text)
# Çıktı: {"sentiment": "pos"} → 8 tokenmax_tokens parametresini agresif tutmak da önemli; modelin uzun cevap üretmesini fiziksel olarak engeller.
3. Daha küçük model kullan, gerektikçe büyüt
Tüm sorgular en güçlü modele gitmek zorunda değil. Cascade pattern: önce ucuz model (Haiku) deneyin; cevap kalitesi yetersizse Sonnet'e, ardından Opus'a yükseltin.
def smart_route(question, context):
# Basit, kısa sorular → Haiku ($0.80/$4 per 1M tokens)
if len(question) < 200 and not needs_reasoning(question):
return call_model("claude-haiku-4-5-20251001", question, context)
# Orta zorluk → Sonnet ($3/$15 per 1M tokens)
return call_model("claude-sonnet-4-6", question, context)
# Yalnızca karmaşık reasoning gerekenler Opus'a ($15/$75 per 1M)Çoğu üretim trafiğinin %70'i basit sorgulardır; bunları Haiku'ya yönlendirmek aylık faturanın yarısını silebilir.
4. Gereksiz bağlam göndermeyi kes
Bir konuşmada her turda tüm geçmişi göndermek, eski mesajların token'ını her seferinde tekrar ödemek demektir. Üç strateji:
a) Konuşmayı özetle
Belirli sayıda turdan sonra geçmişi tek bir özet mesajla değiştir:
if len(messages) > 10:
# İlk 8 mesajı özetle
summary = client.messages.create(
model="claude-haiku-4-5-20251001",
system="Özetle maddeler hâlinde. Kararlar, isimler, sayılar kalsın.",
messages=messages[:8] + [{"role": "user", "content": "Yukarıyı özetle."}],
).content[0].text
messages = [{"role": "user", "content": f"<özet>\n{summary}\n</özet>"}] + messages[8:]b) Pencere kaydır
Sadece son N turu sakla; önceki bilgileri ürünün veritabanına kaydet, gerektiğinde RAG ile getir.
c) Önemli olanı semantik seçim
Geçmiş 50 mesaj arasından şu anki soruyla en alakalı 5'ini seç (embedding benzerliği). Diğerleri prompt'a girmez.
5. Akıllı RAG: az ama doğru chunk
RAG genellikle "top 10 chunk gönder" diye kurulur. Çoğu zaman 3-5 yeter; üstüne reranker ekle, gereksiz chunk'lar elenir.
# Top-5 yerine top-20 al, sonra rerank ile en iyi 3'e indir
candidates = vector_db.search(query, top_k=20)
ranked = reranker.rank(query, candidates)
top_chunks = ranked[:3]
# 3 chunk × 500 token = 1500 token
# vs eski yaklaşım: 10 × 500 = 5000 token
# %70 token tasarrufu, sıklıkla daha iyi cevap6. System prompt'u sıkıştır
Doğal dilde uzun anlatılmış kuralları kısa madde madde komutlara çevir. Genellikle %40-60 daralma sağlanır:
# Önce (245 token):
You are a customer service assistant for our e-commerce store. Please
make sure to be polite and professional at all times. When responding
to customers, you should always reply in Turkish unless they ask
otherwise. Your responses should be concise but helpful, and you
should never offer discounts that are not officially approved by our
management team. If a customer asks about something you don't know,
politely inform them and offer to escalate to a human agent.
# Sonra (89 token):
ROL: TR e-ticaret destek asistanı.
DİL: Türkçe.
TON: Kısa, profesyonel.
KURAL: Onaysız indirim verme. Bilmiyorsan insan temsilciye yönlendir.Aynı bilgi, 2.7x daha az token. "Sen şu rolesin" + "kurallar:" + numaralı liste, "lütfen", "her zaman", "tüm bunları" gibi dolgu kelimelerini siler.
7. Caveman / kompakt yanıt modu
Claude Code kullanıyorsan /caveman skill'i yanıtları %75 kısaltır. API kullanıyorsan aynı etkiyi system prompt'a şu satırla katabilirsin:
RESPONSE STYLE:
Cut filler. Drop articles ("the", "a"). Drop pleasantries.
Use fragments where clear. Code unchanged. Keep technical
substance. One word when one word enough.Hata raporu, debug oturumu, hızlı API'lerde ideal. Müşteri yanıtlarında değil — ton fazla telgraf gibi olur.
8. Akıllı tool seçimi
Function calling kullanırken her tool tanımı prompt'a token ekler. 30 tool tanımlamak gerekiyorsa, kullanıcı niyetine göre dinamik filtreleme yap:
def select_tools(user_message):
# Kullanıcının niyetini sınıflandır
intent = classify_intent(user_message)
tool_groups = {
"files": [read_file, write_file, list_files],
"github": [create_pr, list_issues, comment_pr],
"data": [query_db, run_analytics],
}
return tool_groups[intent]
response = client.messages.create(
model="claude-sonnet-4-6",
tools=select_tools(user_message), # 30 yerine 3 tool
messages=[...],
)9. Batch API kullan
Anthropic'in Message Batches API ve OpenAI'nin Batch API'si toplu işlerde fiyatı %50'ye kadar düşürür. Yanıt süresi 24 saate kadar uzayabilir; gerçek zamanlı olmayan iş yükleri için ideal:
# Anthropic Batch örneği
batch = client.messages.batches.create(
requests=[
{
"custom_id": f"req-{i}",
"params": {
"model": "claude-sonnet-4-6",
"max_tokens": 256,
"messages": [{"role": "user", "content": doc}],
},
}
for i, doc in enumerate(documents)
]
)
# Saatler içinde sonuçları al, %50 indirimİçerik moderasyonu, sentiment analizi, doküman sınıflandırma gibi async işlerde devasa tasarruf.
10. Tokenization'ı tanı
Aynı bilgi farklı yazımla farklı token sayısı verir:
| Yazım | Token sayısı (tiktoken cl100k_base) |
|---|---|
id: 12345 |
4 |
"id":12345 |
5 |
id=12345 |
5 |
<id>12345</id> |
8 |
Düz JSON, XML'den tipik olarak %20-30 daha az token. UUIDsler ve uzun dize ID'ler aşırı pahalıdır; mümkünse kısa integer ID kullan.
ROI sıralı öncelik
Hepsini bir gecede uygulamak gerekmez. Öncelik sırası:
- Prompt cache (yüksek trafikte 5-10x tasarruf)
- Daha küçük model (basit sorgular için Haiku)
- Structured output + max_tokens (çıktı kısalır)
- System prompt sıkıştırma (her çağrı küçülür)
- Akıllı RAG (top-3 + reranker)
- Konuşma özetleme (uzun chat oturumları için)
- Batch API (async işlerde)
Bu sıraya göre uyguladığında çoğu ürün aylık faturasının %50-70'ini siler.
Ölçüm: kör tasarruf yok
Optimizasyona başlamadan önce baseline al. Anthropic console'da, OpenAI dashboard'da token tüketimi ve maliyet görünür. Ek olarak:
- Yanıt başına ortalama input token sayısı
- Yanıt başına ortalama output token sayısı
- Endpoint başına maliyet
- Hangi system prompt en çok kullanılıyor
Bunları izlemeden hangi tasarrufun gerçekten işe yaradığını bilemezsin.
Devamı için
- Token — modelin gördüğü atomik birim, neden tasarrufun temel ölçüsü.
- Context Window — modelin tek seferde sığdırabildiği token sayısı.
- System Prompt Rehberi — sıkıştırılmış system prompt yazımının kalıpları.
- KV Cache — büyük modelleri verimli çalıştırmanın kritik mekanizması.
- Prompt Caching ile Batch API — düşük gecikme + düşük maliyet kombinasyonu.