LLM-нің құрылымдалған шығысы: неге ол өндірісте бұзылады
LLM-нің құрылымдалған шығысы өндірісте жиі бұзылған JSON, схема ауытқуы және құрал шақыруындағы ақаулар салдарынан істен шығады. Тексерулер мен retry тәсілдерін талдаймыз.

Өндірісте нақты не бұзылады
Тест ортасында бәрі көбіне әжептәуір көрінеді. Команда он шақты түсінікті мысалды өткізіп, парсер жауапты оқиды да, модель релизге дайын сияқты сезіледі. Бірақ шынайы енгізу келгенде, модель, схема және код арасындағы келісім сыр бере бастайды.
Ең жиі бұзылу күлкілі көрінеді: модель JSON-ның алдында бір сөйлем жазады. Адам үшін бұл ұсақ нәрсе, ал парсер үшін — қате. Таза объектінің орнына қысқа түсіндірме келеді, оның артынан ашылатын жақша, сөйтіп бүкіл пайплайн алғашқы символда-ақ тоқтайды.
Одан кейін баяуырақ, бірақ жағымсыз ақаулар басталады. Кеше жол болған өріс бүгін сан болып келеді. order_id "00125" мәнінен 125-ке айналып, жүйе басындағы нөлдерді жоғалтады. Егер модель токен лимитіне тірелсе, провайдер генерацияны үзіп тастаса немесе қолданба оқуды тым ерте жапса, массив жауаптың ортасында үзілуі мүмкін.
Мәселе мынада: мұндай қателер ұзақ уақыт көрінбей жүре береді. Жауап әдеттегі тесттерден өтеді де, сирек кездесетін енгізуде құлайды: пайдаланушы хаттан кесте жапсырды, қазақша мен орысшаны араластырды, бос өріс жіберді немесе тым ұзын пікір қосты. Бір ғана қалыптан тыс сұрау команда аса көп тексермеген тармақты бұзады.
Кішкентай мысал: сервис өтінім деректерін шығарады да, customer_name, amount және currency өрістері бар JSON күтеді. Қарапайым мысалдарда модель дәл жауап береді. Ал нақты өтінімде ол алдымен қысқа түсіндірме жазады, amount-ты бос орындары бар жол ретінде береді, ал currency-ді мәтінде анық таппағандықтан өткізіп жібереді. Жауапта мағына бар, бірақ код оны енді қауіпсіз пайдалана алмайды.
Егер команда сұрауларды бір API арқылы әртүрлі модельдерге бағыттаса, айырмашылық одан сайын байқалады. Бір модель форматты қатты ұстайды, екіншісі комментарий қосуды жақсы көреді, үшіншісі типтерді көбірек шатастырады. Сондықтан құрылымдалған шығу бір ғана жерде бұзылмайды. Әдетте мәселе бірден үш деңгейде көрінеді: JSON синтаксисі, схема сәйкестігі және бизнес үшін өрістердің мағынасы.
Жауап тізбегі қай жерде үзіледі
Құрылымдалған жауап сирек бір ғана жерде бұзылады. Әдетте тізбек түгел үзіледі: промпт, модель, парсер, тасымалдау қабаты және нәтижені оқитын сервис. Тестте бұл байқалмайды, өйткені сұраулар қысқа, жауаптар жинақы, ал тізбектегі бәрі бір формат күтеді.
Бірінші жарықшақ көбіне нұсқау мен схема арасында пайда болады. Промпт модельден "қысқа түсіндірме мен себептер тізімін" сұрайды, ал JSON Schema тек артық мәтінсіз жолдар массиві түріндегі reason_codes өрісін күтеді. Модель промптты орындауға тырысады да, парсер массив күтетін жерде түсіндірме жазады. Жауап дерлік дұрыс. Продакшен үшін осының өзі бәрін бұзу үшін жеткілікті.
Кейін постөңдеу қосылады. Команда модельден JSON-ды markdown-блокта қайтаруды сұрайды, ал парсер ```json бөлігін қиып алып, жол ауысуларын тазартады. Дәл осы жерде экранирлеу оңай бұзылады: кері слеш жоғалады, тырнақша ерте жабылады, жол ауысуы бар жол жарамсыз JSON-ға айналады. Логта бұл "модель қоқыс қайтарды" сияқты көрінеді, ал шын қателікті кейін сіздің кодыңыз енгізген болуы мүмкін.
Тағы бір жиі ақауды тасымалдаудың өзі жасайды. Егер сервер немесе прокси жауапты таймаутпен кесіп тастаса, сіз объектінің жартысын аласыз: ашық фигуралық жақша, жабылмаған массив, аяқталмаған өріс. Бұл әсіресе ұзын жауаптарда және бірнеше провайдер арқылы маршруттау кезінде анық байқалады. Егер сіз ортақ OpenAI-үйлесімді шлюз, мысалы AI Router арқылы жұмыс істесеңіз, тек қолданбаға емес, таймауттарға, жауап көлеміне және әр сұраудың логына да қарау керек.
Соңғы үзілу жауап сәтті парсталғаннан кейін болады. Бір сервис customer_type жібере бастайды, ал келесісі әлі де ескі segment өрісін күтеді. JSON жарамды, жергілікті схема өтеді, бірақ бизнес-логика әрі қарай құлайды немесе үнсіз әдепкі мәнді алады. Бұлар — ең жағымсыз қателер. Олар бірден шуламайды да, деректерді жайлап бүлдіреді.
Сондықтан тізбекті қабат-қабат тексерген дұрыс: промпт нақты нені сұрады, модель шынымен не қайтарды, парсер нені өзгертті, сервер жауапты қысқартпады ма және келесі сервис өрістердің дәл қай нұсқасын күтеді. Егер тек соңғы парсинг қатесіне қарасаңыз, көбіне дұрыс емес жерді жөндейсіз.
JSON қателері жиі қандай болады
Продакшнда JSON әдетте сирек багтардан емес, ұсақ-түйектен бұзылады. Адам жауапты оқып, бәрі дұрыс деп ойлайды. Парсер олай ойламайды.
Ең қарапайым қате — объект соңындағы артық үтір. Модель {\"status\":\"ok\",} деп жазады, өйткені код үлгілерінде соған ұқсас мысалдарды жиі көреді. Стандартты JSON үшін мұндай жауап жарамсыз.
Жалғыз тырнақшалар да жақсы емес. Модель оңай {'status':'ok'} деп жібереді, ал JSON үшін {\"status\":\"ok\"} керек. Python сөздігіне бұл ұқсап тұрады, JSON-ға — жоқ. Егер команда жауапты көзбен қарап тексерсе, мұндай айырмашылық жиі байқалмай қалады.
Тағы бір бұзылу жолдармен байланысты. Модель мәннің ішіне нақты жол ауысуын енгізеді, мысалы пікірге немесе мекенжайға. Көзбен қарағанда мәтін оқылады. Парсер болса бұзылған жолды көріп, тоқтайды. Егер жол ауысуы керек болса, модель \\n қайтаруы тиіс, жолды мәннің ішінде тікелей бөле салмауы керек.
Жауапты markdown-ға орап, ```json қосатын жағдай да бөлек ашуландырады. Чат үшін бұл ыңғайлы. API үшін — қоқыс. Парсер таза объект күтеді, ал форматтауды пайдалы деректермен бірге алып алады.
Кейде модель бұдан да әрі кетіп, қатарынан екі объект жазады. Мысалы, әуелі қара нұсқа, сосын түзетілген нұсқа: {\"amount\":1000}{\"amount\":1200}. Немесе жұмсақтау түрі: объект және артынан қысқа мәтіндік түсіндірме. Жүйе үшін бұл бір мәселе — жауап енді бір ғана жарамды JSON құжаты емес.
Практикада мұндай қателер кәдімгі тапсырмаларда шығады: өтінімді жіктеу, құрал шақыруы, форма өрістерін толтыру. Егер жауап "кейде" құласа, алдымен модельдің бастапқы шығысын қарап шығу керек, схемаға немесе клиент кодыңызға бірден кінә артудың қажеті жоқ.
Схема неге жауаппен сәйкес келмей қалады
Схема сирек бірден әрі қатты бұзылады. Көбіне ол біртіндеп сырғып, жүйенің бір бөлігі жаңа ережемен өмір сүріп жатқанда, екіншісі әлі ескі жауапты күтеді. Сол кезде схема бойынша жауаптар өндірісте бытырай бастайды.
Жиі кездесетін жағдай: бір өрісті әдетте модель "көбіне" жібереді деп, оны бастапқыда міндетті емес деп санайды. Бірнеше спринттан кейін сол өріс бизнес-логикада қолданыла бастайды да, іс жүзінде міндеттіге айналады. Бірақ схемаға оны бекітпейді, тесттер үнсіз қалады, ал кейін жауаптардың бір бөлігі онсыз келіп, тізбек ең ыңғайсыз жерде құлайды.
Enum-де де солай болады. Бүгін статус approved, rejected немесе review. Ертең промптта не постөңдеуде needs_info пайда болады, бірақ схема нұсқасы өзгермейді. Адам үшін бұл түк емес. Парсер үшін — ол түсінбейтін жаңа нұсқа.
Күндермен жұмыс одан да жалықтырғыш, бірақ қауіпті. Бір релиз 2025-04-27 береді, келесісі — 27.04.2025, үшіншісі уақытты да қосады. Егер команда бір форматты бекітпесе, сәйкессіздік тек нақты деректерде байқалады: сұрыптау, сүзгі немесе CRM-ге импорт біртүрлі нәтиже бергенде.
Тағы бір жиі ақау — кірістірілген объект жауаптардың бір бөлігінде жоғалады. Мысалы, бұрын модель customer.contact.email қайтаратын, ал кейін кей жазбаларда тек customer.name береді. Егер код толық объектіні null не өрістің жоқтығын тексермей күтсе, қате генерация сәтінде емес, әлдеқайда кейін шығады.
Дрейфтің тағы бір себебі — код пен схема әртүрлі репозиторийде өмір сүреді. Бір команда DTO-ны жаңартты, екіншісі JSON Schema-ны тартпады, үшіншісі промптты өзгертті. Ресми түрде бәрі шамалы ғана өзгеріс жасады, ал нәтижесінде сәйкессіздік пайда болды.
Бірнеше модель мен провайдер бар жүйелерде бұл тіпті анық көрінеді. Егер команда бір контрактіні ортақ OpenAI-үйлесімді endpoint арқылы жүргізсе, айырмашылықтар тез ашылады. AI Router сияқты жерде бір SDK, код және промпттарды сақтай отырып, тек base_url-ды api.airouter.kz-ге ауыстырып, сол бір тесттерді әртүрлі модельдерден өткізуге болады. Салыстыруға ыңғайлы, бірақ мұндай сынақтар схема қай жерде шамадан тыс оптимистік жазылғанын тез көрсетеді.
Жақсы схема модель "көбіне" не қайтаратынын шамаламайды. Ол міндетті өрістерді, күн форматын, рұқсат етілген мәндерді және бос кірістірілген объектілерге қатысты мінез-құлықты нақты бекітеді.
Құрал шақыруы қай жерде сыр береді
Құрал шақыруларында модель қарапайым нәрседен жиі қателеседі. Егер атаулар ұқсас немесе сипаттамалар қабаттасса, ол дұрыс құралды таңдамай қалады. Бір құрал клиентті іздеп, екіншісі оның лимитін тексерсе, модель оларды оңай шатастырады, әсіресе сұрау қысқа әрі контекстсіз болса.
Көбіне толық емес arguments келеді. Модель customer_id жібереді де, region немесе document_type-ты ұмытып кетеді. Тестте мұны байқау оңай емес: мысалдар көбіне таза, ал продакшендегі пайдаланушылар қысқалау жазады, қате жібереді, кей нәрсені түсіріп кетеді.
Тағы бір ақау — құрал объект күтеді, ал модель жол береді. Адам үшін \"customer_id=123\" дерлік дұрыс сияқты. Ал сервис үшін бұл мүлде басқа тип, сондықтан өңдеуші бизнес-логикаға жетпей құлайды.
Кейде модель екі ортада қалуға тырысып, бір жауаптың ішінде кәдімгі мәтінді де, құрал шақыруын да береді. Оркестратор бір әрекетті күтеді, ал екеуін алады. Соның нәтижесінде бір жүйе мәтінді пайдаланушыға көрсетеді, біреуі құралды іске қосады, үшіншісі екеуін де жасайды.
Тіпті ортақ OpenAI-үйлесімді API болғанның өзінде бұл жоғалып кетпейді. Егер команда модельдерді не провайдерлерді бір шлюз арқылы ауыстырса, tool call форматы сол бір контрактінің өзінде сәл басқаша жүре алады. Ұсақ айырмашылық тізбектегі ақауға тез айналады.
Әдетте қарапайым шектеулер көмектеседі. Құрал атаулары тек жазылуы жағынан емес, мағынасы жағынан да өзгеше болуы керек. Типтер мен міндетті өрістерді шақыруға дейін тексеріңіз. Жауап режимін біреу ғана етіңіз: не мәтін, не tool call. Қате болғанда модельге жалпы invalid arguments емес, нақты себеп қайтарған дұрыс. Тағы бір пайдалы қадам: бірдей параметрлермен сол құралды қайта шақыруға тыйым салыңыз. Егер құрал қате қайтарса, модель көбіне дәл сол шақыруды өзгеріссіз қайталайды, ал жүйе токенді пайдасыз циклге жұмсайды.
Жауапты қадамдап қалай тексеру керек
Құрылымдалған шығу сирек бір жерде ғана бұзылады. Әдетте қате ертерек пайда болады, бірақ оны кейінірек байқайды — қолданба жауапты парсинг жасап, түзеп, бірден пайдалануға тырысқанда. Сондықтан тексеру тәртібін қатаң әрі барлық сұрау үшін бірдей қылған дұрыс.
Тәсіл қарапайым:
- Шикі payload пен сұрау метадеректерін сақтаңыз.
- Автотүзетусіз қатаң парсинг жасап көріңіз.
- Парсинг өтпесе, тек нақты ережелер бойынша ғана түзетіңіз.
- JSON оқылса, бөлек схема мен типтерді тексеріңіз.
- Содан кейін ғана бизнес-тексерулерді іске қосыңыз.
Шикі жауапты кез келген тазалауға дейін сақтау керек. Бос орындарды қысқартпаңыз, markdown-ды өшірмеңіз, тырнақшаларды қайта жазбаңыз. Егер тек "түзетілген" нұсқаны қалдырсаңыз, ақау көзін жоғалтып аласыз да, модель нақты не қайтарғанын түсінбейсіз.
Қатаң парсинг қатаңдық үшін емес. Ол JSON қателерінің шынайы жиілігін көрсетеді: артық үтір, объектінің алдындағы мәтін, объект орнына массив, санның орнына жол. Егер бірден ақылды repair қоссаңыз, бұзылуды жасырып, симптомды ғана емдейсіз.
Автотүзету де тар болуы керек. Сыртқы үштік тырнақшаларды алып тастауға немесе code block ішінен JSON шығаруға болады. Бірақ модель "мүмкін былай деген болар" деп өрістерді болжаудың қажеті жоқ. Repair неғұрлым еркін болса, продакшнда үнсіз қателер соғұрлым көп болады.
Схема мен типтерді тексеруді бөлек ұстаған дұрыс. Схема мына сұраққа жауап береді: мұндай өрістерге жалпы рұқсат етіле ме? Тип тексеруі басқа сұраққа жауап береді: price — сан ба, әлде \"1000\" деген жол ма? Мұндай бөлу логтарды да, қайта әрекет етуді де айтарлықтай жеңілдетеді.
Бизнес-тексерулер ең соңында жүреді. Схема теріс сома, өткендегі дата немесе бос тауарлар тізімі бар тапсырысты өткізіп жіберуі мүмкін. JSON үшін бұл жарамды объект. Өнім үшін — жоқ.
Қателіктен бас тартудың себебін жай ғана емес, нақты жазыңыз: parse_error, schema_error, type_error, business_rule_error. Қасына шикі payload-ты сақтаңыз. Сонда командаға не түзету керек екені анық көрінеді: промпт па, схема ма, retry логикасы ма, әлде өңдеу коды ма.
Қайта әрекет етуді қалай баптаған дұрыс
Барлық сәтсіздікке бірдей retry беру қателікті циклге айналдырады. Егер жауап бір тырнақшаның жоқтығынан бұзылса, модельге бүкіл тапсырманы қайта шешудің керегі жоқ. Егер JSON парстан өтеді, бірақ схема өтпесе, оған нақты өрісті түзету керек, бүкіл объектіні қайта жазу емес.
Синтаксистік қате үшін қысқа команда жақсырақ жұмыс істейді: "Тек JSON-ды түзет. Өрістерді өзгертпе, объект сыртында мәтін қоспа". Схема қатесі үшін сұрау нақты болуы керек: "amount өрісі сан болуға тиіс, қазір 12 000 деген жол келді". Құрал қатесі үшін құралдың өзінен қысылған хабарды қайтарған пайдалы — сонда модель қандай параметр жетіспейтінін көреді. Ал таймаут, 429 не қысқа желілік үзіліс сияқты уақытша ақауларды модель емес, оркестратор өңдеуі керек.
Шектерді алдын ала қойған дұрыс. Әдетте формат үшін 2–3 әрекет және құрал сәтсіздігінен кейін тағы бір қосымша әрекет жеткілікті. Уақыт шегін де ұмытпаңыз. Егер тізбек 5–10 секундтан ұзақ созылса, пайдаланушы кешігуді онсыз да көріп тұр, ал жауап сапасы оны ақтайтындай көп өспейді.
Кез келген сыртқы әрекеттің алдында idempotency key қойыңыз. Әйтпесе таймауттан кейінгі қайталау екі төлем, екі тапсырыс немесе CRM-де екі жазба жасап жіберуі мүмкін. Бұл жиі кездесетін қате: команда JSON-ды жөндейді, бірақ құралдың өзі бір рет орындалып үлгеруі мүмкін екенін ұмытады.
Жақсы ереже қарапайым: алдымен форматты түзетіңіз, кейін схеманы, тек содан соң құралды қайта шақырыңыз.
Қарапайым сценарийдегі мысал
Банктің чат-боты несиеге өтінім қабылдайды делік. Модель 4 өріс қайтаруы тиіс: аты, ЖСН, сома және өтінім күні. Көзге бәрі жақсы көрінеді, өйткені жауап JSON түрінде келеді.
{
"name": "Алия Садыкова",
"iin": "",
"amount": "500000 тенге, желательно на 12 месяцев",
"date": "2026-04-27"
}
Мәселе мынада: мұндай жауап тек жарамды сияқты көрінеді. JSON формалды түрде дұрыс, бірақ схема әлдеқашан бұзылған. amount өрісі түсіндірмесі бар жол емес, сан болуы керек. iin бос тұр, ал CRM 12 саннан тұратын жол күтеді. Егер жүйе тек JSON синтаксисін тексерсе, қате тізбектің ары жағына кетіп, CRM шақырылғанда ғана шығады.
Әдетте бұл жай былай аяқталады: бот өтінім құруға тырысады, CRM сұрауды кері қайтарады, ал пайдаланушы біртүрлі жауап алады немесе мүлде үнсіздік көреді. Бұдан да жаманы — жүйе жиналған деректерді жоғалтып, сұрақ-жауапты қайта бастайды. Банк клиенті үшін бұл өте тез тітіркендіреді.
Мұндай сценарийде тексеру реті мынадай болуы керек: алдымен JSON-ды парсинг жасаймыз, сосын типтерді схема бойынша салыстырамыз, одан кейін бизнес ережелерін тексереміз — ЖСН 12 саннан тұруы керек, сома сан болуы және рұқсат етілген диапазонда болуы тиіс, күн бір форматта болуы керек. Тек содан кейін ғана CRM шақырылады.
Егер тексеру өтпесе, жүйеге бүкіл диалогты қайталаудың қажеті жоқ. Ол дұрыс өрістерді сақтап қалып, тек бұзылғанын ғана сұрауы керек. Мысалы: "ЖСН-ді 12 санмен енгізіңіз". Аты мен күні дайын, оларды қайта сұраудың қажеті жоқ.
Бұл қарапайым, бірақ өте көрсеткішті жағдай. Мәселе сирек бір үлкен ақауда болады. Көбіне бұл ұсақ жарықшақтар: жарамды JSON, дұрыс емес тип, бос міндетті өріс, кейін құралды не CRM-ді шақырғанда құлау. Егер сыртқы жүйеге дейін валидация қойып, тек бұзылған өріс бойынша ғана тар retry жасасаңыз, тізбек әлдеқайда тыныш болады.
Команда қандай қателерді қайта-қайта жібереді
Көп ақау модельден емес, команданың әдетінен басталады. Ең жиі қате өте қарапайым: жауап жарамды JSON-ға ұқсаса, оны жұмысқа жарамды деп есептейді. Бірақ синтаксис дұрыс болып, мағынасы дұрыс болмауы мүмкін. status өрісі бар, бірақ мәні тізімде жоқ. Массив келді, бірақ оның ішіндегі объектілер басқа. tool_name толтырылған, ал аргументтер бос.
Екінші типтік мәселе — бір ғана промптты барлық модельге және барлық тапсырмаға жібереді. Қағазда бұл ыңғайлы. Продакшнда формат сонда бұзылады, өйткені модельдер шектеулерді, күн форматтарын, бос өрістерді және құрал шақыруын әртүрлі түсінеді. Бір модельде жақсы жұмыс істейтін промпт екіншісінде түсіндірме қосады, өріс атауларын өзгертеді немесе міндетті мәндерді өткізіп жібереді.
Тағы бір әлсіз жер — логтар. Команда тек парсингтен кейінгі нәтижені сақтап, raw output-ты, tool_call.arguments пен retry-ден кейінгі жауапты сақтамайды. Кейін инцидентті шынайы талдау мүмкін болмай қалады. Тек CRM өтінімді кері қайтарғаны ғана көрінеді, ал модель не қайтарды, парсер нені өзгертті, бәрі қай қадамда бұрылды — белгісіз қалады.
Жиі кездесетін тағы бір нәрсе — тым агрессивті автотүзету. Парсер тырнақшаларды түзетеді, жақшаларды толықтырады, типтерді ауыстырады және жетіспеген өрістерді болжайды. Сол сәтте бұл логтағы қателерді азайтқандай көрінеді, бірақ шын мәнінде оларды жасырып қояды. Бір аптадан кейін команда нағыз мәселе қай жерде екенін — модельде ме, схема ма, әлде өздерінің repair-қабатында ма — түсінбей қалады.
Релиз алдындағы қысқа чек-лист
Жүйені бұрын қате болған нақты мысалдармен тексеріп шығыңыз. Формат жиі ұсақ нәрседен бұзылады: модель ```json қосады, өрісті ұмытады, типті өзгертеді немесе объектінің алдында түсіндірме жазады.
- Әр ақау үшін raw log сақтаңыз: промпт, модельдің шикі жауабы, құрал payload-ы, сұрау id-і, таңдалған модель және қате коды.
- Жауапқа
schema_versionсияқты схема нұсқасын қосыңыз, сонда релизден кейін ескі жауаптарды жаңасымен шатастырмайсыз. - Retry budget-ті нақты қойыңыз: қанша қайталау болады, қандай қателерде және келесі әрекетте модель не промпт өзгере ме.
- Метрикаларды бөлек есептеңіз: parse rate, schema rate және tool success rate. Бір ортақ сәттілік пайызы ақаудың көзін көбіне жасырып қалады.
Егер сізде бірнеше модель немесе провайдер болса, осы метрикаларды әрқайсысы бойынша бөлек қарап отырыңыз. Бір маршрут таза JSON-ды тұрақты бере алады, ал екіншісі дәл сол кодпен құрал шақыруын жиі бұзады.
Дайындықтың жақсы белгісі қарапайым: кез келген ақауды логтан тез табуға, локалды қайта жасауға және оны түсінікті қате класына жатқызуға болады. Егер бұған жарты сағаттық қолмен талдау кетсе, релизді кідірте тұрған жөн.
Әрі қарай не істеу керек
Ақшаға, мерзімге немесе қол еңбегіне тікелей әсер ететін бір сценарийден бастаңыз. Жақсы мысал — өтінімнен өрістерді шығарып, адам араласуынсыз құрал шақыратын жағдай. Егер сонда жиырмадан бір жауап бұзылса, команда талдау мен түзетуге-ақ уақыт жоғалта береді.
Алдымен базалық көріністі өлшеңіз. Сансыз модель сапасы туралы дау тез арада әсерлер туралы дауға айналады. Үш метрика жеткілікті: қанша жауап жалпы JSON ретінде парсингтен өтеді, қаншасы схема тексерісінен өтеді және қанша құрал шақыруы қолмен түзетусіз орындалады.
Сосын бірдей контрактіні бірнеше модельде өткізіңіз. Сынақтардың арасында промптты, схеманы және post-processing-ті өзгертпеңіз, әйтпесе салыстыру мәнін жоғалтады. Көбіне бір модель сәл әдемірек жазады, ал екіншісі enum, күндер немесе міндетті массивтерді әлдеқайда сирек бұзады.
Егер провайдерлерді салыстырсаңыз, бір OpenAI-үйлесімді endpoint ұстау және тек base_url-ды ауыстыру ыңғайлы. Мұндай схемаға AI Router бейтарап қабат бола алады: команда сол SDK, код және промпттарды қолданады, ал модельдер арасындағы маршруттарды интеграцияны қайта жазбай-ақ өзгертеді. Жылдам салыстыру үшін бұл артық жұмысты қатты азайтады.
Тестілеуден кейін ережелерді презентацияда емес, кодта бекітіңіз. Автоматты валидация, қайта әрекет санының лимиті, бас тартудың түсінікті себептері және инциденттерді талдау үшін шикі жауапты логтау қосыңыз. Бөлек жұмыс нұсқаулығын жазыңыз: нені схема қатесі деп санау керек, қашан retry жасау керек, ал қашан сұрауды қолмен кезекке жіберу керек.
Егер командада пилот бар болса, оны бірден он сценарийге кеңейтпеңіз. Бір ағынды кемінде бір апта бойы parse rate пен сәтті шақырулар түсінікті деңгейде ұстайтын тұрақты күйге жеткізіңіз. Содан кейін масштабтау әлдеқайда тыныш әрі арзан болады.
Жиі қойылатын сұрақтар
Құрылымдалған шығыста бірінші не бұзылады?
Көбіне бәрі бір ғана ұсақ нәрседен басталады: модель объектінің алдында бір сөйлем қосады, жауабын ```json ішіне орайды немесе артық үтір қояды. Адам оны оңай оқи береді, ал қатаң парсер бірден тоқтайды.
Алдымен модельдің бастапқы жауабын қараңыз. Егер ол бастапқыдан-ақ былғаныш болса, CRM-нен немесе дерекқордан себеп іздеудің қажеті жоқ.
Неге жарамды JSON бәрібір продакшенге жарамайды?
Тіпті жарамды JSON да пайдасыз болуы мүмкін. amount өрісі санның орнына жол болып келеді, order_id басындағы нөлдерін жоғалтады, міндетті өріс бос қалады немесе статус рұқсат етілген мәндер тізіміне кірмейді.
Тек синтаксисті емес, типтерді, міндетті өрістерді және өнім үшін мағынаны да тексеріңіз.
Модельден JSON-ды markdown-блокта қайтаруды сұраған дұрыс па?
Жоқ, JSON-ды markdown-блокта сұрамаған дұрыс. Чат үшін ыңғайлы болғанымен, API үшін бұл кейін қиып тастауға тура келетін артық қоқыс, әрі тазалау кезінде оңай бұзылады.
Жауаптың алдында да, соңында да түсіндірмесіз бір ғана таза JSON объектісін сұраңыз.
Модель жауабын қандай тәртіппен тексерген дұрыс?
Алдымен сырым payload-ты ешбір тазалаусыз сақтаңыз. Содан кейін қатаң парсинг жасаңыз, бөлек схема мен типтерді тексеріңіз, тек соның соңында ғана бизнес-тексерулер мен сыртқы шақыруларды орындаңыз.
Сонда тізбектің дәл қай жерде үзілгенін тез көресіз: JSON-да ма, контрактта ма, әлде өнім ережелерінде ме.
Қашан retry керек, ал қашан ол керісінше кедергі болады?
Қайта жіберу әрқашан пайдалы емес. Егер тек JSON бұзылса, форматты түзетіп, өрістерді өзгертпеуді сұраңыз. Егер схема сәйкес келмесе, нақты өрісті және керек типті көрсетіңіз. Егер желі таймаут не 429 қайтарса, оны модель емес, оркестратор шешуі керек.
Бірдей ортақ retry-ді барлық қате үшін қолдану көбіне уақыт пен токенді босқа жұмсайды.
Әдепкі бойынша қанша қайталау әрекетін қою керек?
Әдетте формат үшін 2–3 рет, ал құрал істен шыққаннан кейін тағы бір қосымша әрекет жеткілікті. Тізбекті ұзақ созудың мәні сирек болады: кідіріс өседі, ал жауап айтарлықтай жақсармайды.
Пайдаланушы шексіз күтпеуі үшін бірден жалпы уақыт лимитін қойыңыз.
Құрал шақыруларындағы қателерді қалай азайтуға болады?
Құрал шақырулары шашырамасын десеңіз, атаулары мағынасы жағынан бір-бірінен айқын өзгеше болсын және arguments іске қосылардың алдында тексерілсін. Егер құрал объект күтсе, соған ұқсас бір жолдық жолды қабылдамаңыз.
Қарапайым жауап режимі де көмектеседі: не мәтін, не tool call. Сонда оркестратор екіұшты жауаппен не істеу керегін болжай бермейді.
Бұзылуларды талдау үшін міндетті түрде нені логқа жазу керек?
Модельдің бастапқы жауабын, промптты, tool_call.arguments мәнін, таңдалған модельді, сұрау id-ін және parse_error не schema_error сияқты нақты бас тарту себебін сақтаңыз. Бұларсыз инцидентті кейін бөліктерге бөліп қолмен талдауға тура келеді.
Егер сізде тек кейіннен "түзетілген" JSON ғана қалса, қате көзі әлдеқашан жоғалған.
Неге бір контракт бір модельде өтеді де, екіншісінде құлайды?
Бірдей схема әртүрлі модельде әрқалай жұмыс істейді. Бірі форматты қатаң ұстайды, екіншісі түсініктеме қосуды ұнатады, үшіншісі типтерді жиі шатастырады немесе бос өрістерді өткізіп жібереді.
Бір контрактіні промпт пен post-processing-ті өзгертпей бірнеше модель арқылы өткізіңіз. Сонда мәселе модельде ме, әлде сіздің схемаңызда ма, тез көрінеді.
Егер тез ретке келтіргіміз келсе, неден бастау керек?
Кірістіру үшін ең жақсы бастама — ақшаға, уақытқа немесе қол еңбегіне әсер ететін бір сценарий. Мысалы, CRM-ге жіберер алдында өтінім өрістерін шығару. Сол жерде әр жиырмадан бір жауап бұзылса, команда талдау мен түзетуге-ақ уақыт жоғалтады.
Үш нәрсені өлшеңіз: JSON ретінде қанша жауап оқылады, қаншасы схемадан өтеді және қанша сыртқы шақыру қолмен түзетусіз аяқталады.
Бұл ағын бірнеше күн қатарынан тұрақты тұрса, тәсілді басқа сценарийлерге кеңейтіңіз.