Как свернуть дубли карточек номенклатуры в 1С нейросетью: сегментация по фотографии
Иван Недомолков · Опубликовано:
Знакомая картина: открываешь отчёт по остаткам, а там сорок строк одной и той же модели. Разные партии, размеры, поставки - у каждой свой код, артикул и карточка. Для учёта это правильно, у каждой позиции свой вес и себестоимость. Для аналитики беда: спланировать закупку невозможно, залежавшееся не видно, а любой отчёт по номенклатуре растягивается в простыню, где половина строк дублирует друг друга по сути.
Свести такие карточки текстом обычно не выходит, и ниже разберём почему. А потом - метод, который группирует товары по единственному признаку, который у одинаковых изделий действительно совпадает: по тому, как они выглядят. Это визуальная сегментация номенклатуры нейросетью со зрением. Статья про сам метод: когда он применим, из чего собирается и на чём спотыкается. Разбор конкретного проекта с цифрами - в кейсе про 1 622 фотографии, а промпты и код классификатора - в статье на Инфостарте.
Когда текст не спасает
Первое, что пробуют все: сгруппировать по наименованию, артикулу или папке справочника. На дублях моделей это почти всегда не работает, и вот из-за чего:
- в наименовании зашиты партия, размер и вес - “Кольцо обручальное 3.24г р.17 п.0825” и “Кольцо обручальное 3.51г р.19 п.0912” для строкового сравнения это две разные строки, а для человека одна модель;
- артикулы у каждой партии свои - они идентифицируют поставку, а не внешний вид;
- папки справочника organized по поставщикам и коллекциям, а не по тому, как товар выглядит: одинаковые изделия из двух коллекций лежат в разных ветках.
Общий признак ситуации: товары объективно одинаковые, но ни одно текстовое поле в базе этого не отражает. Единственное, что у них реально совпадает, - изображение. Значит, и группировать надо по изображению.
Почему не руками
“Разложить фотографии на кучки одинаковых” звучит как посильная ручная работа, пока не посчитаешь объём. Это задача попарного сравнения: каждая фотография с каждой. Для 1 622 фотографий честное “каждая с каждой” - это 1 314 631 пара. На базе в 12 000 снимков - за 70 миллионов пар.
Даже разумный человек, который не сравнивает всё со всем, а раскладывает по кучкам на глаз (пусть 2 минуты на фото), потратит около 54 часов на срез в полторы тысячи снимков и порядка 400 часов на полную базу. Это два с половиной месяца работы, которую придётся повторять после каждого поступления. И есть проблема хуже трудозатрат: воспроизводимость. Два сотрудника разложат один ассортимент по-разному, а один и тот же сотрудник в понедельник и в пятницу - тоже по-разному. Ручная сегментация не масштабируется и не повторяется, поэтому как процесс она не живёт.
Метод: две обработки 1С и нейросеть между ними
Рабочая схема - конвейер из пяти звеньев. По краям две обработки 1С, посередине нейросеть со зрением.
- Выгрузка. Внешняя обработка достаёт двоичные данные присоединённых к номенклатуре файлов штатным API, складывает изображения в каталог и пишет файл соответствия: код, наименование, артикул, путь в иерархии справочника. Ничего в базе не меняется, только чтение.
- Визуальная классификация. Каждое фото уходит в модель со зрением с промптом “эксперт по визуальной классификации”: определить тип изделия, форму, вставки, конструкцию - 2-5 слов на русском. На выходе метка вида “Кольцо фасонное ажурное” или “Цепь плетение Бисмарк”.
- Консолидация синонимов. Модель на разных пачках формулирует одно и то же по-разному (“Цепь Бисмарк” и “Цепь плетение Бисмарк”). Второй, текстовый проход схлопывает синонимы - с предпросмотром и жёсткими запретами (об этом ниже).
- Выбор обложки. У сегмента из 180 позиций 180 фотографий, а в интерфейс нужна одна. Модель выбирает лучшую по резкости, освещению и чистоте фона.
- Импорт в 1С. Вторая обработка создаёт иерархический справочник сегментов и заполняет регистр сведений “номенклатура → сегмент”. Дальше привязка доступна в любом запросе и отчёте как обычный объект базы.
Важно, что нейросеть здесь - только одно звено из пяти, и оно отвечает за узкую задачу “посмотри на картинку и назови, что на ней”. Всё остальное - обычная работа с 1С и текстом, где никакой магии нет и всё детерминировано. По той же схеме устроено распознавание счетов и накладных: модель читает скан, а спорные поля до загрузки в учёт уходят на проверку сотруднику.
Три правила, от которых зависит качество
Метод простой на схеме, но качество сегментов держится на нескольких неочевидных решениях. Их стоит знать до того, как запускать.
Не отдавайте модели то, что уже есть в реквизитах. Соблазн попросить нейросеть определить заодно металл и пробу - и это ошибка. Отличить белое золото 750 от серебра 925 по фотографии почти невозможно, модель начнёт гадать и ошибаться. При этом металл и проба точно лежат в учёте. Поэтому нейросети запрещают упоминать материал: она отвечает за визуальный дизайн, а металл с пробой подставляются из реквизитов 1С одним пакетным запросом. Итоговое имя собирается из двух источников: “Кольцо обручальное гладкое” плюс “Золото 750”. Правило общее: модель классифицирует только то, чего в базе нет, всё остальное берётся из учёта, где оно достоверно.
Показывайте модели только картинку, не наименование. Если передать вместе с фото ещё и название, модель цепляется за название коллекции и раскладывает одинаковые изделия из разных коллекций по разным сегментам. Классификация должна идти строго по визуалу, иначе она наследует ровно тот текстовый мусор, от которого мы уходим.
Синонимы схлопывайте отдельным проходом с запретами. Проход консолидации обязан иметь жёсткие ограничения: не объединять разные типы изделий, не сливать разные камни. И режим предпросмотра - сначала показать список замен, потом применять. Без предпросмотра одна неудачная склейка тихо портит десяток сегментов, и найти её потом трудно.
На чём метод спотыкается
Честный раздел, потому что именно здесь уходит инженерное время, и именно это отличает работающий пайплайн от демонстрации на десяти картинках.
- Суточные лимиты API. Прогон на несколько часов упирается в лимит запросов. Лечится возобновлением с места: результат сохраняется после каждой пачки, при старте читается готовое, обрабатываются только новые фото. Это же делает прогон бесплатным - он растягивается под бесплатный тариф модели.
- Обрезанный JSON. Модель упирается в лимит токенов ответа и возвращает оборванный на середине массив. Нужен устойчивый разбор в несколько ступеней: снять markdown-обёртку, распарсить как есть, вырезать массив из текста, достроить обрезанный JSON до последнего целого объекта.
- Один снимок на разных карточках. Байтово одинаковый файл привязан к нескольким позициям. Склейка по хэшу изображения до нейросети гарантирует, что такие точно попадут в один сегмент, и заодно экономит вызовы.
- Нетипичные ракурсы. На плохом кадре модель ошибётся. Правильное поведение - оставить товар без сегмента и отправить в ручной разбор, а не проставить наугад. Тогда ошибки локализованы и видны, а не размазаны по базе.
Отдельно про тех, кто торгует на маркетплейсах. Там та же боль всплывает с другой стороны: номенклатуру приходится сопоставлять с карточками площадки, и сорок дублей одной модели превращаются в сорок ручных сопоставлений. Как это устроено на практике и почему сопоставление обычно оказывается самой долгой частью запуска - в разборе интеграции 1С с Каспи. В нашей интеграции 1С с Kaspi сопоставление номенклатуры с карточками площадки идёт отдельным этапом до запуска, поэтому дубли лучше снять раньше него.
И общий принцип безопасности: весь конвейер гоняется на копии, перед каждым необратимым шагом снимается состояние, в продуктив переносится только принятый результат отдельной обработкой. Сегменты и привязка - обычные объекты 1С, после прогона никакие внешние сервисы не нужны, результат живёт бессрочно.
Что это даёт на цифрах
На реальном прогоне по срезу ювелирного ассортимента метод свернул 1 622 фотографии в 289 визуальных сегментов, отчёт по остаткам сократился в 5,6 раза, а инференс обошёлся в 0 ₸ за счёт бесплатного тарифа и возобновляемого прогона. Верхний сегмент “Кольцо обручальное гладкое” заменил в отчёте 180 отдельных строк, десять верхних сегментов свернули почти половину среза. Подробная раскладка по показателям - в кейсе.
Побочный эффект, который часто оказывается ценнее
Сегменты обычно затевают ради отчётов, но у них есть применение дороже. Сегмент - это готовый шаблон для заведения нового товара.
Пришла новая партия той же модели: менеджер создаёт карточку, жмёт “заполнить из сегмента”, выбирает сегмент по фотографии - и наименование, реквизиты, дополнительные свойства и фото переносятся автоматически, фото при этом ссылкой на тот же файл, без раздувания томов хранения. У каждого свойства есть флаг “в сегмент”: отмеченные значения записываются в образец и подставляются следующим товарам, образец дообучается по мере работы. То есть визуальная сегментация из разовой уборки в отчётах превращается в постоянный ускоритель ввода номенклатуры.
Если карточки потом уходят на сайт или маркетплейс, а характеристики там пустые или описания одинаковые, это уже работа с текстами по проверенным исходным данным: контент для сайта и карточек товаров.
Где метод применим, а где нет
Визуальная сегментация окупается там, где у товара есть значимый внешний вид и много карточек-дублей одной модели: ювелирка, одежда и обувь, аксессуары, товары для дома, что угодно, где “одинаковость” видно глазом, а в учёте она рассыпана по партиям и размерам. Чем больше база и чем чаще поступления, тем сильнее эффект.
Не стоит браться там, где товар неразличим по фото (крепёж, сырьё, ГСМ) или где дубли уже нормально сводятся текстом - если у вас чистый артикул модели, отдельный от партии, нейросеть не нужна, хватит группировки запросом. Метод решает именно случай “одинаковое видно, но ни одно поле этого не хранит”.
Коротко
- Дубли карточек одной модели текстом не сводятся: в наименовании партия и размер, артикулы у всех свои, папки по поставщикам.
- Единственный общий признак одинаковых изделий - внешний вид, поэтому группировать надо по фотографии.
- Руками это не масштабируется и не воспроизводится: миллионы пар и разный результат у разных людей.
- Рабочая схема - две обработки 1С по краям и нейросеть со зрением в середине, классификация строго по картинке.
- Качество держат три правила: не спрашивать у модели то, что есть в реквизитах; не показывать наименование; синонимы схлопывать отдельным проходом с предпросмотром.
- Результат - обычные объекты 1С, живут бессрочно, а сегмент заодно становится шаблоном для ввода новых товаров.
Как мы делаем это под ключ, с пилотом на вашем срезе и передачей исходников - на странице AI-сегментации товаров по фото. Технический разбор с промптами и учебным Python-скелетом классификатора - на Инфостарте. А как всё это выглядело на живом проекте, с граблями и снимками интерфейса, - в кейсе про 1 622 фотографии. Другие задачи, где нейросеть снимает ручную работу с обращениями, документами и каталогом, собраны в разделе Нейросети для бизнеса.