Как я выбирал AI для распознавания накладных и дважды поменял решение

05.08.26

Интеграция - Нейросети

Три слоя проверок вокруг нейросети, которые я снёс одним тестом. Плюс вторая развилка: Haiku из 21 позиции распознала 12, а на чистом документе отработала идеально. История о том, как выбирается модель для распознавания накладных — и почему выбирать одну оказалось неправильной постановкой вопроса.

Задача звучала просто. Поставщик присылает накладную — фотографией с телефона, PDF-сканом или Excel-файлом, как ему удобнее. Надо получить из этого документ «Поступление товаров и услуг» в 1С: с правильным контрагентом, правильными суммами и всеми позициями в табличной части. Без ручного набора.

Формулировка «просто скормить фото нейросети» держится ровно до первой реальной накладной. Дальше начинается инженерия, и в ней я успел дважды поменять решение — сначала сменил модель целиком, потом отказался от идеи выбрать одну модель вообще.

 

Сразу отвечу на вопрос, который задал бы сам

«Зачем это вообще, когда есть 1С:РПД?»

Вопрос справедливый, и отмахиваться от него нечестно. 1С:Распознавание первичных документов стоит порядка 600 рублей в год за сотню страниц (актуальные тарифы стоит проверять отдельно, они меняются), поддерживается вендором, умеет накладные, счета-фактуры, УПД, акты, сопоставляет контрагентов и номенклатуру с базой. Есть и другие решения — Entera, продукты на базе SberScan, готовые обработки на Инфостарте. Ниша не пустая, она освоенная.

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

Меня интересовало другое, и вопрос был инженерный, а не продуктовый.

Все существующие решения строились в эпоху, когда распознавание документа означало специализированный конвейер: OCR, извлечение структуры, обученные под конкретные типы документов модели, правила разбора. Долго, дорого, требует данных для обучения. За последние пару лет появились универсальные мультимодальные модели, которым можно просто дать картинку и словами объяснить, что нужно достать. И у меня был вопрос, ответ на который я нигде не нашёл в готовом виде: насколько такая универсальная модель сегодня закрывает эту задачу без специализированного конвейера вокруг неё? Не в демо на идеальном скане, а на реальных накладных.

Это вопрос, на который нельзя ответить чтением. Только собрав и разбив об реальность.

Второе соображение — прикладное. Готовые сервисы работают как чёрный ящик с тарификацией по страницам. Мне хотелось конструкцию, где видно всё: какая модель вызвана, что она вернула, почему результат признан сомнительным. Не потому что чёрный ящик плох, а потому что открытую конструкцию можно допилить под свой поток документов, а тарифицируемый сервис — нет.

Так что ниже — не история продукта-конкурента. История о том, что выяснилось, когда я попробовал решить типичную задачу нетипичным для неё способом. Кое-что из этого пригодится любому, кто прикручивает LLM к рабочему процессу, независимо от накладных.

 

Почему первым был GigaChat

Выбор был не про сравнение возможностей, а про знакомство с инструментом. Я уже работал с GigaChat API в другом проекте и знал его особенности: OAuth-токен живёт 30 минут и его надо не забывать обновлять, обязателен заголовок RqUID с уникальным идентификатором на каждый запрос, авторизация и сам чат живут на двух разных серверах. Всё это уже было отлажено и лежало готовым.

Первые тесты на синтетических накладных обнадёжили. Аккуратный документ — шапка, четыре товарные позиции, итоговая сумма — GigaChat-2-Pro распознавал полностью верно с одного вызова. Все поля, все цифры. Я мысленно поставил галочку «модель подходит» и пошёл собирать вокруг неё остальной конвейер.

Галочка оказалась преждевременной.

 

Что пошло не так на реальных документах

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

Первая — модель путала местами продавца и покупателя. В накладной оба реквизита выглядят одинаково: название организации, ИНН, КПП, адрес. Отличает их только подпись поля и положение на листе. Когда вёрстка нестандартная, модель уверенно брала не тот блок.

Вторая — ИНН. То задвоенный (цифры повторялись, и число выходило длиннее положенного), то просто невалидный — не 10 и не 12 знаков.

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

 

