Разбор

ИИ пишет описания для 1000 товаров за ночь: Python + Claude Batch API без копирайтера

1000 уникальных описаний товаров — 80 000 рублей копирайтеру и месяц работы или 400–800 рублей на API и одна ночь. Схема Python + CSV + Claude Batch API, три стиля для разных категорий, кейс магазина стройматериалов: 2400 SKU за 2 ночи, SEO-трафик +67% за 3 месяца.

• 8 мин чтения

Менеджер интернет-магазина стройматериалов позвонил мне в марте. Говорит: «Нам нужно написать описания для 2400 товаров. Копирайтеры дали смету — 180 000 рублей и шесть недель». Я спросил, когда им нужно. «Желательно к следующей пятнице».

Следующая пятница наступила через 9 дней. К тому моменту все 2400 описаний уже стояли на сайте — уникальные, с SEO-ключами, в трёх разных стилях под разные категории. Потрачено: 2 ночи работы скрипта и около 1 200 рублей на API.

×200
разница в стоимости между копирайтером и Claude Batch API на задаче 1000+ описаний товаров

Почему копирайтер — не решение для тысячи SKU

80 рублей за описание звучит дёшево. Но умножь на тысячу — и уже 80 000 рублей. Умножь на 2400, как у того магазина стройматериалов — 192 000 рублей. Это половина месячного рекламного бюджета небольшого интернет-магазина.

И это только деньги. Ещё есть время. Хороший копирайтер пишет 40–60 описаний в день — при условии что вы дали ему исходник. Если исходник неполный или характеристики у всех товаров в разных форматах, темп падает вдвое. Тысяча SKU — три–четыре недели. Две с половиной тысячи — полтора месяца.

За это время конкуренты с нормальными описаниями уже собирают трафик по тем запросам, где вы пока светите дублем с сайта поставщика.

Дубли — отдельная боль. 60–70% интернет-магазинов в нишах с оптовыми поставщиками (стройматериалы, электроника, хозтовары) используют одни и те же описания от производителя. Яндекс это видит. Уникальный контент — один из немногих реальных способов отличиться в SEO без покупки ссылок.

Что теряет интернет-магазин без уникальных описаний
Позиции по низкочастотным запросам
–60%
Трафик с длинного хвоста
–45%
Конверсия (описание → покупка)
–30%
Индексация карточек товаров
–25%
Оценочные потери магазинов с дублированным контентом на основе отраслевых данных SEO-исследований. Конкретные цифры зависят от ниши и конкурентной среды.

Что такое Batch API и почему он сделан для этой задачи

Обычный Claude API работает синхронно: отправил запрос — получил ответ за секунды. Отлично для чат-ботов и интерактивных сценариев. Для генерации тысячи описаний — неудобно и дорого.

Batch API устроен иначе. Ты отправляешь пакет из нескольких тысяч запросов одним вызовом. Anthropic обрабатывает их асинхронно и возвращает все результаты когда готово — обычно меньше чем за час, максимум 24 часа. За это получаешь скидку 50% от стандартных цен.

Для тысячи описаний это меняет всё. Вместо синхронного цикла с управлением rate limits и обработкой таймаутов — один вызов create, потом poll статуса, потом collect results.

Технические ограничения API: до 100 000 запросов в одном батче, максимум 256 МБ. Тысяча описаний товаров укладывается в эти рамки с огромным запасом.

Три стиля описаний под три типа аудитории

Это то, о чём копирайтерам на аутсорсе обычно не говорят — и потом получают каталог в одном монотонном тоне. У разных категорий товаров разные покупатели с разными ожиданиями от текста.

