Қазақстандық құжаттарды Document AI-ға береміз: Бухгалтердің тозағын қалай автоматтандырдық
Кез келген қазақстандық компанияда айдың соңы — бұл кеңседе кофе, корвалол және қағазға деген жеккөрушілік иісі аңқитын уақыт. Бухгалтерлер, матрицалық станциялардың операторлары сияқты, бастапқы құжаттардың (первичка) шексіз ағынын 1С-ке тоқтаусыз енгізеді (ал бұл деректерді деректерді талдау (Data Analytics) үшін пайдалануға болар еді): орындалған жұмыстар актісі (АВР), жүкқұжаттар (З-2), шот-фактуралар мен түбіртектер. Әрбір құжат — миналанған алаң. Жеткізуші АВР-ды қисық ERP-жүйесінен басып шығарды, курьер оны рюкзагында мыжып тастады, ал оның үстіне компанияның БИН-інің дәл үстіне майлы көк мөр басып берді. Таныс көрініс пе?
Бастапқы құжаттарды енгізуді автоматтандыруға көптеген адамдар тырысты. Нарықта "лезде тануға" уәде беретін ондаған шешімдер бар. Бірақ шындық қатал. Бұл мақалада біз, OZAT инженерлері, классикалық шаблондық OCR неліктен қазақстандық шындық үшін өлгенін айтып береміз және бұл мәселені нейрожелілер, компьютерлік көру (computer vision) және Google Cloud Document AI көмегімен біржола қалай шешкенімізді көрсетеміз.
Классикалық OCR неліктен азап пен қайғы әкеледі?
Тарихи тұрғыдан құжаттарды енгізуді автоматтандыру оптикалық таңбаларды тану (OCR) негізінде құрылды — Tesseract немесе коммерциялық Abbyy FineReader сияқты қозғалтқыштар. Тәсіл қарапайым болып көрінеді: құжатты сканерлейміз, мәтін полотносын аламыз, содан кейін оған тұрақты өрнектерді (Regular Expressions / RegEx) қоямыз. "БИН" сөзін іздейміз, одан кейінгі 12 санды аламыз. "Итого" сөзін іздейміз, соманы аламыз. Не қате кетуі мүмкін?
Бәрі. Қазақстандық бастапқы құжаттар (первичка) — бұл шаблонға сыйғызу мүмкін емес хаос.
- Ығысу мәселесі: Шаблондық OCR жүйелері координаттарға байланады. Бухгалтер парақты сәл қисық сканерлесе болғаны (5 градус бұрышпен) — координаттар "сырғып" кетеді. "Сомасы" өрісі кенеттен "Саны" ретінде танылады.
- Тозақтық көк мөр: Бұл классика. Қазақстанда дөңгелек көк мөрді дәл кестелік бөлікке немесе деректемелерге (реквизиттерге) басуды жақсы көреді. Tesseract үшін қара сандардың үстіндегі көк әріптер пиксельдер ботқасына айналады. БИН "123456789012" кенет "1234S6?89G12" болып шығады. RegEx құлайды.
- Формалардың әртүрлілігі: Тіпті стандартты АВР формасының өзі (50-қосымша) әртүрлі есеп жүйелерінде әртүрлі болып көрінеді. Бағандардың ені әртүрлі, қаріптер әртүрлі, біреу өз өрістерін қосады. Екінші бетке ауыса алатын кестелік бөлік үшін әмбебап RegEx жазу — бұл бэкенд әзірлеушілердің шашын ағартатын тапсырма.
Нәтижесінде, классикалық OCR жүйелері продта ең жақсы дегенде 60% дәлдік береді. Бухгалтерге әрбір сканерленген құжатты қайта тексеруге, қателерді түзетуге және "ақымақ бағдарламашыларды" ұрсуға тура келеді. Автоматтандырудың мәні жоғалады.
Парадигманың өзгеруі: Google Cloud Document AI
Регуляркалар мен шаблондардың тығырыққа тірейтінін түсініп, біз Google Cloud Platform ұсынатын Document AI-ға назар аудардық. Ақымақ OCR-ден айырмашылығы, Document AI — бұл жай ғана мәтін шығарушы емес. Бұл құжаттың кеңістіктік және визуалдық контекстін түсінетін мультимодальды нейрожелі.
Тәжірибеде бұл нені білдіреді? Нейрожелі PDF файлына адам сияқты қарайды. Егер ол жоғарғы оң жақ бұрышта, заңды тұлғаның атауының жанында 12 таңбалы нөмірді көрсе, тіпті "БИН" сөзінің өзі кофеге малшынып тұрса немесе мөрмен жабылып қалса да, оның БИН екенін түсінеді. Оған қатаң координаттар қажет емес. Ол топологияны, кестелердің құрылымын, қаріптерді және элементтердің өзара байланысын талдайды.
Шешім архитектурасы: Біздің шындыққа арналған Custom Extractor
Document AI-де дайын парсерлер бар (Invoice Parser, Receipt Parser), бірақ олар американдық және еуропалық стандарттарға оқытылған. Олар Invoice-ты жақсы түсінеді, бірақ біздің З-2 жүкқұжатының алдында дәрменсіз. Сондықтан біз Custom Extractor — Google-дың Foundation Model-ін өзіңіздің арнайы құжаттарыңызға оқытуға мүмкіндік беретін құралды қолдандық.
Процесс бірнеше инженерлік қадамдардан тұрды:
1. Бұлтта тікелей деректерді белгілеу (Data Labeling)
Алдымен бізге датасет қажет болды. Біз 200 нақты қазақстандық АВР мен жүкқұжаттарды алдық (мөрлері, қолдары, қисық скандары және артефактілері бар). Оларды Cloud Storage-ке жүктедік. Содан кейін Document AI консолінде кірістірілген белгілеу құралын аштық.
Белгілеушінің міндеті — қажетті деректердің айналасында bounding boxes (тіктөртбұрыштар) бөлу және оларға кластар (субъектілер/entities) тағайындау. Біз келесі сущностьтарды анықтадық:
supplier_name(Жеткізушінің атауы)supplier_bin(Жеткізушінің БИН-і)invoice_date(Құжат күні)total_amount(Жалпы сома)line_items(Кестелік бөлікке арналған ата-аналық сущность)item_name(Жұмыс/қызмет атауы)item_quantity(Саны)item_price(Бағасы)item_amount(Сомасы)
2. Модельді оқыту (Fine-Tuning)
Оқыту үшін 150 құжатты (Training set) және тестілеу үшін 50 құжатты (Test set) белгілеп болғаннан кейін, біз жаттығу процесін іске қостық. Google Cloud өзінің алдын ала оқытылған қуатты LLM-моделін (Foundation Model) алады, ол "құжат", "кесте" және "мәтін" дегеннің не екенін түсінеді және оның салмақтарын біздің нақты кластарымызға бейімдеп қайта оқытады.
Оқыту бірнеше сағатқа созылды. Біз Evaluation Metrics-ке қараған кезде нәтижелер бізді таң қалдырды. БИН үшін F1 Score (дәлдік пен толықтық арасындағы гармоникалық орташа мән) 0.98, ал кесте жолдары үшін 0.95 құрады. Модель көк мөрлер мен қолтаңбаларды елемей, көп беттік жүкқұжаттардан тауарларды қатесіз шығарып алуды үйренді!
3. Бэкенд және 1С-пен интеграция
Оқытылған модель (Processor) деплой жасалып, GCP-де өзінің бірегей Endpoint-ын алды. Енді біз оны клиенттің есеп жүйесімен — 1С:Кәсіпорынмен байланыстыруымыз керек болды.
Продакшен архитектурасы мынадай:
- Хатшы бастапқы құжаттардың (первичка) бумасын сканерге салады. Сканер FTP арқылы PDF файлдарын біздің микросервиске (Node.js-те жазылған) жібереді.
- Cloud Run серверсіз ортасында айналып жатқан микросервис PDF-ті алады және оны gRPC арқылы Document AI API-не жібереді.
- Document AI алып JSON қайтарады (оның ішінде мәтін, сущностьтар, геометрия, тану сенімділігі бар).
- Біздің микросервис бұл JSON-ды парсинг жасайды (коды төменде келтірілген), деректердің ұқыпты объектісін жинақтайды және оны HTTP/REST арқылы 1С жарияланған веб-сервисіне жібереді.
- 1С-те автоматты түрде "ТМҚ және Қызметтер түсімі" құжаты жасалады, PDF файлы тіркеледі, ал бухгалтерге тек "Өткізу" (Провести) түймесін басу ғана қалады.
Кодтағы сиқыр: Document AI жауабын парсингтеу
Document AI-мен жұмыс істегендегі ең қиын нәрсе — оның жауабын парсингтеу. API жай ғана мәтін емес, күрделі графтық құрылымды қайтарады. Кестелер мен құжаттың бас жағын шығарып алу үшін Node.js-те өңдеушіні (handler) қалай жазғанымызды қараңыз:
const { DocumentProcessorServiceClient } = require('@google-cloud/documentai').v1;
const client = new DocumentProcessorServiceClient();
async function parseKazakhInvoice(projectId, location, processorId, filePath) {
// Указываем путь к нашему Custom Extractor процессору в Google Cloud
const name = `projects/${projectId}/locations/${location}/processors/${processorId}`;
const fs = require('fs').promises;
const imageFile = await fs.readFile(filePath);
const request = {
name,
rawDocument: {
content: Buffer.from(imageFile).toString('base64'),
mimeType: 'application/pdf',
},
};
// Отправляем скан на обработку в Document AI
console.log('Отправка документа в Document AI...');
const [result] = await client.processDocument(request);
const document = result.document;
const extractedData = { items: [] };
// Функция для безопасного извлечения текста по якорям (Text Anchors)
const getText = (textAnchor) => {
if (!textAnchor || !textAnchor.textSegments || textAnchor.textSegments.length === 0) return '';
let text = '';
for (const segment of textAnchor.textSegments) {
const startIndex = segment.startIndex || 0;
const endIndex = segment.endIndex;
text += document.text.substring(startIndex, endIndex);
}
return text.trim();
};
// Парсинг извлеченных сущностей
for (const entity of document.entities) {
const entityType = entity.type;
const entityValue = entity.mentionText || getText(entity.textAnchor);
// Собираем шапку документа
if (entityType === 'supplier_bin') extractedData.bin = entityValue;
if (entityType === 'total_amount') extractedData.totalAmount = entityValue;
if (entityType === 'invoice_date') extractedData.date = entityValue;
// Парсим табличную часть (Вложенные сущности / Line Items)
if (entityType === 'line_items' && entity.properties) {
for (const item of entity.properties) {
let row = {};
for (const prop of item.properties) {
// Вытаскиваем наименование, количество, цену и сумму
row[prop.type] = prop.mentionText || getText(prop.textAnchor);
}
extractedData.items.push(row);
}
}
}
console.log('Успешно распознано:', JSON.stringify(extractedData, null, 2));
return extractedData;
}
// Пример вызова:
// parseKazakhInvoice('my-gcp-project', 'eu', 'a1b2c3d4e5f6', './nakladnaya.pdf');GitHub-тағы кодты көру (OZAT-kz)
getText(textAnchor) функциясына назар аударыңыз. Бұл Document AI-мен жұмыс істеу кезіндегі маңызды паттерн. Нейрожелі әрқашан дайын сущность мәтінін (mentionText) қайтара бермейді, ол көбінесе құжат мәтінінің ғаламдық массивіндегі "индекстерді" (start/end) көрсетеді. Біз осы координаттар бойынша мәтіннің қажетті бөлігін өзіміз "кесіп алуымыз" керек. Бұл күрделі пішімдеу кезінде деректердің жоғалуын болдырмауға мүмкіндік береді.
Нәтижелер мен ROI: Сандар өздері сөйлейді
Жүйені енгізгенге дейін 4 адамнан тұратын бухгалтерия бөлімі жүздеген жеткізушілерден түсетін бастапқы құжаттарды қолмен енгізуге ғана аптасына барлығы 40-қа жуық адам-сағатын жұмсайтын. Бұл монотонды, қажытатын жұмыс еді, ол сөзсіз қателерге әкелетін (сомадағы санды шатастыру, дұрыс емес БИН көрсету).
1000 жүкқұжатты өңдеу уақыты (сағатпен)
Тұрақты өрнектер (RegEx) негізінде қораптық OCR енгізу әрекеті уақытты 15 сағатқа дейін қысқартты, бірақ жаңа бас ауруын қосты: бухгалтерлер дұрыс танылмаған тиындарды және "сырғып кеткен" кестелерді қолмен түзетуге жүйкелерін тоздырды.
Google Cloud Document AI (Custom Extractor) жүйесіне көшу бәрін өзгертті. 1000 құжатты өңдеу уақыты 30 минуттық машина уақытына дейін қысқарды. Бухгалтерге енді ештеңе терудің қажеті жоқ. Құжат 1С-те өзі пайда болады. Адам тек сандарға көз жүгіртіп, "ОК" батырмасын басатын бақылаушы рөлін ғана атқарады.
Түйін
Деректерді қолмен енгізу және сынғыш тұрақты өрнектер дәуірі ресми түрде аяқталды. Бұлттағы Foundation Models пен бұлтты инфрақұрылымда компьютерлік көруді пайдалану — бұл енді "гиктерге арналған инновация" емес, өскісі келетін бизнес үшін күнделікті қажеттілік.
Google Cloud Document AI тіпті ең қатал қазақстандық бастапқы құжаттарды да (первичка) "қорыта" алатынын дәлелдеді: көк мөрлермен, мәтін үстіндегі қолтаңбалармен, қисық сканерлеумен және стандартты емес шаблондармен. Иә, Custom Extractor-ды оқыту уақытты және ML-процестерін түсінуді талап етеді, бірақ бұл архитектураның ROI-і (инвестициялардың қайтарымы) айлармен есептеледі, ал бухгалтерлердің үнемделген жүйке жасушалары — баға жетпес байлық.
Егер сіздің компанияңыз әлі де қағазға көміліп жатса, ал деректерді енгізу бөлімі ұлғайып бара жатса — OZAT-қа келіңіз. Біз нейрожелілерді сіздің бухгалтерияңыз үшін қалай жұмыс істетуге болатынын көрсетеміз, дәл біз Алматыдағы логистиканы оңтайландырғанымыз сияқты.
💡 ОЗАТ кеңесі: Енгізуге дайынсыз ба? Архитектура мен бюджетті Scope Builder арқылы есептеңіз немесе тегін ЖИ-аудиттен өтіңіз.

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