Кейс: как распознать 790 000 чеков за три недели и не сойти с ума

Всем привет! На связи Боков Ахмад, сооснователь «Искусство Автоматизации» и Botcreators.ru. Сегодня я вам расскажу, как мы сделали систему распознавания чеков для FMCG-заказчика и не захлебнулись на объеме.

Сжатые сроки и неназванный заказчик

В лучших традициях digital-интегратора, к нам пришел клиент, которого нельзя называть, и сказал, что ему уже вчера надо было сделать систему, которая «может все», и при этом ни разу не упадет. В данном случае, под «может все» подразумевалась система распознавания чеков. Да, тех самых обычных кассовых чеков.

Забегая вперед, мы взяли контракт только потому, что уже работали с этим заказчиком, и взаимное доверие было не на нуле.

Если это читают представители заказчиков, то почерпните для себя тезис, что не надо искать исполнителя, когда уже все подгорело — лучше обратиться заранее: сэкономит и вам, и разработчику кучу нервов. А если и прибежали, то надо быть готовым, что многие агентства (да и фрилансеры) откажутся от реализации. Просто потому, что очень высок риск не сдать все вовремя и с ожидаемым качеством.

Но хватит занудничать, давайте к кейсу.

Бизнесовая цель

Тут все просто и понятно. Надо распознавать чеки.

Быстро, качественно, разбирая все атрибуты чека от фискального номера до позиции в чеке без права на ошибку.

Больше, по правилам хорошего тона (NDA), я говорить не буду. Что заказчик делает с этими данными, будем считать, нам не сказали, но намекну, что это выгодно для покупателя товара.

Как работает?

Пользователь грузит фотку чека из чат-бота, мы читаем QR, распознаем, что там внутри, берем эти данные, и «идем» с ними в налоговую. ФНС возвращает в ответ содержимое чека, мы ищем нужный нам товар, кладем его в базу, и формируем отчет для клиента.

Процесс

Есть смысл описывать что «мы вели клиента по стандартным этапам»? За две недели многие заказчики не успевают и договор прочитать, а исполнители принять правки к нему. А тут мы и подписаться успели, и разработать, и успешно стартануть.

Из-за того, что все так классно получилось, мы и пишем этот кейс 😊 Мы, разумеется, разбили работы по этапам. В лучших традициях итеративной разработки, взяли тот функционал, без которого и проект не проект, и начали делать его в первую очередь. Когда пошли загрузки чеков, уже докручивали все остальное.

Чтобы закончить этот «корневой» функционал, у нас ушло всего пару дней. Тестировали, что называется, всей маршруткой.

Дальше - про то, как мы докрутили каждый из этапов и как его тестировали, думаю, что никому не интересно. Главное знать, что мы справились.

Особенности

Отличие кейса от всех остальных проектов, запущенных по подобным «лекалам», заключается в следующем:

  • Сжатый срок. Времени у нас было две недели на всю эту красоту.
  • Большой объем данных СРАЗУ. Это можно расценить как плюс, что было достаточно чеков, чтобы протестировать со всех сторон. Но и как минус, что эти чеки надо было сразу распознавать и сразу выдавать результат. Не было «права на ошибку и отладку», так скажем.
  • Плохое качество фото. Тот же самый, например, "Едадил", легко может сказать «не удалось распознать QR», или просто молча не распознать. У нас такой роскоши нет, поэтому родилась следующая особенность:
  • Если мы не смогли распознать QR, то отправляем чек на ручную модерацию. Это делается уже на стороне клиента. Такой объем мы бы сами замучились распознавать. НО! Это рождает, как вы уже поняли, админку, куда сыпятся эти чеки, и некий «механизм ручной модерации». Этот самый условный модератор, открывая фото, должен куда-то ввести данные, которые смог распознать своими глазами. И это опять улетает в ФНС, и т. д.
  • Аналитика, мониторинг, бекапы, хранилище. Да, мы умудрились не просто сделать чтобы оно работало, а еще и не падало, и бекапилось, и строило красивые графики, и даже мониторилось (если этот пункт не понятен, почитайте мою прошлую статью).

