En
Проекты Вакансии Блог

Создание моделей распознавания на основе ИИ для 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-документах. Этот функционал мы позаимствовали из второго модуля для скоринга, описанного ниже.

В результате схема распознавания товаров была такой:

unnamed (2).png

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

Таким образом, если в базе около 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.

unnamed (1).png

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

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

В результате получился инструмент, позволяющий обрабатывать любые pdf-документы с финансовой отчетностью и автоматически извлекать из них нужные данные.


unnamed.png

Результат

Модули исправно работают и выдерживают наплыв поставщиков, количество которых уже превысило 170. Ассортимент увеличивается, привлекая новых пользователей. 

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


Другие работы
Создание приложения управления сном для компании «Аскона»
Создание единой системы авторизации для крупной российской компании
Анализ процессов крупной производственной компании
Разработка мобильного приложения для «Подели»
Усиление команды по разработке системы управления грузоперевозками для компании «ТЕХНОНИКОЛЬ»
Автоматизация финансовой аналитики: модернизация сервиса
Разработка корпоративного портала для обучения сотрудников крупной технологической компании
Развитие приложения Askona Sleep для компании «Аскона»
Создание приложения управления сном для компании «Аскона»
Создание единой системы авторизации для крупной российской компании
Анализ процессов крупной производственной компании
Разработка мобильного приложения для «Подели»
Усиление команды по разработке системы управления грузоперевозками для компании «ТЕХНОНИКОЛЬ»
Автоматизация финансовой аналитики: модернизация сервиса
Разработка корпоративного портала для обучения сотрудников крупной технологической компании
Развитие приложения Askona Sleep для компании «Аскона»
Оставьте заявку на проект
Оставьте контакты, чтобы обсудить проект и условия сотрудничества, или позвоните: 8 800 200-99-24
Прикрепить файл до 10Мб
Файл выбран
Можно прикрепить один файл в формате: txt, doc, docx, odt, xls, xlsx, pdf, jpg, jpeg, png.

Размер файла до 10 Мб.
Написать нам
Оставьте контакты, чтобы обсудить проект и условия
сотрудничества, или позвоните: 8 800 200-99-24
Прикрепить файл до 10Мб
Файл выбран
Можно прикрепить один файл в формате: txt, doc, docx, odt, xls, xlsx, pdf, jpg, jpeg, png.

Размер файла до 10 Мб.
Оставьте свои контакты
SimbirSoft регулярно расширяет штат сотрудников.
Отправьте контакты, чтобы обсудить условия сотрудничества.
Прикрепить резюме, до 10 Мб
Файл выбран
Можно прикрепить один файл в формате: txt, doc, docx, odt, xls, xlsx, pdf, jpg, jpeg, png.

Размер файла до 10 Мб.
Написать нам
Расскажите, какие задачи сейчас на вашем проекте.
Проконсультируем и предложим подходящих специалистов, а также сориентируем по ставкам на аутстаф.
Направление
Количество специалистов
Middle
TeamLead
Senior
TechLead
Прикрепить файл до 10Мб
Файл выбран
Можно прикрепить один файл в формате: txt, doc, docx, odt, xls, xlsx, pdf, jpg, jpeg, png.

Размер файла до 10 Мб.
Экспресс-консультация
Заполните все поля формы.
Эксперт свяжется с вами в течение рабочего дня.
Тематика
Прикрепить файл до 10Мб
Файл выбран
Можно прикрепить один файл в формате: txt, doc, docx, odt, xls, xlsx, pdf, jpg, jpeg, png.

Размер файла до 10 Мб.
Порекомендуйте друга — получите вознаграждение!
  • Java-разработчик
  • iOS-разработчик
  • QA Engineer Fullstack (Python)
  • DevOps-инженер
  • Разработчик на C++
  • 1С-архитектор
  • Data Scientist (временные ряды)
  • SDET (Python)
  • Архитектор Node.js
  • Node.js-разработчик
  • SDET (Java)
  • DBA
  • QA Engineer Fullstack (Java/Kotlin)
  • Специалист по кадровому делопроизводству
  • Бизнес Ассистент
  • Разработчик С++ (Embedded)
  • PLC разработчик
  • React native-разработчик
  • 1C-Разработчик (Внутренний проект)
Прикрепить резюме, до 10Мб
Файл выбран
Можно прикрепить один файл в формате: txt, doc, docx, odt, xls, xlsx, pdf, jpg, jpeg, png.

Размер файла до 10 Мб.