Распознавание чеков с ИИ: что мы поняли, прочитав их тысячи

сканирование чеков

Сфотографировал чек — получил заполненную транзакцию. Это самая востребованная функция в любом приложении для расходов, и звучит она как давно решённая задача: модели теперь хорошие, достаточно показать одной из них картинку.

А потом вы смотрите на настоящие чеки.

Чек — коварный формат

Стандарта нет. Чек — это то, что решил напечатать принтер магазина, и разнообразие поражает:

  • Итог — не самое большое число. С ним соперничают внесённые наличные, сдача, баланс бонусных баллов и сводка трат за прошлый месяц.

  • Итогов часто несколько. Подытог, итог до налога, итог с налогом, итог со скидкой, сумма, списанная с карты. Какой из них «счёт»? Тот, который на самом деле потратил плательщик, — и это не всегда тот, что напечатан крупнее всех.

  • Налог то включён в цены, то добавлен сверху, и по чеку часто не понять, как именно.

  • Плата за обслуживание прячется. Строка с обслуживанием в 12 % стоит посреди списка позиций и выглядит в точности как позиция.

  • Позиции переносятся. Длинное название товара разбивается на две строки, и цена остаётся на второй — сама по себе.

  • Термобумага выцветает, мнётся посередине, а снимают её обычно под углом и при плохом ресторанном освещении.

По отдельности каждая из этих проблем решаема. Трудность в том, что они встречаются все сразу, и скан, который верно распознал четыре поля из пяти, — всё равно скан, который нужно проверять.

Извлекать структуру, а не просто числа

Мы остановились на конкретном и ограниченном наборе: название, итог, валюта, дата, позиции — а налог, чаевые и сервисный сбор отдельными полями.

Последнее — решение, которое оказалось важнее всех, и пришли мы к нему не сразу.

Наивный вариант считает чек плоским списком строк и даёт людям заявлять их. Но налог и обслуживание никто не заказывал. Если они приходят как обычные позиции, кому-то придётся добровольно заявить строку «SERVICE 12%», а это и абсурдно, и несправедливо: она достаётся самому уступчивому, вместо того чтобы распределиться на весь стол.

Поэтому они приходят как общие затраты и делятся между всеми пропорционально тому, что каждый брал. Именно отдельное извлечение делает возможным честное разделение дальше. Ошибитесь с тем, в каком виде разбирать чек, — и никакой хороший интерфейс разделения это уже не спасёт.

О поле валюты тоже стоит сказать отдельно. Брать её из самого чека — по символу, по названиям налогов, по формату чисел, по языку — особенно важно там, где сканирование ценнее всего, то есть в поездках. Именно тогда вы меньше всего заметите, что ужин за €48 записался как $48. Поэтому мы читаем валюту с документа, а не берём ту, что стоит в аккаунте по умолчанию.

Даты — вторая тихая ловушка. 03/04/2026 — это два разных дня, в зависимости от того, в какой стране напечатан чек. Региональные форматы и язык самого чека — сильные подсказки, и мы предпочитаем опираться на них, а не выбирать один из форматов по умолчанию.

Каждый скан вы видите до сохранения

В этом решении мы уверены больше всего, и именно против него пользователи иногда возражают.

Скан никогда ничего не сохраняет сам. Чек читается вместе с фразой, которую вы написали рядом, когда вы нажимаете Разобрать: бумага даёт итог, валюту, дату и позиции, а фраза — людей и название. Результат попадает в ту же проверку, что и любая другая фраза, — с пометкой «Сумма и дата — из файла» и именем фото, — и ничего не сохраняется, пока вы не нажмёте Добавить. Всё, что распознано неверно, исправляется одним нажатием на чип.

Фраза и отмеченный чек разобраны вместе: €47.77 от 6 сентября, разделено с Anna Lopes, сумма и дата взяты с фото

После добавления транзакция хранит фото и позиции и помечена как созданная из чека — как вот эта закупка продуктов, открытая в боковой панели:

Отсканированный чек открыт в боковой панели рядом со списком «Активность»

Честность проверки держится на том, какую сумму она показывает. Это сумма, напечатанная как итог, — то, что на самом деле списали с плательщика, — а не сумма строк, которые модель могла прочитать неверно. Если строки не дотягивают до итога, разница становится одной строкой Other, которую можно переименовать или удалить; если строк набирается больше, разница становится скидкой. Если итог не читается, его заменяет список позиций, а если не читается ни то ни другое, проверка спрашивает Сколько?, а не гадает.

Логика такая: цена двух видов ошибок несоизмерима. Скан, на который вы взглянули и который поправили до сохранения, стоит вам пяти секунд лёгкого раздражения. Неверная сумма, сохранённая молча, оборачивается неверным балансом с другом, и ни один из вас не заметит этого месяц, — а к тому времени уже никто не восстановит, что было на самом деле. Поэтому скан никогда не сохраняется молча: он оказывается перед вами, и сохраняет его только кнопка Добавить.

Учёт долгов — это инфраструктура доверия. Приложение для расходов, которое иногда незаметно ошибается, хуже того, что просит вас взглянуть на результат, потому что вся его ценность в том, что цифре верят оба.

Так что набирать текст за вас будет скан. А проверка остаётся за вами. Мы считаем, что это правильное разделение труда, даже когда модели становятся всё лучше, потому что дело не в точности модели, а в том, что только вы знаете, та ли цифра на бумаге, которая вам на самом деле нужна.

Сканирования идут по лимиту

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

Тариф

Сканирований в месяц

Free

5

Pro

100

Пяти в месяц намеренно хватает на случаи, где сканирование действительно выигрывает, — длинный ресторанный счёт, большая закупка в супермаркете, — и это не пробный период, который закончится. Кофе за €4 и так быстрее вписать, чем фотографировать.

С чем это сочетается

Скан полезнее всего, когда он работает на что-то ещё. Два сочетания, к которым мы прибегаем сами:

Сканирование, потом позиции. Позиции приходят из чека уже по отдельности, с количеством, так что раздать их людям — пара касаний. Хорошо для небольшой компании с подробным счётом.

Отсканированный счёт делится по позициям: каждая строка достаётся тому, кто её брал, а всё, что никому не отдано, остаётся на вас

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


Сканирование чеков есть на всех тарифах, включая Free. Оно начинается в поле для фразы: прикрепите фото скрепкой (Прикрепить фото или файл), нажмите на нём Чек, напишите, с кем делили, и нажмите Разобрать.

Фото чека прикреплено и отмечено как «Чек»: HiBill прочитает его, когда вы нажмёте «Разобрать»

Читайте также