Yapay Zeka Asistanımız Her Özelliği Bir Araç Olarak Gördü: Tur Başına 0,148 Dolarlık Maliyetin Hikayesi
Kaynak: dev.to

İçindekiler 3 başlık
Kumiko üzerinde geliştirdiğimiz her uygulama, giriş yapan kullanıcının yetkilerine sahip bir yapay zeka asistanıyla gelir. Kampanya oluşturmak, kişi aramak veya e-posta şablonu düzenlemek gibi kullanıcının erişebildiği her işleyici (handler), çerçeve tarafından bir araca (tool) dönüştürülür ve her turda asistana tam liste olarak gönderilirdi.
Pazarlama uygulamamız Offlot'ta bir yönetici rolünün tam 187 aracı bulunuyor. Kullanıcı daha tek bir kelime yazmadan isteme (prompt) ne girdiğini ölçtüğümde yaklaşık 418 bin karakterlik bir yük gördüm:
- 143 bin karakter: Araçların JSON tanımları.
- 260 bin karakter: Uygulama manifestosu (varlıklar, ekranlar, navigasyon ve işleyiciler).
- 154 bin karakter: Manifesto içindeki işleyiciler bölümü (araç listesinin zaten tarif ettiği işlemleri ikinci kez gönderiyorduk).
Üstelik 187 aracın yaklaşık %60'ı pazarlama alanından ziyade platform ve yönetim özelliklerinden geliyordu. Sadece "Bu hafta kaç kişi kaydoldu?" diye soran biri, tüm bu araçların maliyetini ödüyordu.
Dört Araç ve Bir Dizin (Directory)#
Artık modele yalnızca dört temel araç veriyoruz: navigate, ask_user, describe_action ve run_action. Rolün kullanabileceği eylemler sistem istemine her satırda bir eylem ve maksimum 160 karakterlik özet olacak şekilde bir dizin olarak ekleniyor.
Model bir işlemi gerçekleştirmek için önce describe_action ile girdi şemasını istiyor, ardından run_action aracını eylem adı ve girdilerle çağırıyor. run_action kendi başına bir şey çalıştırmıyor; sağlayıcı yanıtından hemen sonra çağrıyı ilgili işleyiciye yeniden yazıyoruz. Böylece dağıtım, Zod doğrulaması ve riskli yazma işlemleri için onay adımı gibi mevcut güvenlik ve işleyiş akışı aynen korunuyor. Konuşma geçmişi yeniden oynatıldığında ise çağrılar modelin yaptığı şekle geri çevriliyor.
Güvenlik açısından, bilinmeyen bir eylem adı ile rolün yetkisi dışındaki bir eylem aynı yanıtı ("No action with this name is available") döndürüyor; böylece asistan yetki dışı araçları keşfetmek için kullanılamıyor. Manifestodan işleyiciler bölümü kaldırıldı ve yalnızca rolün erişebildiği özellikler listelenmeye başlandı. Ayrıca karşılaştırma amacıyla, detayların tamamen ihtiyaç anında yüklendiği Lazy (Tembel) adında üçüncü bir mod daha geliştirdik.
Test Sürüşü ve Sonuçlar#
Sonnet 5.5 üzerinde gerçek API çağrılarıyla aynı 11 uçtan uca senaryoyu üç modda test ettik:
- Tam Araç Kataloğu (Full tool catalog): 203k token istem öbeği | Tur başına 0,148 $ | Tur başına 1,5 model çağrısı
- Dizin (Directory): 85k token istem öbeği | Tur başına 0,062 $ | Tur başına 2,1 model çağrısı
- Tembel Yükleme (Lazy): 79k token istem öbeği | Tur başına 0,061 $ | Tur başına 2,6 model çağrısı
Her üç mod da 11 testin tamamını geçti. Dizin modu, tur başına maliyeti %58 oranında düşürdü. Modelin şema sorması gerektiği için çağrı sayısı artsa da, önbelleğe alınan küçük istem öbeği sayesinde her çağrı çok daha ucuza mal oldu. Lazy modu sadece 6 bin token ve tur başına 0,001 dolar tasarruf sağlarken yarım çağrı ekstra gecikme (latency) ekledi. Kullanıcının beklediği her ekstra tur deneyimi kötüleştirdiği için Lazy modunu eledik ve tüm uygulamalarımızda Dizin moduna geçtik.
Neleri Yanlış Tahmin Ettim ve Pratik Çıkarımlar#
Testten önce dizin öbeğinin yaklaşık 8 bin token olacağını tahmin etmiştim ancak 85 bin token çıktı. Araçların en büyük yük olduğunu varsaymıştım fakat sistem kuralları, dizinin kendisi ve manifestonun geri kalanı (85 binin yaklaşık yarısı) biriktiğinde hala ciddi bir boyut oluşturuyordu. Ayrıca yapılandırma ve ortam değişkeni hataları yüzünden iki testin yanlış modele gitmesi, ölçüm sürecinin toplamda 10,79 dolara mal olmasına yol açtı.
Yazılım Geliştirme Açısından Çıkarımlar:
- Dinamik Şema Yükleme (Meta-Tooling): Çok sayıda aracı doğrudan LLM'e göndermek yerine, bir dizin ve şema sorgulama aracı (
describe_action) kullanmak token maliyetini radikal biçimde düşürür. - Maliyet ve Gecikme Dengesi: Aşırı tembel yükleme (Lazy loading) token tasarrufu sağlasa da çok adımlı ajanlarda tur sayısını ve kullanıcı bekleme süresini artırır.
- Veri Tekrarını Önleyin: Sistem istemi (manifesto) ile araç tanımlarında aynı veriyi iki kez göndermediğinizden emin olmak için ham istem boyutunu mutlaka ölçün.
Kaynak ve atıf
Bu yazı, dev.to üzerinde yayımlanan içerikten yararlanılarak Edumints tarafından yapay zekâ desteğiyle Türkçe hazırlandı. Ayrıntılar ve yazarların kendi anlatımı için orijinaline bakabilirsin:
- dev.to/marc_kumiko/our-ai-assistant-saw-every-feature-as-a-tool-that-cost-0148-per-turn-4gh7