Технический
B2B / Электроника / Инструменты
Факты, характеристики, применение. Покупатель знает что ищет, ему нужно быстро подтвердить что это оно.
«Перфоратор SDS-Plus 800 Вт, удар 2,8 Дж. Режим сверления и долбления. Регулировка оборотов 0–1100 об/мин. Вес 2,9 кг. Для бетона М300 — отверстие до 26 мм.»
Потребительский
B2C / Хозтовары / Бытовое
Выгода для покупателя, простой язык, что это даёт дома. Характеристики — в конце, как доказательство.
«Замените розетку за 15 минут без электрика. Двойное крепление и защита от перегрева — работает надёжно годами. Подходит под стандартный подрозетник 68 мм.»
Эмоциональный
Fashion / Lifestyle / Подарки
Образ, ощущение, история. Характеристики встроены ненавязчиво. Покупатель видит себя с этим товаром.
«Шерсть мериноса 100% — свитер который греет без ощущения «колючего». Свободный крой, рукав реглан. Первая стирка при 30° — и он остаётся таким же.»

В скрипте каждой категории товаров назначается свой системный промпт. Claude получает стиль на входе и применяет его ко всем товарам этой категории.

Код: Python + CSV + Claude Batch API

Скрипт принимает CSV с характеристиками, формирует батч-запросы по одному на товар, отправляет всё одним вызовом и сохраняет результаты обратно в CSV.

Сначала — структура входного файла:

products.csv — пример входных данных
sku,name,category,material,size,purpose,brand
SKU-001,Дрель ударная ProMax 800,tools,металл/пластик,30×23×8 см,сверление бетона кирпича дерева,ProMax
SKU-002,Розетка двойная с заземлением,electrical,поликарбонат,8.5×8.5 см,скрытая установка,Schneider
SKU-003,Свитер мериносовый оверсайз,clothing,мериносовая шерсть 100%,S/M/L/XL,повседневная носка,

Теперь основной скрипт генерации:

generate_descriptions.py — установить: pip install anthropic pandas
import anthropic
import pandas as pd
import time
import json

from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.messages.batch_create_params import Request

CLAUDE_API_KEY = "YOUR_ANTHROPIC_API_KEY"

# Системные промпты для каждого стиля категории
STYLE_PROMPTS = {
  "tools": (
      "Ты пишешь технические описания товаров для интернет-магазина. "
      "Стиль: факты и характеристики, профессиональный тон, конкретные цифры. "
      "Длина: 300–450 символов. Без восклицательных знаков. "
      "Включи: назначение, ключевые характеристики, применение."
  ),
  "electrical": (
      "Ты пишешь потребительские описания товаров. "
      "Стиль: выгода для покупателя, простой язык, что даёт дома. "
      "Длина: 280–420 символов. "
      "Включи: главную выгоду, простоту установки, надёжность."
  ),
  "clothing": (
      "Ты пишешь эмоциональные описания одежды для интернет-магазина. "
      "Стиль: образ и ощущение, покупатель видит себя в вещи. "
      "Длина: 300–450 символов. Материал и уход — ненавязчиво в конце."
  ),
}

# Дефолтный промпт для неизвестных категорий
DEFAULT_PROMPT = (
  "Ты пишешь описания товаров для интернет-магазина. "
  "Стиль: чёткий и информативный. "
  "Длина: 300–450 символов. "
  "Включи: назначение, ключевые характеристики, преимущества."
)

def make_product_prompt(row: dict) -> str:
  """Формируем промпт для конкретного товара из строки CSV."""
  parts = [f"Товар: {row['name']}"]
  if row.get('material'):
      parts.append(f"Материал: {row['material']}")
  if row.get('size'):
      parts.append(f"Размер/характеристики: {row['size']}")
  if row.get('purpose'):
      parts.append(f"Назначение: {row['purpose']}")
  if row.get('brand'):
      parts.append(f"Бренд: {row['brand']}")
  parts.append("Напиши описание товара для карточки в интернет-магазине.")
  return "\n".join(parts)