На сладкое

Чеков за все время мы распознали порядка 790 000 штук. Точное количество назвать сложно, потому что они прибывают с каждой минутой. В первую неделю после запуска распознавателя – было загружено порядка 120 000 чеков. Если рассуждать по-простому, то это примерно по 12 чеков в минуту. Каждую минуту. Если считать, что в сутках 24 часа. Естественно, чеки грузили в основном в рабочее время, что увеличивает нагрузку вплоть до 30шт/мин.

Отдельно акцентирую внимание, что мы храним каждую фотку. Даже если считать, что каждая весит по 2 МБ (телефоны, в наши дни, делают фотографии примерно с весом 2-5 МБ), то 790 000 шт по 2 МБ это почти 2 ТБ. Только файловое хранилище. Напомню, что мы не Яндекс, и своих датацентров еще не построили. А мы их еще и бекапим, чтоб не потерялось.

Наверное, к этому моменту вы хотите узнать, сколько это удовольствие стоило? Это мы раскрывать не можем, но спасибо, что дочитали досюда 😊

Если интересны технологии, на которых это все было реализовано, или еще какие-то детали, то напишите комментарий. Может, еще на одну статью наберется, и я опишу более подробно.

Наш Telegram-канал, куда выкладываем подобные новости: https://t. me/botcreatorsru

0
27 комментариев
Написать комментарий...
Мартин Иден

Насколько понятно из статьи, как таковой распознавалки то и нет) просто считыватель штрих кода. По заголовку можно подумать, что сделали распознавание текста на чеках.

Ответить
Развернуть ветку
Ахмад Боков
Автор

речь про QR код на фото, который прилетает в телеграм-бота, их и распознаем

Ответить
Развернуть ветку
Labeling

Я ожидал что будет эпичная история, а вышло 30 считываний QR кодов в минуту.

Ответить
Развернуть ветку
Sergey Ilyin

Нихрена не написали, что делали. Не описали - зачем хранить каждую фотку. Статья - «мы клёвые, за две недели запилили распознавалку». И?

Ответить
Развернуть ветку
Ахмад Боков
Автор

фотки в этом кейсе были отчетным документом - пришлось хранить

делали highload-систему в сжатые сроки, распознавалка малая часть
- загрузка и валидация фото
- распознавалка
- конвертация фото (для iPhone)
- запросы к ОФД + мини биллинг (запросы платные с лимитами)
- проверка на дубли
- кабинет модератора для ручного разбора
- отчеты менеджеру в почту
- дашборды
- devOps обвязка (мониторинг / бэкапы)

Ответить
Развернуть ветку
Labeling

Помню кто-то говорил, что если данные посещаются в Excel, то это точно не может быть big data.

А если с нагрузкой справляется компьютер, который 10 лет назад считался бюджетным то это точно не может считаться highload.

30 чеков в минуту, кассир на кассе и тот быстрее сканирует.

А что касается вашей "big data" - сжимать не пробовали? Это же просто чеки, они отлично сжимаются, я глянул на свои сканы чеков - 20 - 50KB один весит, то есть ваши 2TB модет ужать до 2-10GB всего лишь.

Эти данные поместятся в оперативную память даже моего лэптопа 10-летней давности.

Ответить
Развернуть ветку
Фанат Bioware

норм лаптоп в 12 году с 10+ гб оперативки. Тогда максимум что я видел - это 8 и то в топовейших лаптопах.

Ответить
Развернуть ветку
Labeling

Старичок еще жив :)

PS: кто бы мог подумать, эту модель до сих пор можно купить на ebay: https://www.ebay.co.uk/itm/325203988791

Ответить
Развернуть ветку
Sergey Ilyin

Ок, продолжаем.
Хайлоад на чем строили? Какой стэк? Сколько сейчас нагрузка чеков в минуту? Дашборды - самописные? Или Графана / Dash?

