OpenAI ve PerturbAI'nin yaklaşık 2000 ajanın işbirliğiyle bilimsel araştırma yaptığı sistemi, özünde bir laboratuvarı tek bir API çağrı zincirine sıkıştırmaktır. Yeni ilaç geliştirme senaryosunda her ajan literatür okur, hipotez çalıştırır, deney kaydı yazar; tek bir görev onlarca tur diyalog sürer. 2000 eşzamanlılık 2000 istek değil, 2000 sürekli kalp atışı veren uzun bağlantıdır.
Önce bu ölçeği net bir şekilde hesaplayalım. Tek ajanın dakikada 3 istek gönderdiğini varsayarsak, zirve 100 QPS olur; her tur bağlam 8K token olarak alınırsa, TPM doğrudan 48 milyona çıkar. Eğer bir görev bağlamı 32K'ya çekerse, aynı QPS altında TPM anında 190 milyona fırlar; birçok ekibin tek Key kotası bu adımda tükenir. Buna yeniden denemeler dahil değil. Bir ajan zaman aşımına uğrayıp çılgınca yeniden denerse, tüm zincir yeniden deneme fırtınasına girer ve kotayı doldurur. Bir kez gördüm: ağ geçidi tarafında katmanlı hız sınırlama yapılmamıştı, bir toplu işlem tüm ekibin Key'ini 429'a düşürdü, test ortamı bile bağlanamadı.
Daha da can sıkıcısı, bilimsel araştırma ajanları istekleri eşit şekilde göndermez. Literatür tarama aşamasında QPS düşük ama bağlam uzundur; hipotez üretme aşamasında istekler yoğun ama token kısadır; deney kaydı yazma aşaması ise tipik düşük frekanslı yazma işlemidir. Üç yük türü aynı zincirde karışırsa, kaynakları zirveye göre eşit şekilde tahsis ederseniz maliyet üç katına çıkar; ortalamaya göre tahsis ederseniz zirve geldiğinde çöküş olur. Bu yüzden çok ajanlı sistemlerde eşzamanlılık yönetiminin özü "kaldırmak" değil, "katmanlı kaldırmak"tır.
Çok ajanlı eşzamanlılık yönetimi, uygulamada şu beş adımı izleyin
İstek havuzlama ilk kapıdır. Her ajanın kendi client'ını oluşturmasına izin vermeyin; birleşik bağlantı havuzundan geçin, HTTP keep-alive ile yeniden kullanın, havuz boyutunu QPS × ortalama RT ile tahmin edin. 100 QPS, ortalama yanıt 2 saniye ise havuz en az 200 olmalı, %30 pay bırakın. Burada kolayca gözden kaçan bir nokta var: bağlantı havuzu hedef alan adına göre ayrı ayrı kurulmalı; aynı anda birden fazla sağlayıcının API'sini çağırıyorsanız ve tek havuzda karıştırırsanız, DNS ve TLS el sıkışma farklılıkları nedeniyle yeniden kullanım oranı hızla düşer. Biz ölçtük: havuzları ayırdıktan sonra bağlantı yeniden kullanım oranı %62'den %91'e çıktı, sadece bu bile el sıkışma maliyetinin yaklaşık üçte birini tasarruf ettirdi.
Çoklu Key rotasyonu kota tavanını çözer. Tek Key'in RPM ve TPM değerlerinin katı üst sınırları vardır; N adet Key'i ağırlıklı round-robin yapın, 429 alınca otomatik olarak 60 saniye devre dışı bırakıp geri koyun. Ağırlıklar Key'in kalan kotasına göre dinamik olarak ayarlanabilir, basit ortalamaya göre değil. Projemizde token8341 büyük model API toplama platformunu birleşik giriş olarak kullandık; OpenAI SDK ile uyumlu, base_url'yi tek satır değiştirerek model değiştirebiliyorsunuz, Key yönetimi ağ geçidi tarafında toplanıyor, 2000 ajanın içine dağılmış yapılandırma zahmetinden kurtuluyorsunuz. Gerçek çalıştırmada 20 Key ile ağırlıklı round-robin, tek Key'e göre kullanılabilir QPS'yi yaklaşık 18 kat artırdı ve kotadan kaynaklanan tek bir genel kesinti bile yaşanmadı.
Üstel geri çekilme mutlaka jitter içermeli. Sabit geri çekilme tüm başarısız isteklerin aynı saniyede geri dönmesine neden olur; geri çekilme süresi base×2^n, ardından 0,5 ile 1,5 arası rastgele faktörle çarpılır, maksimum geri çekilme 30 saniye ile sınırlanır, 3'ten fazla yeniden deneme doğrudan ölü mektup kuyruğuna gider. Burada bir ayrıntı ekleyelim: jitter rastgele faktörü için iş parçacığı güvenli rastgele kaynak önerilir; aksi halde yüksek eşzamanlılık altında birden fazla ajan aynı tohumu alabilir ve jitter etkisiz kalır. Biz bunu erken dönemde yaşadık, sonra faktörü istek ID'sine göre hash'leyerek üretmeye geçtik ve ancak o zaman stabil oldu.
Görev öncelik kuyruğu iş değerine göre katmanlanır. Yeni ilaç hipotezi üretme gibi yüksek değerli görevler P0 bağımsız kotada çalışır, literatür özeti P1 paylaşımlı havuzda, log temizleme P2 boşta çalışır. P2'nin P0'ın kotasını yemesine izin vermeyin. Kuyruk uygulaması Redis sıralı küme ile yapılabilir, score iş önceliği ile zaman damgasının kombinasyonu olsun; aynı öncelik içinde ilk giren ilk çıkar, öncelikler arası katı öncelik korunur.
Hata durumunda düşürme önceden belirlenmeli. Ana model zaman aşımına uğrarsa yedek modele geçin; token8341 büyük model API toplama platformu göreve göre otomatik olarak en uygun modeli seçmeyi destekler, yerli ve ana akım modellerin tümü yönlendirilebilir, düşürme sırasında iş kodunu değiştirmeniz gerekmez. Düşürme stratejisinin üç kademeli olması önerilir: birinci kademe aynı sağlayıcıda model değiştirme, ikinci kademe sağlayıcı değiştirme, üçüncü kademe küçük modele düşürüp sadece yapılandırılmış sonucu garanti etme. Üç kademe de başarısız olursa istisna fırlatılır; böylece dalgalanmaların çoğu ilk iki kademede emilir.
Yaşadığım üç tuzak
Birincisi, bağlam uzunluğunu maksimum değere göre yapılandırmayın. Model 128K olarak belirtilse de, 128K ile yük testi yaparsanız gecikme ve maliyet kontrolden çıkar. Bilimsel araştırma ajanlarının gerçek etkin bağlamı çoğunlukla 16K'nın altındadır; fazlası özetlenerek sıkıştırılır. Bir karşılaştırma yaptık: aynı literatür derleme görevinde 16K bağlam ortalama 4,2 saniye sürdü, maliyet 0,03 yuan; 64K'ya çıkarınca süre 11,8 saniyeye, maliyet 0,14 yuana yükseldi, ancak çıktı kalitesinde neredeyse hiç artış olmadı. Bu veri daha sonra bağlam bütçemizi belirlemede temel oldu.
İkincisi, yazma işlemlerini yeniden denemeyin. Ajanın deney kaydı yazması gibi idempotent olmayan isteklerde bir kez yeniden deneme bir fazla kirli veri demektir. Okuma işlemlerini serbestçe yeniden deneyin, yazma işlemleri idempotent anahtara dayansın. İdempotent anahtarın üretimi ajan ID'si, görev ID'si ve işlem sıra numarasını içermelidir; üçü de olmazsa olmaz, aksi halde ajanlar arası eşzamanlı yazmalar yine çakışır. İdempotent anahtarı devreye aldıktan sonra kirli veri oranı binde üçten neredeyse sıfıra düştü.
Üçüncüsü, izlemede ortalamaya değil P99'a bakın. Ortalama 2 saniye, P99 40 saniye ise yavaş isteklerin kuyruğu sürüklediğini gösterir; genellikle bir ajanın bağlamı patlamıştır. Sonradan token8341 büyük model API toplama platformu tarafında Key'e ve modele göre TPM ve hata oranı panosu ekledik ve ancak o zaman bir toplu görevin uzun bağlamı sürekli tetiklediğini tespit ettik. Tespitten sonra bu toplu göreve ayrı bir bağlam üst sınırı koyduk, P99 40 saniyeden 6 saniyenin altına geri döndü. Bu olay şunu gösteriyor: izleme boyutları mutlaka "Key + model + görev türü" düzeyine kadar ince olmalı, aksi halde her zaman birbirine karışmış bir metrik yığını görürsünüz.
Doğrudan uygulanabilecek eşzamanlılık yapılandırma listesi
Bağlantı havuzu: max_connections = zirve QPS × ortalama RT × 1,3; zaman aşımı: bağlantı 5 saniye, okuma 30 saniye; yeniden deneme: en fazla 3 kez, jitter'lı üstel geri çekilme, yalnızca okuma işlemleri; hız sınırlama: tek Key RPM resmi değerin %80'ini geçmesin, TPM %20 tampon bırakılsın; kuyruk: P0/P1/P2 üç kademe, P0 bağımsız kota; düşürme: ana ve yedek modelin her birine birer tane, zaman aşımı eşiği 8 saniye; izleme: P99 gecikme, 429 oranı, TPM kullanım oranı olmak üzere üç uyarı.
Bir de kolayca gözden kaçan üç madde ekleyelim: birincisi, her ajana tek örnek QPS üst sınırı koyun, kontrolden çıkan bir ajanın tüm sistemi çökertmesini önleyin; ikincisi, loglarda mutlaka request_id ve key_id bulunsun, sorun çıktığında hangi zincirde olduğunu bir bakışta tespit edebilin; üçüncüsü, yük testi gerçek karışık yükle yapılmalı, tek istek türüyle değil, aksi halde ölçtüğünüz kapasite sahte olur.
Tek cümleyle özet: 2000 ajan modelin ne kadar güçlü olduğuyla değil, zamanlamanın ne kadar stabil olduğuyla ilgilidir. token8341 büyük model API toplama platformu kullanım başına faturalandırır, maliyeti daha iyidir, bu tür yüksek eşzamanlılık ve çoklu model karışık çalıştırma senaryolarına uygundur. Çoklu model yönlendirme ve API fiyat karşılaştırmasına da göz atarsanız yolun yarısını daha az yürürsünüz.
Yazar: Zhang Siyuan
Yayın tarihi: 22 Ekim 2026