Kıvanç Ertürk
Blog Claude Code ile yapıldı EN

Tüm yazılar · Geliştirme

Claude Code'da verimi düşürmeden token tasarrufu

Claude Code'da verimi düşürmeden token tasarrufu

Claude Code’u birkaç hafta yoğun kullandıktan sonra limitlere daha sık takılmaya başladım. İlk tepki “daha az kullanayım” oluyor. Ama asıl sorun ne kadar kullandığım değil, token’ların nereye gittiğiydi. Çoğu, işe hiçbir şey katmayan yerlerde harcanıyordu.

Bu yazı, bende işe yarayan ayarları ve insanların çoğunlukla fark etmeden token harcadığı yerleri topluyor. Amaç daha az iş yaptırmak değil, aynı işi daha az bağlamla yaptırmak.

Önce bir gerçek: her tur, bütün bağlamı taşır

Modelin hafızası yok. Her mesajda o ana kadarki konuşmanın tamamı, yani sistem talimatları, araç tanımları, CLAUDE.md, okunan dosyalar ve komut çıktıları yeniden gönderiliyor. Önbellek bunun maliyetini düşürüyor ama sıfırlamıyor.

Bundan çıkan sonuç basit: bağlama giren her şey, oturum bitene kadar her turda tekrar ödenir. 50 satırlık bir log’a ihtiyacın varken 5.000 satırı okutursan, o 5.000 satırı sonraki her mesajda yeniden taşırsın.

Nereye gittiğini görmek için /context komutu bağlamın dökümünü, /cost ise oturumun harcamasını gösteriyor. Bir şey değiştirmeden önce bir kez bakmaya değer.

Fark etmeden token harcanan yerler

Birbiriyle ilgisiz işleri aynı oturumda yapmak

Sabah bir bug’a bakıp öğlen aynı oturumda yeni bir özelliğe geçince, bug’ın bütün izleri yeni işin her turunda taşınıyor. Üstelik model eski bağlamdan yanlış çıkarımlar da yapabiliyor.

Ne yapmalı: İş değişince /clear ile ya da yeni bir oturumla başla. Devam eden işler için bir sonraki bölümdeki devir notu yeterli.

Dev komut çıktıları

En büyük kaçak burası. Tipik örnekler:

  • Bütün test suite’inin ayrıntılı çıktısı
  • npm install ya da build log’u
  • LIMIT olmadan çalışan bir SELECT *
  • Boyut sınırı olmayan bir log araması
  • Bütün bir büyük dosyayı okumak

Ne yapmalı: Büyük çıktıyı dosyaya yaz, sadece gerekeni oku.

npm test > /tmp/test.log 2>&1; tail -40 /tmp/test.log
grep -n "FAIL" /tmp/test.log | head -20

Veritabanında önce COUNT(*) ya da gruplu bir özet sorgusu, sonra LIMIT’li bir örnek. Log aramalarında küçük bir sonuç sayısı ve sadece gereken alanlar. Büyük dosyalarda ilgili satır aralığı. Bunları CLAUDE.md’ye kısa kurallar olarak yazınca model kendiliğinden uyuyor.

Şişkin CLAUDE.md

CLAUDE.md her oturumun başında yükleniyor. Oraya eklenen her prosedür, onu hiç kullanmayan oturumlarda da ödeniyor. Zamanla “bir kere lazım olmuştu” notlarıyla yüzlerce satıra çıkabiliyor.

Ne yapmalı: CLAUDE.md’de sadece her oturumda geçerli olan kurallar kalsın. “Şu durumda şu adımları izle” türündeki prosedürleri skill’lere taşı. Skill’in sadece kısa açıklaması bağlamda durur, içeriği ihtiyaç olunca yüklenir.

Kullanılmayan ve tekrarlayan eklentiler

Her MCP sunucusu, her eklenti bağlama bir şeyler ekliyor: araç tanımları, talimatlar, bazen her oturumun başında çalışan bir hook’un çıktısı. Bende aynı işi yapan iki eklentinin iki kopyası ve hiç kullanmadığım bir dokümantasyon sunucusu vardı.

Ne yapmalı: Eklenti listeni gözden geçir. Aynı işi yapanlardan birini bırak, kullanmadıklarını kapat. Sadece belirli bir projede lazım olanları global ayarlar yerine o projenin .claude/settings.json dosyasında aç.

Her iş için en güçlü model

Bir metni düzeltmek, bir dosyayı yeniden adlandırmak ya da planı hazır bir görevi uygulamak için en güçlü model gerekmiyor.

Ne yapmalı: Varsayılanı orta seviye bir model yap. En güçlü modeli plan, zor hata ayıklama ve son review gibi düşünme gerektiren işlere sakla. Subagent’lara da işine uygun model ver. Aynı mantık düşünme seviyesi (effort) için de geçerli: basit işte yüksek effort, sadece daha uzun bir cevap demek.