def submit_batch(df: pd.DataFrame) -> str:
  """Отправляем батч-запрос и возвращаем batch_id."""
  client = anthropic.Anthropic(api_key=CLAUDE_API_KEY)

  requests = []
  for _, row in df.iterrows():
      system_prompt = STYLE_PROMPTS.get(row.get("category", ""), DEFAULT_PROMPT)
      user_prompt = make_product_prompt(row.to_dict())

      requests.append(Request(
          custom_id=str(row["sku"]),
          params=MessageCreateParamsNonStreaming(
              model="claude-haiku-4-5",  # Haiku — оптимум для описаний
              max_tokens=600,
              system=system_prompt,
              messages=[{"role": "user", "content": user_prompt}],
          ),
      ))

  batch = client.messages.batches.create(requests=requests)
  print(f"Батч создан: {batch.id} — запросов: {len(requests)}")
  return batch.id


def poll_until_done(batch_id: str, poll_interval: int = 60) -> None:
  """Ждём пока батч обработается. Проверяем каждые N секунд."""
  client = anthropic.Anthropic(api_key=CLAUDE_API_KEY)

  while True:
      batch = client.messages.batches.retrieve(batch_id)
      status = batch.processing_status

      if status == "ended":
          counts = batch.request_counts
          print(f"Готово. Успешно: {counts.succeeded}, ошибок: {counts.errored}")
          return
      elif status == "canceling":
          raise RuntimeError("Батч отменён")

      print(f"Статус: {status} — ждём {poll_interval} с...")
      time.sleep(poll_interval)


def collect_results(batch_id: str, df: pd.DataFrame) -> pd.DataFrame:
  """Собираем результаты и добавляем описания в датафрейм."""
  client = anthropic.Anthropic(api_key=CLAUDE_API_KEY)

  results = {}
  for result in client.messages.batches.results(batch_id):
      if result.result.type == "succeeded":
          text = result.result.message.content[0].text
          results[result.custom_id] = text.strip()
      else:
          results[result.custom_id] = ""
          print(f"Ошибка для {result.custom_id}: {result.result.type}")

  df["description"] = df["sku"].astype(str).map(results).fillna("")
  return df


if __name__ == "__main__":
  # 1. Загружаем CSV
  df = pd.read_csv("products.csv")
  print(f"Загружено товаров: {len(df)}")

  # 2. Можно обрабатывать по 1000 — одним батчем
  batch_id = submit_batch(df)

  # 3. Сохраняем batch_id — на случай если скрипт упадёт
  with open("batch_id.txt", "w") as f:
      f.write(batch_id)

  # 4. Ждём завершения
  poll_until_done(batch_id)

  # 5. Собираем результаты
  df = collect_results(batch_id, df)

  # 6. Сохраняем в новый CSV
  df.to_csv("products_with_descriptions.csv", index=False)
  print(f"Готово. Сохранено: products_with_descriptions.csv")

Несколько практических моментов.

batch_id.txt — не случайная деталь. Батч обрабатывается от 15 минут до нескольких часов. Если скрипт упадёт или компьютер уснёт, ID сохранён и можно подключиться к уже запущенному батчу через retrieve(batch_id).

poll_interval=60 — раз в минуту достаточно. Дёргать API каждые 5 секунд бессмысленно: батч не обрабатывается быстрее от этого.

claude-haiku-4-5 — для описаний товаров это правильный выбор. Sonnet пишет лучше для сложных текстов, но для структурированных карточек с чёткими вводными Haiku справляется отлично и стоит в 3 раза дешевле.

Контроль качества: что проверять после генерации

После получения результатов — три быстрые проверки перед загрузкой на сайт.

Длина. Слишком короткие описания (меньше 200 символов) — либо Haiku не получил достаточно исходных данных, либо что-то пошло не так в промпте. Фильтруем:

check_quality.py — быстрая проверка результатов
import pandas as pd

df = pd.read_csv("products_with_descriptions.csv")

# 1. Пустые описания
empty = df[df["description"].str.len() == 0]
print(f"Пустые: {len(empty)}")