Три слоя, которыми я пытался это закрыть

Логичный первый ход — не менять модель, а обстроить её проверками. Я построил три слоя, каждый против конкретной слабости.

Двойной вызов на самопроверку (self-consistency). Шапка документа распознаётся дважды, независимыми запросами. Совпали ответы — доверяем. Разошлись — модель сама себе противоречит, документ идёт на ручную проверку. Стоит это ровно вдвое дороже по токенам на каждую шапку.

OCR-подсказка в промпте. Раз модель читает изображение неуверенно, логично дать ей второй источник того же текста. Перед отправкой фото прогоняется через классический OCR, и распознанный текст добавляется в промпт: вот что обычное распознавание увидело на этой картинке, учитывай. Специализированный OCR читает символы точнее, но не понимает, что из прочитанного чем является; модель понимает смысл, но хуже читает. Идея была сложить сильные стороны обоих.

Якорная проверка по координатам. Самый тяжёлый слой. Известно, где на листе физически стоит блок «Продавец», и известно, какие координаты у распознанного текста. Значит, можно проверить: то, что модель назвала ИНН продавца, действительно лежит рядом с подписью «Продавец», а не в середине товарной таблицы? Если координаты не сходятся — модель прочитала не то, что думает.

Все три слоя работали. Ошибок стало заметно меньше. Но в какой-то момент я посмотрел на это со стороны и увидел неприятную картину: половина конвейера существует не для того, чтобы решать задачу, а чтобы компенсировать слабости конкретной модели. Это не архитектура, это подпорки.

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

 

Тест, который перевернул решение

Проверка была прямая: один и тот же документ, один и тот же промпт, два движка — GigaChat и Claude. Никакой обвязки, чистый вызов против чистого вызова.

Один вызов Claude вернул верные роли сторон и корректные ИНН. Без двойного запроса, без OCR-подсказки, без якорной проверки — то, ради чего было построено три слоя, решалось моделью само.

Оговорюсь про методику, чтобы не выдавать это за большее, чем оно есть. Тестовая база была устроена так: масса синтетических документов, чтобы убедиться, что механика вообще работает, и два реальных — оба отвратительного качества, на 6 и на 21 позицию. Реальных документов мало сознательно: на чистом скане с ровной вёрсткой справляются все модели, разница между ними видна только там, где документ плохой. Смысла набирать десяток хороших сканов не было — они не различают модели.

Чего у меня нет и чего я утверждать не буду: числовой статистики вида «модель А точнее модели Б на столько-то процентов». Для этого нужен прогон по десяткам документов с сохранённым протоколом расхождений. Есть однозначный результат на худших случаях и подтвердившая его последующая эксплуатация. Скрипты сравнения остались в проекте, так что при желании вывод перепроверяется.

После этого теста весь путь фото и PDF переехал на Claude. Двойной вызов на самопроверку, OCR-подсказка в промпте и пост-хок сверка с внешним OCR ушли из основного маршрута — код остался в проекте, но вызывается только из тестовых скриптов сравнения. А вот якорная проверка выжила, причём в новом качестве: вместо того чтобы контролировать ответ модели, она теперь работает до неё и в удачном случае избавляет от AI-вызова для шапки целиком. Об этом ниже.

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

 

Оговорка, без которой рассказ был бы нечестным

Из вышесказанного легко сделать вывод, что GigaChat вообще не годится для работы с изображениями. Формулировка неточная: он видит, но видит плохо — распознаёт неуверенно и нестабильно, особенно там, где смысл поля определяется его положением на листе.

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

Отдельный урок из этого: тест на аккуратном синтетическом документе почти ничего не говорит о поведении модели в продакшене. Он показывает, что задача в принципе решаема, и только.

 

Почему Excel остался на GigaChat

Может показаться, что после такого перехода логично перевести на Claude вообще всё. Но Excel-накладные так и остались на GigaChat, и это не непоследовательность, а разные задачи.

Фото и PDF — это компьютерное зрение: модель должна увидеть изображение и понять, где что расположено. Excel — уже структурированные данные, зрение не нужно вообще; нужно разобрать содержимое ячеек и понять, какая колонка чему соответствует. Другая работа, другой промпт, и слабое место, найденное в vision, сюда не переносится.

