Создание моделей распознавания на основе ИИ для b2b-маркетплейса «Платферрум»
Из всех кейсов внедрения ИИ в приоритетных отраслях промышленности в прошлом году 5,7% пришлось на проекты по цифровизации. Параллельно с этим есть тренд на развитие b2b-маркетплейсов: маркетплейсы уже заняли 70% доли онлайн-торговли в b2c, теперь тренд дошел и до бизнеса. Платферрум - маркетплейс металлопроката, объединивший оба тренда. В этом кейсе расскажем, как помогли внедрить модели распознавания на основе искусственного интеллекта и сколько видов продукции из железа теперь знает ИИ.
Клиент
Платферрум — маркетплейс по продаже металлопроката. Сервис запустился в октябре 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.
В итоге были созданы два модуля, которые научились распознавать данные в карточках от поставщиков, сопоставлять их с эталонными карточками и не ломаться на фразах, которые не относятся к карточке, например, к приветствиям или пожеланиям хорошего дня.
Поиск данных в таблицах сводится к нахождению колонки и строки с нужным кодом и текстовым описанием. Применение ML для такого поиска в данном случае избыточно и привело бы к лишним ошибкам, поэтому мы сконцентрировались на задаче распознавания таблиц.
Детекция таблиц с границами — частая задача компьютерного зрения, но здесь нам прибавилась еще одна проблема — найти таблицу без границ и правильно распознать ячейки. Применить алгоритмы распознавания текста напрямую к документу нельзя, так как важно сохранить структуру таблиц для последующей обработки. Необходимо учитывать, что pdf - формат не простой, страницы могут иметь разную пространственную ориентацию и небольшой угол поворота, документы могут быть читаемыми и не требующими распознавания с помощью ML. Следовательно, требуется дополнительная предобработка.
Для решения задачи распознавания подготовили и разметили датасет, включающий в себя классы таблицы и ячейки, и обучили на нем соответствующие модели детекторов. В итоге получили следующий пайплайн:
1. Препроцессор — читает входной pdf-документ и делает его предобработку:
- Определяет тип: скан или нет
- Если перед нами скан, то разбивает его на изображения страниц в оттенках серого, делает коррекцию ориентации страницы и угла поворота
- Если у нас читаемый pdf (searchable-pdf), то парсинг производится средствами библиотеки pymupdf и следующие этапы отбрасываются.
2. Детектор таблиц на базе YOLOv8 — модель находит границы всех таблиц в документе и определяет их тип: четкие и нечеткие.
3. Детектор ячеек внутри таблицы:
- если границы у таблицы четкие, то применяется cv-алгоритм выделения границ и модель не требуется
- если границы у таблицы нечеткие, то применяется модель детектора границ ячеек на базе YOLOv5
4. Блок распознавания текста внутри ячеек с использованием EasyOCR состоит из двух моделей:
- предобученный детектор текста на базе модели CRAFT
- предобученная на русском языке модель распознавания текста на базе архитектуры Faster-RCNN.

Серьезной проблемой стала низкая производительность пайплайна: на обработку одного pdf-документа из нескольких страниц со сканами могло уходить до нескольких минут. Основное время тратилось на этап распознавания текста. Но нам удалось сделать частичную оптимизацию и повысить производительность в 2 раза через настройку EasyOCR моделей.
Во время разработки заметили особенность детектора: координаты ячеек на изображении определялись не в порядке их расположения слева направо и сверху вниз, а в порядке процента уверенности модели детектора. Когда поняли, что детектор работает так, сделали алгоритм, преобразующий координаты ячеек в координаты строк для анализа и создания сообщения.
В результате получился инструмент, позволяющий обрабатывать любые pdf-документы с финансовой отчетностью и автоматически извлекать из них нужные данные.

Результат
Модули исправно работают и выдерживают наплыв поставщиков, количество которых уже превысило 170. Ассортимент увеличивается, привлекая новых пользователей.
Рост платформы без внедрения ИИ и автоматизации процессов обошёлся бы в разы дороже, поэтому использование искусственного интеллекта — уже не дань моде, а необходимость. К 2030 году, по прогнозам Минэнерго, доля предприятий, которые используют искусственный интеллект в производстве, вырастет до 80%. Но уже сегодня в условиях конкурентного рынка и кадрового голода внедрение ИИ становится сильным преимуществом.