Бір кеште төрт баг
Таңертең ботқа екі жаңа құрал қостым - өтінім жинау және CV жіберу. Бәрі жұмыс істеді. Түске қарай шын мәнінде тексере бастадым және бір-біріне матрёшка сияқты кірігіп кеткен төрт багқа тап болдым.

Баг 1: жоғалған сессиялар
Келуші CV сұрайды. Бот email сұрайды. Келуші мекенжайды жазады. Бот оны бірінші рет көргендей жауап береді.
Себебі - uvicorn-ның екі воркері. Әрқайсысы сессияларды өз жадында сақтайды. Бірінші сұрау 1-воркерге түседі, екіншісі 2-воркерге. 2-воркер сессия туралы ештеңе білмейді, жаңасын ашады.
CPU-bound жүктемелер үшін бірнеше воркердің мәні бар. Чатбот - таза I/O: Claude API жауабын күтеді, SMTP күтеді. Бір async-воркер жиырма бір мезгілдегі қосылымды еш қиындықсыз көтереді. Менің жағдайда екі воркер өнімділікті емес, баг санын екі еселеді.
Түзету - Dockerfile-дағы бір сан. --workers 2 орнына --workers 1 болды.
Баг 2: email тілді ауыстырады
Келуші қазақша жазады. Бот қазақша жауап береді. Келуші ilikosha@icloud.com деп тереді. Бот ағылшынша жауап бере бастайды.
Тіл детекторы хабарламадағы латын және кирилл таңбаларын санайды. Email-мекенжай - таза латын. Кирилл нөл. Детектор бұл ағылшынша деп шешіп, хабарламаға [Reply in English] тегін қояды.
Түзету - санау алдында мәтіннен email-мекенжайларды, URL-дарды және @хэндлдарды алып тастау. Бұлар табиғи тіл емес, есептеуге кірмеуі керек.
Баг 3: ойдан шығарылған email
Келуші: «түйіндемені жіберіңіз». Бот email сұраудың орнына жүйелік промпттан info@imarch.dev мекенжайын алып, құралды шақырады. Хат маған өзіме келеді.
Haiku 3 - кішкентай модель. Tool definition visitor_email міндетті дейді, бірақ диалогта email жоқ болса, модель тоқтамайды. Контексттен бірінші ұқсас мекенжайды алады. Ал жүйелік промптта үшеу бар.
Үш деңгейлі қорғаныс:
Бір деңгей жеткіліксіз. Haiku әрқайсысын жеке-жеке айналып өтеді. Үшеуі бірге ұстайды. Бұл эшелондалған қорғаныс принципі - желі қауіпсіздігіндегі сол тәсіл: бірде-бір кедергі мінсіз емес, бірақ бірге бір-бірінің осал жерлерін жабады.
Баг 4: хаттар спамда
Өтінім хабарландырулары қалыпты келеді. CV хаттары спамға түседі. Бірнеше поштада.
Айырмашылық - өтінімдер менің доменіме кетеді (Cloudflare Email Routing), ал CV сыртқы поштаға жіберіледі (iCloud, Gmail). Сыртқы серверлер қатаңырақ.
Хаттың өзі спамға ұқсайды. Жіберуші - noreply@. Үлкен түймесі бар HTML-шаблон. Мәтін аз. Бейтарап тақырып «Ильяс Мустафин - CV». Алушы аты жоқ, жауап жазу мүмкіндігі жоқ.
Түзету - хатты қарапайым адамнан келген хатқа ұқсату:
Сонымен бірге Resend (Amazon SES) доменнің SPF-жазбасына қосылды - жіберуші серверді авторизацияладым. SPF мен DKIM-сіз жаңа домендегі мінсіз жазылған хат та спамға түседі - пошта серверлері мазмұнға емес, қолтаңбаға сенеді.
Қорытынды
Төрт баг. Ешқайсысы жеке алғанда күрделі емес. Бірақ біріне-бірі үстемеленді: жоғалған сессия сақтандырғышты бұзды, бұзылған сақтандырғыш галлюцинацияны өткізіп жіберді, ойдан шығарылған хат спамға ұшты. Классикалық каскадтық ақау - әр келесі баг алдыңғысын жасырады, бір тесттік іске қосуда проблеманың түбін табу мүмкін емес.
Төрттің ішіндегі ең пайдалы түзету - кэшті тазалауға арналған admin-эндпоинт. Бұрын серверге SSH керек еді. Енді бір curl токенмен. Ұсақ нәрсе, бірақ бір кеште промптты бес рет өзгерткенде - жүйкені сақтайды.
Кештің басты сабағы: AI-чатбот - бұл “API қосып ұмыту” емес. Бұл күйі бар, тілдік логикасы бар, галлюцинация жасайтын моделі бар, нәтижені сүзгілейтін сыртқы сервистері бар жүйе. Әр қабат бұзылуы мүмкін, және ол үнсіз бұзылады - пайдаланушы “бот біртүрлі жауап береді” дегенде ғана білесіз.
Бот жұмыс істеп тұр. CV сұрап немесе өтінім қалдырып көріңіз - чат түймесі оң жақ төменгі бұрышта. Немесе бірдеңе сынса, тікелей жазыңыз.


