Yapay zeka sağlayıcımız modeli kullanımdan kaldırdığında
Bir model değişikliği, hatasız gelen boş cevaplar ve birden kat kat artan bir fatura. Ne bozuldu ve sebebi görmek neden bu kadar zordu.

Temmuz 2026'da birkaç özellik aynı anda çalışmayı bıraktı: yapay zeka sohbeti, ticketlardaki yapay zeka cevapları, ticket özetleri, sunucu oluşturucu, ayrıca fikirlerin ve hata bildirimlerinin moderasyonu ve çevirisi.
Sebep bizim kodumuz değildi. Yapay zeka sağlayıcımız kullandığımız modeli kullanımdan kaldırmıştı.
Birinci kısım: model gitti
Bu bariz kısım ve hızla düzeltildi. Bir sağlayıcı bir modeli sonlandırır, halefini girersin, bitti.
Asıl olay bundan sonra başladı.
İkinci kısım: hatasız boş cevaplar
Değişiklikten sonra cevaplar geldi. Sadece bazen boştu. Kesik değil, bozuk değil, hiçbir hata olmadan tamamen boş bir cevap.
Sebep, model adının ele vermediği bir farkta yatıyor: halef bir akıl yürütme modeli. Asıl cevaptan önce iç düşünce zincirini ayrı bir alana yazar. İkisi de aynı token bütçesinden harcar.
Bütçe düşünmeyle tükenirse, biçimsel olarak sorunsuz bir cevap gelir: sağlayıcı "uzunluğa ulaşıldı" der ve içerik alanı boştur. Hata yok, ipucu yok, bir try/catch bloğunun göreceği hiçbir şey yok.
Bunu gerçek bir testle yeniden ürettik: beş tokenlık bir bütçe bile her istekte boş bir cevap üretmeye yetiyor.
Üçüncü kısım: fatura
En pahalı çağrı noktasında, yani yapay zeka sunucu oluşturucusunda, orada uzun cevaplar üretildiği için cömert bir bütçe belirlemiştik. Bu yüzden düşünme bir sınıra çarpmadı, sadece çalışmaya devam etti.
Sonuçlar aynı anda iki yönden geldi. İstekler o kadar uzun sürdü ki zaman aşımına uğradı. Ve kat kat daha pahalıya mal oldu, çünkü her seferinde görünmez bir düşünce zincirinin tamamı için ödeme yapılıyordu. Sonunda planlamadığımız bir hata mesajı geldi: yetersiz bakiye.
Çözüm tek bir satır. Düşünme, istek gövdesinde devre dışı bırakılabiliyor ve model o zaman yine eskisi gibi davranıyor. O zamandan beri bu satır her çağrı noktasına ait ve depoda bunlardan bir avuçtan fazlası var.
Dördüncü kısım: temizlerken bulduklarımız
Zaten her yapay zeka çağrı noktasına dokunuyorsan, onlara bakarsın. Bu, olayla ilgisi olmayan ama benzer şekilde pahalı ikinci bir konuyu ortaya çıkardı.
Sağlayıcılar, başlangıcı değişmeden kalan ve bir önbellekten sunulabilen bir prompt için çok daha az ücret alır. İsabet ile ıska arasındaki fark yaklaşık otuz kat.
Bu indirimi bir bayrakla elde etmiyorsun. Bunu özellikle test ettik: istek gövdesinde bunun için düşünülmüş bir alanın sıfır etkisi oldu, önbellek zaten otomatik olarak devreye giriyor. Tek kaldıraç prompt içindeki sıralama: sabitten değişkene.
Tam tersini yaptığımız dört yer:
Sabit talimat bloğunun içinde değişken bir değer. Hata bildirimleri için yinelenme kontrolünün talimat metninde modül adı vardı. Bu, aksi halde aynı olan bir bloğa modül başına kendi önbellek satırını veriyordu. Değer, zaten değiştiği değişken kısma aittir.
Yeni şey sabit şeyden önce. Aynı kontrol yeni hata bildirimini en fazla elli karşılaştırma adayından önce gönderiyordu. Bu yüzden API'nin en büyük prompt'u kalıcı olarak tamamen ıska geçiyordu.
Sabit kısımda kullanıcıya özel veriler. Herkese açık yapay zeka sohbeti, kullanıcı hakkındaki notları talimat bloğunda tutuyordu, yani paylaşılan kanal geçmişinden önce. Bu, aynı kanaldaki her kullanıcıya kendi başlangıcını veriyordu ve paylaşılan geçmiş her kullanıcı için ayrı ayrı ödeniyordu.
Geçmiş üzerinde kayan bir pencere. Her mesajda son N mesajı göndermek, başlangıcı her mesajda kaydırır. O zaman tüm geçmiş kalıcı bir ıska olur. Doğru yaklaşım bloklar halinde kırpmaktır, yani nadiren ve büyük parçalar halinde.
Bir de kılı kırk yarmak gibi görünen ama öyle olmayan bir ayrıntı: bir prompt içinde yalnızca tek bir ölçüte göre sıralanan bir liste, eşitlik durumunda sırasını değiştirebilir. Talimat bloğunun ortasında yer değiştiren tek bir satır, arkasındaki her şeyin isabetine mal olur. Prompt içindeki sıralamaların tek anlamlı bir eşitlik bozucuya ihtiyacı var.
Bundan çıkardıklarımız
Bir model değişikliği bir yapılandırma değişikliği değildir. Ad, bir değişkendeki bir değer gibi görünüyor. Arkasında farklı bir davranış vardı ve bu davranış arayüzü değil, bizim kodumuzu bozdu.
Tehlikeli arıza sessiz olanıydı. Eski modelin gitmesi anında görünürdü ve dakikalar içinde düzeltildi. Boş cevaplar biçimsel olarak geçerli yanıtlar olarak geldi ve süresiz olarak öyle kalabilirdi.
Ölçülebilirlik çağrı noktasına aittir. Artık her birinde önbellek isabet oranını kaydediyoruz. Doğru kurulmuş bir nokta ilk istekten sonra yüksek bir orana oturur, kötü kurulmuş biri sıfırda kalır. Bunu bir kayıt satırında görürsün, başka hiçbir yerde görmezsin, çünkü ikisi de çalışıyor.
Ve rahatsız edici sonuç: başkasının modelini kullanmak, ürününün bir kısmının başka bir yerde verilen bir karara bağlı olması demek. Bu yüzden Ağustos'tan beri her sunucu, bizimkine güvenmek yerine yapay zeka özelliklerini kendi uç noktasına yönlendirebiliyor.
Diğer yazılar
4.000 Discord sunucusunu takip etmek: Grafana, PostHog ve bize gösterdikleri
Trafiğimizin yarısına sessizce yol açan bir döngü, günde üç milyon gereksiz istek ve bir dakika sonra biten bir saldırı. İzleme sistemimiz neleri görüyor ve neleri bilerek görmüyor.
Perde ArkasıBir botu 2.000'den fazla Discord sunucusunda çalıştırmak bize ne öğretti
Kodu yazarken varsaydığından farklı işleyen, ölçekle birlikte değişen dört şey.
Perde ArkasıAlphaCloud'da neden neredeyse her şey ücretsiz kalıyor
Çoğu Discord botu en faydalı özelliklerini bir aboneliğin arkasına kilitler. Biz bilerek bunu yapmıyoruz ve bunun cömertlikle, göründüğünden daha az ilgisi var.