Показываем, как сэкономить время и деньги на заполнении карточек товаров для интернет-магазинов и маркетплейсов с помощью нейросети и получить качественный результат.
У интернет-магазинов и маркетплейсов часто возникает проблема с тем, чтобы быстро и недорого заполнить тысячи пустых карточек товаров. На одном из проектов эту проблему мы решили с помощью нейросети, которая за пару часов сгенерировала 13 486 описаний для товаров. Еще час ушел на импорт текстов на сайт. Всё это обошлось нам в 3 доллара.
В статье рассказываем, как повторить этот процесс, какие нюансы важно учитывать и насколько качественный результат можно получить.
Почему пустые карточки — это плохо?
Пустые карточки товаров — не просто неудобство, это плохо для бизнеса.
Когда потенциальный покупатель заходит на страницу товара и видит только его название, кнопку заказать и в лучшем случае картинку, ему сложно решиться на покупку — непонятно, что за товар перед ним. Отсутствие описания также может вызывать сомнения в качестве продукции и надежности продавца.
Но главное, пустые карточки — это рост показателя отказов для всего ресурса. Когда пользователи массово уходят с сайта, не взаимодействуя с ним, поисковые алгоритмы воспринимают это как сигнал о низком качестве контента или неудобном интерфейсе. Это негативно влияет на SEO и позиции сайта в поисковых системах. Отказы снижают ИКС и ранжирование страниц в выдаче.
Проблема клиента: ручное заполнение карточек товаров — это долго и дорого
Наш клиент, интернет-магазин по продаже мототехники и запчастей, вручную заполнял по 200 описаний товаров в месяц силами одного несчастного контент-менеджера. При такой скорости работа с оставшимися пустыми 13 486 карточками заняла бы у клиента 5 лет! А ведь кроме этой задачи, есть и другие.
Некоторые карточки товаров выглядели совсем удручающе:
Конечно, здесь нужна и проработка H1, и добавление фото.
Решение: Используем ChatGPT для генерации описаний товаров
Мы решили прибегнуть к помощи искусственного интеллекта.
Генерация описаний нейросетью устранит проблему пустых карточек на сайте за считаные часы, а не годы, и высвободит ресурсы для других задач.
Мы понимали, что текст от ИИ будет не таким структурированным и информативным, как созданный контент-менеджером. Но отсутствие описания — ещё хуже. К тому же тексты для самых важных товаров можно потом доработать вручную.
Мы выбрали популярную нейросеть ChatGPT. С ее помощью можно добиться высокого качества текстов, а еще работать по API, что гораздо быстрее, нежели отправлять запросы по одному.
Выгрузка и подготовка данных для API
Сперва нужно было собрать список URL карточек товаров, у которых не было описания. Также мы обнаружили, что у многих карточек описание слишком короткое (менее 150 символов) и решили сгенерировать тексты и для них.
Чтобы спарсить список URL, мы использовали Screaming Frog. Задали ограничение на обход страниц с вхождением “/catalog/” и “.html” в URL, чтобы собрать только конечные страницы товаров. У нас есть видео с обзором этого инструмента.
Также добавили XPath-запросы для парсинга блока описания, цены товара, фото и характеристик. Выглядели запросы примерно так:
- Парсинг описаний — //div[@id=’detailText’]
- Парсинг цен — //a[contains(@class, ‘price changePrice’)]
- Парсинг фото — //div[contains(@class, ‘item item-picture’)]
- Парсинг характеристик — //div[contains(@class, ‘changePropertiesGroup’)]
После парсинга обработали полученные данные в таблице:
- Собрав описания, посчитали пустые карточки и те, в которых менее 150 символов.
- У некоторых товаров вместо цены было прописано “Снят с продажи”. Таким товарам не нужно заполнять описания, их нужно было исключить из выборки.
- Собрали товары без фото и характеристик для проработки на будущее.
Создание промпта для ChatGPT
Для отправки запросов к ИИ нужно подготовить промпты для каждого товара. Писать уникальный промпт каждому URL слишком трудозатратно. Необходимо было создать один хороший промпт, который можно шаблонизировать и использовать для всех страниц.
API GPT не умеет просматривать веб-страницы
Сперва мы хотели для каждого URL просто посылать запрос к API в виде {URL-адрес; “Создай описание товара для этого url”}. Тестирование промптов проводили на сайте, в чате с моделью GPT-4.
Когда вы общаетесь с GPT-4 в чате, вы можете присылать ей URL-адреса для анализа. У этой модели есть встроенный браузер, благодаря чему она может просматривать странички из интернета и извлекать оттуда информацию.
Однако когда промпты были уже составлены и тестово отправлялись скриптом по API, мы столкнулись с ограничениями: ни одна из моделей ChatGPT, доступная для использования по API, не умела просматривать страницы в интернете. Мы отправляли текст и получали ответ только на основе текстовых символов.
Стало ясно, что идея заставить GPT заходить на страницу по URL и генерировать описание на основе увиденного не сработает.
Хотя и не совсем.
Сначала мы решили, что нужно спарсить для каждого URL H1-заголовок товара, а затем добавить в промпт по шаблону с помощью старого доброго СЦЕПИТЬ. Однако это оказалось ненужным, потому что URL-адреса товаров выглядят так:
- catalog/aksessuary_8/dlya_kvadrotsiklov/diski_kolesnye/cf/disk_kolesnyy_dlya_kvadrotsikla_peredniy_cfmoto_cf500a_x5_x6.html
- /masla/cfmoto_1/maslo_cfmoto_g_motion_4t_10w_40_polusinteticheskoe_motornoe_1l_.html
Эти URL являются ЧПУ (человекопонятный URL). Выяснилось, что если предоставить ChatGPT такие адреса товаров, то даже несмотря на то, что нейросеть не посетит саму страницу, информации для создания описания ей будет достаточно.
В ЧПУ-урле содержится транслитерированное название “disk_kolesnyy_dlya_kvadrotsikla_peredniy_cfmoto_cf500a_x5_x6”, а также информация о принадлежности к группе товаров “aksessuary_8/dlya_kvadrotsiklov/diski_kolesnye/”. Вы можете спросить, почему нельзя было просто спарсить H1 и сцепить с промптом? Скоро отвечу.
Как мы оптимизировали промпт и сэкономили деньги клиента
Изначально мы создавали длинные промпты и инструкции на 12 000 символов, в которых приводили 5-10 примеров правильных описаний товаров, описывали, чем занимается магазин, какого размера должны быть предложения и т.д.
Затем мы оценили стоимость и поняли, что это дорого, а ИИ обрабатывает такие промты дольше. Опытным путем также выяснили, что длинный промпт не сильно отличается по качеству от короткого, где указаны главные требования и приведен один пример.
В результате мы сократили длину промпта до примерно 1300 символов и разделили его на две части: system_content и user_content. Данные инструкции можно отправлять к API в одном запросе, но отдельно друг от друга.
- system_content — используется для задания начального контекста или инструкций модели. Здесь можно указать, как модель должна себя вести или какой стиль общения использовать.
- user_content — сам запрос, описание того, что нужно сгенерировать.
Такое разграничение помогает модели лучше понимать, что относится к описанию роли, а что к запросу.
Вот какие инструкции мы использовали:
- system_content:
Ты очень полезный помощник консультант в интернет-магазине по продаже мототехники и запчастей. Создавай описания товаров длиной не больше 600 символов с пробелами.
Пример описания товара на сайте для товара «Кранец ПВХ Castro 620 мм. 220 мм. синий»:
“Кранец надувной с двусторонней проушиной. Применяется для размещения между бортом судна и пристанью для защиты …”
- user_content:
Для данного товара [подстановка URL] Напиши полезный, связный текст, который поможет реальному покупателю понять, что за товар перед ним и нужно ли ему его покупать. Опиши, для каких целей используется товар и его назначение. В описании используй только то название товара, которое указано в H1 заголовке страницы или url. Пиши название товара в описании только на русском, нельзя писать транслитом например «koleso» вместо «колесо», однако можно сохранять кодировки и название моделей на английском, например «Polaris АС М8000». Можешь писать характеристики, но добавь в конце текста «Перед покупкой рекомендуется уточнять характеристики товара». Употреби название товара во всем тексте только 1 раз, иначе текст будет спамным. Дели текст на 2 абзаца.
Стоимость генерации и выбор подходящей GPT-модели
Приведу модели, которые мы рассматривали, и кратко расскажу о них. В списке указаны цены за генерацию ста текстов по тысяче символов каждый.
- gpt-3.5-turbo — уже устаревшая модель, хотели использовать из-за низкой стоимости, но оказалось, есть вариант получше. Стоимость 0,06$.
- gpt-4-turbo — работает немного быстрее, чем 3.5 turbo, запрос понимает чуть лучше, но стоит в 20 раз дороже 3,5 turbo. Стоимость 1,25$.
- gpt-4o-mini — очень дешевая и качественная модель. Генерирует текст быстрее, чем gpt-3.5-turbo, и гораздо лучше понимает запрос. Стоимость 0,02$.
- gpt-4 — запросы понимает хорошо, в теории самая умная модель, но, применительно к нашей задаче по качеству не сильно отличается от gpt-4o-mini. Зато работает гораздо медленнее и стоит в 100 раз дороже. Стоимость 2$.
В итоге выбрали gpt-4o-mini за соотношение цены и качества.
Разработка скрипта на python и отправка запросов к API
Итак, модель выбрали, теперь нужно организовать отправку запросов к API ChatGPT.
Чтобы использовать API, нужно зарегистрироваться на платформе openai.com и создать свой API-ключ в личном кабинете. Также нужно пополнить баланс API — оплачивать его надо отдельно, даже если у вас оформлена подписка Plus на обычный ChatGPT.
Чтобы использовать полученный ключ и отправлять запросы, нужна программа. Мы решили написать скрипт на Python. Этот язык удобен для подобных задач и часто используется в парсинге и аналитике. Кстати, такой же скрипт может написать вам сам ChatGPT, просто предоставьте ему все требования, о которых рассказываем ниже. Еще такие скрипты можно найти в открытом доступе в интернете.
Задумка была такая: создать входной excel-файл, со списком URL и промптов для каждого из них. Скрипт должен считывать эти значения и отправлять их в API как запросы. Полученный ответ для каждого запроса сохранять в новую таблицу.
При разработке и тестировании скрипта мы столкнулись со следующими проблемами:
- Медленная скорость работы. Сначала каждый запрос отправлялся отдельно, и время генерации для 10 000 запросов могло составить 16 часов с учетом самой быстрой модели ChatGPT. Мы решили проблему, добавив многопоточность (10 потоков). Это ускорило работу скрипта в 10 раз.
- Результат записан не в ту ячейку. После добавления многопоточности запросы стали отправляться группами, а ответы на каждый приходили в разное время. Время генерации для отдельных запросов отличалось. Ответы приходили не в порядке отправки запросов, из-за чего записывались в строку не для того URL. Мы добавили индекс к каждому запросу, чтобы ответ записывался в нужную строку в таблице.
- Из России нельзя делать запросы к API ChatGPT. В общем-то, как и нельзя пользоваться самим ChatGPT. Чтобы обойти ограничение, добавили функцию отправки запросов через прокси.
- Слишком большая длина ответа. В промпте мы указали: «пиши описания не более 600 символов с пробелами». Однако чат иногда нарушал это правило и мог выдать целую статью о товаре длиной 4000 символов. Если часто допускать такое, то стоимость генерации непредсказуемо вырастет. Также с этим связана еще одна проблема.
У каждой модели есть лимиты на количество запросов, которые можно ей отправить в минуту (RPM) и в день (RPD). А также ограничение на то, сколько вы можете использовать токенов в минуту (TPM).
Токены — это минимальная единица текста для модели. В среднем одно русское слово может занимать от 1 до 4 токенов. Их количество зависит от сложности слова, его длины и редкости употребления в языке. Токены тратятся как на сам запрос, так и на ответ модели.
Ограничение модели gpt-4o-mini составляет 200 000 TPM. Как выяснилось, мы запросто можем превысить это количество, используя отправку запросов в многопоточности. Тогда модель вместо ответа начнет возвращать ошибку и сообщение о превышении лимита.
Чтобы этого не происходило, мы добавили параметр max_tokens = 600. Он задает ограничение на максимально допустимое количество токенов, которые модель может потратить на один запрос.
Помимо этого, добавили обработку ошибки: в случае получения сообщения о превышении лимита делать паузу 60 секунд и пробовать отправку снова.
Осталось только ограничение на 10 000 запросов в день, но его, увы, никак не обойти. После достижения этого лимита получение ответов не прекращается, но замедляется в 10 раз. Тут либо делить отправку на две части и отправлять за два дня, либо не останавливаться и отправлять с меньшей скоростью после достижения лимита.
Разбор и качество полученного ответа
В итоге мы получили таблицу с описаниями товаров для каждого URL. Нужно было оценить итоговое качество текстов.
Вручную проверять такой объем невозможно, поэтому пользовались сортировками, фильтрами и формулами в Гугл-таблицах. Смотрели минимальную и максимальную длину описаний, наличие пустых текстов или описаний с некорректными символами.
Просмотрев таким образом весь массив текстов, мы обнаружили, что некоторые слова ИИ не перевел на русский и оставил так, как они записаны в URL. Например, «koleso», «starter», «korpus». Текстов с такими словами было пару сотен из всего массива. Мы спарсили для них H1 и сделали замену транслит-названия товара на русскоязычное.
При парсинге H1-заголовков товаров мы поняли, почему отдавать ЧПУ URL вместо H1 все же было лучшим решением. Дело в том, что многие H1 (названия товаров) выглядят вот так:
- Запчасти для квадроциклов Шестерня (венец) ротора CFMOTO X8
- Аксессуары для квадроциклов Шина для квадроцикла ITP Mud Lite XL 28×12-14
- Экипировка для активного отдыха — Шапка KLIM Muffler Hat Grey 2024
В названии по какой-то причине присутствует категория товара. Дублировать такое в описании не хочется, а если дать Chat GPT точные H1, то он именно так их и употребит в тексте. В транслите URL такого нет. Например, для тех же товаров транслит выглядел так:
- shesternya_venets_rotora_cfmoto_x8
- shina_dlya_kvadrotsikla_itp_mud_lite_xl_28x12_14
- shapka_klim_muffler_hat_grey_2024
Поэтому предоставить URL в этом случае было лучше, чем H1. Названия товаров, конечно, нужно исправлять.
В целом, качество ответа получилось хорошее. Инструкции почти всегда соблюдались. Пример описания:
«Диск колесный для квадроцикла задний CFMoto X6EPS, X8H, X10EPS – это надежная и прочная деталь, обеспечивающая отличную производительность вашего квадроцикла. Он предназначен для замены поврежденного или изношенного диска, что позволяет улучшить управляемость и увеличивает срок службы техники. Изготовленный из качественных материалов, данный диск устойчив к различным нагрузкам и внешним воздействиям, обеспечивая безопасность во время эксплуатации.
Используйте этот диск для повышения проходимости вашего квадроцикла на сложной местности и в условиях повышенной эксплуатации. Его точная геометрия гарантирует идеальную совместимость с другими компонентами и долговечность в любых условиях. Перед покупкой рекомендуется уточнять характеристики товара, чтобы выбрать оптимальное решение для вашего квадроцикла.»
Затраты и результаты: цифры и ценность для бизнеса
Сбор данных и разработка скрипта происходила силами одного сеошника. Если к задаче подключить программиста, возможно, дело пойдет еще быстрее.
Финансовые затраты для клиента:
- 3$ — стоимость итоговой генерации.
- 10$ — расходы на тестирование промптов и различных моделей.
- Стоимость работы SEO-специалиста.
Временные затраты:
- 10 минут — запуск парсинга, сам процесс занимает 1-2 часа.
- 6 часов — составление промптов и тестирование моделей в первый раз.
- 10 минут — настройка и запуск скрипта на Python. 2-3 часа ушло на его выполнение.
Результаты:
- Объем работы. Мы создали 13,486 описаний товаров, сделав это не за несколько лет, а за 12 часов. Если считать только время на отправку запросов и получение ответа, то за 2 часа.
- Экономия времени. С учетом временных затрат на все этапы задачи, мы ускорили процесс заполнения описаний карточек товаров в 3 650 раз по сравнению с ручным заполнением.
- Влияние на бизнес. Будем отслеживать изменения трафика в дальнейшем, но уменьшение числа отказов на страницах уже заметно.
Выводы и рекомендации для тех, кто хочет повторить процесс
По итогу мы закрыли проблему пустых карточек товаров и автоматизировали процесс, который раньше занял бы годы.
Важно помнить, что подход с использованием нейросети требует тщательной настройки промпта и проверки качества результатов. На основе нашего опыта мы рекомендуем следующее:
- Проверять транслитерацию в URL и адаптировать её под нужды контента. Если в вашей структуре URL нет транслитерации, можно парсить H1 и указывать его в промпте.
- Минимизировать промпты для экономии ресурсов и скорости генерации.
- Инвестировать время в тестирование моделей, чтобы подобрать оптимальное соотношение цены и качества.
- Если будете делать генерацию по ЧПУ URL, стоит проверить все URL по их длине. Например, мы позже обнаружили, что небольшая часть товаров имеет недостаточно информации о товаре в URL. Например, есть такие урлы, как «aksessuary_8/kovrik_1» или «aksessuary_8/dt-4». Для таких товаров описание получится более рандомным, поэтому для них лучше использовать H1.
После тестирования промптов и разработки скрипта этот метод можно легко адаптировать для других категорий товаров или маркетплейсов, что открывает большие возможности для автоматизации контента.
Автор: Дмитрий Мазуркевич (seo-специалист Ant-Team.ru).
Подписывайтесь на наш телеграм-канал, чтобы первыми узнавать о выходе новых материалов. И смотрите наши бесплатные обучающие видео на YouTube, VK и Rutube.