Ana oturumda geniş keşif

“Bu projede kimlik doğrulama nasıl çalışıyor?” diye sorunca model onlarca dosyayı ana bağlama okuyabiliyor. Cevabı aldıktan sonra o dosyaların hepsi bağlamda kalıyor.

Ne yapmalı: Geniş aramaları bir subagent’a ver. Subagent dosyaları kendi bağlamında okur, ana oturuma sadece sonucu döner. Ya da dosya yolunu zaten biliyorsan doğrudan onu söyle.

Belirsiz istekler

“Şu hatayı düzelt” demek, modelin önce hatanın nerede olduğunu aramasına yol açıyor. “src/api/orders.ts içindeki calculateTotal, indirim null olunca çöküyor” demek aramayı atlatıyor.

Ne yapmalı: Bildiğin bağlamı ver: dosya, fonksiyon, hata mesajı, beklenen davranış. Kısa bir cümle, birkaç tur keşiften ucuz.

Sohbete yapıştırılan dev metinler

Bütün bir stack trace’i ya da log dosyasını sohbete yapıştırmak, onu kalıcı olarak bağlama koymak demek.

Ne yapmalı: Dosyaya kaydet ve yolunu ver. Model ihtiyacı olan kısmı okur.

Ekran görüntüsüyle doğrulama

Görseller ciddi token tutuyor. Bir sayfada bir metnin olup olmadığını kontrol etmek için ekran görüntüsü almak pahalı bir yol.

Ne yapmalı: Metin ve yapı için sayfanın metnini ya da erişilebilirlik ağacını oku. Ekran görüntüsünü gerçekten görsel bir şeyi kontrol ederken kullan.

Tekrar deneme döngüleri

Bir komut başarısız olunca model küçük değişikliklerle tekrar tekrar deneyebiliyor. Her deneme bir tur, her tur bütün bağlam.

Ne yapmalı: İki başarısız denemeden sonra dur ve yön ver. Sorun çoğu zaman modelin göremediği bir yerde oluyor: yetki, ortam, sürüm farkı.

Gereğinden büyük çoklu ajan işleri

Paralel çalışan onlarca ajan etkileyici görünüyor, ama her biri kendi bağlamını yüklüyor. Beş ajanın yapabileceği bir review’u yirmi ajana yaptırmak, dört kat token demek.

Ne yapmalı: Çoklu ajan işlerine bir boyut sınırı koy. Claude Code’da bunun için bir ayar da var. Ben varsayılanı “küçük” yaptım.

Sık tekrarlanan arka plan kontrolleri

Bir CI işini ya da deploy’u her dakika kontrol ettirmek, her kontrolde bağlamı yeniden taşımak demek.

Ne yapmalı: Kontrol aralığını işin gerçek süresine göre seç. Sekiz dakika süren bir CI için tek bir kontrol, sekiz kontrolden iyidir.

Uzun işlerde: devir notu

Bazı işler tek oturuma sığmıyor. Bağlam dolunca otomatik sıkıştırma devreye giriyor, ama neyin önemli olduğuna o karar veriyor.

Bunun yerine iş kilometre taşlarında kısa bir devir notu yazdırıyorum: ne yapıldı, hangi kararlar verildi, sırada ne var, hangi dosyalar önemli. Sonra yeni bir oturum açıp sadece o notu okutuyorum. Yeni oturum, yüzlerce turluk geçmiş yerine bir sayfalık özetle başlıyor.

Bunu bir skill’e çevirmek işi tek komuta indiriyor. Not, repo içinde sabit bir klasöre yazılıyor, böylece bir sonraki oturum nereye bakacağını biliyor.

Kısa kontrol listesi

  1. İş değişince /clear ya da yeni oturum.
  2. Büyük çıktı dosyaya, sadece gereken kısmı bağlama.
  3. Sorgularda önce özet, sonra LIMIT. Log aramalarında boyut sınırı.
  4. CLAUDE.md kısa, prosedürler skill’de.
  5. Kullanılmayan ve tekrarlayan eklentiler kapalı. Projeye özel olanlar proje ayarında.
  6. Varsayılan orta model. Güçlü model plan ve review için.
  7. Geniş keşif subagent’ta.
  8. İstekte dosya ve fonksiyon adı.
  9. Metin varken ekran görüntüsü yok.
  10. İki başarısız denemeden sonra müdahale.
  11. Çoklu ajan işlerinde boyut sınırı.
  12. Uzun işlerde devir notu ve temiz oturum.

Bunların hiçbiri modelin yaptığı işi azaltmıyor. Sadece modelin her turda taşıdığı yükü azaltıyor. Bende limitlere takılma sıklığı belirgin şekilde düştü, çıktının kalitesinde bir fark görmedim.