Разбор задачи

Поиск по технической документации предприятия

Действующая редакция находится по децимальному номеру, а не выясняется обходом папок, архива и шкафов

Проверяется: словари обозначений и правила разбора

ПромышленностьРаботаем по NDA

Задача

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

Где ломается

Что съедает срок и бюджет на самом деле

Почти никогда — не модель. Ниже места, из-за которых такие проекты встают, и что мы с каждым делаем.

Сканы разного качества

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

Смысл чертежа находится в основной надписи, спецификации и выносках, а не в сплошном тексте

Штамп извлекается как структура — обозначение, наименование, литера, лист, изменение, — иначе документ не находится по децимальному номеру, то есть по единственному способу, которым его ищут.

Обозначения записывают по-разному

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

Действующая редакция чертежа — это чертёж плюс все извещения об изменениях к нему

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

Ограничение, которое определяет решение

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

Работы, требующие лицензии, выполняет организация-лицензиат, мы работаем в связке с ней в своей части.

Как проверить, что работа сделана

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

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

Пороги по каждой из трёх проверок записываются в акт до начала работ.

О чём спросить любого подрядчика

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

Порядок работ по этапам

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

  1. Обход хранилищПрошли по местам хранения — сетевые папки, архив СЭД, бумажные шкафы — и описали, что где лежит. С архивариусом и конструкторами разобрали, как обозначается редакция, как оформляются извещения об изменениях и по каким признакам документ ищут на практике.
  2. Архитектура конвейераКонвейер разделили на распознавание, извлечение полей и индекс: основную надпись и спецификацию решили класть в поля, а не в общий текст, чтобы поиск по децимальному номеру был точным. Смысловой поиск по тексту вынесли отдельно, а извещения привязали к документу так, чтобы они меняли признак действующей редакции.
  3. Сборка поискаСначала подняли распознавание сканов и извлечение основной надписи, затем нормализацию обозначений по словарям, затем привязку извещений и объединение точного и смыслового поиска. Конвейер дозагрузки собирали и обкатывали на оборудовании заказчика.
  4. Проверка выдачиИскали документы по списку, собранному конструкторами, — и по децимальному номеру, и по описанию узла. Провалом считали выдачу отменённой редакции выше действующей и ненайденный документ при точном обозначении, даже если он находился по тексту.
  5. Передача архивуПередали поисковый сервис в контуре, правила разбора, словари обозначений, конвейер дозагрузки и исходники. Архив научили сам класть новые сканы и извещения в конвейер и проверять, что редакция сменилась.
Архитектура и стек

Как это устроено внутри

Конвейер разбит на узлы: приёмник новых файлов, распознаватель на OpenCV и Tesseract, извлекатель основной надписи и спецификации, индексатор. Узлы связаны RabbitMQ, а синхронные обращения идут по gRPC; распознавание вынесено отдельным сервисом с собственным пулом процессов, потому что скан большого формата занимает узел на минуты и в общем потоке блокировал бы дозагрузку остальных документов. Поля основной надписи, децимальные номера и связи с извещениями об изменениях лежат в PostgreSQL, векторы описаний — в pgvector рядом, чтобы точный поиск по обозначению и смысловой по тексту собирались одним запросом без второго хранилища и без рассинхронизации индексов. Модели подняты через ONNX Runtime на оборудовании заказчика; при падении узла сообщение возвращается в очередь и документ переиндексируется целиком, частичный разбор в индекс не попадает.

Стек
  • C++
  • gRPC
  • PostgreSQL
  • pgvector
  • RabbitMQ
  • Docker
  • OpenCV
  • Tesseract
  • ONNX Runtime

Похожая задача у вас?

Разберём её на созвоне за 40 минут: назовём объём работ, ограничения контура и по каким числам вы будете принимать результат. Если задача не наша — скажем прямо.