Цифровизация в промышленных масштабах: как и зачем внедряли ИИ в маркетплейсе металлопроката
Из всех кейсов внедрения ИИ в приоритетных отраслях промышленности в прошлом году 5,7% пришлось на проекты по цифровизации. Параллельно с этим есть тренд на развитие b2b-маркетплейсов: маркетплейсы уже заняли 70% доли онлайн-торговли в b2c, теперь тренд дошел и до бизнеса. Платферрум — маркетплейс металлопроката, объединивший оба тренда. В этом кейсе SimbirSoft расскажем, как помогли внедрить модели распознавания на основе искусственного интеллекта и сколько видов продукции из железа теперь знает ИИ.
Содержание |
Тренд, который сложно игнорировать
Тренд на цифровизацию нельзя не заметить и не ощутить его влияние на себе. Мы в Simbirsoft замечаем рост запроса заказчиков на внедрение технологий искусственного интеллекта для автоматизации и масштабирования производства. Все чаще появляются запросы по цифровизации документации, формированию базы знаний и обучения RAG-систем (это технологии искусственного интеллекта, которые отвечают на запросы пользователей, собирая информацию из разных источников) для общения с клиентами и для внутреннего пользования. Так, в 2023 году к нам с задачами на Data Science обратилась команда Платферрума.
Платферрум — маркетплейс по продаже металлопроката. Сервис запустился в октябре 2022 года и стал первым подобным проектом.
Маркетплейс Платферрум — это пространство, где встречаются всевозможные способы заполнения документации на товары: каждый поставщик заполняет описание товара в 1С или другой системе так, как привык и как ему удобно. Поэтому команда Платферрума встречала самые разные способы описания одного и того же товара. Так, арматуру можно записать как «арматура», а можно — «арм. 150», «арматура 150», «арм. желез. 150» и так далее. В первые месяцы после запуска Платферрума команда проекта справлялась с редактированием и нормализацией карточек товара вручную — их обрабатывали контент-менеджеры сайта.
Но когда количество поставщиков превысило 70, а количество предложений — 20 000, рук стало не хватать. Призвать поставщиков ввести одинаковые формулировки — вмешательство в их бизнес-процессы и потеря лояльности. Удобство поставщиков для маркетплейса в приоритете: не будет поставщиков — не будет ассортимента товаров, не будет ассортимента — не будет покупателей.
С ростом поставщиков растет количество новых данных и снижается пропускная способность системы. Есть три варианта решения проблемы: нанимать новых контент-менеджеров, но это растущие затраты на ФОТ. Подключить команду разработки проекта и внедрять ИИ самостоятельно — тратить ценный ресурс IT-отдела. Третий вариант — вынести задачу на аутстаф.
Задача для искусственного интеллекта
Команда SimbirSoft уже помогала с реализацией задач платформы, поэтому Платферрум обратились к нам с запросом на разработку двух ML (machine learning) модулей:
Модуль распознавания и сопоставления описаний товаров — это модуль, который анализирует заявки на покупку металлопродукции от поставщиков, ищет в них описание товаров и их количество, сопоставляет найденные карточки товаров поставщиков (КТП) с соответствующими эталонными карточками (ЭКТ) из базы, и получает категорию товара. Если распознать товар получилось, то карточка от поставщика добавляется в базу и привязывается к эталонной карточке. Если нет, то принимается решение о добавлении новой эталонной карточки.
Модуль распознавания таблиц в pdf-документах — модуль, который извлекает информацию для скоринга из финансовой отчетности поставщиков, присылаемой в формате pdf. Как правило, финансовая отчетность клиентов представлена в виде таблиц, поэтому задача ИИ для скоринга разбивается на 2 этапа: распознавание таблиц и поиск в них нужных данных.
Трудности работы с номенклатурой металлопродукции
Когда мы начали работать с модулем, в базе уже было около 120 000 КТП, сопоставленных ручным или алгоритмическим способом через подготовку конфигураций для каждого поставщика. Составление конфигурации — неудобство и лишний ручной труд, поэтому внедрение модуля автоматического сопоставления было единственным оптимальным решением.
Каждая КТП и ЭКТ содержит в себе краткое текстовое описание и набор определенных атрибутов, характеризующих товар.
Описание карточки:
«Труба электросварная прямошовная 18х1х6000 AISI 304 ГОСТ 11068-81»
Атрибуты:
«Труба электросварная прямошовная» — категория товара
«18х1х6000» — размер
«AISI 304» — марка стали
«ГОСТ11068-81» — собственно, ГОСТ.
Задача распознавания КТП непростая, потому что очередность записи атрибутов может меняться, их набор у каждой категории товара свой. Части данных может не хватать, а способ записи атрибута — разный. А еще слова в этих документах часто сокращают, упрощают запись списка товаров (например, объединяют наименования товаров) и просто допускают ошибки.
Сопоставление карточек осложняется тем, что в базе данных содержится около 30 000 эталонных карточек с очень похожими описаниями товаров. Иногда разница между описаниями сводится к одному символу, который обычно относится к размеру, ГОСТу или марке стали. Также в базе могут встречаться дубликаты и карточки с некорректным описанием.
Задачу усложняет разный формат заявок от поставщиков: текстовых (.txt), в виде документов .doc, .docx, .xlsx, .xls, изображений (.jpg, .png) или даже .pdf.
«Балка 20Ш1 СТО АСЧМ 2093 (С245) L=5370 7 шт»
«Трубы (подробный перечень в прикрепленном файле) объем договорной»
«Труба НКТ 102х6,5х9500 мм с муфтой и резьбой гр. Д ст.20 ГОСТ 633-80 1,5 тн»
«Труба б/ш внутренний диаметр 340 мм стенка не менее 12 мм объем договорной»
«Нужны обрезки труб, б\у, чистые, восстановленные, лежалые без овалов, замятий, эллипсов без изоляции. x000D_108*5 мм-1 м, 108*9 мм-1 м, 219*6 мм-1 м, 219*9 мм-1 м, 530*8 мм-1 м, 530*12 мм-1 м, 820*10-1 м, 820*12 мм-1 м, 1220*12 мм-1 м, 820*19 мм_x000D_1 м,_x000D_1220*12-1 м,1220*19 мм-1 м объем договорной»
Каждый формат требовал особого подхода:
- Если заявка в виде текста, в ней может быть дополнительная информация о поставщике, а не только описание товара. Чтобы ее отфильтровать, нужна интеллектуальная обработка текста.
- Если заявка — excel-файл, то нужно извлечь необходимые данные из таблиц. Здесь требуется правильный перевод таблиц в текстовый формат без нарушения структуры документа.
- Если заявки представлены в виде изображений, то это, как правило, сканы или фото заявок, которые нужно распознать и перевести в текст.
- Если заявку прислали как pdf-файл, это может быть как скан, так и текст. Здесь нужна обработка изображений и текста.
Необходимо было обучить языковые модели понимать тонкости производственной номенклатуры.
Как устроена схема распознавания
К проблеме распознавания товаров в текстовых заявках мы подошли как к задаче распознавания именованных сущностей (NER). В нашем случае это описания товаров, их количество и единицы измерения.
Решению такой задачи можно обучить любую NLP-модель. Выбор остановили на BERT-подобных русскоязычных моделях вроде rubert-tiny2 и sbert_large_nlu_ru, потому что они выделяются хорошим соотношением производительности и качества. Также для решения этой задачи привлекали большие языковые модели (LLM) вроде YandexGPT и LLama. Для YandexGPT основной проблемой стало нахождение универсального промпта, а для LLama — высокие требования по вычислительным ресурсам и трудность интеграции в существующую инфраструктуру.
Для обучения модели разметили специальный датасет, включающий около 4000 текстовых заявок от различных поставщиков. Для борьбы с переобучением модели применяли методы предобработки и аугментации данных, регуляризацию дропаутом, ранний останов.
Обучение модели строилось на базе pytorch, pytorch-lightning, transformers. Выбор в пользу экосистемы pytorch сделали из соображений популярности фреймворка, наличия русскоязычных предобученных моделей и большого комьюнити.
Заявки могут быть не только в виде готового текста, но и в виде файлов, поэтому нам нужно было реализовать механизмы их парсинга. Для этого мы использовали ряд библиотек python и инструментов:
- .doc, .docx - docx2txt, python-doc, libreoffice
- .xls, xlsx - pandas
- .pdf - pymupdf, pdf2image
В документах может быть записан не только текст, но и изображения, например, снимки заявок с различными пометками, или сканы. Поэтому текст сначала нужно распознать OCR-моделью, прежде чем скормить его NLP-модели. Для этого мы использовали популярный инструмент для распознавания текста Tesseract, так как у него достаточно высокая производительность, несмотря на то, что он уступает в точности другим аналогам вроде EasyOCR.
Часто заявки представлены в виде таблиц, в каждой строке которой прописано наименование товара, а количества и единицы измерения разнесены по отдельным колонкам. В таком случае применение NLP-модели не обязательно, потому что мы можем определить сущности просто по названиям колонок, если они есть. Тогда было бы очень кстати иметь инструмент для распознавания таблиц с изображений и сканов, так как они часто встречаются, например, в pdf-документах. Этот функционал мы позаимствовали из второго модуля для скоринга, описанного ниже.
В результате схема распознавания товаров была такой:
Нашли товары, как теперь сопоставить с базой
Проблему сопоставления КТП и ЭКТ решали, как задачу классификации товаров, где каждый товар представляет собой отдельную категорию данных. Таким образом, если в базе около 30000 ЭКТ, то у нас будет столько же категорий. В качестве сэмплов внутри категории будет выступать одна ЭКТ и все КТП, сопоставленные с ней, так как это просто различные способы записи одного и того же товара.
Для обучения модели мы использовали уже сопоставленные 120000 КТП, имеющиеся в базе данных. Несложно подсчитать, что в среднем на одну категорию приходится всего по 4 примера — это очень мало. При этом частота встречаемости каждого товара распределена неравномерно: какие-то товары, вроде листов стали, очень популярны, а другие, вроде стального клапана, имеют только одну запись. Поэтому для избежания переобучения модели мы отсеяли редко встречающиеся товары и применили методы аугментации данных.
Обучали модель классификации классическим способом: взяли предобученную rubert-tiny2, добавили к ней линейный слой с выходной размерностью равной количеству категорий, и слой softmax на выход. Но, прежде чем применять линейный слой, нужно сделать агрегацию выходных эмбедингов BERT. Например, путем комбинации усреднения и maxpool. После обучения модели классификации линейный слой отбросили и ближайшие товары находили по косинусному сходству (cosine similarity) между эмбедингами на выходе BERT.
В итоге были созданы два модуля, которые научились распознавать данные в карточках от поставщиков, сопоставлять их с эталонными карточками и не ломаться на фразах, которые не относятся к карточке, например, к приветствиям или пожеланиям хорошего дня.
Что там в pdf-ке
Поиск данных в таблицах сводится к нахождению колонки и строки с нужным кодом и текстовым описанием. Применение ML для такого поиска в данном случае избыточно и привело бы к лишним ошибкам, поэтому мы сконцентрировались на задаче распознавания таблиц.
Детекция таблиц с границами — частая задача компьютерного зрения, но здесь нам прибавилась еще одна проблема — найти таблицу без границ и правильно распознать ячейки. Применить алгоритмы распознавания текста напрямую к документу нельзя, так как важно сохранить структуру таблиц для последующей обработки. Необходимо учитывать, что pdf-формат не простой, страницы могут иметь разную пространственную ориентацию и небольшой угол поворота, документы могут быть читаемыми и не требующими распознавания с помощью ML. Следовательно, требуется дополнительная предобработка.
Для решения задачи распознавания подготовили и разметили датасет, включающий в себя классы таблицы и ячейки, и обучили на нем соответствующие модели детекторов. В итоге получили следующий пайплайн:
- Препроцессор — читает входной pdf-документ и делает его предобработку:
- определяет тип: скан или нет
- Если перед нами скан, то разбивает его на изображения страниц в оттенках серого, делает коррекцию ориентации страницы и угла поворота
- Если у нас читаемый pdf (searchable-pdf), то парсинг производится средствами библиотеки pymupdf и следующие этапы отбрасываются.
- Детектор таблиц на базе YOLOv8 — модель находит границы всех таблиц в документе и определяет их тип: четкие и нечеткие.
- Детектор ячеек внутри таблицы:
- если границы у таблицы четкие, то применяется cv-алгоритм выделения границ и модель не требуется
- если границы у таблицы нечеткие, то применяется модель детектора границ ячеек на базе YOLOv5
- Блок распознавания текста внутри ячеек с использованием EasyOCR состоит из двух моделей:
- предобученный детектор текста на базе модели CRAFT
- предобученная на русском языке модель распознавания текста на базе архитектуры Faster-RCNN.
Серьезной проблемой стала низкая производительность пайплайна: на обработку одного pdf-документа из нескольких страниц со сканами могло уходить до нескольких минут. Основное время тратилось на этап распознавания текста. Но нам удалось сделать частичную оптимизацию и повысить производительность в 2 раза через настройку EasyOCR моделей.
Во время разработки заметили особенность детектора: координаты ячеек на изображении определялись не в порядке их расположения слева направо и сверху вниз, а в порядке процента уверенности модели детектора. Когда поняли, что детектор работает так, сделали алгоритм, преобразующий координаты ячеек в координаты строк для анализа и создания сообщения.
В результате получился инструмент, позволяющий обрабатывать любые pdf-документы с финансовой отчетностью и автоматически извлекать из них нужные данные.
Результаты
Модули исправно работают и выдерживают наплыв поставщиков, количество которых уже превысило 170. Ассортимент увеличивается, привлекая новых пользователей.
Рост платформы без внедрения ИИ и автоматизации процессов обошелся бы в разы дороже, поэтому использование искусственного интеллекта — уже не дань моде, а необходимость. К 2030 году, по прогнозам Минэнерго, доля предприятий, которые используют искусственный интеллект в производстве, вырастет до 80%. Но уже сегодня в условиях конкурентного рынка и кадрового голода внедрение ИИ становится сильным преимуществом.