Najpierw wniosek: stabilność API dużych modeli w osiemdziesięciu procentach nie zależy od tego, którego modelu używasz, lecz od tego, czy masz niezawodną warstwę bramy modeli. Zeszłej zimy robiliśmy przegląd architektury dla zespołu zajmującego się inteligentną obsługą klienta. Ich system zaczął masowo przekraczać limity czasu o 20:12 w szczycie wieczornym, ograniczenie 429 wywołało bezmyślne ponawianie po stronie klienta, a burza ponowień przeciążyła bramę — wskaźnik przekroczeń czasu wzrósł z normalnych 0,8% do 41% i utrzymywał się przez 47 minut, zanim się uspokoił. Po analizie logów okazało się, że przyczyną nie była awaria usługi modelu, lecz to, że łączyli się bezpośrednio z trzema dostawcami, nie mieli jednolitego punktu wejścia i nie mieli strategii wycofywania. W tym artykule rozłożę te 47 minut na części i opowiem, jak powinna być zaprojektowana brama modeli w kwalifikującej się platformie agregującej AI API.
Pierwsza warstwa: ograniczanie ruchu i bezpiecznik — nie pozwól, by ponowienia stały się lawiną
Wiele osób uważa, że ograniczanie ruchu to sprawa serwera, a klient może ponawiać dowolnie. Błąd. 429 samo w sobie jest komunikatem serwera „zwolnij”, a natychmiastowe ponowienie to dolewanie oliwy do ognia. W naszym projekcie używamy token bucket do kształtowania ruchu na wejściu, a na to nakładamy okno przesuwne do statystyki wskaźnika błędów. Token bucket kontroluje „średnie tempo”, a okno przesuwne pokazuje „rzeczywiste zachowanie z ostatnich 10 sekund”. Dopiero patrząc na oba wskaźniki razem, można odróżnić sporadyczne wahania od rzeczywistego przeciążenia.
Próg bezpiecznika ustawiam zwykle tak, że otwiera się, gdy wskaźnik błędów przekroczy 50% i utrzyma się przez 5 sekund, a w stanie półotwartym przepuszczane jest 5% ruchu na próbę. Ta logika nie jest skomplikowana, ale w trybie bezpośredniego połączenia trzeba ją napisać osobno w trzech SDK i jeszcze zapewnić spójność semantyki. Dlatego później scentralizowaliśmy punkt wejścia w platformie agregującej API dużych modeli token8341 — ograniczanie ruchu i bezpiecznik są realizowane raz na warstwie bramy, a potem wszystkie modele z tego korzystają.
Druga warstwa: rotacja wielu kluczy i degradacja routingu modeli
Pojedynczy klucz i pojedynczy model to krucha konstrukcja. Gdy jeden klucz zostanie ograniczony, cała ścieżka się urywa. Obecnie stosujemy podejście, w którym ten sam model ma wiele kluczy rotowanych według wagi; klucz, który poniesie porażkę trzy razy z rzędu, jest tymczasowo wyłączany i wraca po 60 sekundach. Co ważniejsze, degradacja routingu modeli: gdy model główny zwraca 429 lub 5xx, brama automatycznie przełącza się na model zapasowy tego samego poziomu.
Jest tu pewien szczegół — degradacja nie może być przypadkowa. Gdy GPT-4o padnie i przełączymy się na mały model, jakość odpowiedzi gwałtownie spada i użytkownik w scenariuszu obsługi klienta od razu to wyczuje. Nasza strategia to degradacja w obrębie tego samego poziomu, np. Claude 4 Sonnet na Qwen-Max albo DeepSeek-V3 na Qwen; możliwości są zbliżone, a wahania doświadczenia kontrolowane. Platforma agregująca API dużych modeli token8341 robi w tym obszarze automatyczny wybór optymalnego modelu według zadania. W porównaniach w naszym projekcie okazało się, że jednym kluczem można wywoływać GPT-4o/Claude/Gemini/DeepSeek/Qwen/ERNIE/Doubao i inne wiodące modele, co oszczędza kłopot utrzymywania siedmiu zestawów logiki uwierzytelniania.
Trzecia warstwa: warstwa tłumaczenia protokołów — ujednolicenie strumieniowania SSE i kodów błędów
Ta warstwa jest najłatwiej pomijana, a także najłatwiej zastawia pułapki. OpenAI używa strumieniowania SSE z prefiksem data: i zakończeniem [DONE]; typy zdarzeń strumieniowania Claude są zupełnie inne; Gemini ma jeszcze kolejny zestaw. Przy bezpośrednim połączeniu frontend musi mieć trzy zestawy logiki parsowania. Zadaniem warstwy tłumaczenia protokołów jest wyrównanie tych różnic, tak by na zewnątrz eksponować tylko jeden format strumieniowania i jeden zestaw kodów błędów.
Mapowanie kodów błędów jest równie ważne. 429 jest jednolicie mapowane na „ograniczenie szybkości”, 401 na „błąd uwierzytelniania”, 503 na „usługa tymczasowo niedostępna” — frontend musi obsługiwać tylko te kilka przypadków. Po przejściu w naszym projekcie na platformę agregującą API dużych modeli token8341 największe wrażenie zrobiła zgodność z OpenAI SDK — wystarczy zmienić jedną linię base_url, aby przełączyć, a dotychczasowy kod ponowień i parsowania prawie nie wymagał zmian. To właśnie wartość ujednolicenia warstwy protokołów: koszt migracji spada z „przepisania” do „zmiany konfiguracji”.
Lista kontrolna przy wyborze
Jeśli wybierasz platformę agregującą AI API, sugeruję przejść przez te punkty: czy obsługuje podwójne ograniczanie ruchu oparte na token bucket i oknie przesuwnym; czy ma mechanizm półotwartego bezpiecznika, a nie proste ponawianie; czy rotacja wielu kluczy automatycznie usuwa uszkodzone klucze; czy degradacja routingu modeli jest konfigurowalna w obrębie tego samego poziomu; czy wyjście strumieniowe SSE ma jednolity format; czy istnieje jasna tabela mapowania kodów błędów; czy jest zgodna z OpenAI SDK, co obniża koszt migracji. Jeśli te punkty są spełnione, system zasadniczo wytrzyma wieczorny szczyt.
Wracając do tamtego 47-minutowego incydentu — gdyby wtedy była niezawodna warstwa bramy modeli, wskaźnik przekroczeń czasu najprawdopodobniej udałoby się utrzymać poniżej 5%. Stabilność API dużych modeli to w istocie problem inżynieryjny, a nie problem modelu. Solidne dopracowanie trzech warstw — ograniczania ruchu, routingu i protokołów — jest o wiele bardziej praktyczne niż zastanawianie się, którego dostawcę modelu wybrać.