РУКОВОДСТВО · ОБНОВЛЕНО 2026-10-31
Нейросеть извлекла сумму: как проверить запятую, валюту и точность
Технический контракт извлечения чисел без догадок о локали и единицах.
Строка с суммой ещё не является проверенным числом. Разделитель может означать дробную часть или группу разрядов, а знак валюты не всегда задаёт однозначную единицу. Попросите модель сохранить исходный фрагмент и вернуть нормализованное значение отдельным полем. Разбирайте его приложением по согласованным правилам. Для точной десятичной арифметики используйте подходящий десятичный тип или целые минимальные единицы. Не выбирайте валюту и способ округления по догадке модели: эти правила принадлежат контракту вашей системы.
1. Отделите сумму от её представления
Для каждого значения храните исходную запись, нормализованную десятичную строку, валюту или другую единицу и ссылку на источник. Если в документе указан итог в тысячах, коэффициент масштаба должен быть явным. Отдельно различайте сумму, процент и количество. Проверяйте, к какому полю относится число: итог счёта не равен стоимости одной позиции. Отсутствующую валюту обозначайте как неизвестную вместо автоматической подстановки привычного рубля или доллара.
2. Разберите разделители по правилам
Определите допустимые локали и формат входного документа заранее. Учтите обычные и неразрывные пробелы, знак минуса и скобки, если они разрешены контрактом. Не удаляйте все точки и запятые подряд: так можно изменить значение на несколько порядков. Неоднозначную запись отправляйте на уточнение или ручную проверку. Примеры должны включать разные способы записи одного числа и похожие строки с разным смыслом, а не только аккуратную таблицу из одного шаблона.
3. Сохраните десятичную точность
Создавайте десятичное значение из проверенной строки, а не из уже округлённого двоичного float. Документация Python decimal показывает, почему преобразование float может сохранить его двоичную погрешность. Выберите допустимую точность и явное правило округления. Не считайте две цифры после запятой универсальным правилом для любой единицы. Если система хранит целые минимальные единицы, отдельно проверяйте масштаб, диапазон и отсутствие переполнения перед записью результата в рабочее хранилище.
4. Сверьте число с исходником
Сравните результат с видимым фрагментом документа и проверьте предметные связи: сумму строк, скидку или итог только по установленной формуле. Несовпадение не исправляйте автоматическим подбором удобного числа. Для приёмки используйте синтетические документы с отрицательными значениями, пустым полем, разными разделителями и числами возле границы допустимого диапазона. Записывайте причину отклонения отдельно от технической ошибки модели. Такая проверка помогает отличать ошибки извлечения от ошибок числового формата.
Частые вопросы
Можно ли сразу доверять числу из JSON?
Нет. Нужно проверить единицу, источник и соответствие полю документа. Правильный JSON не доказывает правильность извлечённой суммы.
Достаточно ли заменить запятую точкой?
Только для заранее определённого формата. Без контекста запятая может быть разделителем разрядов, а не дробной частью числа.
Зачем хранить исходную запись?
Она позволяет проверить неоднозначность, ошибку распознавания и результат нормализации. Без исходника трудно объяснить изменение значения пользователю.
Можно ли дать модели выбрать округление?
Правило должно задаваться системой и предметным процессом. Модель может описать неопределённость, но не должна незаметно менять принятый способ расчёта.