~ / посты / 11-i-ran-my-real-financial-documents-through-the-model

11. Прогнал через модель свои настоящие финансовые документы_

Хватит теории. Взял папку с реальными документами за май–сентябрь: инвойсы поставщиков, чеки, выписки, налоговые формы. Сорок девять штук. Задача: определить тип документа и вытащить поля по схеме.

Результат за 15 минут на своём ноутбуке, без интернета:

— 49 из 49 ответов пришли строго по схеме — её гарантирует декодер, а не вежливая просьба в промпте; — 13 из 13 номеров счетов — точно; — тип документа — 35 из 36; — 1 из 4 дат в счетах хостинга. Вот тут и началось интересное.

Настоящая ошибка чтения по дороге тоже была. Сначала я рендерил PDF в картинку штатным способом, в родном размере страницы, то есть 72 dpi, — и в одном номере счёта потерялась буква: мелкий шрифт на такой картинке физически неразличим. Поднял разрешение до 2000 пикселей — ошибка исчезла. Цена: вчетверо больше токенов и времени, с пяти секунд до двадцати двух.

Для дат напрашивается та же причина: плохая картинка, потерянный символ. Но с датами она ни при чём. На счёте хостинга напечатано:

Invoice date: 09/06/2026

Модель прочла 6 сентября. Правильный ответ — 9 июня. И по самому документу правильного ответа нет: 09/06 — это девятое июня для немца и шестое сентября для американца, а поставщик своей локали в счёте не указывает. Я проверил глазами и по времени файла: счёт немецкий, значит день первый.

Соблазн тут — сказать «модель плохо распознала» и искать модель получше или картинку почётче. Но распознала она отлично: символы прочитаны верно, все до одного. Она угадала интерпретацию, потому что интерпретировать было нечего. И угадала непоследовательно: 05/07/2026 в том же прогоне прочла правильно, так что даже починка «всегда меняй местами» не работает.

Правильный вывод оказался не про модель, а про конвейер. О том, когда выставлен счёт, у меня есть сигналы помимо самой даты: локаль поставщика известна заранее, а в счёте указан период услуги — «за 05/2026» на счёте, выставленном в июне. Дату не надо угадывать, её надо сверять.

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

Отдельная находка, ради которой стоило это делать локально: в назначении платежа одной из выписок лежит полный номер карты. Не последние четыре цифры — весь. Такое не отправляют в чужой API просто потому, что так удобнее.

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

$ echo "читать серию"

← Все посты