Tek satır, üçte bir indirim: prompt önbelleğini ücretli anahtarla ölçtük
GNL ekibicostprompt-cachingoptimizermeasurement
Tek bir önbellek anahtarıyla dört koşudan üçü, 1.964 açılış token'ının 1.792'sini önbellekten okudu. Deneyin tamamı yarım sentten az tuttu. Bize kendi teşhisimizin kaçırdığı bir durumu da gösterdi.
Sonuç#
Aynı ajanı ücretli bir OpenAI anahtarıyla iki kez çalıştırdık: bir kez olduğu gibi, bir kez önbellek anahtarıyla.
gpt-4o-miniüzerinde 4 koşu; her biri aynı 1.964 token'lık açılışla başlıyor.- Önbellek anahtarı olmadan: önbellekten 0 token okundu.
withCacheBreakpoints(model, { cacheKey })ile: 2. ile 4. koşuların her biri bu 1.964 token'ın 1.792'sini önbellekten okudu.- Bu çağrıların her biri %44 daha ucuz.
- Dört koşu toplamda %33 daha ucuz. İlk koşu tam fiyat öder, çünkü önbellekte henüz bir şey yoktur.
- GNL'in journal'dan hesapladığı maliyet, OpenAI'ın ham kullanım sayılarından ayrıca hesapladığımız maliyete eşitti.
Değişiklik tek satır koddu.
Nereden başladı#
Optimizer'ın teşhisi diagnoseAgent, ajanın maliyetini sağlayıcının faturaladığından okur; bu bilgi ajanın kendi journal'ında kayıtlıdır. Hiçbir model çağırmaz. Önbellek için tek bir şeyi sayıyordu: bir koşunun sonraki her adımında yeniden gönderdiği açılış. Bu sayı doğrudan faturadan gelir.
Kâğıt üstündeki tasarruf yine de bir tahmindir. Bu yüzden gerçek çağrılar için para ödedik ve faturayı okuduk.
Teşhisin ilk seferde kaçırdığı#
Ölçüm, teşhisin görmediği bir tasarruf buldu. Teşhis yalnızca bir koşu içinde yeniden gönderilen açılışı sayıyordu. Ölçtüğümüz tasarruf ise koşudan koşuya yeniden gönderilen aynı talimatlardan geliyordu.
Teşhisi düzelttik. Artık birbirinden 5 dakika içinde başlayan koşuların yeniden gönderdiği aynı talimatları da sayıyor; sağlayıcı önbelleği birkaç dakika tutar. Bu sayı tahmin olarak işaretli, çünkü journal talimatları saklar, token sayılarını değil.
Düzeltmenin testi ölçülen sayıları kullanıyor. Sonraki koşular talimatları yeniden gönderip önbellekten hiçbir şey okumuyorsa, teşhis bir önbellek bulgusu raporluyor. Sonraki her koşu zaten 1.792 token'ı önbellekten okuyorsa, kazanılacak bir şey kalmadığını söylüyor.
GNL değişen bir şey eklemiyor#
Sağlayıcı, ancak isteğin başı önceki bir istekle aynıysa önbellekten okur. İstek gövdelerini yerelde yakalayıp koşular arasında karşılaştırdık. GNL koşudan koşuya değişen hiçbir şey eklemiyor. Ajanın aynı gönderdiğini, sağlayıcı da aynı görüyor.
Önbellek anahtarı token'ları değiştirmez. OpenAI'a hangi isteklerin birlikte olduğunu söyler. Anthropic'te aynı sarmalayıcı bunun yerine sistem mesajına ve son mesaja önbellek işareti koyar.
Ölçüm neye mal oldu#
Deneyin tamamı 0,0042 $ tuttu: gpt-4o-mini üzerinde 66 çağrı.
Önce gpt-4.1-nano'yu seçtik. Listede hâlâ görünüyordu ama emekliye ayrılmıştı; koşular bu yüzden gpt-4o-mini'ye gitti.
Dene#
Ajanın OpenAI ya da Anthropic üzerinde çalışıyorsa modelini sar. OpenAI'da bir anahtar ver: ajanın adını, kiracılar önbelleği paylaşmamalıysa kiracıyı da.
import { withCacheBreakpoints } from '@gnldev/optimizer';
import type { AgentConfig } from '@gnldev/durable';
import { openai } from '@ai-sdk/openai';
const agent: AgentConfig = {
model: withCacheBreakpoints(openai('gpt-4.1'), { cacheKey: 'support' }),
};Önce ajanın için işe yarayıp yaramadığını görmek istersen, teşhisi journal'ı üzerinde çalıştır. Faturalananı okur, hiçbir model çağırmaz.
import { diagnoseAgent } from '@gnldev/optimizer';
const d = await diagnoseAgent({ journal: storage.runs, agent: 'support' });
for (const f of d.findings) console.log(f.lever, f.tokens, f.estimatedSavingUsd?.toFixed(2) ?? 'unpriced', f.why);