Нақты сұраудағы LLM-шлюздің үстеме шығыны
LLM-шлюздің үстеме шығынын қабаттарға бөліп өлшеу керек: аутентификация, аудит, лимиттер, маршруттау, кезектер және streaming.

LLM-шлюзді «кідіріс қоса ма?» деген бір сөйлеммен бағалауға болмайды. Ол бірнеше түрлі жұмысты орындайды және әрқайсысының өз сипаты бар: бірнеше микросекунд CPU уақыты, желілік сақтау орнын күту, үлкен денені сериализациялау, қосылымдар пулына дейінгі кезек немесе артық қайталап көру. Осының бәрін бір gateway_latency метрикасына біріктірсеңіз, команда мәселені тым кеш көреді.
Модельге тікелей шақыру салыстырудың әділ нүктесі сияқты көрінеді, бірақ оның өзінде DNS, TLS, қосылым орнату, промпт жіберу, провайдер кезегін күту және генерация бар. Шлюзді ойдағы мінсіз нұсқамен емес, дәл сондай жағдайдағы осы шақырумен салыстыру керек. Өлшеудің мақсаты қарапайым: аутентификация, лимиттер және аудит сияқты пайдалы кепілдіктердің құнын жойылатын кездейсоқ кідірістерден ажырату.
Алдымен кідіріс деп нені есептейтініңізді анықтаңыз
LLM сұрауының кідірісі бір ғана сан емес, өйткені пайдаланушы, клиенттік SDK, шлюз және провайдер операцияның әртүрлі шекарасын көреді. Streaming чатында пайдаланушы жүйені бірінші токенге дейінгі уақытпен, яғни TTFT арқылы бағалайды. JSON өрістерін шығару, модерация және пакеттік өңдеу кезінде толық жауапқа дейінгі уақыт маңыздырақ. Осы екі метриканы араластырсаңыз, мәтін пайдаланушыға ертерек жетсе де, жылдам streaming жауабы қысқа streaming емес шақырудан нашар көрінуі мүмкін.
Әр сұрауды бір-бірімен қиылыспайтын аралықтарға бөліңіз:
client_to_gateway: қолданбада жіберілген сәттен шлюз қабылдағанға дейінгі уақыт;gateway_queue: бос worker, қосылым немесе ішкі лимитті күту;gateway_processing: аутентификация, саясат, бүркемелеу, маршрут таңдау және сұрауды дайындау;upstream_ttft: провайдерге жіберілгеннен бірінші байтқа немесе ағынның бірінші оқиғасына дейінгі уақыт;upstream_completion: жауаптың қалған бөлігін жасау және жіберу;gateway_to_client: буферлеу, сүзу және клиентке жеткізу.
Streaming емес шақыруда upstream_ttft мәнін сыртқы бақылаудан әрдайым бөліп алу мүмкін емес. Бұл қалыпты жағдай. Белгісіз шаманы болжаммен алмастырмаңыз. Шлюзді аспаптандырып, сұраудың сыртқы қосылымға жазылған сәтін және бірінші қабылданған байт уақытын белгілеңіз.
Қайталап көруге кеткен уақытты бөлек тіркеңіз. Қайталап көру баяу модель де, маршрутизатордың кәдімгі кідірісі де емес. Бұл тәуекелі басқа жұмыс режимі: бірінші әрекетті провайдер қабылдап қойған болуы мүмкін, ал кей операцияларда автоматты қайталау қос жұмысты тудыруы ықтимал. Метрикаларда бастапқы әрекет те, пайдаланушы сұрауының қорытындысы да болуы керек.
Орташа мәнді негізгі көрсеткіш ретінде қолданбаңыз. Орташа мән бірнеше минутта бір рет пайда болып, p99-ға әсер ететін он сұраудан тұратын кезекті жасырады. Әр аралық үшін кемінде p50, p95, p99, сұраулар санын және қателер үлесін жинаңыз. Streaming режиміне TTFT үлестірімін қосыңыз. Лимиттері бар шлюз үшін кезек тереңдігі мен қабылданбаған сұраулар үлесін де өлшеңіз.
Тікелей шақыру мен шлюз модельге бірдей жұмысты орындатуы керек
Салыстыру екі жақ бір модельмен бірдей жұмысты орындағанда ғана мағыналы. base_url мәнін ауыстыру жеткіліксіз: тікелей маршрутта басқа географиялық орналасу, басқа қосылымдар пулы, API-дің басқа нұсқасы немесе SDK автоматты түрде қосатын генерация параметрлері болуы мүмкін.
Өзгермейтін тест корпусын жинаңыз. Онда қысқа сұрау, әдеттегі жұмыс сұрауы, үлкен контекст және алдын ала белгілі ұзындықтағы жауап беретін streaming сұрау болсын. Корпусқа пайдаланушы деректерін қоспаңыз. Әр сұраудың денесін файл ретінде сақтап, тікелей маршрут пен шлюз арқылы байт-бойынша бірдей жіберіңіз.
Тест алдында мыналарды бекітіңіз:
- модельдің нақты идентификаторы мен генерация параметрлері;
- тест клиенті жұмыс істейтін бір өңір;
- параллель сұраулардың бірдей лимиті;
- екі жақта да streaming қосулы немесе өшірулі болуы;
- тайм-аут пен қайталау ережелері;
- суық және қыздырылған қосылымдарды бөлек серия ретінде сынау.
Соңғы тармақ қорытындыны жиі бұзады. Бірінші серияда клиент TCP және TLS қосылымдарын жасайды, ал екіншісінде оларды қайта пайдаланады. Егер тікелей шақыруды бір ұзақ өмір сүретін клиентпен іске қосып, шлюзді әр сұрауға бөлек процеспен шақырсаңыз, тест скриптіңіздің құнын өлшеген боласыз.
Қарапайым бақылау сериясынан бастаңыз. Ол жүктеме тестін алмастырмайды, бірақ тақырыптарға дейінгі уақыт пен толық жауап уақытындағы өрескел айырманы тез көрсетеді.
export DIRECT_URL="$DIRECT_URL"
export GATEWAY_URL="$GATEWAY_URL"
export API_KEY="$API_KEY"
export BODY_FILE="request.json"
curl --http1.1 --silent --show-error --output /dev/null \
--write-out 'route=direct connect=%{time_connect} ttfb=%{time_starttransfer} total=%{time_total} code=%{http_code}\n' \
--header "Authorization: Bearer $API_KEY" \
--header 'Content-Type: application/json' \
--data-binary "@$BODY_FILE" \
"$DIRECT_URL"
curl --http1.1 --silent --show-error --output /dev/null \
--write-out 'route=gateway connect=%{time_connect} ttfb=%{time_starttransfer} total=%{time_total} code=%{http_code}\n' \
--header "Authorization: Bearer $API_KEY" \
--header 'Content-Type: application/json' \
--data-binary "@$BODY_FILE" \
"$GATEWAY_URL"
Нәтиже route=gateway connect=0.012 ttfb=0.441 total=1.836 code=200 түрінде болуы керек. Бұл өлшеу Server-Sent Events үшін TTFT көрсетпейді және ішкі қабаттарды ашпайды, бірақ айқын қатені табуға көмектеседі: upstream ағынды бастап кеткенімен, шлюз клиентке бірінші байтты жібермей тұрып толық жауапты күтіп тұр.
Содан кейін тұрақты қосылым және басқарылатын бәсекелестік бар серияға өтіңіз. Үлестірімнің өзгеретін нүктесін көргенше параллельдік деңгейлерін арттырыңыз. p50 шамамен өзгермей, p95-тің күрт өсуі әдетте баяу модельді емес, кезектің, қосылымдар пулының немесе телеметрияны фондық экспорттаушының қаныққанын білдіреді.
Ең алдымен маршруттау емес, оның алдындағы кезек тежейді
Әр шлюз сүзгісі жылдам жұмыс істесе де, кезек кідіріс құйрығын қатты ұзартады. Бұл көбіне қате түрде «қымбат маршруттау» деп аталады. Модель таңдау шарты миллисекундтың бір бөлігін алуы мүмкін, бірақ барлық worker жауаптарды сериализациялаумен, журнал жазумен немесе баяу upstream-ті күтумен босамай тұрғандықтан, сұрау ондаған не жүздеген миллисекунд күтіп қалады.
Кезекті үш жерден іздеңіз. Біріншісі қолданба кодына дейін орналасады: кіріс қосылымдарының лимиттері, accept backlog, балансировщик және TLS терминалауы. Екіншісі процестің ішінде болады: worker кезегі, файл дескрипторлары пулы, HTTP қосылымдары пулы және бір мезгілдегі ағындар шегі. Үшіншісі тәуелділіктерде пайда болады: үлестірілген лимитке арналған Redis, аудит базасы, трассалар коллекторы және саясат сервисі.
Нашар диагноз: «маршрутизатор 180 мс қосады». Жақсы диагноз: «24 бір мезгілдегі сұраудан кейін ішкі кезектің p99 мәні өседі, өйткені таңдалған провайдерге шығатын қосылымдар пулы шектеулі, ал streaming жауаптары қосылымдарды аяқталғанша ұстап тұрады». Екінші жағдайда нақты түзететін нәрсе бар.
Кезектер заңдылығын өз деректеріңізден тексеріңіз. Кіріс ағыны максималды өткізу қабілетіне жақындаса, өңдеу уақытының шағын ауытқуының өзі құйрықты ұзартады. Worker санын арттыру кейде көмектеседі, бірақ кейде кезекті CPU-ға, желіге немесе downstream жүйесіне ғана жылжытады. Әр жаңа процесс сол Redis-ке тағы да көп сұрау жіберсе, Redis-тегі күтуді процестер санын көбейту арқылы емдей алмайсыз.
Кезектің лимиті және толып кеткендегі түсінікті әрекеті болуы керек. Шексіз кезек пайдаланушылар тым ұзақ күтіп, кейін сұрауларын тоқтата бастағанға дейін сәтті жауаптардың әдемі графигін көрсетеді. Жылдам бас тартатын шектеулі кезек жағымсыз болғанымен, басқарылатын сигнал береді. Клиент пайдаланушыға күйді көрсете алады, тапсырманы фонға ауыстырады немесе кідіріспен қайталап көреді.
Клиенттің тоқтатуы upstream-ке дейін жетуі керек. Пайдаланушы чатты жапса, ал шлюз ұзын ағынды қабылдап, оны аудитке жазуды жалғастырса, қосылымды, токендерді және кезектегі орынды босқа жұмсайсыз. Тоқтатылған сұраулар метрикасы модельге жіберілгенге дейінгі тоқтатуды, генерация кезіндегі тоқтатуды және дайын жауапты клиент оқымай қойғаннан кейінгі тоқтатуды бөлуі керек.
Аутентификация желіге шықпаса, әдетте қымбат емес
API кілтінің қолтаңбасын тексеру немесе кілтті жергілікті кэштен іздеу LLM шақыруының кідірісін әдетте анықтамайды. Әр сұрау үшін қашықтағы интроспекция іске қосылса, блокировкасы бар базаға жүгінсе немесе пайдалану есептегіші синхронды жаңартылса, ол қымбатқа түседі. Сонда модель шақырылардың дәл алдында артық желілік тәуелділік пайда болады.
Бір өңдеушіге жиі біріктірілетін үш міндетті ажыратыңыз: кілт иесін растау, саясатты жүктеу және лимитті есептен шығару. Олардың дерек жаңалығына қойылатын талабы әртүрлі. Кері қайтарылған кілтті тез қабылдауды тоқтату керек. Рұқсат етілген модельдер тізімі сирегірек жаңаруы мүмкін. Лимит есептегіші өнім уәде ететін дәлдікпен келісілген болуы тиіс. Үш операция да әр сұрауда бір синхронды базаны қажет етсе, қажет емес жерде келісімділікті сатып алып отырсыз.
Практикалық схема тексерілетін кілт деректерін және саясаттың өзгермейтін бөліктерін шектеулі өмір сүру мерзімі бар кэште ұстайды. Кері қайтару немесе блоктау инвалидация арнасы арқылы не жазбаның қысқа өмір сүру мерзімімен орындалады. Лимитер әдеттегі трафик үшін жылдам жергілікті жолды қолданады да, ортақ күйге тек ереже талап еткенде жүгінеді. Шектеусіз кэш қоймаңыз: ол кілттің таралып кетуін ұзаққа созылатын мәселеге айналдырады.
Аутентификацияны нәтиже, кілт түрі және бас тарту себебі атрибуттары бар бөлек span арқылы өлшеңіз. Бірақ кілттің өзін де, клиенттерді қажетті контурдан тыс салыстыруға болатын хешті де жазбаңыз. Деректерді өңдеу саясаты рұқсат етсе, телеметрияда тұрақты ішкі жалға алушы идентификаторы жеткілікті.
Теріс жолды да бөлек тексеріңіз. Іс жүзінде қате кілттер, мерзімі өткен токендер немесе әдейі жасалған шабуылдар сәтті трафиктен гөрі базаны көбірек жүктеуі мүмкін, өйткені шлюз жоқ жазбаны әр жолы іздейді. Қысқа өмір сүретін negative cache, дереккөз бойынша жиілік шектеуі және форматты арзан алдын ала тексеру бұл жүктемені азайтады. Бірақ авторизация қателерінің әрқайсысына егжей-тегжейлі түрлі жауап бермеңіз, егер бұл рұқсат етілген кілттерді перебор арқылы табуға мүмкіндік берсе.
Журнал жүргізу өткізу қабілетін жеп қоюы мүмкін
Бір қалыпты сұрауда журналдар әдетте елеулі кідіріс қоспайды. Мәселе бәсекелестік жүктеме кезінде туындайды: шлюз сұрау денелерін сериализациялайды, өрістерді бүркемелейді, жазбаны кезекке қояды және сыртқы агенттің қабылдауын күтеді. Үлкен промпт пен ұзын жауап модель пайдалы жұмыспен айналысып тұрған сәтте мәселені одан әрі қымбаттатады.
Деректерді мақсатына қарай бөліңіз. Аудит кімнің қандай модельді, қандай нәтижемен және қандай ережелер жағдайында шақырғанын көрсетеді. Техникалық журнал қатені тексеруге көмектеседі. Метрикалар жүктеме пішінін көрсетеді. Промпттың толық денесі анық режимі, қолжетімділікті басқаруы және сақтау мерзімі бар шектеулі жөндеу жағдайларына ғана керек. Оны үнемі жазсаңыз, сезімтал деректерді өңдеу тәуекелін және әр сұраудағы артық жұмысты көбейтесіз.
Синхронды аудит операцияны бекітілген жазбасыз қабылданды деп санауға болмайтын кезде орынды. Бұл қымбат шешім, сондықтан оның қымбат екенін мойындау керек. Ереже мұндай реттілікті талап етпесе, оқиғаны жергілікті шектеулі кезекке немесе журналға асинхронды түрде жазыңыз, сұрау өңдеушісінде қашықтағы іздеу жүйесін күтпеңіз.
Әр мән үшін метрика жасамаңыз. Шектеулі мәндер жиыны бар model белгісі әдетте пайдалы. request_id, пайдаланушының толық жолы, upstream-тен келген қате мәтіні немесе шикі сессия идентификаторы жоғары кардиналдылық тудырады. Ең жақсы жағдайда бұл жад шығыны мен сақтау құнын арттырады. Ең нашар жағдайда метрикаларды жинаудың өзі кідіріс себебіне айналады.
PII бүркемелеудің де бағасы бар, бірақ оны өшіру арқылы «оңтайландыруға» болмайды. Дұрыс сұрақ басқа: ол деректердің қай көрінісіне қажет? Ереже аудитке түспей тұрып мазмұнды бүркемелеуді талап етсе, аудитке арналған көшірмеге бүркемелеуді бір рет қолданыңыз. Бірдей тұрақты өрнектер жиынтығын журнал, trace, қате метрикалары және клиент жауабы үшін бөлек іске қоспаңыз. Тексерудің ортақ нәтижесі жұмысты азайтып, арналардың бірінде масканы ұмытып кету қаупін төмендетеді.
Маршруттау екінші LLM шақыруынсыз есептелуі керек
Маршрут таңдау шлюзге бұрыннан белгілі деректерге сүйенсе, аз кідіріс қосады: сұралған модель, қолжетімділік, өңір, жалға алушы рұқсаттары, контекстің күтілетін өлшемі, бюджет класы және пулдардың күйі. Таңдау үшін бөлек модель шақырылса, бірнеше қашықтағы тексеру орындалса немесе провайдерлер бірінен соң бірі қаралса, ол болжанбайтын болады.
«Әр сұрауға қай модель жақсы екенін ақылды модель шешсін» деген ой танымал болғанымен, нашар. Мұндай классификатор критикалық жолдан тыс, мысалы тапсырмаларды офлайн белгілеу және ережелер құру үшін пайдалы болуы мүмкін. Онлайн өңдеуде ол өз TTFT уақытын, құнын, жаңа істен шығу нүктесін және оның шешім сапасын бағалау мәселесін қосады. Күрделі жіктеу қажет болса, қайталанатын контекст үшін оның нәтижесін кэштеп қойыңыз немесе қолданбадан тапсырма класын ашық жіберуді сұраңыз.
Маршрут ережелерін бақыланатын етіңіз. Әр шешім үшін tenant_policy, region_requirement, capacity_fallback немесе requested_model сияқты қысқа себеп сақтаңыз. Әр сұрауда ішкі бағалардың толық жиынын жазудың қажеті жоқ. Қай ереже жеңгенін және бұл fallback болған-болмағанын білу жеткілікті.
Роутер «қалай болғанда да» әр кандидатқа қосылым ашпауы керек. Бір таңдалған маршрут, бір қосылымдар пулы және бір түсінікті timeout budget болсын. Fallback-ты жіктелген қателіктен кейін іске қосыңыз: қолжетімсіздік, артық жүктеме, өңірлік шектеудің бұзылуы немесе провайдердің анық бас тартуы. Пайдаланушы промптындағы қате, дене форматының қате болуы немесе upstream ағыны басталғаннан кейін модельді ауыстырмаңыз. Әйтпесе клиент болжамдылықты күткен жерде басқа модельдің жауабын алады.
Егер тапсырма деректерді сақтау талаптарына байланысты болса, маршрутизатор рұқсат етілген контурдан тыс бірінші байт жіберілмей тұрып мұны тексеруі керек. Алдымен промптты жіберіп, содан кейін таңдалған жолдың жарамсыз екенін анықтауға болмайды. Бұл өнімділік мәселесі емес, бірақ тәртіпті қате құру көбіне кодты жеделдетуге тырысқанда пайда болады.
Streaming кідірісті қабылдауды өзгертеді, бірақ толық жұмысты жоймайды
Егер шлюз upstream-тен бірінші оқиғаны алған бойда жіберсе, streaming жауап адамға интерфейсті жылдамырақ сезіндіреді. Ол бүкіл мәтінді жасау уақытын қысқартпайды және қосылымды ертерек босатпайды. Керісінше, ұзын ағын қысқа streaming емес жауапқа қарағанда қосылымды, күйге арналған жадты және бәсекелестік слотын ұзақ ұстайды.
Төрт уақыт белгісі қажет: шлюздің сұрауды қабылдауы, upstream-ке жіберуі, upstream-тен бірінші байт алуы және клиентке бірінші байт жіберуі. Үшінші мен төртінші белгінің айырмасы шлюз ішіндегі ағын өңдеуінің құнын көрсетеді. Егер ол жауап ұзындығымен бірге өссе, буферлеуді, әр фрагменттің синхронды аудитін, мазмұн сүзгілерін және клиентке жазу кезіндегі блокировкаларды тексеріңіз.
Қалыпты журнал жүргізу үшін ағынды қайтадан толық мәтінге жинамаңыз. Бұл streaming мәнін жойып, жадты үлкейтеді. Аудитке қорытынды хеш, ұзындық, токендер саны немесе нәтиже классификациясы қажет болса, мәндерді инкрементті есептеңіз. Қатаң шектеулі жағдайға толық жауап керек болса, максималды өлшем қойып, шектен асуды анық өңдеңіз.
Клиент модельден баяу болуы мүмкін. Шлюз upstream-ті жылдам оқып, клиентке баяу жазса, буферлер өседі. Ол upstream-ті оқуды тоқтатса, upstream тоқтауы немесе қосылымды жабуы ықтимал. Саясатты алдын ала таңдаңыз: тоқтатумен шектелген буфер, upstream-ке дейінгі backpressure немесе лимит асқанда клиентті ажырату. Әр нұсқаның құн мен аудит толықтығына салдары бар, сондықтан саясатты әдейі баяу клиентпен бөлек тестілеу керек.
Бір trace әр қабаттың құнын көрсетуі керек
Үлестірілген трассировка уақыт туралы сұраққа жауап бергенде ғана пайдалы. Әйтпесе ол әдемі аталған спандар жинағына айналады. W3C Trace Context компоненттер арасында контекст тасымалдау үшін traceparent және tracestate тақырыптарын анықтайды әрі контекстті берген кезде оны дұрыс өңдеуді талап етеді. Спецификацияда бұл тақырыптарға жеке немесе сезімтал деректерді салуға болмайтыны да айтылған.
Бір LLM сұрауы үшін мынадай ағаш жеткілікті:
llm.request
├── gateway.authenticate
├── gateway.policy
├── gateway.rate_limit
├── gateway.route
├── gateway.queue
├── upstream.request
│ ├── upstream.first_byte
│ └── upstream.read_stream
├── gateway.audit_enqueue
└── gateway.client_write
Әр токенге жеке span жасамаңыз. Ұзын жауапта бұл телеметрия тасқынын туғызып, өлшеуді бұрмалайды. Ағын үшін оқиғалар санын, байттарды және бірінші мен соңғы оқиға арасындағы уақытты есептейтін санағыштар жеткілікті. Trace оқиғасын сирек диагностикалық мәліметтерге қалдырыңыз: fallback, тоқтату, лимиттен асу немесе талдау қатесі.
OpenTelemetry context propagation механизмін спандарды әртүрлі компоненттер жасаса да, оларды бір trace-ке байланыстыратын тәсіл ретінде сипаттайды. Осы қағиданы тура қолданыңыз: trace қолданбада басталып, шлюз арқылы өтіп, сыртқы HTTP клиентінде жалғассын. Шлюз себепсіз жаңа trace жасаса, кідірістің нақты қай жерде пайда болғанын дәлелдеу мүмкіндігін жоғалтасыз.
Сэмплинг барлық сұрау үшін бірдей болмауы керек. Сәтті жаппай трафикті ықтималдықпен таңдауға болады, ал қателерді, тоқтатуларды, fallback жағдайларын және баяу сұрауларды жиірек сақтаған дұрыс. Бірақ сыртқы клиенттің сэмплинг жалауын сөзсіз бұйрық ретінде қабылдамаңыз. Сыртқы клиент сізді тым көп дерек жазуға мәжбүрлеуге тырысуы мүмкін. W3C жазу туралы шешім компонентке деген сенімділікті, теріс пайдалануды және өз жүктемесін ескеруі тиіс екенін нақты көрсетеді.
Жүктеме тесті бір уақытта бір қабатты бұзуы керек
«Бәрі қосулы» болатын бір үлкен тест соңғы тексеруге жарайды, бірақ нәтижені түсіндіруге нашар. Алдымен тікелей шақырудың базалық профилін түсіріңіз. Содан кейін қабаттарды бір-бірден қосыңыз: аутентификация, лимитер, аудит, трассировка, маршруттау, бүркемелеу және fallback. Әр қадамнан кейін тек толық кідірісті емес, жеке аралықтарды да салыстырыңыз.
Жұмыс реті мынадай болуы мүмкін:
- Қосылымдарды қыздырып, тұрақты шағын параллельдікпен серия түсіріңіз.
- p95 өзгергенше немесе қателер пайда болғанша бәсекелестікті арттыра отырып, серияны қайталаңыз.
- Бір ішкі қабатты қосып, оның span, CPU, жад және сыртқы шақырулар саны бойынша айырмасын табыңыз.
- Сол тесті ұзын streaming жауабымен және баяу клиентпен өткізіңіз.
- Бір upstream қолжетімсіз болғанда тексеруді қайталап, fallback пен қайталаудың құнын көріңіз.
SDK нұсқасын, журнал форматын, қосылымдар пулы параметрлерін және маршрут ережесін бір уақытта өзгертпеңіз. Мұндай тәжірибеден кейін себептер туралы ғана дауласа аласыз. Бір факторды өзгерту көбірек уақыт алады, бірақ қайталауға болатын жауап береді.
Өткізу қабілетін қабылданған сұраулардың максималды саны емес, берілген SLO жағдайында аяқталған пайдалы операциялар саны ретінде қараңыз. Мың сұрауды қабылдап, оларды шексіз кезекке қойып, бір минуттан кейін жауап берген шлюз өнімдірек болған жоқ. Ол қатені кейінге қалдырды.
Әр тест үшін конфигурацияны, нұсқаларды, корпус өлшемін, бәсекелестік деңгейін, клиент метрикаларын және trace үзіндісін сақтаңыз. Бұл қызықсыз тәртіп көрінуі мүмкін, бірақ онсыз екі аптадан кейін команда түзетудің нәтижесін провайдердегі кездейсоқ жылдамырақ кезеңнен ажырата алмайды.
Критикалық жолда тек міндетті шешімдер қалуы керек
Шлюздің әр қабаты қарапайым сынақтан өтуі тиіс: промпт модельге кеткенге немесе бірінші токен клиентке жеткенге дейін ол аяқталуы керек пе? Аутентификация, қолжетімділікті тексеру, өңірлік шектеулер және міндетті лимиттер әдетте аяқталуы тиіс. Аналитика экспортын, іздеу индексін толықтыруды және егжей-тегжейлі техникалық журналды әдетте бұл жолдан шығаруға болады.
Бұл бақылаусыз «жұқа прокси» керек дегенді білдірмейді. Бизнес жүйесіне аудит, PII бүркемелеу, лимиттер және модельдерді басқарылатын түрде таңдау қажет. Бірақ бұл функцияларды кідіріске қосылатын жалпы үстеме ретінде бағалауға болмайды, өйткені олардың бір бөлігі синхронды болуы тиіс, ал екіншісі пайдаланушы жолынан тыс жұмыс істеуі керек.
AI Router командаға API адресін ауыстыру арқылы OpenAI-мен үйлесімді клиенттік келісімді сақтауға мүмкіндік береді. Бірақ қосқаннан кейін өз саясаттарыңызды, аудитті және маршруттау сценарийлерін бәрібір өлшеңіз, шлюзді көрінбейтін деп қабылдамаңыз. Мұндай өлшеудің пайдалы нәтижесі «шлюз N миллисекунд қосады» деген сөз емес, әр қабаттың құны, оның кезек шекарасы және қайта тексеруге болатын шешім көрсетілген кесте.
Егер trace ішінде кезек уақыты, upstream-ке дейінгі бірінші байт уақыты және клиентке бірінші байтты жеткізу уақыты бөлек көрсетілмесе, сіз әзірге үстеме шығынды өлшеп жатқан жоқсыз. Сіз тек жалпы күтуді өлшеп, себебін табуға үміттеніп отырсыз.
Жиі қойылатын сұрақтар
LLM-шлюз қанша кідіріс қосады?
Оны бүкіл жолдың бір бөлігі ретінде өлшесеңіз, міндетті түрде емес. Шлюз әдетте кілтті тексеруді, маршрут таңдауды, лимиттерді, аудитті және телеметрияны қосады. Маңыздысы, әр қабаттың сіздің SLO көрсеткішіңізге қанша уақыт қосатынын және жүктеме кезінде кезек тудырмайтынын анықтау.
Нені өлшеген маңыздырақ: TTFT ме, әлде толық кідіріс пе?
TTFT streaming режиміндегі жауапта бірінші токенге дейінгі уақытты өлшейді. Толық кідіріс бүкіл жауаптың жасалуын және соңғы байттардың клиентке берілуін қамтиды. Чатта пайдаланушылар көбіне TTFT-ті сезеді. Пакеттік өңдеу мен қысқа JSON жауаптары үшін толық кідіріс маңыздырақ болуы мүмкін.
Тікелей шақыру мен шлюзді бір curl сұрауымен салыстыруға бола ма?
Жоқ. Егер тікелей шақыруға бір промпт, ал шлюз арқылы басқа промпт жіберсеңіз, параметрлер өзгеше болса немесе маршруттар әртүрлі болса, бұл сандар ештеңені дәлелдемейді. Сұрау денесін, модельді, өңірді, қосылымды, параллель клиенттер санын және қайталау ережесін бірдей етіп бекітіңіз.
Rate limiting LLM сұрауларын айтарлықтай баяулата ала ма?
Иә, егер лимитатор қашықтағы сұрау жіберсе, ортақ есептегішке блокировка қойса немесе әр сұрау үшін синхронды журнал жазса. Токендерді жергілікті тексеру әдетте арзан. Мәселе арзан тексеру критикалық жолдағы желілік транзакцияға айналғанда басталады.
LLM-шлюзде қандай деректерді журналға жазу керек?
Промпттың толық денесі, модель жауабы, пайдаланушы идентификаторы, маршрут, кезекте күту уақыты, токендер саны, жауап коды және бас тарту себебі пайдалы болуы мүмкін. Бірақ сұрау денесін техникалық журналдарға ойланбастан жібермеңіз, әсіресе онда жеке немесе коммерциялық құпия деректер болса. Аудитті, жөндеу жазбаларын және метрикаларды бөліңіз.
Провайдер жылдам жауап берсе де, шлюз неге баяу?
Көбіне бұған журналдарды синхронды жазу, метрикалардағы бірегей белгілердің тым көп болуы, қашықтағы сақтау орнын күту немесе әр сұрау үшін шектеусіз trace жасау себеп болады. Бұл кезде модель тұрақты жауап беруі мүмкін, бірақ шлюз өз тәуелді сервистерін күтіп тұрады. Мұны тек жеке спандар мен кезек метрикалары арқылы көруге болады.
Жүктеме тестінде streaming режимін қосу керек пе?
Пайдаланушы чаты үшін алдымен streaming режимін сынап, бірінші оқиғаға дейінгі уақытты өлшеңіз. Өрістерді шығару, жіктеу және фондық тапсырмалар үшін кәдімгі жауапты сынаңыз, өйткені клиентке аяқталған нәтиже керек. Бір режимнің нәтижесін екіншісіне көшірмеңіз.
LLM сұрауларын үлкен кідіріссіз маршруттауға бола ма?
Иә, таңдау алдын ала белгілі белгілерге ғана тәуелді болса: рұқсат етілген модельдерге, өңірге, тапсырма класына, бюджетке және қолжетімділікке. Егер маршрутизатор модель таңдау үшін әр жолы бөлек модель шақырса, ол болжанбайтын кідіріс пен жаңа істен шығу көзін қосады. Күрделі шешімдерді критикалық жолдан шығарған дұрыс.
LLM-шлюзді бағалау үшін қандай перцентильдер керек?
Әдетте p95 және p99 қажет. Орташа мән сирек кездесетін кезектерді, жад жинағышының кідірістерін, қайталап көруді және аудитті баяу жазуды жасырады, ал пайдаланушы тәжірибесін көбіне дәл осы жағдайлар бұзады. Қателер, тоқтатылған сұраулар, TTFT және кезек тереңдігін де қосыңыз.
LLM-шлюздегі ең қымбат қабатты қалай табуға болады?
Өндірістік ортаға ұқсас бір сценарийден бастаңыз, содан кейін қабаттарды бір-бірден өшіріңіз: trace экспортын, синхронды аудитті, қашықтағы лимитаторды, күрделі маршруттауды. Әр өзгерістен кейін тек орташа мәнді емес, кідіріс үлестірімін және процесс жүктемесін қараңыз. Осылайша жалпы әдемі, бірақ пайдасыз санды емес, нақты функцияның құнын табасыз.