Грабли на Excel-пути свои. Модель нестабильна по формату ответа — для одной и той же структуры может вернуть то словарь, то список, и код должен быть готов к обоим вариантам. Плюс путается в числовых индексах колонок, когда листов много. Лечится это не сменой модели, а фолбэками на стороне обработки: проверка типа пришедшей структуры перед разбором, явная нормализация индексов.

Побочный, но приятный эффект: обработка Excel-накладной обходится кратно дешевле обработки фото. Если поставщики шлют преимущественно Excel — это прямая экономия, а не просто техническая деталь.

 

Второй раунд: Haiku или Sonnet

Внутри линейки Claude встал новый вопрос. Haiku дешевле и быстрее, Sonnet дороже и сильнее. Соблазн взять дешёвую моделью по умолчанию был очевидный.

Проверил на реальном документе — плохой скан, 21 позиция. Haiku ошиблась крупно: неверно определила продавца, покупателя оставила вообще без имени, итоговые суммы обнулила, а из 21 товарной позиции распознала только 12. Девять позиций просто исчезли.

На простом синтетическом документе та же Haiku отработала безупречно — точное совпадение по всем полям, и ответ короче, чем у Sonnet, то есть ещё и дешевле по токенам.

Ровно та же картина, что была с GigaChat раньше, и это уже похоже на закономерность, а не совпадение: на чистом документе разницы между моделями почти нет, на грязном она решающая. Слабая модель на хорошем входе выглядит как сильная. Что делает тестирование на аккуратных примерах почти бесполезным для выбора.

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

 

Решение: не выбирать модель, а маршрутизировать по качеству входа

Ключевая мысль оказалась не в том, чтобы попробовать дешёвую модель и переделать при неудаче, а в том, чтобы оценить документ до первого обращения к AI.

Оценку делает OCR — один прогон на страницу, результат используется дважды. Считается доля «слабых» блоков: тех, где уверенность распознавания ниже 0,7. Метрика грубая, но она отвечает ровно на нужный вопрос — насколько вообще читаем этот документ.

Дальше три ветки.

Если слабых блоков больше 30% — пайплайн отказывает сразу, ни одна модель не вызывается. Смысл простой: на таком фото ошибётся любая модель, а платить за распознавание мусора и потом объяснять пользователю, почему в документе ерунда, — худший вариант из возможных. Лучше честно сказать «переснимите» до того, как потрачены деньги и время.

Если слабых блоков от 10 до 30% — сразу Sonnet. Haiku в этой ветке не пробуется вообще. Это ровно тот случай, где она ломается, и тратить вызов на заведомо провальную попытку смысла нет.

Если слабых блоков меньше 10% — идёт Haiku. И вот только здесь появляется эскалация: результат проверяется на признаки сбоя — расхождение суммы позиций с итогом, противоречие в итогах, неподтверждённый ИНН, пустые обязательные поля — и при срабатывании делается один повторный вызов на Sonnet. Один, без рекурсии.

Отдельно про то, что оказалось приятным сюрпризом. Если якорное извлечение уверенно взяло все обязательные поля шапки — продавца, покупателя, оба ИНН, договор — шапка в AI не отправляется вообще. Модель работает только с товарными позициями. Тот самый якорный слой, который строился как проверка поверх ответа модели, в итоге стал первичным путём для шапки, до модели. Из подпорки превратился в несущую конструкцию.

 

Честные границы этой схемы

Первое: пороги 10% и 30% откалиброваны на двух документах. Двух. В коде они помечены как временные, и я не буду делать вид, что это выверенные эмпирические константы — это разумные первые приближения, которые почти наверняка сдвинутся, когда наберётся статистика.

Второе: детерминированные проверки почти никогда не блокируют результат. Они превращаются в предупреждения и понижают уверенность по полям, но документ всё равно доезжает до пользователя. Это осознанный выбор — правдоподобный, но тихо неполный результат опаснее явного предупреждения.

