BİLGİSAYAR ERİŞİM SİSTEMİ

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çin

Maliyet 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ımBileşenGiriş Token’larıÇıkış Token’larıGiriş MaliyetiÇıkış MaliyetiToplam
1İlk planlama4.200800$0,0126$0,0120$0,025
2Web arama çağrısı4.800200$0,0144$0,0030$0,017
3Arama sonuçlarını işleme8.500600$0,0255$0,0090$0,035
4Derin okuma (sayfa 1)12.000500$0,0360$0,0075$0,044
5Derin okuma (sayfa 2)15.200500$0,0456$0,0075$0,053
6Takip araması16.800200$0,0504$0,0030$0,053
7Sonuçları işleme20.100600$0,0603$0,0090$0,069
8Sentez22.5001.200$0,0675$0,0180$0,086
9Doğrulama24.000400$0,0720$0,0060$0,078
10Nihai yanıt25.5001.500$0,0765$0,0225$0,099
Toplam153.6006.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 anthropic
import time
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class 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},
}
@dataclass
class 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):
pass

Optimize etmeden önce bile bugünden


İlgili Makaleler