Ответить
Развернуть ветку
Ахмад Боков
Автор
Ответить
Развернуть ветку
Владислав Котов

А как под капотом все было устроено?

Ответить
Развернуть ветку
Ахмад Боков
Автор

Бекенд: Java (Spring + Hibernate), Postgres для БД
Фронт: ReactJS
Собрали дашборды на Metabase

Ответить
Развернуть ветку
Dmitry Kapustin

Интересная тема! Я в свое время написал бота: нейросеть переводчик с чекового языка на нормальный русский c категоризацией товаров :)

А как разрулили с ФНС? нужно официальное разрешение от пользователя на получение его чеков?

И как решили проблему плохо пропечатанных QR кодов? чтобы получить чек без QR кода нужно вбить очень много данных

Cами данные JSON получить не сложно, проблемы могут возникнуть если чек не найден или еще не обработан ФНС

Я так понял это сервис подарка за покупку? тогда нужно вылавливать акционные товары которые по разному называются в чеках разных магазинов, вот это тоже отдельный геморрой

Ответить
Развернуть ветку
Мартин Иден

а еще вопрос: а зачем такой софт был нужен заказчику?

Ответить
Развернуть ветку
Ахмад Боков
Автор

это проведение мотивационной программы (промо) , чеки являются доказательством выполнения условий

аля пруф - я выполнил условие - загружаю чек

Ответить
Развернуть ветку
Галя Конькова

То есть по сути задачей было распознать только один товар для подтверждения участия в акции пользователя? А остальные позиции в чеках идентифицировали? Проводили анализ, что/с чем/как/в каком количестве/в какой торговой сети и пр.?

Ответить
Развернуть ветку
Alexey Remizov

"Распознать" это слишком громко сказано. По qr коду и API получают json с текстом, и в нем найти товар..

Ответить
Развернуть ветку
Ахмад Боков
Автор

NDA, к сожалению многое сказать не позволяет. Ваш кейс по кросс-анализу - реализуем. Можем созвониться и обсудить задачу ) https://t.me/B_Akhmad - я тут )

Ответить
Развернуть ветку
Валентин Потапов

Интересно такое. Только у меня ФНС нет, но зато не горит. Поэтому пока думал делать с 0 с фрилансом. Ну если у кого готовое только есть, то может помочь. Хранить фото после его согласования мне не нужно

Ответить
Развернуть ветку
Ахмад Боков
Автор

у вас небольшое кол-во чеков и ручной разбор, верно ?

Ответить
Развернуть ветку
Валентин Потапов

Мне надо вытащить из чека id ресторана, id чека ( возможно дату ) и сумму. Пока это оценка стартапа, а не текущая процедура. Много или не много, как пойдет.

Ответить
Развернуть ветку
Василий Степанофф

А фнс разве не ограничивает количество запросов по апи?

Ответить
Развернуть ветку
Ахмад Боков
Автор

мы работаем с ОФД. А он уже интегрирован с ФНС. Лимиты есть, тарифицируются, для этого написали мини-биллинг, чтобы не выкатиться

Ответить
Развернуть ветку
Василий Степанофф

тогда яснопонятно. Система совсем не сложная.
За день можно накатать..с перекурами на холивары на vc.ru

Ответить
Развернуть ветку
Ахмад Боков
Автор

так и живем 😁

Ответить
Развернуть ветку
Adminus

А что за сервис, что бы на деле поспать сервис который вы сделали !

Ответить
Развернуть ветку
Антон

В чём выгода отправлять чек на ручную модерацию по сравнению с тем, чтобы вернуть процесс юзеру с "не удалось распознать QR"? Предложение переснять чек нормально, как у едадила, воспринимается лучше, чем пропажа процесса в недрах системы без ясного таймлайна. И что делает ручной модератор, распознаёт человекочитаемые поля? Это тоже проще автоматизировать, нет? В общем, этот момент вызывает сомнения.

Ответить
Развернуть ветку
24 комментария
Раскрывать всегда