Model çağrısını üretime almak: zaman aşımı, yeniden deneme, akış
Model çağrısı, uçtan uca süre bütçesinin içine yerleştirilerek üretime alınır: bağlantı, ilk token ve toplam yanıt için ayrı zaman aşımı tanımlayın, toplam eşik kullanıcıya vaat edilen süreden küçük kalsın. Yalnızca geçici hataları (429, 5xx, bağlantı kopması) üstel geri çekilme ve rastgele sapmayla yeniden deneyin; 400, 401 ve 403 gibi kalıcı hatalarda ilk denemede durun. Akışta ilk token gittikten sonra çağrı yeniden denenemez — kısmi çıktı ya atılır ya da yarım olduğu açıkça işaretlenir. Her denemeyi istek kimliği, deneme sırası ve sonlanma nedeniyle kaydedin.
ÖNKOŞULLAR
- Bir model sağlayıcısına çalışan API erişimi ve üretimden ayrı bir test anahtarı
- Servis için yazılı bir uçtan uca gecikme hedefi — kullanıcıya vaat edilen süre
- Yapılandırılmış günlük (JSON satır) yazabildiğiniz bir uygulama katmanı
- Gerçek çağrı yapmadan hata ve gecikme döndürebilen bir taklit uç nokta
GEREKEN ARAÇLAR
- Bağlantı, okuma ve toplam zaman aşımını ayrı ayarlayabilen bir HTTP istemcisi
- Yeniden deneme ve devre kesici kütüphanesi
- Akış (SSE veya benzeri) taşıyabilen bir sunucu ve istemci katmanı
- Yapılandırılmış günlük toplayıcı ve yüzdelik raporlayabilen bir metrik deposu
- Hata ve gecikme enjekte edebilen bir yük testi aracı
- 01
Uçtan uca süre bütçesini yaz
Kullanıcıya vaat edilen toplam süreyi tek bir sayı olarak belirleyin ve bu sayıyı ağ, geri getirme, model çağrısı ve son işleme arasında paylaştırın.
Zaman aşımı değerlerini tek tek seçerek başlamak, yanlış uçtan başlamaktır. Önce kullanıcıya vaat edilen toplam süreyi yazın: bir sohbet yanıtı, bir form doldurma önerisi ve gece çalışan bir toplu iş aynı bütçeye sahip olamaz. Bütçe belirlendikten sonra her katmanın payı bu sayının içinden çıkar, dışarıdan eklenmez.
Katman Bütçedeki yeri Aşıldığında Ağ ve ağ geçidi Küçük ve sabit Bağlantı hatası döner Geri getirme veya veri okuma Orta, ölçülebilir Eksik bağlamla devam edilir ya da durulur Model çağrısı En büyük pay Zaman aşımı; yeniden deneme süresi de buradan çıkar Son işleme ve doğrulama Küçük Yanıt ham hâliyle verilir veya reddedilir Paylar örnektir, ölçüm değil; kendi gecikme dağılımınızla değiştirin. Toplamları vaat edilen süreden küçük kalmalı ve arada bir güvenlik payı bulunmalı. - 02
Zaman aşımını üç ayrı eşiğe böl
Bağlantı kurma, ilk token ve toplam yanıt için ayrı eşikler tanımlayın; tek bir genel zaman aşımı, yavaş üreten sunucu ile hiç cevap vermeyen sunucuyu ayırt edemez.
Tek bir "istek zaman aşımı" değeri iki farklı arızayı aynı kovaya atar: hiç cevap vermeyen bir sunucu ile yavaş ama üreten bir sunucu. İkincisini beklemek çoğu zaman doğrudur, birincisini beklemek her zaman kayıptır. Eşiği üçe bölmek bu ikisini ayırır.
- Bağlantı zaman aşımı: TCP ve TLS el sıkışması için. Kısa tutulur, çünkü burada geçen süre üretimle ilgili değildir.
- İlk token zaman aşımı: sağlayıcı isteği kuyruğa mı aldı yoksa çalışıyor mu — bunu ayırt eden tek eşik budur.
- Toplam yanıt zaman aşımı: uzun üretimin üst sınırı; çıktı uzunluğu sınırıyla birlikte düşünülür.
- Akışta dördüncü eşik: iki parça arasındaki en uzun sessizlik. Açık kalıp veri göndermeyen bir bağlantı, kopmuş bağlantıdan farklı bir arızadır.
python from dataclasses import dataclass @dataclass class ZamanAsimi: baglanti: float # el sıkışma ilk_token: float # ilk parça gelene kadar toplam: float # çağrının üst sınırı sessizlik: float # akışta iki parça arası def cagir(istek, esik: ZamanAsimi, kalan_butce: float): if kalan_butce <= esik.baglanti: raise ButceBitti("model çağrısına yer kalmadı") # Etkin eşik her zaman ikisinden küçüğü: yapılandırma değil bütçe bağlar. return istemci.cagir( istek, baglanti=esik.baglanti, ilk_token=min(esik.ilk_token, kalan_butce), toplam=min(esik.toplam, kalan_butce), )Doğrulama adımı: sağlayıcıyı taklit eden bir uç nokta kurun. Biri hiç cevap vermesin, biri çok yavaş üretsin, biri ilk tokenden sonra bağlantıyı kapatsın. Üç durumda da günlükte farklı bir sonlanma nedeni görmüyorsanız eşikleriniz ayrışmamış demektir.
- 03
Hataları geçici ve kalıcı diye ayır
Yeniden denenecek hatalarla denenmeyecekleri yazılı bir tabloda ayırın: 429 ve 5xx tekrar denenir, 400 ve 403 ilk denemede durur.
Yeniden deneme politikası, hata sınıflandırmasından sonra gelir. Sınıflandırma yoksa iki uçtan birine düşülür: ya her hata denenir ve kalıcı arızalar bütçeyi yer, ya hiçbiri denenmez ve geçici bir dalgalanma kullanıcıya hata olarak yansır.
Belirti Sınıf Yapılacak 429 — oran sınırı Geçici Retry-After varsa ona uy, yoksa geri çekilerek dene 500, 502, 503, 504 Geçici Sınırlı sayıda ve bütçe içinde yeniden dene Bağlantı sıfırlandı veya zaman aşımı Geçici, yan etkiye dikkat İstek kimliğiyle tekilleştirip dene 400 — geçersiz istek Kalıcı Dur, isteği kaydet, girdiyi düzelt 401 / 403 — kimlik veya yetki Kalıcı Dur; yeniden deneme yalnızca sorunu gizler Bağlam sınırı aşıldı Aynı girdiyle kalıcı Girdiyi küçültmeden tekrar deneme Bu tablo kodda tek bir yerde yaşamalı. Her çağrı noktasına kopyalanan hata listeleri zamanla birbirinden ayrışır ve hangi davranışın geçerli olduğu kimsenin bilmediği bir hâle gelir. - 04
Üstel geri çekilme ve rastgele sapma kur
Denemeler arasındaki beklemeyi her turda katlayarak artırın ve üzerine rastgele sapma ekleyin; sabit aralıklı yeniden deneme, zorlanan sağlayıcıyı aynı anda tekrar vurur.
Sabit aralıkla yeniden deneme, yükün altında kalan bir sağlayıcıyı topluca yeniden vurur: aynı saniyede hata alan bin istemci, aynı saniyede tekrar dener. Beklemeyi her denemede katlayarak artırmak yükü zamana yayar; üzerine rastgele sapma eklemek istemcileri birbirinden ayırır.
python import random def bekleme(deneme: int, taban: float, tavan: float) -> float: """Üstel artış + tam rastgele sapma (full jitter).""" ust = min(tavan, taban * (2 ** (deneme - 1))) return random.uniform(0, ust)- 01Deneme sayısına değil kalan bütçeye bakın: bekleme süresi bütçeyi aşacaksa yeni deneme yapılmaz.
- 02Sağlayıcı Retry-After gönderiyorsa kendi hesabınızı değil onu kullanın.
- 03Deneme üst sınırını bütçeden türetin; sayıyı artırmak bütçeyi büyütmediğiniz sürece yalnızca son denemenin kesilme ihtimalini artırır.
- 04Kuyrukta çalışan işlere ayrı politika yazın: kullanıcı beklemiyorsa bütçe geniş, geri çekilme uzun olabilir.
Doğrulama adımı: hata enjeksiyonuyla ardışık 429 döndürün ve günlükten deneme zamanlarını çıkarın. Aralıklar katlanarak artmıyorsa geri çekilme, hepsi birbirinin aynısıysa sapma uygulanmıyor demektir.
- 05
Yeniden denemeyi güvenli kıl
Her iş birimine bir istek kimliği verin ve yan etkili adımları bu kimlikle tekilleştirin; zaman aşımı, isteğin çalışmadığı anlamına gelmez.
Zaman aşımı, isteğin işlenmediği anlamına gelmez; yalnızca cevabın size ulaşmadığı anlamına gelir. Sağlayıcı isteği almış, model üretmiş, sizin bağlantınız kopmuş olabilir. Yan etkisiz bir metin üretiminde bu sadece boşa giden bir çağrıdır; araç çağıran bir akışta ise iki kez gönderilmiş bir e-posta ya da iki kez açılmış bir kayıt demektir.
- 1İstek kimliği üret
Kimlik çağrının metninden değil iş biriminden türetilir; aynı iş için yapılan yeniden denemede aynı kimlik kullanılır.
- 2Kimliği hem sağlayıcıya hem kendi kaydına yaz
Sağlayıcı tekilleştirme başlığı destekliyorsa gönderin; desteklemiyorsa tekilleştirmeyi kendi tarafınızda yapın.
- 3Yan etkiyi kimlikle koru
Araç çağrısı, veritabanı yazımı ve bildirim gönderimi aynı kimlikle ikinci kez çalıştırılmaz.
- 4Sonucu kimlikle sabitle
Yeniden deneme başarılı olduktan sonra ilk denemenin geç gelen cevabı kaydı bozmamalı; geç gelen yanıt atılır.
- 06
Akış sözleşmesini tanımla
Akışta durum kodu ilk baytla birlikte gider; başarısızlığı gövdenin içinde taşıyan ayrı bir hata olayı ve açık bir bitiş olayı tanımlayın.
Akışta HTTP durum kodu cevabın ilk baytıyla birlikte gönderilir — yani 200 dönmüş bir çağrı sonradan başarısız olabilir. Bu, hata iletiminin gövdenin içine taşınması gerektiği anlamına gelir: istemci, akışın normal mi bittiğini yoksa koptuğunu mu bilmek zorunda.
Kopma anı İstemcinin gördüğü Doğru davranış İlk token gelmeden Henüz veri yok Sessizce yeniden denenebilir Akışın ortasında Yarım metin Yeniden deneme yok; hata olayı gönderilir Bitiş olayı gelmeden bağlantı kapandı Tamamlanmış gibi görünen metin Açık bitiş olayı yoksa tamam sayma Kullanıcı sekmeyi kapattı Hiçbir şey İptal yukarı taşınır, üretim durdurulur - Akışın sonunu açık bir olayla bildirin; bağlantının kapanması bitiş sinyali değildir.
- Hata için ayrı bir olay tipi tanımlayın ve içine istek kimliğini koyun.
- Uzun sessizliklerde canlılık sinyali gönderin; aradaki vekil sunucular sessiz bağlantıyı kapatabilir.
- İstemci bağlantıyı kapattığında iptali sağlayıcıya kadar taşıyın; aksi hâlde kimsenin okumayacağı bir üretim devam eder.
- 07
Kısmi çıktıyı kurala bağla
Yarım kalan çıktının saklanıp saklanmayacağına içerik türüne göre karar verin: serbest metin yarım olduğu belirtilerek gösterilebilir, yapılandırılmış çıktı atılır.
Kısmi çıktı bir istisna değil, akış kullanan her sistemin düzenli olarak karşılaştığı bir durum. Karar önceden verilmezse her çağrı noktası kendi yolunu seçer ve aynı arıza iki farklı sonuç üretir.
Çıktı türü Yarım geldiğinde Gerekçe Serbest metin Gösterilir, yarım olduğu işaretlenir Kullanıcı okuduğunu kendisi değerlendirebilir Yapılandırılmış çıktı Atılır Eksik belge ayrıştırılamaz; tam sanılırsa veri bozulur Araç çağrısı argümanı Atılır, araç çalıştırılmaz Eksik argüman yanlış yan etki üretir Özet veya sınıflandırma Atılır Yarım özet yanlış özettir ve kısmilik aşağı akışta görünmez Kısmi çıktıyı saklayacaksanız ayrı bir alanda ve açık bir bayrakla saklayın. "Yarım" bir durumdur; kaydedilmezse iki gün sonra tam kayıt sanılır ve raporlara öyle girer.
- 08
Devre kesici ve geri çekilme yolu kur
Hata oranı eşiği aşıldığında çağrıyı denemeden reddedin ve önceden tanımlı bir geri çekilme yoluna geçin; kuyruğu sınırsız büyütmeyin.
Sağlayıcı geniş çaplı bir arıza yaşadığında yeniden deneme mantığı sorunu büyütür: her istek birkaç kez denenir, eşzamanlı bağlantı sayısı şişer ve kendi servisiniz de cevap veremez hâle gelir. Devre kesici bu döngüyü keser — eşik aşıldığında çağrılar denenmeden ve hızlıca reddedilir.
- 1Eşiği ölç
Kayan pencerede hata ve zaman aşımı oranı izlenir; eşik aşılınca devre açılır.
- 2Devreyi aç
Yeni çağrılar sağlayıcıya gitmeden geri çekilme yoluna düşer; kuyruk büyümez.
- 3Yarı açığa geç
Bekleme süresi dolduğunda devre yarı açık duruma geçer ve sınırlı sayıda deneme çağrısına izin verilir; deneme başarısız olursa devre yeniden açılır ve bekleme uzar.
- 4Devreyi kapat
Ardışık başarı eşiği geçildiğinde normal trafiğe dönülür ve geçiş kayda yazılır.
- Önbellekten cevap: aynı veya benzer istek daha önce cevaplandıysa, tazeliği belirtilerek verilir.
- Daha küçük veya başka bir sağlayıcıdaki model: yanıt kalitesi düşer ama servis ayakta kalır.
- Modelsiz yol: kural tabanlı cevap, arama sonucu listesi ya da insana yönlendirme.
- Dürüst hata: şu an cevap üretilemediğini söylemek, yanlış cevap üretmekten iyidir.
- 09
Her denemeyi kaydet ve eşikleri izle
Çağrı başına değil deneme başına kayıt tutun: istek kimliği, deneme sırası, sonlanma nedeni ve ilk token süresi her satırda bulunsun.
Çağrı başına tek bir kayıt yetmez. Yeniden denemeler tek satırda birleştirilirse dışarıdan bakan biri servisin yavaşladığını görür ama nedenini göremez. Her deneme ayrı satır olmalı ve satırlar ortak bir istek kimliğiyle birbirine bağlanmalı.
json { "istek_kimligi": "c7f1a3", "deneme": 2, "istem_surumu": "destek-yanit@7", "ilk_token_ms": 812, "toplam_ms": 4310, "sonlanma": "tamam", "onceki_hata": "429", "girdi_token": 1840, "cikti_token": 260, "kesildi": false }- İlk token süresinin yüzdelik dağılımı — ortalama, kuyruğu gizler.
- Deneme oranı: yeniden denenen çağrıların payı; sessizce artması sağlayıcıda bozulma habercisidir.
- Zaman aşımı ve iptal oranları ayrı ayrı; ikisi farklı arızalardır.
- Kesilen çıktı oranı: çıktı uzunluğu sınırına çarpan yanıtlar.
Yukarıdaki satırdaki sayılar biçimi göstermek içindir, ölçüm değildir. Bir de uyarı: istem ve çıktı metnini bu satıra gömmeyin. Metin kişisel veri taşıyabildiği için ayrı bir depoda, ayrı saklama süresi ve ayrı erişim yetkisiyle tutulmalı; kayıt satırında yalnızca ona işaret eden kimlik durmalı.
SIK DÜŞÜLEN TUZAKLAR
Her hatayı yeniden denemek
Geçersiz istek ve yetki hataları tekrar denendiğinde sonuç değişmez, yalnızca kullanıcının beklediği süre katlanır. Yeniden deneme kararı hata sınıfına bakar, çağrının önemine değil.
Zaman aşımlarını iç içe sıralamamak
Ağ geçidi istemciden önce kesiyorsa yeniden deneme ve geri çekilme kodu hiç çalışmaz; bağlantı siz karar vermeden kopar. Eşikler dıştan içe küçülecek şekilde sıralanmalı.
İptali yukarı taşımamak
Kullanıcı sekmeyi kapattığında sunucu üretmeye devam eder. Kimsenin okumayacağı bu çıktı hem kapasiteyi hem bütçeyi yer; üstelik eşzamanlılık sınırınızı gerçek talepten daha erken doldurur.
Kısmi JSON’u ayrıştırmaya çalışmak
Yarım gelen yapılandırılmış çıktıyı tamamlamak biçim hatasını gizler, veri hatasını gizlemez. Eksik alanlar varsayılanla dolar ve yanlış kayıt hiçbir uyarı üretmeden aşağı akışa geçer.
Geri çekilme yolunu hiç denememek
Yedek yol yalnızca arıza anında çalıştırılıyorsa test edilmemiş demektir. Aynı sağlayıcıya bağlı bir yedek, ihtiyaç duyulduğu anda zaten çökmüş olur.
KONTROL LİSTESİ
- Uçtan uca süre bütçesi yazılı ve katmanlara paylaştırılmış
- Bağlantı, ilk token ve toplam yanıt için ayrı zaman aşımı tanımlı
- Hata sınıflandırma tablosu kodda tek yerde ve testle korunuyor
- Yeniden deneme üstel geri çekilme ve rastgele sapma kullanıyor, toplam bütçeyi aşmıyor
- Yan etkili her adım bir istek kimliğiyle tekilleştiriliyor
- Akışta hata ve bitiş için ayrı olay tipleri var, istemci ikisini de işliyor
- İstemci bağlantıyı kapattığında iptal sağlayıcıya kadar gidiyor
- Deneme sırası ve sonlanma nedeni her çağrı için kayıtlı
Maddelerin tamamı işaretlenmeden kurulum üretime alınmamalı.
Sık sorulan sorular
LLM API çağrısı için zaman aşımı kaç saniye olmalı?
Tek bir doğru sayı yok; değer, kullanıcıya vaat edilen toplam süreden geriye doğru hesaplanır. Önce toplam bütçeyi yazın, ağ ve geri getirme paylarını düşün, kalanı model çağrısına verin — yeniden deneme beklemeleri de bu kalanın içinden çıkar. Akış kullanıyorsanız ilk token eşiği toplam eşikten belirgin biçimde kısa olmalı, çünkü ikisi farklı arızaları yakalar. Değerleri ölçtüğünüz gecikme dağılımının yüzdeliklerine göre ayarlayın, ortalamaya göre değil.
429 hatası alınca ne yapmalı?
429 geçici bir hatadır ve yeniden denenebilir, ama hemen değil. Sağlayıcı Retry-After gönderiyorsa kendi hesabınız yerine onu kullanın; göndermiyorsa üstel geri çekilme ve rastgele sapmayla bekleyin. Bekleme kalan süre bütçenizi aşacaksa denemeyin, geri çekilme yoluna geçin. 429’un sistematik olarak artması bir yeniden deneme sorunu değil kapasite sorunudur; eşzamanlılık sınırınızı gözden geçirin.
Akış sırasında bağlantı koparsa yeniden deneme yapılabilir mi?
İlk token gitmediyse evet: istemci henüz bir şey görmediği için çağrı sessizce tekrarlanabilir. İlk token gittikten sonra hayır — yeniden deneme kullanıcıya baştan yazılan ikinci bir cevap gösterir ve yan etkili adımlar tekrarlanır. Bu durumda doğru davranış, gövdenin içinde tanımlı bir hata olayı göndermek ve kararı istemciye bırakmaktır: yeniden sor, yarım metni koru ya da at.
Yeniden deneme sayısı kaç olmalı?
Sayıyı değil bütçeyi sınırlayın: yeni bir deneme ancak bekleme süresiyle birlikte kalan bütçeye sığıyorsa yapılır. Pratikte bu, kullanıcının beklediği çağrılarda küçük bir deneme sayısı bırakır; kuyrukta çalışan toplu işlerde daha cömert olabilirsiniz. Her denemenin ayrı bir çağrı olduğunu ve girdi tokenlerinin yeniden işlendiğini unutmayın — deneme sayısını artırmak sessizce verilmiş bir kapasite kararıdır.
Kaynaklar
- 01HTTP Semantics (RFC 9110) — durum kodları, Retry-After ve yeniden deneme güvenliği — IETF · Teknik rapor
- 02Model sağlayıcılarının hata kodu ve oran sınırı dokümantasyonları — Model sağlayıcıları · Dokümantasyon
- 03Sinaptik Research — üretim çağrı hattı uygulama notları — Sinaptik Lab · Teknik rapor
BUILD
Bu rehberi kurumunuzda uygulayalım mı?
Aynı mimariyi kendi verinizle kurmak için discovery oturumundan üretime kadar birlikte ilerliyoruz.