Третье, и самое важное для честности: эскалация Haiku → Sonnet работает не во всех ветках. В якорной ветке, где шапку взял OCR, модель для позиций выбирается заранее, и повторного вызова при провале проверок не происходит — будет только предупреждение. Так что фраза «если что-то не сошлось, подключится модель посильнее» верна не всегда, и мне это ещё предстоит доделать.

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

 

Про проверку ИНН — точная формулировка

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

Второй уровень — сверка с реальными данными через сервис dadata.ru, который агрегирует данные ФНС. Формулировать это стоит именно так: не прямой запрос в реестр налоговой, а обращение к стороннему сервису-агрегатору. Если организация найдена — название подставляется официальное, а не то, что прочитала модель. Если не найдена — уверенность по этому полю резко понижается и выводится предупреждение.

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

 

Чего эта штука не делает — до того, как вы спросите

Работает только с «Поступлением товаров и услуг». Это не универсальный распознаватель любых документов, и делать вид, что универсальный, я не буду — вот здесь разрыв с решением от вендора по охвату типов документов принципиальный, и не в мою пользу.

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

Документ создаётся черновиком. Счёт учёта, способ учёта НДС, склад заполняет человек — это учётные решения, а не задача распознавания.

И то, о чём стоит сказать прямым текстом: фото и файлы уходят на сторонний сервер для распознавания через внешний AI-сервис. В момент обработки через чужую инфраструктуру проходят ИНН контрагентов, названия организаций, суммы, номенклатура. Постоянно они не хранятся, но если у организации жёсткая политика по данным — это надо знать заранее, а не выяснять постфактум.

 

Что в итоге

Два раза за проект я менял решение, и оба раза не потому, что первое было глупым, а потому что появлялись данные, которых на момент выбора не было. Первый выбор сделан по знакомству с API — разумно на старте, неверно по сути. Второй — попытка выбрать «правильную модель» вместо того, чтобы признать, что правильной одной модели тут нет.

Главное, что я вынес: подпорки вокруг модели — это диагноз, а не архитектура. Но диагноз не означает «выбросить всё». Три слоя из четырёх ушли, а четвёртый — якорное извлечение — оказался не костылём, а самостоятельным механизмом, который в удачном случае вообще избавляет от обращения к модели. Разница в том, что раньше он страховал модель, а теперь работает вместо неё.

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

А на исходный вопрос — «зачем, когда есть готовое» — у меня ответ такой. Затем, что готовое отвечает на вопрос «как ввести первичку», а мне был интересен вопрос «изменилось ли что-то в том, как такие задачи вообще решаются». Оказалось, изменилось: там, где раньше нужен был специализированный конвейер, теперь местами хватает одного грамотного вызова. Не везде и не всегда — но граница сдвинулась, и это стоило проверить руками.

Собрано в обработку SmartDocs AI, лежит на Инфостарте за 2 стартмани, сейчас в стадии сбора обратной связи: //infostart.ru/1c/tools/2747047/. Особенно интересны случаи, где распознавание ошибается — именно они определяют, куда двигать пороги маршрутизации дальше.

Вступайте в нашу телеграмм-группу Инфостарт

распознавание накладных распознавание документов 1С поступление товаров и услуг GigaChat мультимодальные модели проверка ИНН автоматизация ввода первички выбор модели

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданным 1С, справке синтакс-помощника и проверки синтаксиса.

15250 руб.

25.08.2025    67429    136    38    

143

SALE! %

Банковские операции Обмен с интернет-банком Мастера заполнения Нейросети Программист Бухгалтер Пользователь 1С:Предприятие 8 1C:ERP 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:ERP. Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 3.0 Платные (руб)

Корректируйте банковские документы быстро и легко! Создайте правило обработки — и оно автоматически применится при загрузке выписки (отбор по любому реквизиту или регулярному выражению). Решение заполняет расшифровку платежа, комиссию эквайринга, подбирает ведомости на выплату зарплаты, помечает дубли из банка на удаление и многое другое. Доплачивать за алгоритмы не нужно — они включены в решение. Обработка работает при загрузке из файлов клиент-банка и через DirectBank. Новое — искусственный интеллект: модель приводит нестандартные назначения платежа к виду, понятному алгоритмам, а ИИ-ассистент прямо в 1С консультирует по решению и разбирает код правил и алгоритмов. Поддерживаются локальные и облачные OpenAI-совместимые модели — данные могут не покидать ваш контур.

