Как нормализовать каталог товаров с помощью ИИ: зафиксируйте схему, приведите единицы, словари и идентификаторы к ней, сохранив исходные строки. Ниже — рабочий порядок: фиксация схемы и копии, строковые SKU, словарь цветов, единица объёма, готовый CSV с промптом, карантин конфликтов, проверка числа строк и согласование исключений перед импортом.
Зафиксировать схему и исходную копию
Сохраните исходный файл отдельно от результата и опишите целевую схему: поля, типы, единицы и допустимые значения. SKULaunch определяет нормализацию как приведение записей поставщиков к согласованному формату. Она сохраняет смысл имеющегося факта; установить отсутствующий факт требуется отдельно.
Целевая схема для товарного CSV обычно включает:
row_id— технический ключ строки, неизменяемый;sku— строка, ведущие нули значимы;name— название товара;capacity_ml— целое число в миллилитрах;color— значение из разрешённого словаря;material— значение из разрешённого словаря либо пусто;status— допуск или карантин;reason— причина решения.
Bulkbase рекомендует задавать обязательные поля, значения, единицы и правила проверки с учётом категории. Для нашего CSV заранее согласованы миллилитры и словарь цветов.
Bulkbase предлагает архивировать вход, результат, отчёт проверки и исключения. Сохраните их отдельными файлами, связанными обозначением версии.
Отдельно фиксируют границу задачи. Нормализация приводит к схеме уже существующие атрибуты. Обогащение добавляет сведения из внешнего подтверждённого источника. В обзоре на pxmatlas.com эти работы разделены: нормализация работает с неоднородными значениями поставщика, а заполнение пробелов по сходству относится к отдельной задаче с повышенным риском. Смешение двух задач в одном проходе мешает проверке.
Схема и копия — это ещё и договор с проверяющим. Когда колонки, типы и словари зафиксированы письменно, результат проверяется по значениям и письменным правилам.
Прочитать SKU как строки и сохранить ведущие нули
SKULaunch предупреждает о потере цифр идентификаторов в электронных таблицах и рекомендует текстовое хранение. Перед работой откройте исходник как текст: в нашем примере sku001 и sku1 различаются.
Правило для SKU формулируется коротко: sku читается как строка, 001 и 1 — разные значения. Это правило попадает и в схему, и в промпт, и в проверку результата.
В справке Google Merchant Center для продавцов сказано: используйте уникальное значение для каждого товара, применяйте SKU товара там, где это возможно, сохраняйте ID неизменным при обновлении данных. Там же указано: используйте один и тот же ID для одного товара в разных странах и языках. Эти требования совместимы с текстовым хранением: строка 001 остаётся 001 и в выгрузке, и в фиде.
Практический порядок для идентификаторов:
- Объявить
skuстроковым полем в схеме. - Запретить в промпте любые преобразования SKU: обрезку, приведение регистра, удаление пробелов внутри значимой части.
- Сохранить исходное значение SKU рядом с нормализованным, если нормализация всё же применялась.
- Проверить, что число уникальных SKU совпадает с ожидаемым.
Bulkbase советует хранить исходный и нормализованный идентификаторы. В нашей схеме изменение SKU запрещено, связь с каждой записью сохраняет row_id.
Если цифры уже утрачены, SKULaunch рекомендует повторно запросить данные у поставщика. Для нашего набора восстановление SKU не требуется: исходные значения доступны целиком.
Задать словарь цветов и единицу объёма
Два атрибута задают тон всей работе: цвет и объём. Цвет живёт в контролируемом словаре, объём — в одной единице измерения.
SKULaunch предлагает собрать варианты атрибута, выбрать канонические значения и записать соответствия. Для нашего набора разрешены синий и красный; blue сопоставляется с синим. Бордо отсутствует в согласованном словаре.
SKULaunch рекомендует одну единицу на атрибут. В нашем поле capacity_ml хранятся миллилитры; исходный текст объёма остаётся в копии входа.
Словарь и единица объёма в учебном примере выглядят так:
| Атрибут | Тип | Допустимые значения | Правило |
|---|---|---|---|
capacity_ml |
целое | любое неотрицательное | 1 л = 1000 мл |
color |
строка | синий, красный | blue → синий, синий → синий |
material |
строка | сталь | значение берётся из источника |
SKULaunch рекомендует ограничивать предложения модели контролируемым списком. Для этого учебного прохода любое неизвестное значение блокирует допуск строки. Оценка уверенности модели не отменяет запрет на догадки.
Практический вывод для словаря: значение вне списка отправляется в карантин с причиной. Так «бордо» не превращается в «красный» без решения владельца словаря.
Дать полный CSV, промпт и таблицу результата
Ниже — полный учебный набор. Все значения условные и вымышленные, запуск модели не выполнялся.
Исходный CSV, разделитель ;:
row_id;sku;name;capacity;color;material
r1;001;Кружка Лист;0,5 л;blue;сталь
r2;1;Кружка Лист;500 мл;синий;сталь
r3;003;Термокружка Лист;?;бордо;
r4;001;Кружка Лист;450 мл;blue;сталь
Правила: sku — строка, 001 и 1 различны. capacity_ml — целое число, 1 л = 1000 мл, ? означает неизвестно. Цвета разрешены только «синий» и «красный», словарь blue → синий, синий → синий, соответствия для «бордо» нет. material не угадывается. Совпавший sku с конфликтом объёма отправляет обе строки в карантин. Все четыре row_id сохраняются, строки не удаляются и не сливаются.
Промпт для копирования:
Нормализуй CSV по правилам. Сохрани все row_id и строковые sku, не удаляй и не сливай строки. Выдай row_id|sku|capacity_ml|color|material|status|reason и журнал source→value.
Допуск только без неизвестных и конфликтов. При одинаковом sku с разным объёмом отправь обе строки в карантин. Не угадывай бордо, материал или объём.
Схема: capacity_ml — целое, 1 л = 1000 мл; ? означает неизвестно. Разрешённые цвета: синий и красный. Словарь blue→синий, синий→синий. Для бордо соответствия нет. SKU001 и SKU1 различны.
CSV, разделитель ;:
row_id;sku;name;capacity;color;material
r1;001;Кружка Лист;0,5 л;blue;сталь
r2;1;Кружка Лист;500 мл;синий;сталь
r3;003;Термокружка Лист;?;бордо;
r4;001;Кружка Лист;450 мл;blue;сталь
Проверь четыре строки, сохранность ведущих нулей, допуски и карантин.
Ожидаемый результат:
| row_id | sku | capacity_ml | color | material | status | reason |
|---|---|---|---|---|---|---|
| r1 | 001 | 500 | синий | сталь | карантин | конфликт с r4 |
| r2 | 1 | 500 | синий | сталь | допуск | все поля известны, sku отдельный |
| r3 | 003 | неизвестно | неизвестно | неизвестно | карантин | объём, словарь цвета, материал |
| r4 | 001 | 450 | синий | сталь | карантин | конфликт с r1 |
Журнал преобразований: r1 0,5 л → 500; r1 и r4 blue → синий; r2 500 мл → 500. Неизвестное значение r3 сохранено и не заполнено догадкой. Всего четыре строки, одна допущена, три требуют решения. Предложенные значения карантинных строк ещё не являются принятой записью каталога.
Вариации той же задачи:
- Заменить словарь цветов на другой набор и проверить, что значения вне списка уходят в карантин.
- Добавить атрибут веса и правило пересчёта в граммы.
- Ввести порог уверенности и отдельную колонку
confidence. - Расширить набор до десяти строк с двумя конфликтами по SKU.
- Добавить проверку контрольного разряда для GTIN.
Выявить конфликт одинакового SKU без слияния
Строки r1 и r4 несут один и тот же sku 001 и разные значения объёма: 500 и 450 мл. Это конфликт. Обе строки уходят в карантин, ни одна не удаляется.
Bulkbase предлагает сравнивать атрибуты при совпадении идентификаторов, задавать приоритет источника по полям и передавать нерешённые конфликты человеку. В нашем входе приоритет между r1 и r4 не задан: выбрать победителя нельзя.
Слияние строк требует отдельного решения владельца данных. Автоматический проход помечает конфликт и останавливается.
Для пары r1/r4 сохраните оба значения объёма и обе ссылки на исходные строки. Вопрос поставщику должен показывать расхождение 500 и450 мл, чтобы ответ можно было привязать к конкретной паре.
Отрицательная проба для учебного набора: превратить 001 в 1, объединить r1, r2 и r4 и заполнить r3 по похожей кружке отклоняется. Причины — потеря идентификатора, конфликт объёма и неподтверждённые свойства.
Не угадывать отсутствующие свойства
Строка r3 содержит ? в объёме, «бордо» в цвете и пустой материал. Все три поля остаются неизвестными. Модель не подставляет ни объём, ни цвет, ни материал.
Pxmatlas предупреждает о риске заполнения пропусков выводом: такие значения могут отсутствовать в источниках. В нашем наборе предположения о свойствах похожей кружки не подтверждают r3.
В обзоре на getcatalog.ai приведён пример: система может отнести «linen maxi dress» к категории одежды, но не должна выдумывать точный состав ткани, инструкции по уходу или условия возврата без подтверждения. Там же сказано, что хорошее обогащение отделяет уверенные факты от догадок.
Практический порядок для пропусков:
- Пустое значение и
?трактуются как неизвестность. - Неизвестность сохраняется в результате явной меткой.
- Строка с неизвестностью уходит в карантин.
- Заполнение возможно только из подтверждённого внешнего источника с указанием источника.
Bulkbase требует прослеживаемости изменения до исходной записи. Для r3 в журнале остаётся неизвестность, без придуманного материала или объёма.
Проверить число строк и журнал изменений
Проверка результата опирается на два счётчика и один журнал. Число строк на входе и на выходе совпадает: четыре и четыре. Число уникальных row_id совпадает с числом строк. Журнал перечисляет каждое преобразование парой «источник → значение».
Bulkbase рекомендует проверять число строк, устойчивость идентификаторов и сохранность колонок вне области преобразования. В нашем случае name сохраняется буквально, sku проверяется как строка.
Счётчики учебного прохода: входных строк четыре, выходных четыре; уникальных row_id четыре, уникальных sku три. Повтор sku001 ожидаем и не устраняется удалением строки. Число допущенных строк равно одному; остальные три сохранены для разбора.
Чек-лист проверки:
- число строк входа равно числу строк выхода;
row_idуникальны и не переупорядочены;skuостались строками, ведущие нули на месте;capacity_ml— целые числа в миллилитрах;colorсодержит только значения словаря или метку неизвестности;- каждая строка имеет
statusиreason; - журнал покрывает все изменённые значения.
Журнал преобразований для учебного набора: r1 0,5 л → 500, r1 и r4 blue → синий, r2 500 мл → 500. Неизвестное значение r3 сохранено без заполнения.
Согласовать исключения перед импортом
Карантинные строки не попадают в импорт до решения владельца данных. Для нашего результата выгрузка допуска содержит только r2, а список исключений — r1, r3 и r4. Сохраните все четыре строки также в полном контрольном результате.
В обзоре на getcatalog.ai приведён перечень проверок перед публикацией: полнота обязательных полей, покрытие полей по категории, согласованность единиц, невозможные комбинации, дубли SKU, разорванные связи вариантов, свежесть цены и наличия, уверенность источника.
Порядок согласования:
- Собрать все строки со статусом «карантин».
- Для каждой указать причину и недостающие сведения.
- Запросить недостающее у поставщика либо у владельца словаря.
- Внести решение в словарь или в правила конфликта.
- Повторить проход и сверить счётчики заново.
Перед импортом повторите проверку на сохранённых файлах. Импортировать весь контрольный результат как готовый каталог нельзя: наличие предложенных значений в строках карантина ещё не даёт разрешения использовать их.
Составьте проверяемый журнал по каждой ячейке
Журнал нужен человеку, который принимает преобразования. Укажите row_id, поле, исходное значение, предложенное значение и основание. Для r1 в поле объёма это 0,5 л,500 и правило пересчёта литров в миллилитры. В том же row_id цвет blue переходит в синий по отдельному словарному соответствию. Эти изменения имеют разные основания, поэтому их следует записать раздельно. Статус r1 при этом остаётся карантинным из-за конфликта объёма с r4.
Для r2 объём500 мл превращается в число500. Цвет синий уже совпадает со словарём; материал сталь уже указан. Зафиксируйте, что sku1 сохранён буквально и не объединён со sku001. Результат допуска опирается на эту проверку всех полей. Простое совпадение имени Кружка Лист не задаёт правило слияния: одинаковое название встречается у строк с различающимися идентификаторами и объёмами.
Для r3 запишите три отдельные причины. Объём неизвестен по знаку вопроса, цвет не имеет согласованного соответствия, материал отсутствует. Сохраните исходное бордо в журнале рядом с неизвестным нормализованным цветом. Это позволит владельцу словаря решить именно вопрос соответствия. Пустой материал должен остаться пустым или явно неизвестным по принятой схеме, без переноса стали из соседней строки. Для каждого поля нужно собственное подтверждение.
Для r4 объём450 мл приводится к числу450, цвет blue — к синему. В причине карантина сошлитесь на r1. Обратная ссылка из r1 на r4 помогает найти вторую сторону конфликта, не просматривая весь файл. Не меняйте450 на500 ради совпадения пары: такая операция уже исправляла бы факт без основания. Запросите у поставщика, какая запись описывает товар и почему возникли разные объёмы.
Проверьте сохранённый файл и повторный проход
Откройте выгруженный CSV текстовым редактором и посмотрите на sku001 и sku003. Затем при чтении таблицей явно задайте этой колонке текстовый тип. Сам по себе визуально похожий результат не подтверждает сохранность нулей в сохранённом файле. Проверяйте значение после выгрузки и повторного открытия, поскольку преобразование может произойти именно на этом переходе. Сохранённый контрольный результат должен содержать все row_id в исходном порядке.
Результат и список исключений свяжите с версией правил. Если владелец позже разрешит соответствие для бордо, новый проход может изменить цвет r3, но неизвестные объём и материал останутся отдельными препятствиями. Решение одного вопроса не означает допуска всей строки. Если поставщик разберёт конфликт r1/r4, сохраните его ответ и новое правило отдельно от исходного файла. Только после повторной проверки формируется новая выгрузка допуска.
Перед передачей уточните, какой файл предназначен для импорта, а какой служит контрольным отчётом. В текущем примере в файл допуска уходит r2; полный результат и три исключения остаются в пакете проверки. Передавайте вместе схему, словарь, исходник и журнал. Так следующий редактор сможет повторить решение по каждой строке и не примет карантинные предложения за утверждённые свойства товара.
Частые вопросы
Что значит нормализовать данные каталога?
В нашем примере 0,5 л и500 мл становятся числом500 в поле capacity_ml, blue становится синим. Идентификаторы остаются строками, неизвестные свойства не заполняются.
Чем нормализация отличается от очистки данных?
Здесь нормализация меняет формат известных значений. Удаление дублей и исправление спорных фактов требуют отдельного решения. В нашем наборе все четыре строки сохраняются.
Может ли ИИ нормализовать товарные данные?
Модель получает полный CSV, фиксированную схему и словарь. Проверять её результат нужно по ручному эталону: одна строка допущена, три отправлены в карантин. Сам вызов модели в статье не выполнялся.
Когда стоит нормализовать товарные данные?
Проверьте входной файл до импорта. Сохраните копию и правила; после изменения словаря повторите проход на тех же строках. Старые результаты не становятся согласованными автоматически.
Как проверить результат нормализации перед импортом?
Сохраните четыре row_id, три различных строковых sku и ведущие нули. Проверьте суммы допуска и карантина: один плюс три равно четырём. Сопоставьте каждое изменение с журналом.
