«Сен кімсің?»: Vertex AI-ды WhatsApp-қа қалай қосып, ХҚКО-ботын шала қазақша түсінуге қалай үйреттік
Кез келген қазақстандық бұл азапты кем дегенде бір рет басынан өткерген. Сіз қандай да бір ведомствоның немесе банктің ресми WhatsApp-ботына жазасыз: «Сәлеметсіз бе! Менің ЭЦП кілтімнің мерзімі өтіп кетті, қалай жаңартсам болады? Только без похода в ЦОН, пожалуйста». Ал жауапқа жансыз мынадай мәтін аласыз:
- [1] Өтінім мәртебесін білу
- [2] Бөлімшелер мекенжайы
- [3] Операторды шақыру (Күту уақыты: 4 сағат)
Классикалық түймелі чат-боттар — бұл тас ғасырының технологиясы. Олар мәтінмәнді (контекст) түсінбейді, кішкене қате кетсе сынып қалады және олар біздің ерекше лингвистикалық феноменіміз — шала қазақ тілінің алдында мүлдем дәрменсіз (бір сөйлемде қазақ, орыс сөздері мен англицизмдер табиғи түрде араласып кеткенде).
Осыдан бір ай бұрын OZAT командасына ірі квазимемлекеттік сектордан мынадай тапсырма түсті: «Бізге WhatsApp-қа арналған ақылды көмекші керек. Ол мемлекеттік қызметтер бойынша кеңес беріп, кезекке қойып және ең бастысы, сленг пен қателерді түсіне отырып, адамдармен тірі адам сияқты сөйлесуі керек». Біз бірден түсіндік — Vertex AI мен Gemini модельдерін іске қосатын кез келді.
Неліктен дәл Gemini және Vertex AI?
LLM (Large Language Models) әлемінде мықты ойыншылар көп. Бірақ Қазақстанның мемлекеттік секторы мен финтех жобалары үшін Google Cloud-тың (дәлірек айтсақ Vertex AI) екі өлімші артықшылығы бар:
- Қораптан шыққан мультиязықтылық (Көптілділік). Gemini (әсіресе соңғы 1.5 Pro және Flash модельдері) қазақ тілін феноменалды түрде жақсы түсінеді. Оның үстіне, пайдаланушы сөйлем ортасында тілдерді ауыстырған кезде модель «сүрінбейді».
- Enterprise Security (GDPR/SOC2). Азаматтардың деректерін өңдеу үшін ChatGPT немесе Claude-тың жалпыға қолжетімді (публичный) API-ін пайдалану — бұл қылмыстық іске немесе үлкен айыппұлдарға апаратын тікелей жол. Vertex AI-ға жіберілген деректер Google-дың базалық модельдерін қосымша оқыту (train) үшін пайдаланылмайды, ал барлық трафикті VPC Service Controls ішінде оқшаулауға болады. Деректер қорғалған периметрден шықпайды.
Шешім архитектурасы: WhatsApp-тан LLM-ге және кері қайту
Біз GCP сервистері негізінде жеңіл әрі шексіз масштабталатын serverless-архитектура құрдық. Әкімшілік етуді қажет ететін виртуалды машиналар жоқ — тек код және басқарылатын сервистер.
- WhatsApp Business API: Пайдаланушылардан хабарламалар қабылдап, біздің бэкендке Webhook жібереді.
- Cloud Run: Оркестратор рөлін атқаратын Node.js (TypeScript) сервисі. Ол вебхукты тексереді, мәтінді шығарып алады және бизнес-логиканы басқарады.
- Firestore: NoSQL дерекқор, мұнда біз әр телефон нөмірі үшін диалог мәтінмәнін (Memory) сақтаймыз.
- Vertex AI (Gemini 1.5 Flash): Біздің «миымыз», ол мәтінді түсінеді, шешім қабылдайды және жауаптарды құрастырады. Flash моделінің жылдамдығы чаттар үшін өте қолайлы (жауап 1-1.5 секундта генерацияланады).
- Google Cloud Secret Manager: WhatsApp API кілттері мен ішкі жүйелердің токендерін сақтайды.
TypeScript-те Vertex AI-ды инициализациялау
Vertex AI-мен жұмыс істеу үшін біз Google-дың ресми @google/genai SDK-сын қолданамыз. Маңызды сәт: біз Cloud Run-ның сервистік аккаунтын автоматты түрде іліп әкететін Application Default Credentials (ADC) аутентификация әдісін пайдаланамыз. Ешқандай хардкодталған JSON кілттері жоқ!
import { GoogleGenAI } from '@google/genai';
// Vertex AI клиентін инициализациялау.
// Код Cloud Run ішінде айналып тұрғандықтан, тіркеу деректері (ADC)
// және жоба қоршаған ортадан автоматты түрде тартылады.
const ai = new GoogleGenAI();
export async function generateBotReply(userMessage: string, chatHistory: any[]) {
// ХҚКО-ботымыздың персонатұрпаты мен шектеулерін
// орнататын жүйелік промпт (System Instruction) құрастырамыз
const systemInstruction = `
Сен — Қазақстанның Халыққа қызмет көрсету орталықтарының (ХҚКО) ресми виртуалды көмекшісісің.
Сенің мақсатың — азаматтарға мемлекеттік қызметтерді алу мәселелері бойынша сыпайы әрі нақты кеңес беру.
Ережелер:
1. Пайдаланушы қай тілде жазса, сол тілде жауап бер. Егер пайдаланушы аралас тілді (шала қазақша) қолданса, басым тілге байланысты таза қазақ немесе орыс тілінде жауап беруге тырыс.
2. Қысқа әрі эмпатиямен жауап бер. Ұзын-сонар мәтіндер жазба.
3. Қауіпсіздік мақсатында ешқашан толық ЖСН сұрама, функцияны шақыру үшін қажет болған жағдайда ғана верификация үшін соңғы 4 санын сұра.`;
const response = await ai.models.generateContent({
model: 'gemini-1.5-flash',
contents: [
...chatHistory,
{ role: 'user', parts: [{ text: userMessage }] }
],
config: {
systemInstruction: systemInstruction,
temperature: 0.3, // Дәлірек және болжамды болу үшін төмен температура
maxOutputTokens: 500,
}
});
return response.text;
}GitHub-тағы кодты көру (OZAT-kz)
temperature: 0.3 параметріне назар аударыңыз. Шығармашылық тапсырмалар үшін (мысалы, өлең жазу) температураны көтереді. Бірақ мемлекеттік қызметтер боты қиялдап, галлюцинация жасамауы керек. Оған хирургиялық дәлдік қажет.
Мәселе: «Шала қазақша» және ниетті тану (Intent recognition)
Келіңіздер, NLP модулі бар классикалық бот (мысалы, Dialogflow ES) пен Gemini-дің логтардағы нақты сұрауға қалай қарайтынын көрейік.
Пайдаланушының сұрауы: «Брат, менің правам срок бітіп қалды, новый алу үшін қайда барам? Шоферская справка керек па?»
Классикалық бот: Кешіріңіз, мен сұрауыңызды түсінбедім. Мәзір тармағын таңдаңыз: [1] ЭЦП алу... (NLP қозғалтқышы сленг пен екі тілдің қоспасынан entity мен intent-ті ажырата алмады).
Vertex AI (Gemini) негізіндегі біздің бот: «Сәлеметсіз бе! Жүргізуші куәлігін (права) ауыстыру үшін сізге Мамандандырылған ХҚКО-ға (СпецЦОН) бару қажет немесе eGov.kz порталы арқылы онлайн өтінім қалдыра аласыз. Иә, 073/у формалы медициналық анықтама (шоферская справка) міндетті түрде қажет.»
Gemini аралас тілді деконструкциялауды тамаша орындайды, «права» (жүргізуші куәлігі) және «срок бітіп қалды» (жарамдылық мерзімі аяқталды) мәтінмәнін дәл түсінеді.
Ниетті тану дәлдігі (Intent Recognition)
Функцияларды шақыру (Function Calling): LLM-ге түймелерді басуды үйретеміз
Кеңес беру — жақсы іс. Бірақ нағыз сиқыр ЖИ (ИИ) бэкенд-жүйелерде нақты әрекеттерді орындай алған кезде басталады. Пайдаланушы былай деп жазады: «Маған ертең таңғы 10-ға Алмалы ХҚКО-на кезек брондап берші». LLM өздігінен сізді брондау дерекқорына тіркей алмайды. Бұл үшін Function Calling (немесе Tools) механизмі қолданылады.
Біз Gemini үшін қолжетімді функциялар тізімін JSON-схема түрінде сипаттаймыз (функция атаулары, олардың сипаттамасы және талап етілетін параметрлер). Егер Gemini пайдаланушының сұрауына жауап беру үшін әрекетті орындау керектігін түсінсе, ол жауап мәтінін емес, функция атауы және шығарылған параметрлері бар құрылымдалған JSON-ды қайтарады.
import { GoogleGenAI, Type } from '@google/genai';
const ai = new GoogleGenAI();
// Gemini шақыра алатын құралды (функцияны) сипаттаймыз
const bookAppointmentTool = {
functionDeclarations: [
{
name: 'book_con_appointment',
description: 'ХҚКО-да кезек брондау. Пайдаланушы кезек брондауды, ХҚКО-ға жазылуды немесе талон алуды сұраса, осы функцияны шақыр.',
parameters: {
type: Type.OBJECT,
properties: {
con_name: {
type: Type.STRING,
description: 'ХҚКО атауы немесе ауданы (мысалы, "Алмалы", "Астана Мамандандырылған ХҚКО")'
},
date_time: {
type: Type.STRING,
description: 'ISO 8601 форматындағы қалаулы күн мен уақыт (мысалы, "2026-08-15T10:00:00")'
}
},
required: ['con_name', 'date_time'],
},
},
],
};
// Tools қолдауы бар диалогты өңдеу функциясы
export async function handleUserMessageWithTools(userMessage: string) {
const response = await ai.models.generateContent({
model: 'gemini-1.5-flash',
contents: [{ role: 'user', parts: [{ text: userMessage }] }],
config: {
tools: [bookAppointmentTool], // Модельге құралдарымызды береміз
}
});
// Модельдің функцияны шақыруға шешім қабылдағанын тексереміз
if (response.functionCalls && response.functionCalls.length > 0) {
const call = response.functionCalls[0];
if (call.name === 'book_con_appointment') {
const args = call.args as any;
console.log(`[System] Модель кезек брондағысы келеді: ХҚКО - ${args.con_name}, Уақыты - ${args.date_time}`);
// Мұнда біз брондау дерекқорының API-іне нақты HTTP-сұрау жасаймыз
// const result = await api.book(args.con_name, args.date_time);
// Адамға түсінікті жауап құрастыру үшін функцияның орындалу нәтижесін
// кері модельге қайтарамыз
const functionResponse = await ai.models.generateContent({
model: 'gemini-1.5-flash',
contents: [
{ role: 'user', parts: [{ text: userMessage }] },
// Модельден функция сұрауын тарихқа қосамыз
{ role: 'model', parts: [{ functionCall: call }] },
// Орындалу нәтижесін қайтарамыз
{ role: 'function', parts: [{ functionResponse: { name: call.name, response: { status: 'success', booking_id: 'A-123' } } }] }
]
});
return functionResponse.text;
}
}
// Егер функция шақырылмаса, жай ғана жауап мәтінін қайтарамыз
return response.text;
}GitHub-тағы кодты көру (OZAT-kz)
Осылайша, пайдаланушы құрылымдалмаған мәтін жазғанда «Братан, ертең түстен кейін Бостандыққа жазып жіберші», Gemini con_name: "Бостандықский" мәнін шығарып алады және ағымдағы уақыт негізінде date_time мәнін есептеп, біздің ішкі API-ді шақырады. Пайдаланушы мынадай жауап алады: «Сіздің кезегіңіз Бостандық ауданының ХҚКО-на ертең сағат 14:00-ге сәтті брондалды. Талон нөмірі: A-123.»
Қауіпсіздік және PII (Дербес деректер)
Мемлекеттік және қаржылық боттармен жұмыс істегенде сезімтал деректерді (төлқұжат нөмірлері, ЖСН, банк карталарының толық нөмірлері) LLM-ге бермеу өте маңызды. Иә, Vertex AI деректерді оқыту үшін пайдаланбайды, бірақ чат тарихының логтарында PII сақтау — жаман тәжірибе.
Сондықтан мәтінді Vertex AI-ға жібермес бұрын, біз пайдаланушының хабарламасын Google Cloud DLP (Data Loss Prevention) API (қазіргі атауы Sensitive Data Protection) арқылы өткіземіз. Бұл сервис тұрақты өрнектер (regular expressions) мен машиналық оқытудың көмегімен ЖСН-ді (бақылау сомасына түсетін 12 сан) тауып, оны маскалайды.
Пайдаланушы жазады: «Менің ИИН-ім 900101300123, статус тексерші».
Vertex AI қабылдайды: «Менің ИИН-ім [IIN_MASKED], статус тексерші».
ЖСН біздің Node.js бэкенді деңгейінде шығарылып алынады, қорғалған айнымалыға сақталады және LLM «миын» айналып өтіп, ТЕК ХҚКО-ның ішкі API-леріне сұрау жасау үшін қолданылады.
Қорытындылар
Классикалық чат-боттар өліп бара жатыр. Пайдаланушылар мәзір тармақтарын кезіп, командалардың дұрыс тұжырымын табудан шаршады. Gemini 1.5 сияқты үлкен тілдік модельдерді мессенджерлерге біріктіру Customer Service саласындағы ойын ережелерін толығымен өзгертеді.
Біздің тәжірибеміз көрсеткендей, Vertex AI мен Function Calling-ті бірге пайдалану жай ғана «сөйлесетін ботты» емес, жергілікті ерекшелікті (сол баяғы шала қазақ тілін) түсінетін, бизнес-процедураларды орындайтын және қатаң enterprise-қауіпсіздік стандарттарын сақтайтын толыққанды цифрлық қызметкерді құруға мүмкіндік береді.
Cloud Run негізіндегі архитектура бұл шешімді өте арзан (тек сұрауды өңдеу кезіндегі процессордың нақты жұмыс уақыты үшін төлем) және ақауларға төзімді етеді. WhatsApp-тағы шквалды өтініштер тудыратын ешқандай вирустық репост сіздің бэкендіңізді құлата алмайды.
Егер сіздің компанияңыз әлі күнге дейін клиенттерді «Бас мәзірге оралу үшін 0-ді басыңыз» деген сөздермен қинап жатса — бізге OZAT-қа жазатын кез келді. ЖИ-дың (ИИ) жарық жағына өтетін уақыт жетті!

Рустам Шарафутдинов
Google Cloud архитектурасы саласындағы сарапшы және 15 жылдан астам тәжірибесі бар Senior Full-Stack әзірлеушісі. Ақауға төзімді архитектураларға, жоғары жүктемелі жобаларды оңтайландыруға және AI (Vertex AI) интеграциясына маманданған.