15250 руб.

20.12.2024    18086    91    29    

80

Учет документов Распознавание документов и образов Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Одна из наиболее удобных обработок автоматического прикрепления большого количества документов-оригиналов к документам 1С. Для файлов поточного сканирования автоматически определяются начало и конец каждого документа. Поддерживаются штрихкоды, QR-коды, отсканированные PDF документы без штрихкодов, сформированные в ЭДО текстовые PDF документы. Поддерживаются входящие и исходящие документы-оригиналы.

87108 руб.

23.12.2021    17167    34    25    

15

SALE! 35%

Нейросети Программист 1С 8.3 Бесплатно (free)

Один проход модели по вопросу из 28 знаков стоит 631 296 умножений и 4,8 секунды. Столько берёт языковая модель на 21 920 параметров, посчитанная прямо в 1С средствами самой платформы. На ней разбираю по шагам, что стоит за каждым словом из модного словаря: токен, словарь, вектор символа, вес, слой, голова внимания, контекст, softmax, температура, KV-кэш. Отдельно про температуру - она вообще не про креативность и управляет выбором буквы уже после того, как модель закончила работу. Отдельно про галлюцинацию - показываю в цикле генерации место, куда физически невозможно вставить "не знаю". Плюс расчёт потолка для встроенного языка, замер цены размера модели и история про метод платформы, которого не существует.

20.08.2026    4479    nedomolkov.ivan    11    

20

Инструментарий разработчика Нейросети Программист 1С 8.3 Бесплатно (free)

Стенд, на котором языковую модель видно изнутри: настоящий трансформер посчитан с нуля на встроенном языке, без внешних компонент, ONNX, Native API и обращений наружу. Три кнопки: полный ответ с отчётом о числе умножений и секундах, один проход модели с вероятностями всех 36 символов алфавита столбиком, и разбор устройства - алфавит, номера токенов, размерности. Поле температуры показывает, что выбор буквы делает не сама модель, а код снаружи: при нуле ответ повторяется слово в слово, при пятёрке текст рассыпается на слоги. В комплекте два файла: модель на 21 920 параметров отвечает за 7-13 секунд, вчетверо более крупная примерно за 28. Веса лежат макетом внутри, скачивать и настраивать нечего. Знаний о мире у модели нет: она помнит сорок фраз про объекты 1С, и на вопрос вне этого набора отвечает бессмыслицей с той же уверенностью.

20.08.2026    3437    79    nedomolkov.ivan    0    

15

Нейросети Программист Бесплатно (free)

Код от агента выглядит хорошо, но между «агент выдал код» и «код работает в боевой базе» лежит дистанция, которую никто не проходит за вас. Как я обвесил её конвейером из семи ролей на боевой 1С:БП КОРП с БИТ.ФИНАНС: устройство конвейера, почему «критично» у агента не значит «дефект», шесть промахов, прошедших конвейер насквозь, один дефект, доехавший до боевой базы, и честный список того, чего я не измерял.

19.08.2026    1723    VlaMax    34    

12

Распознавание документов и образов Программист Пользователь 1С 8.3 1С:Библиотека стандартных подсистем Абонемент ($m)

Кроссплатформенный инструмент для распознавания QR-кода с экрана вашего монитора.

1 стартмани

14.08.2026    732    5    SerVer1C    0    

13
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. akR00b 26 05.08.26 11:04 Сейчас в теме
Интересный кейс +
2. G_100802897175107255412 32 05.08.26 11:50 Сейчас в теме
(1) Спасибо! Если будете пробовать на своих документах — интересны в первую очередь случаи, где распознавание ошибается. По ним и настраиваются пороги.
3. nedomolkov.ivan 164 06.08.26 05:05 Сейчас в теме
Спасибо за честный разбор. Отдельно — за то, что оговорка «пороги откалиброваны на двух документах» стоит в самом тексте, а не появляется в комментариях после чужого вопроса.

