Agent Maliyet Optimizasyonu: API Harcamalarını Azaltmaya Yönelik Pratik Bir Rehber
Agent Maliyet Optimizasyonu: API Harcamalarını Azaltmaya Yönelik Pratik Bir Rehber
Ajanınız harika çalışıyor. Günde 200 isteği işliyor ve kullanıcılar memnun. Sonra API faturasını kontrol ediyorsunuz: Bu ay 3.400 dolar. Rakamlara daha yakından bakınca ajanın her istek için ortalama 12 API çağrısı yaptığını ve her çağrıda 4.000 token’lık bir sistem istemi kullandığını fark ediyorsunuz. Bu, yalnızca sistem istemleri için günde 9,6 milyon giriş token’ı demek. Milyon token başına 3 dolar fiyatla bu, tekrarlanan içerik için ayda 864 dolar anlamına geliyor.
Maliyet, üretimdeki ajan dağıtımlarının ölçeğinin küçültülmesinin ya da tamamen iptal edilmesinin bir numaralı nedenidir. Optimizasyon, erken bir adım değil; bir hayatta kalma meselesidir. İyi haber şu: Çoğu ajan dağıtımında, tüm sistemi yeniden tasarlamayı gerektirmeyen basit değişikliklerle %50-80 maliyet düşürme potansiyeli mevcuttur.
Bu rehberde, yatırım getirisine (ROI) göre sıralanmış yedi maliyet azaltma stratejisini öğreneceksiniz. En üstten başlayıp bütçe hedefinize ulaşana kadar aşağıya doğru ilerleyin. Her bölüm, tek bir satır kod yazmadan önce tasarrufları tahmin edebilmeniz için somut rakamlar içermektedir.
1. Token Muhasebesi: Paranızın Nereye Gittiğini Bilin
Ölçemediğiniz şeyi optimize edemezsiniz. Herhangi bir değişiklik yapmadan önce, ajan iş akışınızdaki her kuruşun nereye gittiğine dair eksiksiz bir tablo oluşturun.
Giriş Token’larının Dağılımı
Claude’a yapılan her API çağrısı, giriş tarafında birkaç token kategorisi içerir:
- Sistem istemi — Talimatlar, persona, kısıtlamalar. Genellikle 1.000-5.000 token arasında olup her çağrıda tekrarlanır.
- Araç tanımları — Ajanın kullanabileceği her araç için JSON şemaları. 10 araç kolayca 2.000-3.000 token tüketebilir.
- Konuşma geçmişi — Konuşmadaki tüm önceki mesajlar. Her adımla birlikte büyür.
- Araç sonuçları — Önceki araç çağrılarından elde edilen ve bağlama geri enjekte edilen çıktılar. Çok büyük olabilir (tam web sayfaları, veritabanı sonuçları).
Çıkış Token’larının Dağılımı
Çıkış token’ları, giriş token’larına kıyasla 3-5 kat daha pahalıdır ve bu da onları kritik bir optimizasyon hedefi haline getirir:
- Ajan akıl yürütmesi — Dahili düşünce zinciri (özellikle genişletilmiş düşünme ile).
- Araç çağrısı oluşturma — Araç çağrıları için JSON.
- Nihai yanıt — Kullanıcıya yönelik cevap.
Görev Başına Maliyet Hesabı
Tek bir ajan görevi için toplam maliyet şu şekilde hesaplanır:
Toplam Maliyet = Σ (giriş_token'ları × giriş_fiyatı + çıkış_token'ları × çıkış_fiyatı) görevdeki her API çağrısı içinMaliyet Dağılımı Örneği
Claude Sonnet kullanan 10 adımlı bir araştırma ajantı görevi için gerçekçi bir dağılım (3$/M giriş, 15$/M çıkış):
| Adım | Bileşen | Giriş Token’ları | Çıkış Token’ları | Giriş Maliyeti | Çıkış Maliyeti | Toplam |
|---|---|---|---|---|---|---|
| 1 | İlk planlama | 4.200 | 800 | $0,0126 | $0,0120 | $0,025 |
| 2 | Web arama çağrısı | 4.800 | 200 | $0,0144 | $0,0030 | $0,017 |
| 3 | Arama sonuçlarını işleme | 8.500 | 600 | $0,0255 | $0,0090 | $0,035 |
| 4 | Derin okuma (sayfa 1) | 12.000 | 500 | $0,0360 | $0,0075 | $0,044 |
| 5 | Derin okuma (sayfa 2) | 15.200 | 500 | $0,0456 | $0,0075 | $0,053 |
| 6 | Takip araması | 16.800 | 200 | $0,0504 | $0,0030 | $0,053 |
| 7 | Sonuçları işleme | 20.100 | 600 | $0,0603 | $0,0090 | $0,069 |
| 8 | Sentez | 22.500 | 1.200 | $0,0675 | $0,0180 | $0,086 |
| 9 | Doğrulama | 24.000 | 400 | $0,0720 | $0,0060 | $0,078 |
| 10 | Nihai yanıt | 25.500 | 1.500 | $0,0765 | $0,0225 | $0,099 |
| Toplam | 153.600 | 6.500 | $0,461 | $0,098 | $0,558 |
Giriş maliyetlerinin baskın olduğuna ve konuşma geçmişi biriktiği için her adımla birlikte nasıl arttığına dikkat edin. 8-10. adımlar, toplam adımların yalnızca %30’unu oluşturmasına rağmen toplam maliyetin %47’sini oluşturmaktadır.
Maliyet Takip Kodu
Baştan itibaren bir takip sarmalayıcısı uygulayın:
import anthropicimport timefrom dataclasses import dataclass, fieldfrom typing import Optional
@dataclassclass CostRecord: step: int model: str input_tokens: int output_tokens: int cache_read_tokens: int = 0 cache_creation_tokens: int = 0 input_cost: float = 0.0 output_cost: float = 0.0 total_cost: float = 0.0 duration_ms: float = 0.0
# Milyon token başına fiyatlandırma (2026 başı itibarıyla)MODEL_PRICING = { "claude-haiku": {"input": 0.25, "output": 1.25, "cache_read": 0.025, "cache_write": 0.30}, "claude-sonnet": {"input": 3.00, "output": 15.00, "cache_read": 0.30, "cache_write": 3.75}, "claude-opus": {"input": 15.00, "output": 75.00, "cache_read": 1.50, "cache_write": 18.75},}
@dataclassclass TaskCostTracker: task_id: str budget_limit: Optional[float] = None records: list = field(default_factory=list) total_cost: float = 0.0
def record_call(self, step: int, model: str, usage) -> CostRecord: pricing = MODEL_PRICING.get(model, MODEL_PRICING["claude-sonnet"])
input_cost = (usage.input_tokens / 1_000_000) * pricing["input"] output_cost = (usage.output_tokens / 1_000_000) * pricing["output"] cache_read_cost = (getattr(usage, 'cache_read_input_tokens', 0) / 1_000_000) * pricing["cache_read"] cache_write_cost = (getattr(usage, 'cache_creation_input_tokens', 0) / 1_000_000) * pricing["cache_write"]
total = input_cost + output_cost + cache_read_cost + cache_write_cost
record = CostRecord( step=step, model=model, input_tokens=usage.input_tokens, output_tokens=usage.output_tokens, cache_read_tokens=getattr(usage, 'cache_read_input_tokens', 0), cache_creation_tokens=getattr(usage, 'cache_creation_input_tokens', 0), input_cost=input_cost + cache_read_cost + cache_write_cost, output_cost=output_cost, total_cost=total, )
self.records.append(record) self.total_cost += total
print(f" Adım {step} [{model}]: {usage.input_tokens} giriş / {usage.output_tokens} çıkış = ${total:.4f} (kümülatif: ${self.total_cost:.4f})")
if self.budget_limit and self.total_cost > self.budget_limit: raise BudgetExceededError( f"Görev {self.task_id} bütçeyi aştı: ${self.total_cost:.4f} > ${self.budget_limit:.4f}" )
return record
def summary(self) -> dict: return { "task_id": self.task_id, "total_steps": len(self.records), "total_input_tokens": sum(r.input_tokens for r in self.records), "total_output_tokens": sum(r.output_tokens for r in self.records), "total_cost": self.total_cost, "cost_by_model": self._cost_by_model(), }
def _cost_by_model(self) -> dict: by_model = {} for r in self.records: if r.model not in by_model: by_model[r.model] = {"calls": 0, "cost": 0.0} by_model[r.model]["calls"] += 1 by_model[r.model]["cost"] += r.total_cost return by_model
class BudgetExceededError(Exception): passOptimize etmeden önce bile bugünden
İlgili Makaleler
- AI Ajanları için Önbellekleme Stratejileri: Maliyetleri Kısmadan Kaliteyi Korumak
- Ajan İş Akışlarında Akıl Yürütme Modelleri: Genişletilmiş Düşünce Ne Zaman İşe Yarar?
- Çok Ajanlı Desenler: Orkestratörler, İşçiler ve Boru Hatları
- Özerk Ajan Sistemlerinde Hata Ayıklama ve Gözlemlenebilirlik