# 2. Слишком короткие (< 200 символов)
short = df[df["description"].str.len() < 200]
print(f"Слишком короткие: {len(short)}")
print(short[["sku", "name", "description"]].to_string())

# 3. Подозрительные дубли — сравниваем первые 60 символов
df["desc_start"] = df["description"].str[:60]
dupes = df[df["desc_start"].duplicated(keep=False)]
print(f"Похожих по началу: {len(dupes)}")

# 4. Базовая статистика
print(f"\nСредняя длина: {df['description'].str.len().mean():.0f} символов")
print(f"Минимум: {df['description'].str.len().min()}")
print(f"Максимум: {df['description'].str.len().max()}")

На практике при 1000 товарах получаешь 3–8 пустых или коротких описаний — обычно у товаров с минимальным набором характеристик в CSV. Их перегенерировать отдельно через обычный API за пару минут.

Дублей по первым 60 символам — как правило 0–2 на тысячу. Claude по умолчанию строит разные конструкции предложений.

Выборочный просмотр. Прочитай 20–30 случайных описаний из каждой категории. Это занимает 10 минут, но позволяет понять нужно ли скорректировать системный промпт перед следующим батчем.

Кейс: магазин стройматериалов, 2400 SKU

Возвращаемся к тому магазину. Три категории: строительные смеси, крепёж и инструменты, электрика. Под каждую — свой промпт с техническими деталями.

Результаты за 3 месяца после запуска
+67%
органический трафик из Яндекса
2 400
описаний за 2 ночи
1 200 ₽
стоимость генерации через Batch API
98.6%
описаний принято без правок

Первая ночь — 1200 SKU категории «крепёж и инструменты». Вторая — 1200 SKU «смеси + электрика». Ручная правка потребовалась для 34 позиций с неполными данными в исходном CSV.

Трафик +67% — это не только от описаний. Параллельно шла работа с метатегами и структурой каталога. Но конкретные карточки товаров стали ранжироваться по тем низкочастотным запросам, которых раньше не было вообще: «цементная смесь М400 25 кг применение», «болт М8 нержавеющий DIN 933 купить». Это длинный хвост, который невозможно покрыть вручную даже за деньги — просто некому формулировать тысячи специфических запросов.

Сколько у тебя товаров и сколько это будет стоить

Считаем стоимость генерации

3 вопроса — получишь оценку

Вопрос 1 из 3
Сколько товаров нужно описать?
Вопрос 2 из 3
Какая модель Claude нужна?
Вопрос 3 из 3
Средний объём данных на товар?

Сравнение подходов

ПараметрКопирайтерClaude Batch API
Стоимость 1000 описаний80 000–150 000 ₽400–800 ₽
Время на 1000 SKU3–4 недели1–3 часа
Разные стили под категорииНужно отдельно оговариватьВ промпте автоматически
Масштабирование на 10 000 SKU×10 стоимость и времениЕщё один батч-запрос
Обновление при смене ассортиментаКаждый раз зановоСкрипт переиспользуется
Живой авторский голосДа — с хорошим копирайтеромЗависит от промпта
Контроль качестваРедактура входит в ценуНужна выборочная проверка

Одна строка в таблице, на которую стоит смотреть честно: «Живой авторский голос». Claude пишет хорошо, но не пишет так, как пишет человек с экспертизой в нише. Для премиальных товаров, где каждая карточка — это продающий текст с историей, копирайтер лучше. Для каталогов с сотнями однотипных позиций — Claude и дешевле, и быстрее, и стабильнее.

Как запустить за один вечер

1
Подготовить CSV с характеристиками

Минимальный набор: sku, name, category. Остальное (material, size, purpose) — чем больше, тем лучше результат. Проверь что нет строк с пустым name — они дадут пустые описания.

2
Установить зависимости и получить API-ключ