Добавлю с соседнего поля. У нас была не первичка, а свёртка каталога: 1 622 фотографии товаров в 289 визуальных сегментов мультимодальной моделью. Задача другая, а три вывода совпали почти дословно.

Про self-consistency. Двойной вызов у нас тоже не выжил, и причина, кажется, глубже экономии токенов: согласие модели с самой собой — не то же самое, что правильность. Перепутанные продавец и покупатель — ошибка систематическая, она про то, как модель читает вёрстку, и на втором вызове она уверенно повторится. Двойной вызов ловит шум, а не смещение; платить за него вдвое осмысленно там, где ошибки случайные, а не там, где модель стабильно понимает документ неправильно.

Про якорь. Его роль у нас играл независимый признак из учётной системы — то, чего на картинке не видно вообще. Пока сверка шла «модель против самой себя», ошибки проезжали; внешний детерминированный источник сделал их видимыми. И он у нас тоже со временем переехал из проверки в первичный путь — ровно ваш сюжет про подпорку, ставшую несущей конструкцией.

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

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

Вопрос по маршрутизации. Отказ при доле слабых блоков выше 30 % — он окончательный, или пользователь может его продавить? У нас честное «переснимите» экономило деньги, но собирало заметно больше раздражения, чем плохой результат с предупреждением: человек читает это как «программа даже не попыталась». В итоге отказ оставили, но с принудительным запуском и явной пометкой на результате.
4. G_100802897175107255412 32 06.08.26 07:33 Сейчас в теме
(3) Спасибо за развёрнутый разбор, это редкий случай, когда комментарий добавляет к статье больше, чем часть самой статьи.
Про self-consistency вы сформулировали точнее, чем я. Я списывал отказ от него на цену, а причина глубже: двойной вызов ловит шум, а не смещение. Перепутанные стороны — как раз смещение, оно воспроизводится на втором вызове с той же уверенностью. То есть инструмент был не дорогой, а не тот. Заберу эту формулировку.
Про якорь и внешний детерминированный источник — да, совпадение сюжета почти дословное. У меня в этой роли выступила связка координат OCR и запроса в справочник по ИНН: и то, и другое не зависит от того, что модель «увидела». Пока проверка шла моделью по модели, ошибки проезжали.
Про обрыв JSON на длинных ответах — у меня этого нет по случайной причине: позиции извлекаются не одним куском. Но грабля из той же семьи знакома по Excel-пути: модель для одной и той же структуры возвращает то словарь, то список. Тоже лечится не ретраем, а тем, что код готов к обоим вариантам. Ваш вывод «предел длины оказался жёстче качества зрения» — беру на заметку, при росте табличной части я в это упрусь.
Теперь по вопросу, он самый ценный.
Сейчас отказ окончательный: выше 30% слабых блоков — ни одна модель не вызывается, пользователь получает «переснимите». Логика была про деньги и про то, что правдоподобный мусор опаснее явного отказа.
Но ваше наблюдение про раздражение звучит убедительно, и я его не проверял — у меня просто не было столько пользователей, чтобы это увидеть. «Программа даже не попыталась» — действительно другое переживание, чем «попыталась и честно предупредила». Ваш компромисс — отказ по умолчанию плюс принудительный запуск с пометкой на результате — выглядит правильным решением: сохраняет экономию в типичном случае и оставляет человеку контроль.
Возьму в ближайшую доработку. Уточню один момент, если не сложно: пометка на результате у вас была на уровне документа целиком или по конкретным полям? У меня уверенность считается по полям, и хочется понять, стоит ли в таком режиме глушить её всю разом или помечать выборочно.
5. nedomolkov.ivan 164 06.08.26 08:06 Сейчас в теме
(4) «Не дорогой, а не тот» — заберу и я эту формулировку. Связка «координаты OCR + справочник по ИНН» сильная: детерминированный якорь вне модели ловит смещение там, где проверка «модель по модели» проезжает с той же уверенностью. Про JSON на длинных ответах — да, извлекать не одним куском и есть обход; ещё помогает просить модель отдавать по одной позиции за раз, а не весь массив разом. Спасибо за предметный разговор — на площадке это редкость.
Для отправки сообщения требуется регистрация/авторизация