pip install anthropic pandas. API-ключ — на console.anthropic.com. Для первого запуска хватит 5 долларов на счёте. На 1000 товаров с Haiku потратишь меньше одного.

3
Написать системные промпты под свои категории

Это самая важная часть. Сначала напиши промпт для одной категории, запусти тест на 10–15 товарах через обычный API, прочитай результаты и скорректируй. Только потом запускай батч на всё.

4
Запустить батч и дождаться результатов

python generate_descriptions.py — и оставить работать. Скрипт сохранит batch_id в файл. При 1000 товарах Haiku обрабатывает батч обычно за 15–40 минут.

5
Проверить качество и загрузить на сайт

Запустить check_quality.py, просмотреть 20–30 случайных описаний из каждой категории. Перегенерировать проблемные. Итоговый CSV с описаниями импортировать через CMS или прямую загрузку в базу.


Три месяца назад тот магазин стройматериалов получил +67% трафика. Сейчас они прогоняют новые поступления через тот же скрипт каждые две недели — описания встают на сайт раньше чем конкуренты успевают скопировать карточки поставщика.

Скрипт лежит у них в репозитории. Запускает его менеджер по каталогу — без программиста, без копирайтера, без очереди на две недели.

Источники

Источники

Часто задаваемые вопросы

Сколько стоит сгенерировать 1000 описаний товаров через Claude API?
400–800 рублей при использовании Claude Haiku 4.5 через Batch API (скидка 50% от обычной цены). Для Sonnet 4.6 — 1 500–2 500 рублей. Точная сумма зависит от длины промптов и описаний. Для сравнения: копирайтер берёт 80–150 рублей за одно описание, итого 80 000–150 000 рублей за тысячу.
Что такое Claude Message Batches API и зачем он нужен?
Batch API позволяет отправить до 100 000 запросов одним пакетом и получить результаты асинхронно — обычно в течение 1 часа, максимум 24 часов. Главный плюс: стоимость в два раза ниже обычного API. Для массовой генерации контента — оптимальный выбор, поскольку срочность не нужна.
Можно ли использовать разные стили описаний для разных категорий товаров?
Да, это одно из ключевых преимуществ подхода. В скрипте каждой категории назначается свой системный промпт: технический стиль для электроники и B2B-товаров, потребительский для бытовых вещей, эмоциональный для одежды и lifestyle. Claude получает промпт категории + характеристики товара и пишет в нужном регистре.
Как убедиться что описания уникальны и не дублируют друг друга?
Claude генерирует уникальные тексты по умолчанию — одинаковые характеристики он описывает разными словами. Для дополнительной проверки после генерации запустите простую проверку на совпадение первых 50 символов: в практике на 1000 описаний обычно находят 0–3 случайных совпадения, которые легко переформировать.
Сколько времени занимает настройка скрипта с нуля?
3–4 часа для человека с базовым знанием Python. Основные шаги: установка зависимостей (pip install anthropic pandas), подготовка CSV с характеристиками, настройка промптов под категории, тестовый прогон на 10–20 товарах, запуск полного батча. Большую часть времени занимает именно написание хороших промптов под каждую категорию.
Работает ли этот подход для товаров с похожими характеристиками?
Да, для этого в промпте важно добавить инструкцию использовать разные синонимы и структуры предложений. Для категорий с очень похожими товарами (например, болты разных размеров) хорошо работает добавление в промпт нескольких запрещённых фраз из предыдущего описания — это заставляет модель искать другие формулировки.
Обсуждение

    Пока без комментариев. Будьте первым.

    Войдите, чтобы отправить комментарий

    Вы сможете комментировать статьи, сохранять материалы

    или войдите по email

    Бесплатная диагностика · 30 минут · без обязательств

    Маркетинг работает, но продажи не растут?

    Отвечу на 3–5 вопросов о вашем бизнесе — и мы вместе разберём, где именно теряются клиенты и что с этим делать.

    Без продаж. Без навязчивых звонков.